| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/dispatcher.h" | 5 #include "mojo/edk/system/dispatcher.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <thread> | 8 #include <thread> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 68 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 69 d->GetBufferInformation(NullUserPointer(), 0u)); | 69 d->GetBufferInformation(NullUserPointer(), 0u)); |
| 70 std::unique_ptr<PlatformSharedBufferMapping> mapping; | 70 std::unique_ptr<PlatformSharedBufferMapping> mapping; |
| 71 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 71 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 72 d->MapBuffer(0u, 1u, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); | 72 d->MapBuffer(0u, 1u, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); |
| 73 EXPECT_FALSE(mapping); | 73 EXPECT_FALSE(mapping); |
| 74 Waiter w; | 74 Waiter w; |
| 75 w.Init(); | 75 w.Init(); |
| 76 HandleSignalsState hss; | 76 HandleSignalsState hss; |
| 77 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 77 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 78 d->AddAwakable(&w, ~MOJO_HANDLE_SIGNAL_NONE, 0, &hss)); | 78 d->AddAwakable(&w, 0, false, ~MOJO_HANDLE_SIGNAL_NONE, &hss)); |
| 79 EXPECT_EQ(0u, hss.satisfied_signals); | 79 EXPECT_EQ(0u, hss.satisfied_signals); |
| 80 EXPECT_EQ(0u, hss.satisfiable_signals); | 80 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 81 // Okay to remove even if it wasn't added (or was already removed). | 81 // Okay to remove even if it wasn't added (or was already removed). |
| 82 hss = HandleSignalsState(); | 82 hss = HandleSignalsState(); |
| 83 d->RemoveAwakable(&w, &hss); | 83 d->RemoveAwakable(false, &w, 0, &hss); |
| 84 EXPECT_EQ(0u, hss.satisfied_signals); | 84 EXPECT_EQ(0u, hss.satisfied_signals); |
| 85 EXPECT_EQ(0u, hss.satisfiable_signals); | 85 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 86 hss = HandleSignalsState(); | 86 hss = HandleSignalsState(); |
| 87 d->RemoveAwakable(&w, &hss); | 87 d->RemoveAwakable(false, &w, 0, &hss); |
| 88 EXPECT_EQ(0u, hss.satisfied_signals); | 88 EXPECT_EQ(0u, hss.satisfied_signals); |
| 89 EXPECT_EQ(0u, hss.satisfiable_signals); | 89 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 90 | 90 |
| 91 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); | 91 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); |
| 92 | 92 |
| 93 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 93 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 94 d->WriteMessage(NullUserPointer(), 0, nullptr, | 94 d->WriteMessage(NullUserPointer(), 0, nullptr, |
| 95 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 95 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 96 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 96 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 97 d->ReadMessage(NullUserPointer(), NullUserPointer(), nullptr, | 97 d->ReadMessage(NullUserPointer(), NullUserPointer(), nullptr, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 123 d->DuplicateBufferHandle(NullUserPointer(), &new_dispatcher)); | 123 d->DuplicateBufferHandle(NullUserPointer(), &new_dispatcher)); |
| 124 EXPECT_FALSE(new_dispatcher); | 124 EXPECT_FALSE(new_dispatcher); |
| 125 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 125 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 126 d->GetBufferInformation(NullUserPointer(), 0u)); | 126 d->GetBufferInformation(NullUserPointer(), 0u)); |
| 127 mapping.reset(); | 127 mapping.reset(); |
| 128 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 128 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 129 d->MapBuffer(0u, 1u, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); | 129 d->MapBuffer(0u, 1u, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); |
| 130 EXPECT_FALSE(mapping); | 130 EXPECT_FALSE(mapping); |
| 131 hss = HandleSignalsState(); | 131 hss = HandleSignalsState(); |
| 132 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 132 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 133 d->AddAwakable(&w, ~MOJO_HANDLE_SIGNAL_NONE, 0, &hss)); | 133 d->AddAwakable(&w, 0, false, ~MOJO_HANDLE_SIGNAL_NONE, &hss)); |
| 134 EXPECT_EQ(0u, hss.satisfied_signals); | 134 EXPECT_EQ(0u, hss.satisfied_signals); |
| 135 EXPECT_EQ(0u, hss.satisfiable_signals); | 135 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 136 hss = HandleSignalsState(); | 136 hss = HandleSignalsState(); |
| 137 d->RemoveAwakable(&w, &hss); | 137 d->RemoveAwakable(false, &w, 0, &hss); |
| 138 EXPECT_EQ(0u, hss.satisfied_signals); | 138 EXPECT_EQ(0u, hss.satisfied_signals); |
| 139 EXPECT_EQ(0u, hss.satisfiable_signals); | 139 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 140 } | 140 } |
| 141 | 141 |
| 142 enum class DispatcherOp { | 142 enum class DispatcherOp { |
| 143 CLOSE = 0, | 143 CLOSE = 0, |
| 144 DUPLICATE_DISPATCHER, | 144 DUPLICATE_DISPATCHER, |
| 145 WRITE_MESSAGE, | 145 WRITE_MESSAGE, |
| 146 READ_MESSAGE, | 146 READ_MESSAGE, |
| 147 SET_DATA_PIPE_PRODUCER_OPTIONS, | 147 SET_DATA_PIPE_PRODUCER_OPTIONS, |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 case DispatcherOp::MAP_BUFFER: { | 259 case DispatcherOp::MAP_BUFFER: { |
| 260 std::unique_ptr<PlatformSharedBufferMapping> mapping; | 260 std::unique_ptr<PlatformSharedBufferMapping> mapping; |
| 261 EXPECT_EQ( | 261 EXPECT_EQ( |
| 262 MOJO_RESULT_INVALID_ARGUMENT, | 262 MOJO_RESULT_INVALID_ARGUMENT, |
| 263 dispatcher->MapBuffer(0u, 1u, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); | 263 dispatcher->MapBuffer(0u, 1u, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); |
| 264 EXPECT_FALSE(mapping); | 264 EXPECT_FALSE(mapping); |
| 265 break; | 265 break; |
| 266 } | 266 } |
| 267 case DispatcherOp::ADD_AWAKABLE: { | 267 case DispatcherOp::ADD_AWAKABLE: { |
| 268 HandleSignalsState hss; | 268 HandleSignalsState hss; |
| 269 MojoResult r = | 269 MojoResult r = dispatcher->AddAwakable(&waiter, 0, false, |
| 270 dispatcher->AddAwakable(&waiter, ~MOJO_HANDLE_SIGNAL_NONE, 0, &hss); | 270 ~MOJO_HANDLE_SIGNAL_NONE, &hss); |
| 271 EXPECT_TRUE(r == MOJO_RESULT_FAILED_PRECONDITION || | 271 EXPECT_TRUE(r == MOJO_RESULT_FAILED_PRECONDITION || |
| 272 r == MOJO_RESULT_INVALID_ARGUMENT); | 272 r == MOJO_RESULT_INVALID_ARGUMENT); |
| 273 EXPECT_EQ(0u, hss.satisfied_signals); | 273 EXPECT_EQ(0u, hss.satisfied_signals); |
| 274 EXPECT_EQ(0u, hss.satisfiable_signals); | 274 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 275 break; | 275 break; |
| 276 } | 276 } |
| 277 case DispatcherOp::REMOVE_AWAKABLE: { | 277 case DispatcherOp::REMOVE_AWAKABLE: { |
| 278 HandleSignalsState hss; | 278 HandleSignalsState hss; |
| 279 dispatcher->RemoveAwakable(&waiter, &hss); | 279 dispatcher->RemoveAwakable(false, &waiter, 0, &hss); |
| 280 EXPECT_EQ(0u, hss.satisfied_signals); | 280 EXPECT_EQ(0u, hss.satisfied_signals); |
| 281 EXPECT_EQ(0u, hss.satisfiable_signals); | 281 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 282 break; | 282 break; |
| 283 } | 283 } |
| 284 default: | 284 default: |
| 285 NOTREACHED(); | 285 NOTREACHED(); |
| 286 break; | 286 break; |
| 287 } | 287 } |
| 288 | 288 |
| 289 // Always try to remove the waiter, in case we added it. | 289 // Always try to remove the waiter, in case we added it. |
| 290 HandleSignalsState hss; | 290 HandleSignalsState hss; |
| 291 dispatcher->RemoveAwakable(&waiter, &hss); | 291 dispatcher->RemoveAwakable(false, &waiter, 0, &hss); |
| 292 EXPECT_EQ(0u, hss.satisfied_signals); | 292 EXPECT_EQ(0u, hss.satisfied_signals); |
| 293 EXPECT_EQ(0u, hss.satisfiable_signals); | 293 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 294 } | 294 } |
| 295 | 295 |
| 296 TEST(DispatcherTest, ThreadSafetyStress) { | 296 TEST(DispatcherTest, ThreadSafetyStress) { |
| 297 static const size_t kRepeatCount = 20; | 297 static const size_t kRepeatCount = 20; |
| 298 static const size_t kNumThreads = 100; | 298 static const size_t kNumThreads = 100; |
| 299 | 299 |
| 300 for (size_t i = 0; i < kRepeatCount; i++) { | 300 for (size_t i = 0; i < kRepeatCount; i++) { |
| 301 // Manual reset, not initially signaled. | 301 // Manual reset, not initially signaled. |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 for (auto& thread : threads) | 346 for (auto& thread : threads) |
| 347 thread.join(); | 347 thread.join(); |
| 348 | 348 |
| 349 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); | 349 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); |
| 350 } | 350 } |
| 351 } | 351 } |
| 352 | 352 |
| 353 } // namespace | 353 } // namespace |
| 354 } // namespace system | 354 } // namespace system |
| 355 } // namespace mojo | 355 } // namespace mojo |
| OLD | NEW |