summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--platform/darwin/src/async_task.cpp2
-rw-r--r--test/util/async_task.cpp27
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;