diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2017-07-21 15:54:26 +0300 |
---|---|---|
committer | Ivo van Dongen <info@ivovandongen.nl> | 2017-08-14 23:10:10 +0300 |
commit | bfac9b6292fdb4fe167a69e652be5751b2e2f4b8 (patch) | |
tree | 9a9713221cff0f6809a0ee69b0e59342e2ec2780 /test/util/thread.test.cpp | |
parent | 034551f1519491110b83f74662af7d4c0c509104 (diff) | |
download | qtlocation-mapboxgl-bfac9b6292fdb4fe167a69e652be5751b2e2f4b8.tar.gz |
[core] allow safe direct access to actor on single threaded schedulerupstream/ivd-direct-actor-access
Diffstat (limited to 'test/util/thread.test.cpp')
-rw-r--r-- | test/util/thread.test.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/test/util/thread.test.cpp b/test/util/thread.test.cpp index 228e463d9e..1bc55eadda 100644 --- a/test/util/thread.test.cpp +++ b/test/util/thread.test.cpp @@ -6,6 +6,7 @@ #include <mbgl/util/timer.hpp> #include <atomic> +#include <chrono> #include <memory> #include <thread> @@ -308,3 +309,30 @@ TEST(Thread, PauseResumeMultiThreaded) { thread1.join(); thread2.join(); } + +TEST(Thread, DirectAccess) { + + Thread<TestWorker> test("Test"); + + // Use the thread's object directly + std::atomic<bool> flag { false }; + auto guard = std::make_unique<BlockingThreadGuard<TestWorker>>( test ); + guard->object().send([&] { flag = true; }); + ASSERT_TRUE(flag); + + // Ensure messages queued up are processed + std::atomic<bool> message1Consumed { false }; + test.actor().invoke(&TestWorker::send, [&]() { message1Consumed = true; }); + + // Release the guard + guard.reset(); + + // Ensure messages send after releasing the guard are processed + std::atomic<bool> message2Consumed { false }; + test.actor().invoke(&TestWorker::send, [&]() { message2Consumed = true; }); + + while (!message1Consumed && !message2Consumed) { + using namespace std::chrono_literals; + std::this_thread::sleep_for(10ms); + }; +} |