From 618b9f1dbff9c3a13c886b0edd949b7c6533fc5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Tue, 12 Apr 2016 12:00:11 -0700 Subject: [PATCH] [darwin] use CFRunLoopSourceInvalidate() to also cancel any pending AsyncTask invocations --- platform/darwin/src/async_task.cpp | 2 +- test/util/async_task.cpp | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/platform/darwin/src/async_task.cpp b/platform/darwin/src/async_task.cpp index 122f95f73..513629726 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 9d3623047..5fd890ad9 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 task1, task2; + + task1 = std::make_unique([&] { + task2.reset(); + if (!task1) { + FAIL() << "Task was destroyed but invoked anyway"; + } + }); + task2 = std::make_unique([&] { + task1.reset(); + if (!task2) { + FAIL() << "Task was destroyed but invoked anyway"; + } + }); + + task1->send(); + task2->send(); + + loop.runOnce(); +} + TEST(AsyncTask, RequestCoalescingMultithreaded) { RunLoop loop;