12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/thread_aware_callback.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/ppapi_globals.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/ppb_message_loop_shared.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ppapi { 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace internal { 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ThreadAwareCallbackBase::Core : public base::RefCountedThreadSafe<Core> { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Core() : aborted_(false) {} 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MarkAsAborted() { aborted_ = true; } 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RunIfNotAborted(const base::Closure& closure) { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!aborted_) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CallWhileUnlocked(closure); 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class base::RefCountedThreadSafe<Core>; 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ~Core() {} 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool aborted_; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ThreadAwareCallbackBase::ThreadAwareCallbackBase() 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : target_loop_(PpapiGlobals::Get()->GetCurrentMessageLoop()), 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) core_(new Core()) { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(target_loop_.get()); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ThreadAwareCallbackBase::~ThreadAwareCallbackBase() { core_->MarkAsAborted(); } 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ThreadAwareCallbackBase::HasTargetLoop() { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !!PpapiGlobals::Get()->GetCurrentMessageLoop(); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ThreadAwareCallbackBase::InternalRunOnTargetThread( 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& closure) { 48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (target_loop_.get() != PpapiGlobals::Get()->GetCurrentMessageLoop()) { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_loop_->PostClosure( 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunWhileLocked(base::Bind(&Core::RunIfNotAborted, core_, closure)), 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CallWhileUnlocked(closure); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace internal 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ppapi 60