summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Shalamov <alexander.shalamov@mapbox.com>2019-08-08 16:15:25 +0200
committerŁukasz Paczos <lukas.paczos@gmail.com>2019-08-29 12:48:26 +0200
commitc43b08af066b43d89fdbd9d7061ad0944bbcb176 (patch)
treef3d99e45f709b247063d69008af0bc24cd5d6bba
parentd6a60f053bf8123fb0a2caeb9390d89b65d7b868 (diff)
downloadqtlocation-mapboxgl-upstream/lp-offline-loop-null-test.tar.gz
[android] Check flag before runnable task invocationupstream/lp-offline-loop-null-test
-rw-r--r--platform/android/src/async_task.cpp9
-rw-r--r--platform/android/src/timer.cpp13
2 files changed, 16 insertions, 6 deletions
diff --git a/platform/android/src/async_task.cpp b/platform/android/src/async_task.cpp
index 6c14e96fa6..0a4d90a275 100644
--- a/platform/android/src/async_task.cpp
+++ b/platform/android/src/async_task.cpp
@@ -16,6 +16,7 @@ public:
}
~Impl() {
+ queued = true;
loop->removeRunnable(this);
}
@@ -31,9 +32,11 @@ public:
}
void runTask() override {
- loop->removeRunnable(this);
- queued = true;
- task();
+ if (!queued) {
+ queued = true;
+ loop->removeRunnable(this);
+ task();
+ }
}
private:
diff --git a/platform/android/src/timer.cpp b/platform/android/src/timer.cpp
index a45c48702e..2c33504dfd 100644
--- a/platform/android/src/timer.cpp
+++ b/platform/android/src/timer.cpp
@@ -3,6 +3,7 @@
#include <mbgl/util/run_loop.hpp>
#include <mbgl/util/timer.hpp>
+#include <atomic>
#include <functional>
namespace mbgl {
@@ -10,7 +11,8 @@ namespace util {
class Timer::Impl : public RunLoop::Impl::Runnable {
public:
- Impl() = default;
+ Impl() : active(false) {
+ }
~Impl() {
stop();
@@ -25,9 +27,11 @@ public:
due = (timeout == Duration::max()) ? std::chrono::time_point<Clock>::max() : Clock::now() +
timeout;
loop->addRunnable(this);
+ active = true;
}
void stop() {
+ active = false;
loop->removeRunnable(this);
}
@@ -45,8 +49,10 @@ public:
}
void runTask() override {
- reschedule();
- task();
+ if (active) {
+ reschedule();
+ task();
+ }
}
private:
@@ -56,6 +62,7 @@ private:
RunLoop::Impl* loop = reinterpret_cast<RunLoop::Impl*>(RunLoop::getLoopHandle());
std::function<void()> task;
+ std::atomic<bool> active;
};
Timer::Timer() : impl(std::make_unique<Impl>()) {