| 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 |