diff options
author | rtenneti@chromium.org <rtenneti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-03 08:16:24 +0000 |
---|---|---|
committer | rtenneti@chromium.org <rtenneti@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-03 08:16:24 +0000 |
commit | 1d88aea97c70078531760e3063908082b137faa8 (patch) | |
tree | 998d9c26a8db6cf0ded6b0d96490d4b92974e5eb /media/audio | |
parent | 08fafe4d23d8c0bf6a68098c1c49aebd8269db6b (diff) | |
download | chromium_src-1d88aea97c70078531760e3063908082b137faa8.zip chromium_src-1d88aea97c70078531760e3063908082b137faa8.tar.gz chromium_src-1d88aea97c70078531760e3063908082b137faa8.tar.bz2 |
MessageLoop's RUN method will pass a const ref to PendingTask when
TaskObserver's WillProcessTask and DidProcessTask methods are called.
User's of TaskObserver get time_posted by accessing pending_task.time_posted.
User's of TaskObserver get time_posted by accessing pending_task.time_posted.
(would like to use this with SpdySession testing to verify a task is posted
or not).
R=jar@chromium.org, darin@chromium.org
TESTS= all unit tests
Review URL: https://chromiumcodereview.appspot.com/12161002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@180302 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio')
-rw-r--r-- | media/audio/mac/audio_device_listener_mac.cc | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/media/audio/mac/audio_device_listener_mac.cc b/media/audio/mac/audio_device_listener_mac.cc index 8aedf45..8910e90 100644 --- a/media/audio/mac/audio_device_listener_mac.cc +++ b/media/audio/mac/audio_device_listener_mac.cc @@ -4,12 +4,14 @@ #include "media/audio/mac/audio_device_listener_mac.h" +#include "base/bind.h" #include "base/file_path.h" #include "base/logging.h" #include "base/mac/libdispatch_task_runner.h" #include "base/mac/mac_logging.h" #include "base/mac/mac_util.h" #include "base/message_loop.h" +#include "base/pending_task.h" namespace media { @@ -27,7 +29,7 @@ class ExclusiveDispatchQueueTaskObserver : public MessageLoop::TaskObserver { // If we're currently on the thread, fire the suspend operation so we don't // end up with an unbalanced resume. if (message_loop_->message_loop_proxy()->BelongsToCurrentThread()) - WillProcessTask(base::TimeTicks()); + SuspendDispatchQueue(); message_loop_->AddTaskObserver(this); } @@ -38,26 +40,18 @@ class ExclusiveDispatchQueueTaskObserver : public MessageLoop::TaskObserver { // If we're currently on the thread, fire the resume operation so we don't // end up with an unbalanced suspend. if (message_loop_->message_loop_proxy()->BelongsToCurrentThread()) - DidProcessTask(base::TimeTicks()); + ResumeDispatchQueue(); // This will hang if any listeners are still registered with the queue. property_listener_queue_->Shutdown(); } - virtual void WillProcessTask(base::TimeTicks time_posted) OVERRIDE { - // Issue a synchronous suspend operation. Benchmarks on a retina 10.8.2 - // machine show this takes < 20us on average. dispatch_suspend() is an - // asynchronous operation so we need to issue it inside of a synchronous - // block to ensure it completes before WillProccesTask() completes. - dispatch_sync(queue_, ^{ - dispatch_suspend(queue_); - }); + virtual void WillProcessTask(const base::PendingTask& pending_task) OVERRIDE { + SuspendDispatchQueue(); } - virtual void DidProcessTask(base::TimeTicks time_posted) OVERRIDE { - // Issue an asynchronous resume operation. Benchmarks on a retina 10.8.2 - // machine show this takes < 10us on average. - dispatch_resume(queue_); + virtual void DidProcessTask(const base::PendingTask& pending_task) OVERRIDE { + ResumeDispatchQueue(); } dispatch_queue_t dispatch_queue() const { @@ -65,6 +59,22 @@ class ExclusiveDispatchQueueTaskObserver : public MessageLoop::TaskObserver { } private: + // Issue a synchronous suspend operation. Benchmarks on a retina 10.8.2 + // machine show this takes < 20us on average. dispatch_suspend() is an + // asynchronous operation so we need to issue it inside of a synchronous block + // to ensure it completes before WillProccesTask() completes. + void SuspendDispatchQueue() { + dispatch_sync(queue_, ^{ + dispatch_suspend(queue_); + }); + } + + // Issue an asynchronous resume operation. Benchmarks on a retina 10.8.2 + // machine show this takes < 10us on average. + void ResumeDispatchQueue() { + dispatch_resume(queue_); + } + scoped_refptr<base::mac::LibDispatchTaskRunner> property_listener_queue_; const dispatch_queue_t queue_; MessageLoop* message_loop_; |