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