| 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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 d->BeginWriteData(NullUserPointer(), NullUserPointer(), | 67 d->BeginWriteData(NullUserPointer(), NullUserPointer(), |
| 68 MOJO_WRITE_DATA_FLAG_NONE)); | 68 MOJO_WRITE_DATA_FLAG_NONE)); |
| 69 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, d->EndWriteData(0)); | 69 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, d->EndWriteData(0)); |
| 70 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 70 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 71 d->ReadData(NullUserPointer(), NullUserPointer(), | 71 d->ReadData(NullUserPointer(), NullUserPointer(), |
| 72 MOJO_READ_DATA_FLAG_NONE)); | 72 MOJO_READ_DATA_FLAG_NONE)); |
| 73 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 73 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 74 d->BeginReadData(NullUserPointer(), NullUserPointer(), | 74 d->BeginReadData(NullUserPointer(), NullUserPointer(), |
| 75 MOJO_READ_DATA_FLAG_NONE)); | 75 MOJO_READ_DATA_FLAG_NONE)); |
| 76 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, d->EndReadData(0)); | 76 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, d->EndReadData(0)); |
| 77 RefPtr<Dispatcher> new_dispatcher; |
| 78 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 79 d->DuplicateBufferHandle(NullUserPointer(), &new_dispatcher)); |
| 80 EXPECT_FALSE(new_dispatcher); |
| 81 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 82 d->GetBufferInformation(NullUserPointer(), 0u)); |
| 83 std::unique_ptr<PlatformSharedBufferMapping> mapping; |
| 84 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 85 d->MapBuffer(0u, 1u, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); |
| 86 EXPECT_FALSE(mapping); |
| 77 Waiter w; | 87 Waiter w; |
| 78 w.Init(); | 88 w.Init(); |
| 79 HandleSignalsState hss; | 89 HandleSignalsState hss; |
| 80 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 90 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 81 d->AddAwakable(&w, ~MOJO_HANDLE_SIGNAL_NONE, 0, &hss)); | 91 d->AddAwakable(&w, ~MOJO_HANDLE_SIGNAL_NONE, 0, &hss)); |
| 82 EXPECT_EQ(0u, hss.satisfied_signals); | 92 EXPECT_EQ(0u, hss.satisfied_signals); |
| 83 EXPECT_EQ(0u, hss.satisfiable_signals); | 93 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 84 // Okay to remove even if it wasn't added (or was already removed). | 94 // Okay to remove even if it wasn't added (or was already removed). |
| 85 hss = HandleSignalsState(); | 95 hss = HandleSignalsState(); |
| 86 d->RemoveAwakable(&w, &hss); | 96 d->RemoveAwakable(&w, &hss); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 106 d->BeginWriteData(NullUserPointer(), NullUserPointer(), | 116 d->BeginWriteData(NullUserPointer(), NullUserPointer(), |
| 107 MOJO_WRITE_DATA_FLAG_NONE)); | 117 MOJO_WRITE_DATA_FLAG_NONE)); |
| 108 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, d->EndWriteData(0)); | 118 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, d->EndWriteData(0)); |
| 109 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 119 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 110 d->ReadData(NullUserPointer(), NullUserPointer(), | 120 d->ReadData(NullUserPointer(), NullUserPointer(), |
| 111 MOJO_READ_DATA_FLAG_NONE)); | 121 MOJO_READ_DATA_FLAG_NONE)); |
| 112 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 122 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 113 d->BeginReadData(NullUserPointer(), NullUserPointer(), | 123 d->BeginReadData(NullUserPointer(), NullUserPointer(), |
| 114 MOJO_READ_DATA_FLAG_NONE)); | 124 MOJO_READ_DATA_FLAG_NONE)); |
| 115 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, d->EndReadData(0)); | 125 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, d->EndReadData(0)); |
| 126 new_dispatcher = nullptr; |
| 127 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 128 d->DuplicateBufferHandle(NullUserPointer(), &new_dispatcher)); |
| 129 EXPECT_FALSE(new_dispatcher); |
| 130 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 131 d->GetBufferInformation(NullUserPointer(), 0u)); |
| 132 mapping.reset(); |
| 133 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 134 d->MapBuffer(0u, 1u, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); |
| 135 EXPECT_FALSE(mapping); |
| 116 hss = HandleSignalsState(); | 136 hss = HandleSignalsState(); |
| 117 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 137 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 118 d->AddAwakable(&w, ~MOJO_HANDLE_SIGNAL_NONE, 0, &hss)); | 138 d->AddAwakable(&w, ~MOJO_HANDLE_SIGNAL_NONE, 0, &hss)); |
| 119 EXPECT_EQ(0u, hss.satisfied_signals); | 139 EXPECT_EQ(0u, hss.satisfied_signals); |
| 120 EXPECT_EQ(0u, hss.satisfiable_signals); | 140 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 121 hss = HandleSignalsState(); | 141 hss = HandleSignalsState(); |
| 122 d->RemoveAwakable(&w, &hss); | 142 d->RemoveAwakable(&w, &hss); |
| 123 EXPECT_EQ(0u, hss.satisfied_signals); | 143 EXPECT_EQ(0u, hss.satisfied_signals); |
| 124 EXPECT_EQ(0u, hss.satisfiable_signals); | 144 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 125 } | 145 } |
| 126 | 146 |
| 127 enum class DispatcherOp { | 147 enum class DispatcherOp { |
| 128 CLOSE = 0, | 148 CLOSE = 0, |
| 129 WRITE_MESSAGE, | 149 WRITE_MESSAGE, |
| 130 READ_MESSAGE, | 150 READ_MESSAGE, |
| 131 WRITE_DATA, | 151 WRITE_DATA, |
| 132 BEGIN_WRITE_DATA, | 152 BEGIN_WRITE_DATA, |
| 133 END_WRITE_DATA, | 153 END_WRITE_DATA, |
| 134 READ_DATA, | 154 READ_DATA, |
| 135 BEGIN_READ_DATA, | 155 BEGIN_READ_DATA, |
| 136 END_READ_DATA, | 156 END_READ_DATA, |
| 137 DUPLICATE_BUFFER_HANDLE, | 157 DUPLICATE_BUFFER_HANDLE, |
| 158 GET_BUFFER_INFORMATION, |
| 138 MAP_BUFFER, | 159 MAP_BUFFER, |
| 139 ADD_WAITER, | 160 ADD_AWAKABLE, |
| 140 REMOVE_WAITER, | 161 REMOVE_AWAKABLE, |
| 141 COUNT | 162 COUNT |
| 142 }; | 163 }; |
| 143 | 164 |
| 144 void ThreadSafetyStressHelper(ManualResetWaitableEvent* event, | 165 void ThreadSafetyStressHelper(ManualResetWaitableEvent* event, |
| 145 RefPtr<Dispatcher>&& dispatcher, | 166 RefPtr<Dispatcher>&& dispatcher, |
| 146 DispatcherOp op) { | 167 DispatcherOp op) { |
| 147 CHECK_LE(0, static_cast<int>(op)); | 168 CHECK_LE(0, static_cast<int>(op)); |
| 148 CHECK_LT(static_cast<int>(op), static_cast<int>(DispatcherOp::COUNT)); | 169 CHECK_LT(static_cast<int>(op), static_cast<int>(DispatcherOp::COUNT)); |
| 149 | 170 |
| 150 event->Wait(); | 171 event->Wait(); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 break; | 210 break; |
| 190 case DispatcherOp::BEGIN_READ_DATA: | 211 case DispatcherOp::BEGIN_READ_DATA: |
| 191 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 212 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 192 dispatcher->BeginReadData(NullUserPointer(), NullUserPointer(), | 213 dispatcher->BeginReadData(NullUserPointer(), NullUserPointer(), |
| 193 MOJO_READ_DATA_FLAG_NONE)); | 214 MOJO_READ_DATA_FLAG_NONE)); |
| 194 break; | 215 break; |
| 195 case DispatcherOp::END_READ_DATA: | 216 case DispatcherOp::END_READ_DATA: |
| 196 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, dispatcher->EndReadData(0)); | 217 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, dispatcher->EndReadData(0)); |
| 197 break; | 218 break; |
| 198 case DispatcherOp::DUPLICATE_BUFFER_HANDLE: { | 219 case DispatcherOp::DUPLICATE_BUFFER_HANDLE: { |
| 199 RefPtr<Dispatcher> unused; | 220 RefPtr<Dispatcher> new_dispatcher; |
| 200 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 221 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 201 dispatcher->DuplicateBufferHandle(NullUserPointer(), &unused)); | 222 dispatcher->DuplicateBufferHandle(NullUserPointer(), |
| 223 &new_dispatcher)); |
| 224 EXPECT_FALSE(new_dispatcher); |
| 202 break; | 225 break; |
| 203 } | 226 } |
| 227 case DispatcherOp::GET_BUFFER_INFORMATION: |
| 228 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 229 dispatcher->GetBufferInformation(NullUserPointer(), 0u)); |
| 230 break; |
| 204 case DispatcherOp::MAP_BUFFER: { | 231 case DispatcherOp::MAP_BUFFER: { |
| 205 std::unique_ptr<PlatformSharedBufferMapping> unused; | 232 std::unique_ptr<PlatformSharedBufferMapping> mapping; |
| 206 EXPECT_EQ( | 233 EXPECT_EQ( |
| 207 MOJO_RESULT_INVALID_ARGUMENT, | 234 MOJO_RESULT_INVALID_ARGUMENT, |
| 208 dispatcher->MapBuffer(0u, 0u, MOJO_MAP_BUFFER_FLAG_NONE, &unused)); | 235 dispatcher->MapBuffer(0u, 1u, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); |
| 236 EXPECT_FALSE(mapping); |
| 209 break; | 237 break; |
| 210 } | 238 } |
| 211 case DispatcherOp::ADD_WAITER: { | 239 case DispatcherOp::ADD_AWAKABLE: { |
| 212 HandleSignalsState hss; | 240 HandleSignalsState hss; |
| 213 MojoResult r = | 241 MojoResult r = |
| 214 dispatcher->AddAwakable(&waiter, ~MOJO_HANDLE_SIGNAL_NONE, 0, &hss); | 242 dispatcher->AddAwakable(&waiter, ~MOJO_HANDLE_SIGNAL_NONE, 0, &hss); |
| 215 EXPECT_TRUE(r == MOJO_RESULT_FAILED_PRECONDITION || | 243 EXPECT_TRUE(r == MOJO_RESULT_FAILED_PRECONDITION || |
| 216 r == MOJO_RESULT_INVALID_ARGUMENT); | 244 r == MOJO_RESULT_INVALID_ARGUMENT); |
| 217 EXPECT_EQ(0u, hss.satisfied_signals); | 245 EXPECT_EQ(0u, hss.satisfied_signals); |
| 218 EXPECT_EQ(0u, hss.satisfiable_signals); | 246 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 219 break; | 247 break; |
| 220 } | 248 } |
| 221 case DispatcherOp::REMOVE_WAITER: { | 249 case DispatcherOp::REMOVE_AWAKABLE: { |
| 222 HandleSignalsState hss; | 250 HandleSignalsState hss; |
| 223 dispatcher->RemoveAwakable(&waiter, &hss); | 251 dispatcher->RemoveAwakable(&waiter, &hss); |
| 224 EXPECT_EQ(0u, hss.satisfied_signals); | 252 EXPECT_EQ(0u, hss.satisfied_signals); |
| 225 EXPECT_EQ(0u, hss.satisfiable_signals); | 253 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 226 break; | 254 break; |
| 227 } | 255 } |
| 228 default: | 256 default: |
| 229 NOTREACHED(); | 257 NOTREACHED(); |
| 230 break; | 258 break; |
| 231 } | 259 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 for (auto& thread : threads) | 316 for (auto& thread : threads) |
| 289 thread.join(); | 317 thread.join(); |
| 290 | 318 |
| 291 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); | 319 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); |
| 292 } | 320 } |
| 293 } | 321 } |
| 294 | 322 |
| 295 } // namespace | 323 } // namespace |
| 296 } // namespace system | 324 } // namespace system |
| 297 } // namespace mojo | 325 } // namespace mojo |
| OLD | NEW |