Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(361)

Side by Side Diff: mojo/edk/system/dispatcher_unittest.cc

Issue 2084593005: Rationalize AddAwakable...() and RemoveAwakable...() methods. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: doh Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « mojo/edk/system/dispatcher.cc ('k') | mojo/edk/system/ipc_support_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « mojo/edk/system/dispatcher.cc ('k') | mojo/edk/system/ipc_support_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698