blob: 7b2c1703162dbef35cf4b13a8a71412e20b6418d [file] [log] [blame]
[email protected]3fee57b2013-11-12 16:35:021// Copyright 2013 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 MOJO_COMMON_MESSAGE_PUMP_MOJO_H_
6#define MOJO_COMMON_MESSAGE_PUMP_MOJO_H_
7
8#include <map>
9
[email protected]d7dc6add2014-03-20 05:59:5810#include "base/memory/scoped_ptr.h"
[email protected]3fee57b2013-11-12 16:35:0211#include "base/message_loop/message_pump.h"
[email protected]5273d8ec2014-04-16 05:34:1812#include "base/synchronization/lock.h"
[email protected]a6881fd2013-11-23 19:04:1913#include "base/time/time.h"
[email protected]3fee57b2013-11-12 16:35:0214#include "mojo/common/mojo_common_export.h"
[email protected]5dddd192014-03-28 00:53:2715#include "mojo/public/cpp/system/core.h"
[email protected]3fee57b2013-11-12 16:35:0216
17namespace mojo {
18namespace common {
19
20class MessagePumpMojoHandler;
21
22// Mojo implementation of MessagePump.
23class MOJO_COMMON_EXPORT MessagePumpMojo : public base::MessagePump {
24 public:
25 MessagePumpMojo();
26 virtual ~MessagePumpMojo();
27
[email protected]d7dc6add2014-03-20 05:59:5828 // Static factory function (for using with |base::Thread::Options|, wrapped
29 // using |base::Bind()|).
30 static scoped_ptr<base::MessagePump> Create();
31
[email protected]3fee57b2013-11-12 16:35:0232 // Registers a MessagePumpMojoHandler for the specified handle. Only one
[email protected]a6881fd2013-11-23 19:04:1933 // handler can be registered for a specified handle.
[email protected]9a412922014-08-14 15:48:2434 // NOTE: a value of 0 for |deadline| indicates an indefinite timeout.
[email protected]3fee57b2013-11-12 16:35:0235 void AddHandler(MessagePumpMojoHandler* handler,
[email protected]bd6cb4bc2013-11-25 23:57:1636 const Handle& handle,
[email protected]e3da5f92014-06-18 10:18:1137 MojoHandleSignals wait_signals,
[email protected]a6881fd2013-11-23 19:04:1938 base::TimeTicks deadline);
[email protected]3fee57b2013-11-12 16:35:0239
[email protected]bd6cb4bc2013-11-25 23:57:1640 void RemoveHandler(const Handle& handle);
[email protected]3fee57b2013-11-12 16:35:0241
42 // MessagePump:
43 virtual void Run(Delegate* delegate) OVERRIDE;
44 virtual void Quit() OVERRIDE;
45 virtual void ScheduleWork() OVERRIDE;
46 virtual void ScheduleDelayedWork(
47 const base::TimeTicks& delayed_work_time) OVERRIDE;
48
49 private:
50 struct RunState;
51 struct WaitState;
52
[email protected]273e2172013-12-10 07:24:1653 // Contains the data needed to track a request to AddHandler().
[email protected]3fee57b2013-11-12 16:35:0254 struct Handler {
[email protected]9a067d52014-06-18 15:25:0355 Handler() : handler(NULL), wait_signals(MOJO_HANDLE_SIGNAL_NONE), id(0) {}
[email protected]3fee57b2013-11-12 16:35:0256
57 MessagePumpMojoHandler* handler;
[email protected]e3da5f92014-06-18 10:18:1158 MojoHandleSignals wait_signals;
[email protected]a6881fd2013-11-23 19:04:1959 base::TimeTicks deadline;
60 // See description of |MessagePumpMojo::next_handler_id_| for details.
61 int id;
[email protected]3fee57b2013-11-12 16:35:0262 };
63
[email protected]bd6cb4bc2013-11-25 23:57:1664 typedef std::map<Handle, Handler> HandleToHandler;
[email protected]3fee57b2013-11-12 16:35:0265
[email protected]5273d8ec2014-04-16 05:34:1866 // Implementation of Run().
67 void DoRunLoop(RunState* run_state, Delegate* delegate);
68
[email protected]3fee57b2013-11-12 16:35:0269 // Services the set of handles ready. If |block| is true this waits for a
70 // handle to become ready, otherwise this does not block.
[email protected]5273d8ec2014-04-16 05:34:1871 void DoInternalWork(const RunState& run_state, bool block);
[email protected]3fee57b2013-11-12 16:35:0272
73 // Removes the first invalid handle. This is called if MojoWaitMany finds an
74 // invalid handle.
75 void RemoveFirstInvalidHandle(const WaitState& wait_state);
76
[email protected]5273d8ec2014-04-16 05:34:1877 void SignalControlPipe(const RunState& run_state);
[email protected]3fee57b2013-11-12 16:35:0278
[email protected]5273d8ec2014-04-16 05:34:1879 WaitState GetWaitState(const RunState& run_state) const;
[email protected]3fee57b2013-11-12 16:35:0280
[email protected]a6881fd2013-11-23 19:04:1981 // Returns the deadline for the call to MojoWaitMany().
[email protected]5273d8ec2014-04-16 05:34:1882 MojoDeadline GetDeadlineForWait(const RunState& run_state) const;
[email protected]a6881fd2013-11-23 19:04:1983
[email protected]3fee57b2013-11-12 16:35:0284 // If non-NULL we're running (inside Run()). Member is reference to value on
85 // stack.
86 RunState* run_state_;
87
[email protected]5273d8ec2014-04-16 05:34:1888 // Lock for accessing |run_state_|. In general the only method that we have to
89 // worry about is ScheduleWork(). All other methods are invoked on the same
90 // thread.
91 base::Lock run_state_lock_;
92
[email protected]3fee57b2013-11-12 16:35:0293 HandleToHandler handlers_;
94
[email protected]a6881fd2013-11-23 19:04:1995 // An ever increasing value assigned to each Handler::id. Used to detect
96 // uniqueness while notifying. That is, while notifying expired timers we copy
97 // |handlers_| and only notify handlers whose id match. If the id does not
98 // match it means the handler was removed then added so that we shouldn't
99 // notify it.
100 int next_handler_id_;
101
[email protected]3fee57b2013-11-12 16:35:02102 DISALLOW_COPY_AND_ASSIGN(MessagePumpMojo);
103};
104
105} // namespace common
106} // namespace mojo
107
108#endif // MOJO_COMMON_MESSAGE_PUMP_MOJO_H_