• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // 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_HANDLE_WATCHER_H_
6 #define MOJO_COMMON_HANDLE_WATCHER_H_
7 
8 #include "base/basictypes.h"
9 #include "base/callback_forward.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "mojo/common/mojo_common_export.h"
12 #include "mojo/public/system/core_cpp.h"
13 
14 namespace base {
15 class Thread;
16 class TickClock;
17 class TimeTicks;
18 }
19 
20 namespace mojo {
21 namespace common {
22 namespace test {
23 class HandleWatcherTest;
24 }
25 
26 // HandleWatcher is used to asynchronously wait on a handle and notify a Closure
27 // when the handle is ready, or the deadline has expired.
28 class MOJO_COMMON_EXPORT HandleWatcher {
29  public:
30   HandleWatcher();
31   ~HandleWatcher();
32 
33   // Starts listening for |handle|. This implicitly invokes Stop(). In other
34   // words, Start() performs one asynchronous watch at a time. It is ok to call
35   // Start() multiple times, but it cancels any existing watches. |callback| is
36   // notified when the handle is ready, invalid or deadline has passed and is
37   // notified on the thread Start() was invoked on.
38   void Start(const Handle& handle,
39              MojoWaitFlags wait_flags,
40              MojoDeadline deadline,
41              const base::Callback<void(MojoResult)>& callback);
42 
43   // Stops listening. Does nothing if not in the process of listening.
44   void Stop();
45 
46   // Returns now. Used internally; generally not useful.
47   static base::TimeTicks NowTicks();
48 
49   // Converts a MojoDeadline into a TimeTicks.
50   static base::TimeTicks MojoDeadlineToTimeTicks(MojoDeadline deadline);
51 
52  private:
53   friend class test::HandleWatcherTest;
54   struct StartState;
55 
56   // See description of |StartState::weak_factory| for details.
57   void OnHandleReady(MojoResult result);
58 
59   // If non-NULL Start() has been invoked.
60   scoped_ptr<StartState> start_state_;
61 
62   // Used for getting the time. Only set by tests.
63   static base::TickClock* tick_clock_;
64 
65   DISALLOW_COPY_AND_ASSIGN(HandleWatcher);
66 };
67 
68 }  // namespace common
69 }  // namespace mojo
70 
71 #endif  // MOJO_COMMON_HANDLE_WATCHER_H_
72