Index: mojo/edk/system/awakable_list.cc |
diff --git a/mojo/edk/system/awakable_list.cc b/mojo/edk/system/awakable_list.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6af305b4420e2799ede060085e9ae914c03d22e4 |
--- /dev/null |
+++ b/mojo/edk/system/awakable_list.cc |
@@ -0,0 +1,58 @@ |
+// 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. |
+ |
+#include "mojo/edk/system/awakable_list.h" |
+ |
+#include "base/logging.h" |
+#include "mojo/edk/system/awakable.h" |
+#include "mojo/edk/system/handle_signals_state.h" |
+ |
+namespace mojo { |
+namespace system { |
+ |
+AwakableList::AwakableList() { |
+} |
+ |
+AwakableList::~AwakableList() { |
+ DCHECK(awakables_.empty()); |
+} |
+ |
+void AwakableList::AwakeForStateChange(const HandleSignalsState& state) { |
+ for (AwakeInfoList::iterator it = awakables_.begin(); it != awakables_.end(); |
+ ++it) { |
+ if (state.satisfies(it->signals)) |
+ it->awakable->Awake(MOJO_RESULT_OK, it->context); |
+ else if (!state.can_satisfy(it->signals)) |
+ it->awakable->Awake(MOJO_RESULT_FAILED_PRECONDITION, it->context); |
+ } |
+} |
+ |
+void AwakableList::CancelAll() { |
+ for (AwakeInfoList::iterator it = awakables_.begin(); it != awakables_.end(); |
+ ++it) { |
+ it->awakable->Awake(MOJO_RESULT_CANCELLED, it->context); |
+ } |
+ awakables_.clear(); |
+} |
+ |
+void AwakableList::Add(Awakable* awakable, |
+ MojoHandleSignals signals, |
+ uint32_t context) { |
+ awakables_.push_back(AwakeInfo(awakable, signals, context)); |
+} |
+ |
+void AwakableList::Remove(Awakable* awakable) { |
+ // We allow a thread to wait on the same handle multiple times simultaneously, |
+ // so we need to scan the entire list and remove all occurrences of |waiter|. |
+ for (AwakeInfoList::iterator it = awakables_.begin(); |
+ it != awakables_.end();) { |
+ AwakeInfoList::iterator maybe_delete = it; |
+ ++it; |
+ if (maybe_delete->awakable == awakable) |
+ awakables_.erase(maybe_delete); |
+ } |
+} |
+ |
+} // namespace system |
+} // namespace mojo |