Index: mojo/public/cpp/utility/run_loop.h |
diff --git a/mojo/public/cpp/utility/run_loop.h b/mojo/public/cpp/utility/run_loop.h |
deleted file mode 100644 |
index a6c100e9b70bdef78323622372b47e792a4a99a3..0000000000000000000000000000000000000000 |
--- a/mojo/public/cpp/utility/run_loop.h |
+++ /dev/null |
@@ -1,184 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#ifndef MOJO_PUBLIC_CPP_UTILITY_RUN_LOOP_H_ |
-#define MOJO_PUBLIC_CPP_UTILITY_RUN_LOOP_H_ |
- |
-#include <mojo/system/time.h> |
- |
-#include <map> |
-#include <queue> |
- |
-#include "mojo/public/cpp/bindings/callback.h" |
-#include "mojo/public/cpp/system/handle.h" |
-#include "mojo/public/cpp/system/macros.h" |
-#include "mojo/public/cpp/system/wait_set.h" |
-#include "mojo/public/cpp/utility/run_loop_handler.h" |
- |
-namespace mojo { |
- |
-// Run loop (a.k.a. message loop): watches handles for signals and calls |
-// handlers when they occur; can also execute posted (delayed) tasks. This class |
-// is not thread-safe. |
-class RunLoop { |
- public: |
- RunLoop(); |
- ~RunLoop(); |
- |
- // Returns the RunLoop for the current thread or null if not yet created. |
- static RunLoop* current(); |
- |
- // Registers a RunLoopHandler for the specified handle. Returns an |Id| |
- // |
- // The handler's OnHandleReady() method is invoked after one of the signals in |
- // |handle_signals| occurs. Note that the handler remains registered until |
- // explicitly removed or an error occurs. |
- // |
- // The handler's OnHandleError() method is invoked if the deadline elapses, an |
- // error is detected, or the RunLoop is being destroyed (with result |
- // MOJO_RESULT_ABORTED in this case). The handler is automatically |
- // unregistered before calling OnHandleError(), so it will not receive any |
- // further notifications. |
- // |
- // A handler may call AddHandler() again in both OnHandleReady() and |
- // OnHandleError(). Warning: If OnHandleError() was called due to the RunLoop |
- // being destroyed, the newly-added handler's OnHandleError() will also be |
- // called; this may lead to an infinite loop if it again calls AddHandler() ad |
- // infinitum. |
- RunLoopHandler::Id AddHandler(RunLoopHandler* handler, |
- const Handle& handle, |
- MojoHandleSignals handle_signals, |
- MojoDeadline deadline); |
- void RemoveHandler(RunLoopHandler::Id id); |
- |
- // Adds a task to be performed after delay has elapsed. |
- void PostDelayedTask(const Closure& task, MojoTimeTicks delay); |
- |
- // Runs the loop servicing handles and tasks as they become ready. Returns |
- // when Quit() is invoked, or there are no more handles or tasks. |
- void Run(); |
- |
- // Runs the loop servicing any handles and tasks that are ready. Does not wait |
- // for handles or tasks to become ready before returning. Returns early if |
- // Quit() is invoked. |
- void RunUntilIdle(); |
- |
- void Quit(); |
- |
- // Returns the number of registered handlers. (This is mostly used for |
- // testing.) |
- size_t num_handlers() const { return handlers_.size(); } |
- |
- private: |
- static constexpr MojoTimeTicks kInvalidTimeTicks = 0; |
- |
- // Contains the information that was passed to |AddHandler()|. These are |
- // stored in |handlers|, which is a map from |RunLoopHandler::Id|s |
- // (generated/returned by |AddHandler()| to |HandlerInfo|s. Each entry in |
- // |handlers_| also has a corresponding entry in |wait_set_| (with cookie the |
- // |RunLoopHandler::Id|). |
- struct HandlerInfo { |
- HandlerInfo(RunLoopHandler* handler, |
- MojoHandleSignals handle_signals, |
- MojoTimeTicks absolute_deadline) |
- : handler(handler), |
- handle_signals(handle_signals), |
- absolute_deadline(absolute_deadline) {} |
- |
- RunLoopHandler* handler; |
- MojoHandleSignals handle_signals; |
- // |kInvalidTimeTicks| means forever/no deadline/indefinite. |
- MojoTimeTicks absolute_deadline; |
- }; |
- using IdToHandlerInfoMap = std::map<RunLoopHandler::Id, HandlerInfo>; |
- |
- // Contains information about a handler with a deadline. These are stored in |
- // the |handler_deadlines_| priority queue (with the earliest/lowest |
- // |RunLoopHandler::Id| at the top). If |id| is not in |handlers_|, then this |
- // deadline is no longer valid (i.e., is stale). |
- struct HandlerDeadlineInfo { |
- HandlerDeadlineInfo(RunLoopHandler::Id id, MojoTimeTicks absolute_deadline) |
- : id(id), absolute_deadline(absolute_deadline) {} |
- |
- // Needed to be in a priority queue. Note that |std::priority_queue<>|'s top |
- // is the "greatest" element, whereas we want the earliest. |
- bool operator<(const HandlerDeadlineInfo& other) const { |
- return (absolute_deadline == other.absolute_deadline) |
- ? id < other.id |
- : absolute_deadline > other.absolute_deadline; |
- } |
- |
- RunLoopHandler::Id id; |
- MojoTimeTicks absolute_deadline; |
- }; |
- using HandlerDeadlineQueue = std::priority_queue<HandlerDeadlineInfo>; |
- |
- // Contains information about a task posted using |PostDelayedTask()|. (Even |
- // though tasks are not handlers, we also assign them |RunLoopHandler::Id|s |
- // from the same namespace.) These are stored in the |delayed_tasks_| priority |
- // queue (with the earliest/lowest |RunLoopHandler::Id| at the top). |
- struct DelayedTaskInfo { |
- DelayedTaskInfo(RunLoopHandler::Id id, |
- const Closure& task, |
- MojoTimeTicks absolute_run_time); |
- ~DelayedTaskInfo(); |
- |
- bool operator<(const DelayedTaskInfo& other) const { |
- return (absolute_run_time == other.absolute_run_time) |
- ? id > other.id |
- : absolute_run_time > other.absolute_run_time; |
- } |
- |
- RunLoopHandler::Id id; |
- Closure task; |
- MojoTimeTicks absolute_run_time; |
- }; |
- using DelayedTaskQueue = std::priority_queue<DelayedTaskInfo>; |
- |
- // Inside of |Run()|/|RunUntilIdle()| (i.e., really in |RunInternal()|), we |
- // have one of these on the stack. |current_run_state_| points to the current |
- // one. (This is needed to handle nested execution.) |
- struct RunState; |
- |
- // Helper for |Run()| and |RunUntilIdle()|, which loops and executes delayed |
- // tasks and handlers as handles become "ready". It will if: |
- // - there are no more tasks or registered handlers, |
- // - |Quit()| is called, or |
- // - no work is done in a given iteration if |quit_when_idle| is true. |
- void RunInternal(bool quit_when_idle); |
- |
- // Executes one iteration of the run loop. Returns true if the run loop should |
- // continue. |
- bool DoIteration(bool quit_when_idle); |
- |
- // Notifies handlers corresponding to the wait results in |results| (which |
- // should not be empty). Returns true if work was done (i.e., any handler was |
- // called). |
- bool NotifyResults(const std::vector<MojoWaitSetResult>& results); |
- |
- // Notifies any handlers with a deadline up to |absolute_deadline| was that |
- // their deadline was exceeded. Returns true if work was done (i.e., any |
- // handler was called). |
- bool NotifyHandlersDeadlineExceeded(MojoTimeTicks absolute_deadline); |
- |
- // Calculates the absolute deadline (to be turned into a relative deadline) |
- // for the wait set wait. This should only be called if |handlers_| is |
- // nonempty. Returns |kInvalidTimeTicks| for "forever"/indefinite. Sets |
- // |*is_delayed_task| to true if the deadline is for a delayed task. |
- MojoTimeTicks CalculateAbsoluteDeadline(bool* is_delayed_task); |
- |
- RunLoopHandler::Id next_id_ = 1u; |
- IdToHandlerInfoMap handlers_; |
- ScopedWaitSetHandle wait_set_; |
- HandlerDeadlineQueue handler_deadlines_; |
- DelayedTaskQueue delayed_tasks_; |
- |
- RunState* current_run_state_ = nullptr; |
- |
- MOJO_DISALLOW_COPY_AND_ASSIGN(RunLoop); |
-}; |
- |
-} // namespace mojo |
- |
-#endif // MOJO_PUBLIC_CPP_UTILITY_RUN_LOOP_H_ |