| // 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_EDK_SYSTEM_AWAKABLE_LIST_H_ |
| #define MOJO_EDK_SYSTEM_AWAKABLE_LIST_H_ |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include <vector> |
| |
| #include "base/macros.h" |
| #include "mojo/edk/system/system_impl_export.h" |
| #include "mojo/edk/system/watcher.h" |
| #include "mojo/edk/system/watcher_set.h" |
| #include "mojo/public/c/system/types.h" |
| |
| namespace mojo { |
| namespace edk { |
| |
| class Awakable; |
| struct HandleSignalsState; |
| |
| // |AwakableList| tracks all the |Waiter|s that are waiting on a given |
| // handle/|Dispatcher|. There should be a |AwakableList| for each handle that |
| // can be waited on (in any way). In the simple case, the |AwakableList| is |
| // owned by the |Dispatcher|, whereas in more complex cases it is owned by the |
| // secondary object (see simple_dispatcher.* and the explanatory comment in |
| // core.cc). This class is thread-unsafe (all concurrent access must be |
| // protected by some lock). |
| class MOJO_SYSTEM_IMPL_EXPORT AwakableList { |
| public: |
| AwakableList(); |
| ~AwakableList(); |
| |
| void AwakeForStateChange(const HandleSignalsState& state); |
| void CancelAll(); |
| void Add(Awakable* awakable, MojoHandleSignals signals, uintptr_t context); |
| void Remove(Awakable* awakable); |
| |
| // Add and remove Watchers to this AwakableList. |
| MojoResult AddWatcher(MojoHandleSignals signals, |
| const Watcher::WatchCallback& callback, |
| uintptr_t context, |
| const HandleSignalsState& current_state); |
| MojoResult RemoveWatcher(uintptr_t context); |
| |
| private: |
| struct AwakeInfo { |
| AwakeInfo(Awakable* awakable, MojoHandleSignals signals, uintptr_t context) |
| : awakable(awakable), signals(signals), context(context) {} |
| |
| Awakable* awakable; |
| MojoHandleSignals signals; |
| uintptr_t context; |
| }; |
| using AwakeInfoList = std::vector<AwakeInfo>; |
| |
| AwakeInfoList awakables_; |
| |
| // TODO: Remove AwakableList and instead use WatcherSet directly in |
| // dispatchers. |
| WatcherSet watchers_; |
| |
| DISALLOW_COPY_AND_ASSIGN(AwakableList); |
| }; |
| |
| } // namespace edk |
| } // namespace mojo |
| |
| #endif // MOJO_EDK_SYSTEM_AWAKABLE_LIST_H_ |