message_loop_proxy_impl.h revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
1// Copyright (c) 2010 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/lock.h"
10#include "base/message_loop.h"
11#include "base/message_loop_proxy.h"
12
13namespace base {
14
15// A stock implementation of MessageLoopProxy that takes in a MessageLoop
16// and keeps track of its lifetime using the MessageLoop DestructionObserver.
17// For now a MessageLoopProxyImpl can only be created for the current thread.
18class MessageLoopProxyImpl : public MessageLoopProxy,
19                             public MessageLoop::DestructionObserver {
20 public:
21  virtual ~MessageLoopProxyImpl();
22
23  // MessageLoopProxy implementation
24  virtual bool PostTask(const tracked_objects::Location& from_here,
25                        Task* task);
26  virtual bool PostDelayedTask(const tracked_objects::Location& from_here,
27                               Task* task, int64 delay_ms);
28  virtual bool PostNonNestableTask(const tracked_objects::Location& from_here,
29                                   Task* task);
30  virtual bool PostNonNestableDelayedTask(
31      const tracked_objects::Location& from_here,
32      Task* task,
33      int64 delay_ms);
34  virtual bool BelongsToCurrentThread();
35
36  // MessageLoop::DestructionObserver implementation
37  virtual void WillDestroyCurrentMessageLoop();
38
39 protected:
40  // Override OnDestruct so that we can delete the object on the target message
41  // loop if it still exists.
42  virtual void OnDestruct() const;
43
44 private:
45  MessageLoopProxyImpl();
46  bool PostTaskHelper(const tracked_objects::Location& from_here,
47                      Task* task, int64 delay_ms, bool nestable);
48
49  // For the factory method to work
50  friend class MessageLoopProxy;
51
52  // The lock that protects access to target_message_loop_.
53  mutable Lock message_loop_lock_;
54  MessageLoop* target_message_loop_;
55
56  DISALLOW_COPY_AND_ASSIGN(MessageLoopProxyImpl);
57};
58
59}  // namespace base
60
61#endif  // BASE_MESSAGE_LOOP_PROXY_IMPL_H_
62
63