// 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_MESSAGE_PUMP_HANDLE_WATCHER_H_ #define MOJO_MESSAGE_PUMP_HANDLE_WATCHER_H_ #include "base/basictypes.h" #include "base/callback_forward.h" #include "base/memory/scoped_ptr.h" #include "base/run_loop.h" #include "mojo/message_pump/mojo_message_pump_export.h" #include "mojo/public/cpp/system/core.h" namespace base { class Thread; } namespace mojo { namespace common { namespace test { class HandleWatcherTest; } // HandleWatcher is used to asynchronously wait on a handle and notify a Closure // when the handle is ready, or the deadline has expired. class MOJO_MESSAGE_PUMP_EXPORT HandleWatcher { public: HandleWatcher(); ~HandleWatcher(); // Starts listening for |handle|. This implicitly invokes Stop(). In other // words, Start() performs one asynchronous watch at a time. It is ok to call // Start() multiple times, but it cancels any existing watches. |callback| is // notified when the handle is ready, invalid or deadline has passed and is // notified on the thread Start() was invoked on. If the current thread exits // before the handle is ready, then |callback| is invoked with a result of // MOJO_RESULT_ABORTED. void Start(const Handle& handle, MojoHandleSignals handle_signals, MojoDeadline deadline, const base::Callback& callback); // Stops listening. Does nothing if not in the process of listening. void Stop(); private: class StateBase; class SameThreadWatchingState; class SecondaryThreadWatchingState; // If non-NULL Start() has been invoked. scoped_ptr state_; DISALLOW_COPY_AND_ASSIGN(HandleWatcher); }; } // namespace common } // namespace mojo #endif // MOJO_MESSAGE_PUMP_HANDLE_WATCHER_H_