Add comment about a subtlety

This commit is contained in:
John Firebaugh
2015-06-08 19:19:48 -04:00
parent 5fadda53e5
commit f14e4c67fd

View File

@@ -42,6 +42,17 @@ public:
std::move(fn),
std::move(tuple));
// `task` is a shared pointer with ownership in the following three places:
// 1. In the `queue` of pending invocations.
// 2. In the `WorkRequest` result.
// 3. In the lambda binding of the callback to be executed on the invoking
// RunLoop. This last shared ownership is necessary in the case where
// callback execution has been scheduled (queued on the invoking RunLoop),
// but the other two places have released ownership -- i.e. the task was
// cancelled after the work is completed, but before the callback is
// executed. In this case, the lambda binding checks the cancellation flag
// and does not execute the original callback.
task->bind(callback);
withMutex([&] { queue.push(task); });