Index: base/mac/libdispatch_task_runner.cc |
diff --git a/base/mac/libdispatch_task_runner.cc b/base/mac/libdispatch_task_runner.cc |
index 12d28229c2ca18c164e128e96cfb55954bd68bbe..4b5abaf30c9f8ba1eed8cc3ec4005aafeb927204 100644 |
--- a/base/mac/libdispatch_task_runner.cc |
+++ b/base/mac/libdispatch_task_runner.cc |
@@ -10,7 +10,10 @@ namespace base { |
namespace mac { |
LibDispatchTaskRunner::LibDispatchTaskRunner(const char* name) |
- : queue_(dispatch_queue_create(name, NULL)) { |
+ : queue_(dispatch_queue_create(name, NULL)), |
+ queue_finalized_(false, false) { |
+ dispatch_set_context(queue_, this); |
+ dispatch_set_finalizer_f(queue_, &LibDispatchTaskRunner::Finalizer); |
} |
bool LibDispatchTaskRunner::PostDelayedTask( |
@@ -50,12 +53,27 @@ bool LibDispatchTaskRunner::PostNonNestableDelayedTask( |
return PostDelayedTask(from_here, task, delay); |
} |
+void LibDispatchTaskRunner::Shutdown() { |
+ dispatch_release(queue_); |
+ queue_ = NULL; |
+ queue_finalized_.Wait(); |
+} |
+ |
dispatch_queue_t LibDispatchTaskRunner::GetDispatchQueue() const { |
return queue_; |
} |
LibDispatchTaskRunner::~LibDispatchTaskRunner() { |
- dispatch_release(queue_); |
+ if (queue_) { |
+ dispatch_set_context(queue_, NULL); |
+ dispatch_set_finalizer_f(queue_, NULL); |
+ dispatch_release(queue_); |
+ } |
+} |
+ |
+void LibDispatchTaskRunner::Finalizer(void* context) { |
+ LibDispatchTaskRunner* self = static_cast<LibDispatchTaskRunner*>(context); |
+ self->queue_finalized_.Signal(); |
} |
} // namespace mac |