diff options
-rw-r--r-- | platform/darwin/src/async_task.cpp | 2 | ||||
-rw-r--r-- | test/util/async_task.cpp | 27 |
2 files changed, 28 insertions, 1 deletions
diff --git a/platform/darwin/src/async_task.cpp b/platform/darwin/src/async_task.cpp index 122f95f738..513629726b 100644 --- a/platform/darwin/src/async_task.cpp +++ b/platform/darwin/src/async_task.cpp @@ -29,7 +29,7 @@ public: } ~Impl() { - CFRunLoopRemoveSource(loop, source, kCFRunLoopDefaultMode); + CFRunLoopSourceInvalidate(source); CFRelease(source); } diff --git a/test/util/async_task.cpp b/test/util/async_task.cpp index 9d36230472..5fd890ad9e 100644 --- a/test/util/async_task.cpp +++ b/test/util/async_task.cpp @@ -64,6 +64,33 @@ TEST(AsyncTask, DestroyShouldNotRunQueue) { EXPECT_EQ(count, 0); } +TEST(AsyncTask, DestroyAfterSignaling) { + RunLoop loop; + + // We're creating two tasks and signal both of them; the one that gets fired first destroys + // the other one. Make sure that the second one we destroyed doesn't fire. + + std::unique_ptr<AsyncTask> task1, task2; + + task1 = std::make_unique<AsyncTask>([&] { + task2.reset(); + if (!task1) { + FAIL() << "Task was destroyed but invoked anyway"; + } + }); + task2 = std::make_unique<AsyncTask>([&] { + task1.reset(); + if (!task2) { + FAIL() << "Task was destroyed but invoked anyway"; + } + }); + + task1->send(); + task2->send(); + + loop.runOnce(); +} + TEST(AsyncTask, RequestCoalescingMultithreaded) { RunLoop loop; |