Chromium Code Reviews| Index: ppapi/shared_impl/thread_aware_callback.cc |
| diff --git a/ppapi/shared_impl/thread_aware_callback.cc b/ppapi/shared_impl/thread_aware_callback.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..b06fb8c8b22243d7e32ae845068b0b13755c2d4b |
| --- /dev/null |
| +++ b/ppapi/shared_impl/thread_aware_callback.cc |
| @@ -0,0 +1,58 @@ |
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "ppapi/shared_impl/thread_aware_callback.h" |
| + |
| +#include "base/callback.h" |
| +#include "ppapi/shared_impl/ppapi_globals.h" |
| +#include "ppapi/shared_impl/ppb_message_loop_shared.h" |
| + |
| +namespace ppapi { |
| +namespace internal { |
| + |
| +class ThreadAwareCallbackBase::Core : public base::RefCountedThreadSafe<Core> { |
| + public: |
| + Core() : aborted_(false) { |
| + } |
| + |
| + void MarkAsAborted() { aborted_ = true; } |
| + |
| + void RunIfNotAborted(const base::Closure& closure) { |
| + ProxyAutoLock auto_lock; |
|
dmichael (off chromium)
2013/01/15 22:43:52
You could use "RunWhileLocked" where you Post this
yzshen1
2013/01/16 18:55:59
RunWhileLocked() adds another level of 'Bind', whi
dmichael (off chromium)
2013/01/16 19:21:00
I really don't think the Bind is a big deal; it's
yzshen1
2013/01/16 22:37:36
Done. Thanks for the feedback. :)
On 2013/01/16 1
|
| + |
| + if (!aborted_) |
| + CallWhileUnlocked(closure); |
| + } |
| + |
| + private: |
| + friend class base::RefCountedThreadSafe<Core>; |
| + ~Core() { |
| + } |
| + |
| + bool aborted_; |
| +}; |
| + |
| +ThreadAwareCallbackBase::ThreadAwareCallbackBase() |
| + : target_loop_(PpapiGlobals::Get()->GetCurrentMessageLoop()), |
| + core_(new Core()) { |
|
dmichael (off chromium)
2013/01/15 22:43:52
DCHECK(target_loop_);
?
There's no guarantee that
yzshen1
2013/01/16 18:55:59
A DCHECK() won't help plugin developers who develo
dmichael (off chromium)
2013/01/16 19:21:00
Ah. I was assuming that the API that uses this wou
yzshen1
2013/01/16 22:37:36
Yeah, I like this idea. I have made changes accord
|
| +} |
| + |
| +ThreadAwareCallbackBase::~ThreadAwareCallbackBase() { |
| + core_->MarkAsAborted(); |
| +} |
| + |
| +bool ThreadAwareCallbackBase::ShouldPostToTargetLoop() { |
| + return target_loop_.get() && |
| + target_loop_ != PpapiGlobals::Get()->GetCurrentMessageLoop(); |
| +} |
| + |
| +void ThreadAwareCallbackBase::RunIfNotAborted( |
| + const base::Closure& closure) { |
| + target_loop_->PostClosure(FROM_HERE, |
| + base::Bind(&Core::RunIfNotAborted, core_, closure), |
| + 0); |
| +} |
| + |
| +} // namespace internal |
| +} // namespace ppapi |