OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "mojo/edk/system/wait_set_dispatcher.h" | 5 #include "mojo/edk/system/wait_set_dispatcher.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 15 matching lines...) Expand all Loading... |
26 class WaitSetDispatcherTest : public ::testing::Test { | 26 class WaitSetDispatcherTest : public ::testing::Test { |
27 public: | 27 public: |
28 WaitSetDispatcherTest() {} | 28 WaitSetDispatcherTest() {} |
29 ~WaitSetDispatcherTest() override {} | 29 ~WaitSetDispatcherTest() override {} |
30 | 30 |
31 void SetUp() override { | 31 void SetUp() override { |
32 CreateMessagePipe(&dispatcher0_, &dispatcher1_); | 32 CreateMessagePipe(&dispatcher0_, &dispatcher1_); |
33 } | 33 } |
34 | 34 |
35 void TearDown() override { | 35 void TearDown() override { |
| 36 Dispatcher::RequestContext request_context; |
36 for (auto& d : dispatchers_to_close_) | 37 for (auto& d : dispatchers_to_close_) |
37 d->Close(); | 38 d->Close(&request_context); |
38 } | 39 } |
39 | 40 |
40 MojoResult GetOneReadyDispatcher( | 41 MojoResult GetOneReadyDispatcher( |
41 const scoped_refptr<WaitSetDispatcher>& wait_set, | 42 const scoped_refptr<WaitSetDispatcher>& wait_set, |
42 scoped_refptr<Dispatcher>* ready_dispatcher, | 43 scoped_refptr<Dispatcher>* ready_dispatcher, |
43 uintptr_t* context) { | 44 uintptr_t* context) { |
44 uint32_t count = 1; | 45 uint32_t count = 1; |
45 MojoResult dispatcher_result = MOJO_RESULT_UNKNOWN; | 46 MojoResult dispatcher_result = MOJO_RESULT_UNKNOWN; |
46 DispatcherVector dispatchers; | 47 DispatcherVector dispatchers; |
47 MojoResult result = wait_set->GetReadyDispatchers( | 48 MojoResult result = wait_set->GetReadyDispatchers( |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 TEST_F(WaitSetDispatcherTest, Basic) { | 92 TEST_F(WaitSetDispatcherTest, Basic) { |
92 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); | 93 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); |
93 CloseOnShutdown(wait_set); | 94 CloseOnShutdown(wait_set); |
94 ASSERT_EQ(MOJO_RESULT_OK, | 95 ASSERT_EQ(MOJO_RESULT_OK, |
95 wait_set->AddWaitingDispatcher(dispatcher0_, | 96 wait_set->AddWaitingDispatcher(dispatcher0_, |
96 MOJO_HANDLE_SIGNAL_READABLE, 1)); | 97 MOJO_HANDLE_SIGNAL_READABLE, 1)); |
97 ASSERT_EQ(MOJO_RESULT_OK, | 98 ASSERT_EQ(MOJO_RESULT_OK, |
98 wait_set->AddWaitingDispatcher(dispatcher1_, | 99 wait_set->AddWaitingDispatcher(dispatcher1_, |
99 MOJO_HANDLE_SIGNAL_WRITABLE, 2)); | 100 MOJO_HANDLE_SIGNAL_WRITABLE, 2)); |
100 | 101 |
| 102 Dispatcher::RequestContext request_context; |
101 Waiter w; | 103 Waiter w; |
102 uintptr_t context = 0; | 104 uintptr_t context = 0; |
103 w.Init(); | 105 w.Init(); |
104 HandleSignalsState hss; | 106 HandleSignalsState hss; |
105 // |dispatcher1_| should already be writable. | 107 // |dispatcher1_| should already be writable. |
106 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 108 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
107 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); | 109 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
108 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 110 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
109 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 111 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
110 | 112 |
(...skipping 20 matching lines...) Expand all Loading... |
131 EXPECT_FALSE(hss.satisfies(MOJO_HANDLE_SIGNAL_READABLE)); | 133 EXPECT_FALSE(hss.satisfies(MOJO_HANDLE_SIGNAL_READABLE)); |
132 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); | 134 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); |
133 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 135 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
134 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); | 136 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
135 | 137 |
136 // Write to |dispatcher1_|, which should make |dispatcher0_| readable. | 138 // Write to |dispatcher1_|, which should make |dispatcher0_| readable. |
137 char buffer[] = "abcd"; | 139 char buffer[] = "abcd"; |
138 w.Init(); | 140 w.Init(); |
139 ASSERT_EQ(MOJO_RESULT_OK, | 141 ASSERT_EQ(MOJO_RESULT_OK, |
140 dispatcher1_->WriteMessage(buffer, sizeof(buffer), nullptr, 0, | 142 dispatcher1_->WriteMessage(buffer, sizeof(buffer), nullptr, 0, |
141 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 143 MOJO_WRITE_MESSAGE_FLAG_NONE, |
| 144 &request_context)); |
142 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); | 145 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); |
143 woken_dispatcher = nullptr; | 146 woken_dispatcher = nullptr; |
144 context = 0; | 147 context = 0; |
145 EXPECT_EQ(MOJO_RESULT_OK, | 148 EXPECT_EQ(MOJO_RESULT_OK, |
146 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); | 149 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); |
147 EXPECT_EQ(dispatcher0_, woken_dispatcher); | 150 EXPECT_EQ(dispatcher0_, woken_dispatcher); |
148 EXPECT_EQ(1u, context); | 151 EXPECT_EQ(1u, context); |
149 | 152 |
150 // Again, if a ready dispatcher isn't removed, it will continue to be | 153 // Again, if a ready dispatcher isn't removed, it will continue to be |
151 // returned. | 154 // returned. |
152 woken_dispatcher = nullptr; | 155 woken_dispatcher = nullptr; |
153 EXPECT_EQ(MOJO_RESULT_OK, | 156 EXPECT_EQ(MOJO_RESULT_OK, |
154 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); | 157 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
155 EXPECT_EQ(dispatcher0_, woken_dispatcher); | 158 EXPECT_EQ(dispatcher0_, woken_dispatcher); |
156 | 159 |
157 wait_set->RemoveAwakable(&w, nullptr); | 160 wait_set->RemoveAwakable(&w, nullptr); |
158 } | 161 } |
159 | 162 |
160 TEST_F(WaitSetDispatcherTest, HandleWithoutRemoving) { | 163 TEST_F(WaitSetDispatcherTest, HandleWithoutRemoving) { |
161 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); | 164 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); |
162 CloseOnShutdown(wait_set); | 165 CloseOnShutdown(wait_set); |
163 ASSERT_EQ(MOJO_RESULT_OK, | 166 ASSERT_EQ(MOJO_RESULT_OK, |
164 wait_set->AddWaitingDispatcher(dispatcher0_, | 167 wait_set->AddWaitingDispatcher(dispatcher0_, |
165 MOJO_HANDLE_SIGNAL_READABLE, 1)); | 168 MOJO_HANDLE_SIGNAL_READABLE, 1)); |
166 | 169 |
| 170 Dispatcher::RequestContext request_context; |
167 Waiter w; | 171 Waiter w; |
168 uintptr_t context = 0; | 172 uintptr_t context = 0; |
169 w.Init(); | 173 w.Init(); |
170 HandleSignalsState hss; | 174 HandleSignalsState hss; |
171 // No ready dispatcher. | 175 // No ready dispatcher. |
172 hss = HandleSignalsState(); | 176 hss = HandleSignalsState(); |
173 EXPECT_EQ(MOJO_RESULT_OK, | 177 EXPECT_EQ(MOJO_RESULT_OK, |
174 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); | 178 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
175 EXPECT_FALSE(hss.satisfies(MOJO_HANDLE_SIGNAL_READABLE)); | 179 EXPECT_FALSE(hss.satisfies(MOJO_HANDLE_SIGNAL_READABLE)); |
176 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); | 180 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); |
177 scoped_refptr<Dispatcher> woken_dispatcher; | 181 scoped_refptr<Dispatcher> woken_dispatcher; |
178 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 182 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
179 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); | 183 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
180 | 184 |
181 // The tested behaviour below should be repeatable. | 185 // The tested behaviour below should be repeatable. |
182 for (size_t i = 0; i < 3; i++) { | 186 for (size_t i = 0; i < 3; i++) { |
183 // Write to |dispatcher1_|, which should make |dispatcher0_| readable. | 187 // Write to |dispatcher1_|, which should make |dispatcher0_| readable. |
184 char buffer[] = "abcd"; | 188 char buffer[] = "abcd"; |
185 w.Init(); | 189 w.Init(); |
186 ASSERT_EQ(MOJO_RESULT_OK, | 190 ASSERT_EQ(MOJO_RESULT_OK, |
187 dispatcher1_->WriteMessage(buffer, sizeof(buffer), nullptr, 0, | 191 dispatcher1_->WriteMessage(buffer, sizeof(buffer), nullptr, 0, |
188 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 192 MOJO_WRITE_MESSAGE_FLAG_NONE, |
| 193 &request_context)); |
189 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); | 194 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); |
190 woken_dispatcher = nullptr; | 195 woken_dispatcher = nullptr; |
191 context = 0; | 196 context = 0; |
192 EXPECT_EQ(MOJO_RESULT_OK, | 197 EXPECT_EQ(MOJO_RESULT_OK, |
193 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); | 198 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); |
194 EXPECT_EQ(dispatcher0_, woken_dispatcher); | 199 EXPECT_EQ(dispatcher0_, woken_dispatcher); |
195 EXPECT_EQ(1u, context); | 200 EXPECT_EQ(1u, context); |
196 | 201 |
197 // Read from |dispatcher0_| which should change it's state to non-readable. | 202 // Read from |dispatcher0_| which should change it's state to non-readable. |
198 char read_buffer[sizeof(buffer) + 5]; | 203 char read_buffer[sizeof(buffer) + 5]; |
199 uint32_t num_bytes = sizeof(read_buffer); | 204 uint32_t num_bytes = sizeof(read_buffer); |
200 ASSERT_EQ(MOJO_RESULT_OK, | 205 ASSERT_EQ(MOJO_RESULT_OK, |
201 dispatcher0_->ReadMessage(read_buffer, &num_bytes, nullptr, | 206 dispatcher0_->ReadMessage(read_buffer, &num_bytes, nullptr, |
202 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); | 207 nullptr, MOJO_READ_MESSAGE_FLAG_NONE, |
| 208 &request_context)); |
203 EXPECT_EQ(sizeof(buffer), num_bytes); | 209 EXPECT_EQ(sizeof(buffer), num_bytes); |
204 | 210 |
205 // No dispatchers are ready. | 211 // No dispatchers are ready. |
206 w.Init(); | 212 w.Init(); |
207 woken_dispatcher = nullptr; | 213 woken_dispatcher = nullptr; |
208 context = 0; | 214 context = 0; |
209 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 215 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
210 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); | 216 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); |
211 EXPECT_EQ(nullptr, woken_dispatcher); | 217 EXPECT_EQ(nullptr, woken_dispatcher); |
212 EXPECT_EQ(0u, context); | 218 EXPECT_EQ(0u, context); |
(...skipping 17 matching lines...) Expand all Loading... |
230 ASSERT_EQ(MOJO_RESULT_OK, | 236 ASSERT_EQ(MOJO_RESULT_OK, |
231 wait_set->AddWaitingDispatcher(dispatcher1_, | 237 wait_set->AddWaitingDispatcher(dispatcher1_, |
232 MOJO_HANDLE_SIGNAL_WRITABLE, 0)); | 238 MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
233 ASSERT_EQ(MOJO_RESULT_OK, | 239 ASSERT_EQ(MOJO_RESULT_OK, |
234 wait_set->AddWaitingDispatcher(mp1_dispatcher0, | 240 wait_set->AddWaitingDispatcher(mp1_dispatcher0, |
235 MOJO_HANDLE_SIGNAL_WRITABLE, 0)); | 241 MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
236 ASSERT_EQ(MOJO_RESULT_OK, | 242 ASSERT_EQ(MOJO_RESULT_OK, |
237 wait_set->AddWaitingDispatcher(mp1_dispatcher1, | 243 wait_set->AddWaitingDispatcher(mp1_dispatcher1, |
238 MOJO_HANDLE_SIGNAL_WRITABLE, 0)); | 244 MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
239 | 245 |
| 246 Dispatcher::RequestContext request_context; |
240 Waiter w; | 247 Waiter w; |
241 w.Init(); | 248 w.Init(); |
242 HandleSignalsState hss; | 249 HandleSignalsState hss; |
243 // The three writable dispatchers should be ready. | 250 // The three writable dispatchers should be ready. |
244 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 251 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
245 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); | 252 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
246 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 253 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
247 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 254 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
248 | 255 |
249 scoped_refptr<Dispatcher> woken_dispatcher; | 256 scoped_refptr<Dispatcher> woken_dispatcher; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 nullptr)); | 312 nullptr)); |
306 EXPECT_EQ(2u, count); | 313 EXPECT_EQ(2u, count); |
307 std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); | 314 std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); |
308 EXPECT_EQ(expected_dispatchers, dispatchers_vector); | 315 EXPECT_EQ(expected_dispatchers, dispatchers_vector); |
309 | 316 |
310 // Write to |dispatcher1_|, which should make |dispatcher0_| readable. | 317 // Write to |dispatcher1_|, which should make |dispatcher0_| readable. |
311 char buffer[] = "abcd"; | 318 char buffer[] = "abcd"; |
312 w.Init(); | 319 w.Init(); |
313 ASSERT_EQ(MOJO_RESULT_OK, | 320 ASSERT_EQ(MOJO_RESULT_OK, |
314 dispatcher1_->WriteMessage(buffer, sizeof(buffer), nullptr, 0, | 321 dispatcher1_->WriteMessage(buffer, sizeof(buffer), nullptr, 0, |
315 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 322 MOJO_WRITE_MESSAGE_FLAG_NONE, |
| 323 &request_context)); |
316 { | 324 { |
317 Waiter mp_w; | 325 Waiter mp_w; |
318 mp_w.Init(); | 326 mp_w.Init(); |
319 // Wait for |dispatcher0_| to be readable. | 327 // Wait for |dispatcher0_| to be readable. |
320 if (dispatcher0_->AddAwakable(&mp_w, MOJO_HANDLE_SIGNAL_READABLE, 0, | 328 if (dispatcher0_->AddAwakable(&mp_w, MOJO_HANDLE_SIGNAL_READABLE, 0, |
321 nullptr) == MOJO_RESULT_OK) { | 329 nullptr) == MOJO_RESULT_OK) { |
322 EXPECT_EQ(MOJO_RESULT_OK, mp_w.Wait(MOJO_DEADLINE_INDEFINITE, 0)); | 330 EXPECT_EQ(MOJO_RESULT_OK, mp_w.Wait(MOJO_DEADLINE_INDEFINITE, 0)); |
323 dispatcher0_->RemoveAwakable(&mp_w, nullptr); | 331 dispatcher0_->RemoveAwakable(&mp_w, nullptr); |
324 } | 332 } |
325 } | 333 } |
(...skipping 29 matching lines...) Expand all Loading... |
355 MOJO_HANDLE_SIGNAL_READABLE, 0)); | 363 MOJO_HANDLE_SIGNAL_READABLE, 0)); |
356 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 364 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
357 wait_set->AddWaitingDispatcher(dispatcher0_, | 365 wait_set->AddWaitingDispatcher(dispatcher0_, |
358 MOJO_HANDLE_SIGNAL_READABLE, 0)); | 366 MOJO_HANDLE_SIGNAL_READABLE, 0)); |
359 | 367 |
360 // Remove a dispatcher that wasn't added. | 368 // Remove a dispatcher that wasn't added. |
361 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, | 369 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, |
362 wait_set->RemoveWaitingDispatcher(dispatcher1_)); | 370 wait_set->RemoveWaitingDispatcher(dispatcher1_)); |
363 | 371 |
364 // Add to a closed wait set. | 372 // Add to a closed wait set. |
365 wait_set->Close(); | 373 Dispatcher::RequestContext request_context; |
| 374 wait_set->Close(&request_context); |
366 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 375 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
367 wait_set->AddWaitingDispatcher(dispatcher0_, | 376 wait_set->AddWaitingDispatcher(dispatcher0_, |
368 MOJO_HANDLE_SIGNAL_READABLE, 0)); | 377 MOJO_HANDLE_SIGNAL_READABLE, 0)); |
369 } | 378 } |
370 | 379 |
371 TEST_F(WaitSetDispatcherTest, NotSatisfiable) { | 380 TEST_F(WaitSetDispatcherTest, NotSatisfiable) { |
372 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); | 381 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); |
373 CloseOnShutdown(wait_set); | 382 CloseOnShutdown(wait_set); |
374 | 383 |
375 // Wait sets can only satisfy MOJO_HANDLE_SIGNAL_READABLE. | 384 // Wait sets can only satisfy MOJO_HANDLE_SIGNAL_READABLE. |
376 Waiter w; | 385 Waiter w; |
377 w.Init(); | 386 w.Init(); |
378 HandleSignalsState hss; | 387 HandleSignalsState hss; |
379 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 388 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
380 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); | 389 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); |
381 EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, hss.satisfied_signals); | 390 EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, hss.satisfied_signals); |
382 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 391 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
383 | 392 |
384 hss = HandleSignalsState(); | 393 hss = HandleSignalsState(); |
385 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 394 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
386 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 0, &hss)); | 395 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 0, &hss)); |
387 EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, hss.satisfied_signals); | 396 EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, hss.satisfied_signals); |
388 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 397 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
389 } | 398 } |
390 | 399 |
391 TEST_F(WaitSetDispatcherTest, ClosedDispatchers) { | 400 TEST_F(WaitSetDispatcherTest, ClosedDispatchers) { |
392 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); | 401 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); |
393 CloseOnShutdown(wait_set); | 402 CloseOnShutdown(wait_set); |
394 | 403 |
| 404 Dispatcher::RequestContext request_context; |
395 Waiter w; | 405 Waiter w; |
396 w.Init(); | 406 w.Init(); |
397 HandleSignalsState hss; | 407 HandleSignalsState hss; |
398 // A dispatcher that was added and then closed will be cancelled. | 408 // A dispatcher that was added and then closed will be cancelled. |
399 ASSERT_EQ(MOJO_RESULT_OK, | 409 ASSERT_EQ(MOJO_RESULT_OK, |
400 wait_set->AddWaitingDispatcher(dispatcher0_, | 410 wait_set->AddWaitingDispatcher(dispatcher0_, |
401 MOJO_HANDLE_SIGNAL_READABLE, 0)); | 411 MOJO_HANDLE_SIGNAL_READABLE, 0)); |
402 EXPECT_EQ(MOJO_RESULT_OK, | 412 EXPECT_EQ(MOJO_RESULT_OK, |
403 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); | 413 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
404 dispatcher0_->Close(); | 414 dispatcher0_->Close(&request_context); |
405 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); | 415 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); |
406 EXPECT_TRUE( | 416 EXPECT_TRUE( |
407 wait_set->GetHandleSignalsState().satisfies(MOJO_HANDLE_SIGNAL_READABLE)); | 417 wait_set->GetHandleSignalsState().satisfies(MOJO_HANDLE_SIGNAL_READABLE)); |
408 scoped_refptr<Dispatcher> woken_dispatcher; | 418 scoped_refptr<Dispatcher> woken_dispatcher; |
409 EXPECT_EQ(MOJO_RESULT_CANCELLED, | 419 EXPECT_EQ(MOJO_RESULT_CANCELLED, |
410 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); | 420 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
411 EXPECT_EQ(dispatcher0_, woken_dispatcher); | 421 EXPECT_EQ(dispatcher0_, woken_dispatcher); |
412 | 422 |
413 // Dispatcher will be implicitly removed because it may be impossible to | 423 // Dispatcher will be implicitly removed because it may be impossible to |
414 // remove explicitly. | 424 // remove explicitly. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
458 EXPECT_EQ(MOJO_RESULT_OK, | 468 EXPECT_EQ(MOJO_RESULT_OK, |
459 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); | 469 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
460 EXPECT_EQ(nested_wait_set, woken_dispatcher); | 470 EXPECT_EQ(nested_wait_set, woken_dispatcher); |
461 | 471 |
462 wait_set->RemoveAwakable(&w, nullptr); | 472 wait_set->RemoveAwakable(&w, nullptr); |
463 } | 473 } |
464 | 474 |
465 } // namespace | 475 } // namespace |
466 } // namespace edk | 476 } // namespace edk |
467 } // namespace mojo | 477 } // namespace mojo |
OLD | NEW |