1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef BASE_MESSAGE_LOOP_PROXY_IMPL_H_ 6 #define BASE_MESSAGE_LOOP_PROXY_IMPL_H_ 7 #pragma once 8 9 #include "base/base_api.h" 10 #include "base/message_loop.h" 11 #include "base/message_loop_proxy.h" 12 #include "base/synchronization/lock.h" 13 14 namespace base { 15 16 // A stock implementation of MessageLoopProxy that takes in a MessageLoop 17 // and keeps track of its lifetime using the MessageLoop DestructionObserver. 18 // For now a MessageLoopProxyImpl can only be created for the current thread. 19 class BASE_API MessageLoopProxyImpl : public MessageLoopProxy, 20 public MessageLoop::DestructionObserver { 21 public: 22 virtual ~MessageLoopProxyImpl(); 23 24 // MessageLoopProxy implementation 25 virtual bool PostTask(const tracked_objects::Location& from_here, 26 Task* task); 27 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, 28 Task* task, int64 delay_ms); 29 virtual bool PostNonNestableTask(const tracked_objects::Location& from_here, 30 Task* task); 31 virtual bool PostNonNestableDelayedTask( 32 const tracked_objects::Location& from_here, 33 Task* task, 34 int64 delay_ms); 35 virtual bool BelongsToCurrentThread(); 36 37 // MessageLoop::DestructionObserver implementation 38 virtual void WillDestroyCurrentMessageLoop(); 39 40 protected: 41 // Override OnDestruct so that we can delete the object on the target message 42 // loop if it still exists. 43 virtual void OnDestruct() const; 44 45 private: 46 MessageLoopProxyImpl(); 47 bool PostTaskHelper(const tracked_objects::Location& from_here, 48 Task* task, int64 delay_ms, bool nestable); 49 50 // For the factory method to work 51 friend class MessageLoopProxy; 52 53 // The lock that protects access to target_message_loop_. 54 mutable base::Lock message_loop_lock_; 55 MessageLoop* target_message_loop_; 56 57 DISALLOW_COPY_AND_ASSIGN(MessageLoopProxyImpl); 58 }; 59 60 } // namespace base 61 62 #endif // BASE_MESSAGE_LOOP_PROXY_IMPL_H_ 63 64