Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3033)

Unified Diff: base/mac/libdispatch_task_runner.cc

Issue 11547006: De-flake the LibDispatchTaskRunner tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove circular reference Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/mac/libdispatch_task_runner.h ('k') | base/mac/libdispatch_task_runner_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « base/mac/libdispatch_task_runner.h ('k') | base/mac/libdispatch_task_runner_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698