• 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_EDK_SYSTEM_AWAKABLE_LIST_H_
6 #define MOJO_EDK_SYSTEM_AWAKABLE_LIST_H_
7 
8 #include <stddef.h>
9 #include <stdint.h>
10 
11 #include <vector>
12 
13 #include "base/macros.h"
14 #include "mojo/edk/system/system_impl_export.h"
15 #include "mojo/edk/system/watcher.h"
16 #include "mojo/edk/system/watcher_set.h"
17 #include "mojo/public/c/system/types.h"
18 
19 namespace mojo {
20 namespace edk {
21 
22 class Awakable;
23 struct HandleSignalsState;
24 
25 // |AwakableList| tracks all the |Waiter|s that are waiting on a given
26 // handle/|Dispatcher|. There should be a |AwakableList| for each handle that
27 // can be waited on (in any way). In the simple case, the |AwakableList| is
28 // owned by the |Dispatcher|, whereas in more complex cases it is owned by the
29 // secondary object (see simple_dispatcher.* and the explanatory comment in
30 // core.cc). This class is thread-unsafe (all concurrent access must be
31 // protected by some lock).
32 class MOJO_SYSTEM_IMPL_EXPORT AwakableList {
33  public:
34   AwakableList();
35   ~AwakableList();
36 
37   void AwakeForStateChange(const HandleSignalsState& state);
38   void CancelAll();
39   void Add(Awakable* awakable, MojoHandleSignals signals, uintptr_t context);
40   void Remove(Awakable* awakable);
41 
42   // Add and remove Watchers to this AwakableList.
43   MojoResult AddWatcher(MojoHandleSignals signals,
44                         const Watcher::WatchCallback& callback,
45                         uintptr_t context,
46                         const HandleSignalsState& current_state);
47   MojoResult RemoveWatcher(uintptr_t context);
48 
49  private:
50   struct AwakeInfo {
AwakeInfoAwakeInfo51     AwakeInfo(Awakable* awakable, MojoHandleSignals signals, uintptr_t context)
52         : awakable(awakable), signals(signals), context(context) {}
53 
54     Awakable* awakable;
55     MojoHandleSignals signals;
56     uintptr_t context;
57   };
58   using AwakeInfoList = std::vector<AwakeInfo>;
59 
60   AwakeInfoList awakables_;
61 
62   // TODO: Remove AwakableList and instead use WatcherSet directly in
63   // dispatchers.
64   WatcherSet watchers_;
65 
66   DISALLOW_COPY_AND_ASSIGN(AwakableList);
67 };
68 
69 }  // namespace edk
70 }  // namespace mojo
71 
72 #endif  // MOJO_EDK_SYSTEM_AWAKABLE_LIST_H_
73