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 |