| // Copyright (c) 2010 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. |
| |
| #ifndef BASE_MESSAGE_LOOP_PROXY_IMPL_H_ |
| #define BASE_MESSAGE_LOOP_PROXY_IMPL_H_ |
| #pragma once |
| |
| #include "base/lock.h" |
| #include "base/message_loop.h" |
| #include "base/message_loop_proxy.h" |
| |
| namespace base { |
| |
| // A stock implementation of MessageLoopProxy that takes in a MessageLoop |
| // and keeps track of its lifetime using the MessageLoop DestructionObserver. |
| // For now a MessageLoopProxyImpl can only be created for the current thread. |
| class MessageLoopProxyImpl : public MessageLoopProxy, |
| public MessageLoop::DestructionObserver { |
| public: |
| virtual ~MessageLoopProxyImpl(); |
| |
| // MessageLoopProxy implementation |
| virtual bool PostTask(const tracked_objects::Location& from_here, |
| Task* task); |
| virtual bool PostDelayedTask(const tracked_objects::Location& from_here, |
| Task* task, int64 delay_ms); |
| virtual bool PostNonNestableTask(const tracked_objects::Location& from_here, |
| Task* task); |
| virtual bool PostNonNestableDelayedTask( |
| const tracked_objects::Location& from_here, |
| Task* task, |
| int64 delay_ms); |
| virtual bool BelongsToCurrentThread(); |
| |
| // MessageLoop::DestructionObserver implementation |
| void WillDestroyCurrentMessageLoop(); |
| |
| protected: |
| // Override OnDestruct so that we can delete the object on the target message |
| // loop if it still exists. |
| virtual void OnDestruct() const; |
| |
| private: |
| MessageLoopProxyImpl(); |
| bool PostTaskHelper(const tracked_objects::Location& from_here, |
| Task* task, int64 delay_ms, bool nestable); |
| |
| // For the factory method to work |
| friend class MessageLoopProxy; |
| |
| // The lock that protects access to target_message_loop_. |
| mutable Lock message_loop_lock_; |
| MessageLoop* target_message_loop_; |
| |
| DISALLOW_COPY_AND_ASSIGN(MessageLoopProxyImpl); |
| }; |
| |
| } // namespace base |
| |
| #endif // BASE_MESSAGE_LOOP_PROXY_IMPL_H_ |
| |