Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 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 #include "mojo/edk/system/watcher_set.h" | |
| 6 | |
| 7 #include "base/bind.h" | |
| 8 #include "base/containers/stack_container.h" | |
|
Anand Mistry (off Chromium)
2016/02/29 12:03:35
Unused?
Ken Rockot(use gerrit already)
2016/02/29 20:59:06
Removed
| |
| 9 | |
| 10 namespace mojo { | |
| 11 namespace edk { | |
| 12 | |
| 13 struct HandleSignalsState; | |
|
Anand Mistry (off Chromium)
2016/02/29 12:03:35
Remove and #include "mojo/edk/system/handle_signal
Ken Rockot(use gerrit already)
2016/02/29 20:59:06
Done
| |
| 14 | |
| 15 WatcherSet::Watcher::Watcher(MojoHandleSignals signals, | |
| 16 const Dispatcher::WatchCallback& callback) | |
| 17 : signals(signals), callback(callback) {} | |
| 18 | |
| 19 WatcherSet::Watcher::~Watcher() {} | |
| 20 | |
| 21 WatcherSet::WatcherSet() {} | |
| 22 | |
| 23 WatcherSet::~WatcherSet() {} | |
| 24 | |
| 25 void WatcherSet::NotifyOfStateChange( | |
| 26 const HandleSignalsState& state, | |
| 27 Dispatcher::RequestContext* request_context) { | |
| 28 MojoHandleSignalsState signals_state; | |
|
Anand Mistry (off Chromium)
2016/02/29 12:03:35
Given that HandleSignalsSate inherits from MojoHan
Ken Rockot(use gerrit already)
2016/02/29 20:59:06
Ah right... static_cast :) Done
| |
| 29 signals_state.satisfied_signals = state.satisfied_signals; | |
| 30 signals_state.satisfiable_signals = state.satisfiable_signals; | |
| 31 for (const auto& entry : watchers_) | |
| 32 MaybeNotifyWatcher(entry.second, signals_state, request_context); | |
| 33 } | |
| 34 | |
| 35 void WatcherSet::CancelAll(Dispatcher::RequestContext* request_context) { | |
| 36 MojoHandleSignalsState signals_state = {0, 0}; | |
| 37 for (const auto& entry : watchers_) { | |
| 38 request_context->AddFinalizer(base::Bind( | |
| 39 entry.second.callback, MOJO_RESULT_CANCELLED, signals_state)); | |
| 40 } | |
| 41 watchers_.clear(); | |
| 42 } | |
| 43 | |
| 44 MojoResult WatcherSet::Add(MojoHandleSignals signals, | |
| 45 const Dispatcher::WatchCallback& callback, | |
| 46 uintptr_t context, | |
| 47 const HandleSignalsState& current_state, | |
| 48 Dispatcher::RequestContext* request_context) { | |
| 49 auto it = watchers_.find(context); | |
| 50 if (it != watchers_.end()) | |
| 51 return MOJO_RESULT_ALREADY_EXISTS; | |
| 52 | |
| 53 if (!current_state.can_satisfy(signals)) | |
| 54 return MOJO_RESULT_FAILED_PRECONDITION; | |
| 55 | |
| 56 Watcher watcher(signals, callback); | |
| 57 watchers_.insert(std::make_pair(context, watcher)); | |
| 58 | |
| 59 MojoHandleSignalsState signals_state; | |
| 60 signals_state.satisfied_signals = current_state.satisfied_signals; | |
| 61 signals_state.satisfiable_signals = current_state.satisfiable_signals; | |
| 62 MaybeNotifyWatcher(watcher, signals_state, request_context); | |
| 63 | |
| 64 return MOJO_RESULT_OK; | |
| 65 } | |
| 66 | |
| 67 MojoResult WatcherSet::Remove(uintptr_t context) { | |
| 68 auto it = watchers_.find(context); | |
| 69 if (it == watchers_.end()) | |
| 70 return MOJO_RESULT_INVALID_ARGUMENT; | |
| 71 watchers_.erase(it); | |
| 72 return MOJO_RESULT_OK; | |
| 73 } | |
| 74 | |
| 75 void WatcherSet::MaybeNotifyWatcher( | |
| 76 const Watcher& watcher, | |
| 77 const MojoHandleSignalsState& current_state, | |
| 78 Dispatcher::RequestContext* request_context) { | |
| 79 if (current_state.satisfied_signals & watcher.signals) { | |
| 80 request_context->AddFinalizer( | |
| 81 base::Bind(watcher.callback, MOJO_RESULT_OK, current_state)); | |
| 82 } else if (!(current_state.satisfiable_signals & watcher.signals)) { | |
| 83 request_context->AddFinalizer(base::Bind( | |
| 84 watcher.callback, MOJO_RESULT_FAILED_PRECONDITION, current_state)); | |
| 85 } | |
| 86 } | |
| 87 | |
| 88 } // namespace edk | |
| 89 } // namespace mojo | |
| OLD | NEW |