diff options
author | Thiago Marcos P. Santos <tmpsantos@gmail.com> | 2020-03-11 01:31:13 +0200 |
---|---|---|
committer | Thiago Marcos P. Santos <tmpsantos@gmail.com> | 2020-03-11 12:35:20 +0200 |
commit | 410e583db6459d9eeb672dd3dbae739b5069b04a (patch) | |
tree | 8e3edbf8307f7c6bc535fc61e94967fee2e29520 /test | |
parent | 09ab9420a9834788708a90a9767202423abf6a5a (diff) | |
download | qtlocation-mapboxgl-410e583db6459d9eeb672dd3dbae739b5069b04a.tar.gz |
[core] Add a callback for platform RunLoop integration
Platform integration callback for platforms that do not have full
run loop integration or don't want to block at the Mapbox GL Native
loop. It will be called from any thread and is up to the platform
to, after receiving the callback, call RunLoop::runOnce() from the
same thread as the Map object lives.
Diffstat (limited to 'test')
-rw-r--r-- | test/util/run_loop.test.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/test/util/run_loop.test.cpp b/test/util/run_loop.test.cpp index 4d2c704421..62bfbb0fc1 100644 --- a/test/util/run_loop.test.cpp +++ b/test/util/run_loop.test.cpp @@ -3,6 +3,10 @@ #include <mbgl/test/util.hpp> +#include <atomic> +#include <condition_variable> +#include <thread> + using namespace mbgl::util; TEST(RunLoop, Stop) { @@ -64,3 +68,48 @@ TEST(RunLoop, Priorities) { EXPECT_EQ((std::vector<int>{ 2, 4, 1, 3 }), order); } + +TEST(RunLoop, PlatformIntegration) { + std::atomic<int> count1(0); + + // No need to be atomic, it will run + // on the main thread. + int count2(0); + + std::thread::id mainThread = std::this_thread::get_id(); + + RunLoop loop; + + std::mutex mutex; + std::condition_variable cv; + + loop.setPlatformCallback([&] { + EXPECT_NE(mainThread, std::this_thread::get_id()); + count1++; + cv.notify_one(); + }); + + auto threadBody = [&]() { + for (unsigned i = 0; i < 100000; ++i) { + loop.invoke([&] { + EXPECT_EQ(mainThread, std::this_thread::get_id()); + count2++; + }); + } + }; + + std::thread thread1(threadBody); + std::thread thread2(threadBody); + + while (count2 < 200000) { + std::unique_lock<std::mutex> lock(mutex); + cv.wait(lock); + loop.runOnce(); + } + + EXPECT_EQ(count1, 200000); + EXPECT_EQ(count2, 200000); + + thread1.join(); + thread2.join(); +} |