• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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