Home | History | Annotate | Download | only in base
      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