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

Side by Side Diff: mojo/edk/system/remote_message_pipe_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/remote_data_pipe_impl_unittest.cc ('k') | mojo/edk/system/simple_dispatcher.h » ('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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 <stdint.h> 5 #include <stdint.h>
6 #include <stdio.h> 6 #include <stdio.h>
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <utility> 10 #include <utility>
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 RefPtr<ChannelEndpoint> ep1; 189 RefPtr<ChannelEndpoint> ep1;
190 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); 190 auto mp1 = MessagePipe::CreateProxyLocal(&ep1);
191 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); 191 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1));
192 192
193 // Write in one direction: MP 0, port 0 -> ... -> MP 1, port 1. 193 // Write in one direction: MP 0, port 0 -> ... -> MP 1, port 1.
194 194
195 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do 195 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do
196 // it later, it might already be readable.) 196 // it later, it might already be readable.)
197 waiter.Init(); 197 waiter.Init();
198 ASSERT_EQ(MOJO_RESULT_OK, 198 ASSERT_EQ(MOJO_RESULT_OK,
199 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 199 mp1->AddAwakable(1, &waiter, 123, false,
200 123, nullptr)); 200 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
201 201
202 // Write to MP 0, port 0. 202 // Write to MP 0, port 0.
203 EXPECT_EQ( 203 EXPECT_EQ(
204 MOJO_RESULT_OK, 204 MOJO_RESULT_OK,
205 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), 205 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello),
206 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 206 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
207 207
208 // Wait. 208 // Wait.
209 EXPECT_EQ(MOJO_RESULT_OK, 209 EXPECT_EQ(MOJO_RESULT_OK,
210 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 210 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
211 EXPECT_EQ(123u, context); 211 EXPECT_EQ(123u, context);
212 hss = HandleSignalsState(); 212 hss = HandleSignalsState();
213 mp1->RemoveAwakable(1, &waiter, &hss); 213 mp1->RemoveAwakable(1, false, &waiter, 0, &hss);
214 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 214 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
215 hss.satisfied_signals); 215 hss.satisfied_signals);
216 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 216 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
217 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 217 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
218 hss.satisfiable_signals); 218 hss.satisfiable_signals);
219 219
220 // Read from MP 1, port 1. 220 // Read from MP 1, port 1.
221 EXPECT_EQ(MOJO_RESULT_OK, 221 EXPECT_EQ(MOJO_RESULT_OK,
222 mp1->ReadMessage(1, UserPointer<void>(buffer), 222 mp1->ReadMessage(1, UserPointer<void>(buffer),
223 MakeUserPointer(&buffer_size), nullptr, nullptr, 223 MakeUserPointer(&buffer_size), nullptr, nullptr,
224 MOJO_READ_MESSAGE_FLAG_NONE)); 224 MOJO_READ_MESSAGE_FLAG_NONE));
225 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); 225 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size));
226 EXPECT_STREQ(kHello, buffer); 226 EXPECT_STREQ(kHello, buffer);
227 227
228 // Write in the other direction: MP 1, port 1 -> ... -> MP 0, port 0. 228 // Write in the other direction: MP 1, port 1 -> ... -> MP 0, port 0.
229 229
230 waiter.Init(); 230 waiter.Init();
231 ASSERT_EQ(MOJO_RESULT_OK, 231 ASSERT_EQ(MOJO_RESULT_OK,
232 mp0->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 232 mp0->AddAwakable(0, &waiter, 456, false,
233 456, nullptr)); 233 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
234 234
235 EXPECT_EQ( 235 EXPECT_EQ(
236 MOJO_RESULT_OK, 236 MOJO_RESULT_OK,
237 mp1->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld), 237 mp1->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld),
238 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 238 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
239 239
240 EXPECT_EQ(MOJO_RESULT_OK, 240 EXPECT_EQ(MOJO_RESULT_OK,
241 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 241 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
242 EXPECT_EQ(456u, context); 242 EXPECT_EQ(456u, context);
243 hss = HandleSignalsState(); 243 hss = HandleSignalsState();
244 mp0->RemoveAwakable(0, &waiter, &hss); 244 mp0->RemoveAwakable(0, false, &waiter, 0, &hss);
245 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 245 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
246 hss.satisfied_signals); 246 hss.satisfied_signals);
247 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 247 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
248 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 248 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
249 hss.satisfiable_signals); 249 hss.satisfiable_signals);
250 250
251 buffer_size = static_cast<uint32_t>(sizeof(buffer)); 251 buffer_size = static_cast<uint32_t>(sizeof(buffer));
252 EXPECT_EQ(MOJO_RESULT_OK, 252 EXPECT_EQ(MOJO_RESULT_OK,
253 mp0->ReadMessage(0, UserPointer<void>(buffer), 253 mp0->ReadMessage(0, UserPointer<void>(buffer),
254 MakeUserPointer(&buffer_size), nullptr, nullptr, 254 MakeUserPointer(&buffer_size), nullptr, nullptr,
255 MOJO_READ_MESSAGE_FLAG_NONE)); 255 MOJO_READ_MESSAGE_FLAG_NONE));
256 EXPECT_EQ(sizeof(kWorld), static_cast<size_t>(buffer_size)); 256 EXPECT_EQ(sizeof(kWorld), static_cast<size_t>(buffer_size));
257 EXPECT_STREQ(kWorld, buffer); 257 EXPECT_STREQ(kWorld, buffer);
258 258
259 // Close MP 0, port 0. 259 // Close MP 0, port 0.
260 mp0->Close(0); 260 mp0->Close(0);
261 261
262 // Try to wait for MP 1, port 1 to become readable. This will eventually fail 262 // Try to wait for MP 1, port 1 to become readable. This will eventually fail
263 // when it realizes that MP 0, port 0 has been closed. (It may also fail 263 // when it realizes that MP 0, port 0 has been closed. (It may also fail
264 // immediately.) 264 // immediately.)
265 waiter.Init(); 265 waiter.Init();
266 hss = HandleSignalsState(); 266 hss = HandleSignalsState();
267 MojoResult result = mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 267 MojoResult result = mp1->AddAwakable(1, &waiter, 789, false,
268 false, 789, &hss); 268 MOJO_HANDLE_SIGNAL_READABLE, &hss);
269 if (result == MOJO_RESULT_OK) { 269 if (result == MOJO_RESULT_OK) {
270 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 270 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
271 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 271 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
272 EXPECT_EQ(789u, context); 272 EXPECT_EQ(789u, context);
273 hss = HandleSignalsState(); 273 hss = HandleSignalsState();
274 mp1->RemoveAwakable(1, &waiter, &hss); 274 mp1->RemoveAwakable(1, false, &waiter, 0, &hss);
275 } 275 }
276 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); 276 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
277 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); 277 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
278 278
279 // And MP 1, port 1. 279 // And MP 1, port 1.
280 mp1->Close(1); 280 mp1->Close(1);
281 } 281 }
282 282
283 TEST_F(RemoteMessagePipeTest, PeerClosed) { 283 TEST_F(RemoteMessagePipeTest, PeerClosed) {
284 Waiter waiter; 284 Waiter waiter;
285 HandleSignalsState hss; 285 HandleSignalsState hss;
286 uint64_t context = 0; 286 uint64_t context = 0;
287 287
288 // Connect message pipes. MP 0, port 1 will be attached to channel 0 and 288 // Connect message pipes. MP 0, port 1 will be attached to channel 0 and
289 // connected to MP 1, port 0, which will be attached to channel 1. This leaves 289 // connected to MP 1, port 0, which will be attached to channel 1. This leaves
290 // MP 0, port 0 and MP 1, port 1 as the "user-facing" endpoints. 290 // MP 0, port 0 and MP 1, port 1 as the "user-facing" endpoints.
291 291
292 RefPtr<ChannelEndpoint> ep0; 292 RefPtr<ChannelEndpoint> ep0;
293 auto mp0 = MessagePipe::CreateLocalProxy(&ep0); 293 auto mp0 = MessagePipe::CreateLocalProxy(&ep0);
294 RefPtr<ChannelEndpoint> ep1; 294 RefPtr<ChannelEndpoint> ep1;
295 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); 295 auto mp1 = MessagePipe::CreateProxyLocal(&ep1);
296 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); 296 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1));
297 297
298 // Close MP 0, port 0. 298 // Close MP 0, port 0.
299 mp0->Close(0); 299 mp0->Close(0);
300 300
301 // Try to wait for MP 1, port 1 to be signaled with peer closed. 301 // Try to wait for MP 1, port 1 to be signaled with peer closed.
302 waiter.Init(); 302 waiter.Init();
303 hss = HandleSignalsState(); 303 hss = HandleSignalsState();
304 MojoResult result = mp1->AddAwakable( 304 MojoResult result = mp1->AddAwakable(1, &waiter, 101, false,
305 1, &waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, false, 101, &hss); 305 MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss);
306 if (result == MOJO_RESULT_OK) { 306 if (result == MOJO_RESULT_OK) {
307 EXPECT_EQ(MOJO_RESULT_OK, 307 EXPECT_EQ(MOJO_RESULT_OK,
308 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 308 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
309 EXPECT_EQ(101u, context); 309 EXPECT_EQ(101u, context);
310 hss = HandleSignalsState(); 310 hss = HandleSignalsState();
311 mp1->RemoveAwakable(1, &waiter, &hss); 311 mp1->RemoveAwakable(1, false, &waiter, 0, &hss);
312 } 312 }
313 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); 313 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
314 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); 314 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
315 315
316 // And MP 1, port 1. 316 // And MP 1, port 1.
317 mp1->Close(1); 317 mp1->Close(1);
318 } 318 }
319 319
320 TEST_F(RemoteMessagePipeTest, Multiplex) { 320 TEST_F(RemoteMessagePipeTest, Multiplex) {
321 static const char kHello[] = "hello"; 321 static const char kHello[] = "hello";
(...skipping 28 matching lines...) Expand all
350 EXPECT_GT(max_endpoint_info_size, 0u); 350 EXPECT_GT(max_endpoint_info_size, 0u);
351 ASSERT_EQ(0u, max_platform_handle_count); 351 ASSERT_EQ(0u, max_platform_handle_count);
352 std::unique_ptr<char[]> endpoint_info(new char[max_endpoint_info_size]); 352 std::unique_ptr<char[]> endpoint_info(new char[max_endpoint_info_size]);
353 size_t endpoint_info_size; 353 size_t endpoint_info_size;
354 mp2->EndSerialize(1, channels(0), endpoint_info.get(), &endpoint_info_size, 354 mp2->EndSerialize(1, channels(0), endpoint_info.get(), &endpoint_info_size,
355 nullptr); 355 nullptr);
356 EXPECT_EQ(max_endpoint_info_size, endpoint_info_size); 356 EXPECT_EQ(max_endpoint_info_size, endpoint_info_size);
357 357
358 waiter.Init(); 358 waiter.Init();
359 ASSERT_EQ(MOJO_RESULT_OK, 359 ASSERT_EQ(MOJO_RESULT_OK,
360 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 360 mp1->AddAwakable(1, &waiter, 123, false,
361 123, nullptr)); 361 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
362 362
363 EXPECT_EQ(MOJO_RESULT_OK, 363 EXPECT_EQ(MOJO_RESULT_OK,
364 mp0->WriteMessage(0, UserPointer<const void>(endpoint_info.get()), 364 mp0->WriteMessage(0, UserPointer<const void>(endpoint_info.get()),
365 static_cast<uint32_t>(endpoint_info_size), 365 static_cast<uint32_t>(endpoint_info_size),
366 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 366 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
367 367
368 EXPECT_EQ(MOJO_RESULT_OK, 368 EXPECT_EQ(MOJO_RESULT_OK,
369 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 369 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
370 EXPECT_EQ(123u, context); 370 EXPECT_EQ(123u, context);
371 hss = HandleSignalsState(); 371 hss = HandleSignalsState();
372 mp1->RemoveAwakable(1, &waiter, &hss); 372 mp1->RemoveAwakable(1, false, &waiter, 0, &hss);
373 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 373 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
374 hss.satisfied_signals); 374 hss.satisfied_signals);
375 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 375 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
376 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 376 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
377 hss.satisfiable_signals); 377 hss.satisfiable_signals);
378 378
379 EXPECT_EQ(endpoint_info_size, channels(1)->GetSerializedEndpointSize()); 379 EXPECT_EQ(endpoint_info_size, channels(1)->GetSerializedEndpointSize());
380 std::unique_ptr<char[]> received_endpoint_info(new char[endpoint_info_size]); 380 std::unique_ptr<char[]> received_endpoint_info(new char[endpoint_info_size]);
381 buffer_size = static_cast<uint32_t>(endpoint_info_size); 381 buffer_size = static_cast<uint32_t>(endpoint_info_size);
382 EXPECT_EQ(MOJO_RESULT_OK, 382 EXPECT_EQ(MOJO_RESULT_OK,
383 mp1->ReadMessage(1, UserPointer<void>(received_endpoint_info.get()), 383 mp1->ReadMessage(1, UserPointer<void>(received_endpoint_info.get()),
384 MakeUserPointer(&buffer_size), nullptr, nullptr, 384 MakeUserPointer(&buffer_size), nullptr, nullptr,
385 MOJO_READ_MESSAGE_FLAG_NONE)); 385 MOJO_READ_MESSAGE_FLAG_NONE));
386 EXPECT_EQ(endpoint_info_size, static_cast<size_t>(buffer_size)); 386 EXPECT_EQ(endpoint_info_size, static_cast<size_t>(buffer_size));
387 EXPECT_EQ(0, memcmp(received_endpoint_info.get(), endpoint_info.get(), 387 EXPECT_EQ(0, memcmp(received_endpoint_info.get(), endpoint_info.get(),
388 endpoint_info_size)); 388 endpoint_info_size));
389 389
390 // Warning: The local side of mp3 is port 0, not port 1. 390 // Warning: The local side of mp3 is port 0, not port 1.
391 RefPtr<IncomingEndpoint> incoming_endpoint = 391 RefPtr<IncomingEndpoint> incoming_endpoint =
392 channels(1)->DeserializeEndpoint(received_endpoint_info.get()); 392 channels(1)->DeserializeEndpoint(received_endpoint_info.get());
393 ASSERT_TRUE(incoming_endpoint); 393 ASSERT_TRUE(incoming_endpoint);
394 RefPtr<MessagePipe> mp3 = incoming_endpoint->ConvertToMessagePipe(); 394 RefPtr<MessagePipe> mp3 = incoming_endpoint->ConvertToMessagePipe();
395 ASSERT_TRUE(mp3); 395 ASSERT_TRUE(mp3);
396 396
397 // Write: MP 2, port 0 -> MP 3, port 1. 397 // Write: MP 2, port 0 -> MP 3, port 1.
398 398
399 waiter.Init(); 399 waiter.Init();
400 ASSERT_EQ(MOJO_RESULT_OK, 400 ASSERT_EQ(MOJO_RESULT_OK,
401 mp3->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 401 mp3->AddAwakable(0, &waiter, 789, false,
402 789, nullptr)); 402 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
403 403
404 EXPECT_EQ( 404 EXPECT_EQ(
405 MOJO_RESULT_OK, 405 MOJO_RESULT_OK,
406 mp2->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), 406 mp2->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello),
407 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 407 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
408 408
409 EXPECT_EQ(MOJO_RESULT_OK, 409 EXPECT_EQ(MOJO_RESULT_OK,
410 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 410 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
411 EXPECT_EQ(789u, context); 411 EXPECT_EQ(789u, context);
412 hss = HandleSignalsState(); 412 hss = HandleSignalsState();
413 mp3->RemoveAwakable(0, &waiter, &hss); 413 mp3->RemoveAwakable(0, false, &waiter, 0, &hss);
414 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 414 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
415 hss.satisfied_signals); 415 hss.satisfied_signals);
416 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 416 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
417 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 417 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
418 hss.satisfiable_signals); 418 hss.satisfiable_signals);
419 419
420 // Make sure there's nothing on MP 0, port 0 or MP 1, port 1 or MP 2, port 0. 420 // Make sure there's nothing on MP 0, port 0 or MP 1, port 1 or MP 2, port 0.
421 buffer_size = static_cast<uint32_t>(sizeof(buffer)); 421 buffer_size = static_cast<uint32_t>(sizeof(buffer));
422 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, 422 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
423 mp0->ReadMessage(0, UserPointer<void>(buffer), 423 mp0->ReadMessage(0, UserPointer<void>(buffer),
(...skipping 16 matching lines...) Expand all
440 mp3->ReadMessage(0, UserPointer<void>(buffer), 440 mp3->ReadMessage(0, UserPointer<void>(buffer),
441 MakeUserPointer(&buffer_size), nullptr, nullptr, 441 MakeUserPointer(&buffer_size), nullptr, nullptr,
442 MOJO_READ_MESSAGE_FLAG_NONE)); 442 MOJO_READ_MESSAGE_FLAG_NONE));
443 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); 443 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size));
444 EXPECT_STREQ(kHello, buffer); 444 EXPECT_STREQ(kHello, buffer);
445 445
446 // Write: MP 0, port 0 -> MP 1, port 1 again. 446 // Write: MP 0, port 0 -> MP 1, port 1 again.
447 447
448 waiter.Init(); 448 waiter.Init();
449 ASSERT_EQ(MOJO_RESULT_OK, 449 ASSERT_EQ(MOJO_RESULT_OK,
450 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 450 mp1->AddAwakable(1, &waiter, 123, false,
451 123, nullptr)); 451 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
452 452
453 EXPECT_EQ( 453 EXPECT_EQ(
454 MOJO_RESULT_OK, 454 MOJO_RESULT_OK,
455 mp0->WriteMessage(0, UserPointer<const void>(kWorld), sizeof(kWorld), 455 mp0->WriteMessage(0, UserPointer<const void>(kWorld), sizeof(kWorld),
456 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 456 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
457 457
458 EXPECT_EQ(MOJO_RESULT_OK, 458 EXPECT_EQ(MOJO_RESULT_OK,
459 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 459 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
460 EXPECT_EQ(123u, context); 460 EXPECT_EQ(123u, context);
461 hss = HandleSignalsState(); 461 hss = HandleSignalsState();
462 mp1->RemoveAwakable(1, &waiter, &hss); 462 mp1->RemoveAwakable(1, false, &waiter, 0, &hss);
463 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 463 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
464 hss.satisfied_signals); 464 hss.satisfied_signals);
465 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 465 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
466 MOJO_HANDLE_SIGNAL_PEER_CLOSED | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 466 MOJO_HANDLE_SIGNAL_PEER_CLOSED | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
467 hss.satisfiable_signals); 467 hss.satisfiable_signals);
468 468
469 // Make sure there's nothing on the other ports. 469 // Make sure there's nothing on the other ports.
470 buffer_size = static_cast<uint32_t>(sizeof(buffer)); 470 buffer_size = static_cast<uint32_t>(sizeof(buffer));
471 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, 471 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
472 mp0->ReadMessage(0, UserPointer<void>(buffer), 472 mp0->ReadMessage(0, UserPointer<void>(buffer),
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
523 523
524 BootstrapChannelEndpointNoWait(0, std::move(ep0)); 524 BootstrapChannelEndpointNoWait(0, std::move(ep0));
525 525
526 RefPtr<ChannelEndpoint> ep1; 526 RefPtr<ChannelEndpoint> ep1;
527 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); 527 auto mp1 = MessagePipe::CreateProxyLocal(&ep1);
528 528
529 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do 529 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do
530 // it later, it might already be readable.) 530 // it later, it might already be readable.)
531 waiter.Init(); 531 waiter.Init();
532 ASSERT_EQ(MOJO_RESULT_OK, 532 ASSERT_EQ(MOJO_RESULT_OK,
533 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 533 mp1->AddAwakable(1, &waiter, 123, false,
534 123, nullptr)); 534 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
535 535
536 BootstrapChannelEndpointNoWait(1, std::move(ep1)); 536 BootstrapChannelEndpointNoWait(1, std::move(ep1));
537 537
538 // Wait. 538 // Wait.
539 EXPECT_EQ(MOJO_RESULT_OK, 539 EXPECT_EQ(MOJO_RESULT_OK,
540 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 540 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
541 EXPECT_EQ(123u, context); 541 EXPECT_EQ(123u, context);
542 hss = HandleSignalsState(); 542 hss = HandleSignalsState();
543 // Note: MP 1, port 1 should definitely should be readable, but it may or may 543 // Note: MP 1, port 1 should definitely should be readable, but it may or may
544 // not appear as writable (there's a race, and it may not have noticed that 544 // not appear as writable (there's a race, and it may not have noticed that
545 // the other side was closed yet -- e.g., inserting a sleep here would make it 545 // the other side was closed yet -- e.g., inserting a sleep here would make it
546 // much more likely to notice that it's no longer writable). 546 // much more likely to notice that it's no longer writable).
547 mp1->RemoveAwakable(1, &waiter, &hss); 547 mp1->RemoveAwakable(1, false, &waiter, 0, &hss);
548 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); 548 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
549 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); 549 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
550 550
551 // Read from MP 1, port 1. 551 // Read from MP 1, port 1.
552 EXPECT_EQ(MOJO_RESULT_OK, 552 EXPECT_EQ(MOJO_RESULT_OK,
553 mp1->ReadMessage(1, UserPointer<void>(buffer), 553 mp1->ReadMessage(1, UserPointer<void>(buffer),
554 MakeUserPointer(&buffer_size), nullptr, nullptr, 554 MakeUserPointer(&buffer_size), nullptr, nullptr,
555 MOJO_READ_MESSAGE_FLAG_NONE)); 555 MOJO_READ_MESSAGE_FLAG_NONE));
556 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); 556 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size));
557 EXPECT_STREQ(kHello, buffer); 557 EXPECT_STREQ(kHello, buffer);
(...skipping 28 matching lines...) Expand all
586 // Close MP 0, port 0 before channel 1 is even connected. 586 // Close MP 0, port 0 before channel 1 is even connected.
587 mp0->Close(0); 587 mp0->Close(0);
588 588
589 RefPtr<ChannelEndpoint> ep1; 589 RefPtr<ChannelEndpoint> ep1;
590 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); 590 auto mp1 = MessagePipe::CreateProxyLocal(&ep1);
591 591
592 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do 592 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do
593 // it later, it might already be readable.) 593 // it later, it might already be readable.)
594 waiter.Init(); 594 waiter.Init();
595 ASSERT_EQ(MOJO_RESULT_OK, 595 ASSERT_EQ(MOJO_RESULT_OK,
596 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 596 mp1->AddAwakable(1, &waiter, 123, false,
597 123, nullptr)); 597 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
598 598
599 BootstrapChannelEndpointNoWait(1, std::move(ep1)); 599 BootstrapChannelEndpointNoWait(1, std::move(ep1));
600 600
601 // Wait. 601 // Wait.
602 EXPECT_EQ(MOJO_RESULT_OK, 602 EXPECT_EQ(MOJO_RESULT_OK,
603 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 603 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
604 EXPECT_EQ(123u, context); 604 EXPECT_EQ(123u, context);
605 hss = HandleSignalsState(); 605 hss = HandleSignalsState();
606 // Note: MP 1, port 1 should definitely should be readable, but it may or may 606 // Note: MP 1, port 1 should definitely should be readable, but it may or may
607 // not appear as writable (there's a race, and it may not have noticed that 607 // not appear as writable (there's a race, and it may not have noticed that
608 // the other side was closed yet -- e.g., inserting a sleep here would make it 608 // the other side was closed yet -- e.g., inserting a sleep here would make it
609 // much more likely to notice that it's no longer writable). 609 // much more likely to notice that it's no longer writable).
610 mp1->RemoveAwakable(1, &waiter, &hss); 610 mp1->RemoveAwakable(1, false, &waiter, 0, &hss);
611 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); 611 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
612 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); 612 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
613 613
614 // Read from MP 1, port 1. 614 // Read from MP 1, port 1.
615 EXPECT_EQ(MOJO_RESULT_OK, 615 EXPECT_EQ(MOJO_RESULT_OK,
616 mp1->ReadMessage(1, UserPointer<void>(buffer), 616 mp1->ReadMessage(1, UserPointer<void>(buffer),
617 MakeUserPointer(&buffer_size), nullptr, nullptr, 617 MakeUserPointer(&buffer_size), nullptr, nullptr,
618 MOJO_READ_MESSAGE_FLAG_NONE)); 618 MOJO_READ_MESSAGE_FLAG_NONE));
619 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); 619 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size));
620 EXPECT_STREQ(kHello, buffer); 620 EXPECT_STREQ(kHello, buffer);
(...skipping 19 matching lines...) Expand all
640 MessagePipeDispatcher::kDefaultCreateOptions); 640 MessagePipeDispatcher::kDefaultCreateOptions);
641 auto local_mp = MessagePipe::CreateLocalLocal(); 641 auto local_mp = MessagePipe::CreateLocalLocal();
642 dispatcher->Init(local_mp.Clone(), 0); 642 dispatcher->Init(local_mp.Clone(), 0);
643 Handle handle(std::move(dispatcher), 643 Handle handle(std::move(dispatcher),
644 MessagePipeDispatcher::kDefaultHandleRights); 644 MessagePipeDispatcher::kDefaultHandleRights);
645 645
646 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do 646 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do
647 // it later, it might already be readable.) 647 // it later, it might already be readable.)
648 waiter.Init(); 648 waiter.Init();
649 ASSERT_EQ(MOJO_RESULT_OK, 649 ASSERT_EQ(MOJO_RESULT_OK,
650 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 650 mp1->AddAwakable(1, &waiter, 123, false,
651 123, nullptr)); 651 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
652 652
653 // Write to MP 0, port 0. 653 // Write to MP 0, port 0.
654 { 654 {
655 HandleTransport transport(test::HandleTryStartTransport(handle)); 655 HandleTransport transport(test::HandleTryStartTransport(handle));
656 EXPECT_TRUE(transport.is_valid()); 656 EXPECT_TRUE(transport.is_valid());
657 657
658 std::vector<HandleTransport> transports; 658 std::vector<HandleTransport> transports;
659 transports.push_back(transport); 659 transports.push_back(transport);
660 EXPECT_EQ( 660 EXPECT_EQ(
661 MOJO_RESULT_OK, 661 MOJO_RESULT_OK,
662 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), 662 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello),
663 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); 663 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE));
664 transport.End(); 664 transport.End();
665 665
666 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when 666 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when
667 // the |handle.dispatcher| is destroyed. 667 // the |handle.dispatcher| is destroyed.
668 EXPECT_TRUE(handle.dispatcher->HasOneRef()); 668 EXPECT_TRUE(handle.dispatcher->HasOneRef());
669 handle.reset(); 669 handle.reset();
670 } 670 }
671 671
672 // Wait. 672 // Wait.
673 EXPECT_EQ(MOJO_RESULT_OK, 673 EXPECT_EQ(MOJO_RESULT_OK,
674 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 674 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
675 EXPECT_EQ(123u, context); 675 EXPECT_EQ(123u, context);
676 hss = HandleSignalsState(); 676 hss = HandleSignalsState();
677 mp1->RemoveAwakable(1, &waiter, &hss); 677 mp1->RemoveAwakable(1, false, &waiter, 0, &hss);
678 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 678 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
679 hss.satisfied_signals); 679 hss.satisfied_signals);
680 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 680 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
681 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 681 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
682 hss.satisfiable_signals); 682 hss.satisfiable_signals);
683 683
684 // Read from MP 1, port 1. 684 // Read from MP 1, port 1.
685 char read_buffer[100] = {0}; 685 char read_buffer[100] = {0};
686 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 686 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
687 HandleVector read_handles; 687 HandleVector read_handles;
(...skipping 12 matching lines...) Expand all
700 EXPECT_EQ(Dispatcher::Type::MESSAGE_PIPE, 700 EXPECT_EQ(Dispatcher::Type::MESSAGE_PIPE,
701 read_handles[0].dispatcher->GetType()); 701 read_handles[0].dispatcher->GetType());
702 EXPECT_EQ(MessagePipeDispatcher::kDefaultHandleRights, 702 EXPECT_EQ(MessagePipeDispatcher::kDefaultHandleRights,
703 read_handles[0].rights); 703 read_handles[0].rights);
704 dispatcher = RefPtr<MessagePipeDispatcher>( 704 dispatcher = RefPtr<MessagePipeDispatcher>(
705 static_cast<MessagePipeDispatcher*>(read_handles[0].dispatcher.get())); 705 static_cast<MessagePipeDispatcher*>(read_handles[0].dispatcher.get()));
706 706
707 // Add the waiter now, before it becomes readable to avoid a race. 707 // Add the waiter now, before it becomes readable to avoid a race.
708 waiter.Init(); 708 waiter.Init();
709 ASSERT_EQ(MOJO_RESULT_OK, 709 ASSERT_EQ(MOJO_RESULT_OK,
710 dispatcher->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, 710 dispatcher->AddAwakable(&waiter, 456, false,
711 nullptr)); 711 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
712 712
713 // Write to "local_mp", port 1. 713 // Write to "local_mp", port 1.
714 EXPECT_EQ( 714 EXPECT_EQ(
715 MOJO_RESULT_OK, 715 MOJO_RESULT_OK,
716 local_mp->WriteMessage(1, UserPointer<const void>(kHello), sizeof(kHello), 716 local_mp->WriteMessage(1, UserPointer<const void>(kHello), sizeof(kHello),
717 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 717 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
718 718
719 // TODO(vtl): FIXME -- We (racily) crash if I close |dispatcher| immediately 719 // TODO(vtl): FIXME -- We (racily) crash if I close |dispatcher| immediately
720 // here. (We don't crash if I sleep and then close.) 720 // here. (We don't crash if I sleep and then close.)
721 721
722 // Wait for the dispatcher to become readable. 722 // Wait for the dispatcher to become readable.
723 EXPECT_EQ(MOJO_RESULT_OK, 723 EXPECT_EQ(MOJO_RESULT_OK,
724 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 724 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
725 EXPECT_EQ(456u, context); 725 EXPECT_EQ(456u, context);
726 hss = HandleSignalsState(); 726 hss = HandleSignalsState();
727 dispatcher->RemoveAwakable(&waiter, &hss); 727 dispatcher->RemoveAwakable(false, &waiter, 0, &hss);
728 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 728 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
729 hss.satisfied_signals); 729 hss.satisfied_signals);
730 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 730 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
731 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 731 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
732 hss.satisfiable_signals); 732 hss.satisfiable_signals);
733 733
734 // Read from the dispatcher. 734 // Read from the dispatcher.
735 memset(read_buffer, 0, sizeof(read_buffer)); 735 memset(read_buffer, 0, sizeof(read_buffer));
736 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 736 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
737 EXPECT_EQ(MOJO_RESULT_OK, 737 EXPECT_EQ(MOJO_RESULT_OK,
738 dispatcher->ReadMessage(UserPointer<void>(read_buffer), 738 dispatcher->ReadMessage(UserPointer<void>(read_buffer),
739 MakeUserPointer(&read_buffer_size), 0, 739 MakeUserPointer(&read_buffer_size), 0,
740 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); 740 nullptr, MOJO_READ_MESSAGE_FLAG_NONE));
741 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); 741 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size));
742 EXPECT_STREQ(kHello, read_buffer); 742 EXPECT_STREQ(kHello, read_buffer);
743 743
744 // Prepare to wait on "local_mp", port 1. 744 // Prepare to wait on "local_mp", port 1.
745 waiter.Init(); 745 waiter.Init();
746 ASSERT_EQ(MOJO_RESULT_OK, 746 ASSERT_EQ(MOJO_RESULT_OK,
747 local_mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 747 local_mp->AddAwakable(1, &waiter, 789, false,
748 false, 789, nullptr)); 748 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
749 749
750 // Write to the dispatcher. 750 // Write to the dispatcher.
751 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage( 751 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage(
752 UserPointer<const void>(kHello), sizeof(kHello), 752 UserPointer<const void>(kHello), sizeof(kHello),
753 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 753 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
754 754
755 // Wait. 755 // Wait.
756 EXPECT_EQ(MOJO_RESULT_OK, 756 EXPECT_EQ(MOJO_RESULT_OK,
757 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 757 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
758 EXPECT_EQ(789u, context); 758 EXPECT_EQ(789u, context);
759 hss = HandleSignalsState(); 759 hss = HandleSignalsState();
760 local_mp->RemoveAwakable(1, &waiter, &hss); 760 local_mp->RemoveAwakable(1, false, &waiter, 0, &hss);
761 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 761 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
762 hss.satisfied_signals); 762 hss.satisfied_signals);
763 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 763 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
764 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 764 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
765 hss.satisfiable_signals); 765 hss.satisfiable_signals);
766 766
767 // Read from "local_mp", port 1. 767 // Read from "local_mp", port 1.
768 memset(read_buffer, 0, sizeof(read_buffer)); 768 memset(read_buffer, 0, sizeof(read_buffer));
769 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 769 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
770 EXPECT_EQ(MOJO_RESULT_OK, 770 EXPECT_EQ(MOJO_RESULT_OK,
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
833 RefPtr<ChannelEndpoint> ep0; 833 RefPtr<ChannelEndpoint> ep0;
834 auto mp0 = MessagePipe::CreateLocalProxy(&ep0); 834 auto mp0 = MessagePipe::CreateLocalProxy(&ep0);
835 RefPtr<ChannelEndpoint> ep1; 835 RefPtr<ChannelEndpoint> ep1;
836 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); 836 auto mp1 = MessagePipe::CreateProxyLocal(&ep1);
837 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); 837 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1));
838 838
839 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do 839 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do
840 // it later, it might already be readable.) 840 // it later, it might already be readable.)
841 waiter.Init(); 841 waiter.Init();
842 ASSERT_EQ(MOJO_RESULT_OK, 842 ASSERT_EQ(MOJO_RESULT_OK,
843 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 843 mp1->AddAwakable(1, &waiter, 123, false,
844 123, nullptr)); 844 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
845 845
846 // Write to MP 0, port 0. 846 // Write to MP 0, port 0.
847 { 847 {
848 HandleTransport transport(test::HandleTryStartTransport(handle)); 848 HandleTransport transport(test::HandleTryStartTransport(handle));
849 EXPECT_TRUE(transport.is_valid()); 849 EXPECT_TRUE(transport.is_valid());
850 850
851 std::vector<HandleTransport> transports; 851 std::vector<HandleTransport> transports;
852 transports.push_back(transport); 852 transports.push_back(transport);
853 EXPECT_EQ( 853 EXPECT_EQ(
854 MOJO_RESULT_OK, 854 MOJO_RESULT_OK,
855 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), 855 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello),
856 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); 856 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE));
857 transport.End(); 857 transport.End();
858 858
859 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when 859 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when
860 // the |handle.dispatcher| is destroyed. 860 // the |handle.dispatcher| is destroyed.
861 EXPECT_TRUE(handle.dispatcher->HasOneRef()); 861 EXPECT_TRUE(handle.dispatcher->HasOneRef());
862 handle.reset(); 862 handle.reset();
863 } 863 }
864 864
865 // Wait. 865 // Wait.
866 EXPECT_EQ(MOJO_RESULT_OK, 866 EXPECT_EQ(MOJO_RESULT_OK,
867 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 867 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
868 EXPECT_EQ(123u, context); 868 EXPECT_EQ(123u, context);
869 hss = HandleSignalsState(); 869 hss = HandleSignalsState();
870 mp1->RemoveAwakable(1, &waiter, &hss); 870 mp1->RemoveAwakable(1, false, &waiter, 0, &hss);
871 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 871 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
872 hss.satisfied_signals); 872 hss.satisfied_signals);
873 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 873 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
874 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 874 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
875 hss.satisfiable_signals); 875 hss.satisfiable_signals);
876 876
877 // Read from MP 1, port 1. 877 // Read from MP 1, port 1.
878 char read_buffer[100] = {0}; 878 char read_buffer[100] = {0};
879 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 879 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
880 HandleVector read_handles; 880 HandleVector read_handles;
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
968 ASSERT_TRUE(mapping0->GetBase()); 968 ASSERT_TRUE(mapping0->GetBase());
969 ASSERT_EQ(100u, mapping0->GetLength()); 969 ASSERT_EQ(100u, mapping0->GetLength());
970 static_cast<char*>(mapping0->GetBase())[0] = 'A'; 970 static_cast<char*>(mapping0->GetBase())[0] = 'A';
971 static_cast<char*>(mapping0->GetBase())[50] = 'B'; 971 static_cast<char*>(mapping0->GetBase())[50] = 'B';
972 static_cast<char*>(mapping0->GetBase())[99] = 'C'; 972 static_cast<char*>(mapping0->GetBase())[99] = 'C';
973 973
974 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do 974 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do
975 // it later, it might already be readable.) 975 // it later, it might already be readable.)
976 waiter.Init(); 976 waiter.Init();
977 ASSERT_EQ(MOJO_RESULT_OK, 977 ASSERT_EQ(MOJO_RESULT_OK,
978 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 978 mp1->AddAwakable(1, &waiter, 123, false,
979 123, nullptr)); 979 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
980 980
981 // Write to MP 0, port 0. 981 // Write to MP 0, port 0.
982 { 982 {
983 HandleTransport transport(test::HandleTryStartTransport(handle)); 983 HandleTransport transport(test::HandleTryStartTransport(handle));
984 EXPECT_TRUE(transport.is_valid()); 984 EXPECT_TRUE(transport.is_valid());
985 985
986 std::vector<HandleTransport> transports; 986 std::vector<HandleTransport> transports;
987 transports.push_back(transport); 987 transports.push_back(transport);
988 EXPECT_EQ( 988 EXPECT_EQ(
989 MOJO_RESULT_OK, 989 MOJO_RESULT_OK,
990 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), 990 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello),
991 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); 991 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE));
992 transport.End(); 992 transport.End();
993 993
994 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when 994 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when
995 // the |handle.dispatcher| is destroyed. 995 // the |handle.dispatcher| is destroyed.
996 EXPECT_TRUE(handle.dispatcher->HasOneRef()); 996 EXPECT_TRUE(handle.dispatcher->HasOneRef());
997 handle.reset(); 997 handle.reset();
998 } 998 }
999 999
1000 // Wait. 1000 // Wait.
1001 EXPECT_EQ(MOJO_RESULT_OK, 1001 EXPECT_EQ(MOJO_RESULT_OK,
1002 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 1002 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
1003 EXPECT_EQ(123u, context); 1003 EXPECT_EQ(123u, context);
1004 hss = HandleSignalsState(); 1004 hss = HandleSignalsState();
1005 mp1->RemoveAwakable(1, &waiter, &hss); 1005 mp1->RemoveAwakable(1, false, &waiter, 0, &hss);
1006 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1006 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1007 hss.satisfied_signals); 1007 hss.satisfied_signals);
1008 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 1008 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
1009 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1009 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1010 hss.satisfiable_signals); 1010 hss.satisfiable_signals);
1011 1011
1012 // Read from MP 1, port 1. 1012 // Read from MP 1, port 1.
1013 char read_buffer[100] = {0}; 1013 char read_buffer[100] = {0};
1014 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 1014 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
1015 HandleVector read_handles; 1015 HandleVector read_handles;
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1084 // be passed. 1084 // be passed.
1085 auto dispatcher = 1085 auto dispatcher =
1086 PlatformHandleDispatcher::Create(PlatformHandleFromFILE(std::move(fp))); 1086 PlatformHandleDispatcher::Create(PlatformHandleFromFILE(std::move(fp)));
1087 Handle handle(std::move(dispatcher), 1087 Handle handle(std::move(dispatcher),
1088 PlatformHandleDispatcher::kDefaultHandleRights); 1088 PlatformHandleDispatcher::kDefaultHandleRights);
1089 1089
1090 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do 1090 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do
1091 // it later, it might already be readable.) 1091 // it later, it might already be readable.)
1092 waiter.Init(); 1092 waiter.Init();
1093 ASSERT_EQ(MOJO_RESULT_OK, 1093 ASSERT_EQ(MOJO_RESULT_OK,
1094 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 1094 mp1->AddAwakable(1, &waiter, 123, false,
1095 123, nullptr)); 1095 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
1096 1096
1097 // Write to MP 0, port 0. 1097 // Write to MP 0, port 0.
1098 { 1098 {
1099 HandleTransport transport(test::HandleTryStartTransport(handle)); 1099 HandleTransport transport(test::HandleTryStartTransport(handle));
1100 EXPECT_TRUE(transport.is_valid()); 1100 EXPECT_TRUE(transport.is_valid());
1101 1101
1102 std::vector<HandleTransport> transports; 1102 std::vector<HandleTransport> transports;
1103 transports.push_back(transport); 1103 transports.push_back(transport);
1104 EXPECT_EQ( 1104 EXPECT_EQ(
1105 MOJO_RESULT_OK, 1105 MOJO_RESULT_OK,
1106 mp0->WriteMessage(0, UserPointer<const void>(kWorld), sizeof(kWorld), 1106 mp0->WriteMessage(0, UserPointer<const void>(kWorld), sizeof(kWorld),
1107 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); 1107 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE));
1108 transport.End(); 1108 transport.End();
1109 1109
1110 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when 1110 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when
1111 // the |handle.dispatcher| is destroyed. 1111 // the |handle.dispatcher| is destroyed.
1112 EXPECT_TRUE(handle.dispatcher->HasOneRef()); 1112 EXPECT_TRUE(handle.dispatcher->HasOneRef());
1113 handle.reset(); 1113 handle.reset();
1114 } 1114 }
1115 1115
1116 // Wait. 1116 // Wait.
1117 EXPECT_EQ(MOJO_RESULT_OK, 1117 EXPECT_EQ(MOJO_RESULT_OK,
1118 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 1118 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
1119 EXPECT_EQ(123u, context); 1119 EXPECT_EQ(123u, context);
1120 hss = HandleSignalsState(); 1120 hss = HandleSignalsState();
1121 mp1->RemoveAwakable(1, &waiter, &hss); 1121 mp1->RemoveAwakable(1, false, &waiter, 0, &hss);
1122 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1122 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1123 hss.satisfied_signals); 1123 hss.satisfied_signals);
1124 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 1124 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
1125 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1125 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1126 hss.satisfiable_signals); 1126 hss.satisfiable_signals);
1127 1127
1128 // Read from MP 1, port 1. 1128 // Read from MP 1, port 1.
1129 char read_buffer[100] = {0}; 1129 char read_buffer[100] = {0};
1130 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 1130 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
1131 HandleVector read_handles; 1131 HandleVector read_handles;
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1225 MessagePipeDispatcher::kDefaultCreateOptions); 1225 MessagePipeDispatcher::kDefaultCreateOptions);
1226 auto local_mp = MessagePipe::CreateLocalLocal(); 1226 auto local_mp = MessagePipe::CreateLocalLocal();
1227 dispatcher->Init(local_mp.Clone(), 0); 1227 dispatcher->Init(local_mp.Clone(), 0);
1228 Handle handle(std::move(dispatcher), 1228 Handle handle(std::move(dispatcher),
1229 MessagePipeDispatcher::kDefaultHandleRights); 1229 MessagePipeDispatcher::kDefaultHandleRights);
1230 1230
1231 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do 1231 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do
1232 // it later, it might already be readable.) 1232 // it later, it might already be readable.)
1233 waiter.Init(); 1233 waiter.Init();
1234 ASSERT_EQ(MOJO_RESULT_OK, 1234 ASSERT_EQ(MOJO_RESULT_OK,
1235 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 1235 mp1->AddAwakable(1, &waiter, 123, false,
1236 123, nullptr)); 1236 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
1237 1237
1238 // Write to MP 0, port 0. 1238 // Write to MP 0, port 0.
1239 { 1239 {
1240 HandleTransport transport(test::HandleTryStartTransport(handle)); 1240 HandleTransport transport(test::HandleTryStartTransport(handle));
1241 EXPECT_TRUE(transport.is_valid()); 1241 EXPECT_TRUE(transport.is_valid());
1242 1242
1243 std::vector<HandleTransport> transports; 1243 std::vector<HandleTransport> transports;
1244 transports.push_back(transport); 1244 transports.push_back(transport);
1245 EXPECT_EQ( 1245 EXPECT_EQ(
1246 MOJO_RESULT_OK, 1246 MOJO_RESULT_OK,
1247 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), 1247 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello),
1248 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); 1248 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE));
1249 transport.End(); 1249 transport.End();
1250 1250
1251 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when 1251 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when
1252 // the |handle.dispatcher| is destroyed. 1252 // the |handle.dispatcher| is destroyed.
1253 EXPECT_TRUE(handle.dispatcher->HasOneRef()); 1253 EXPECT_TRUE(handle.dispatcher->HasOneRef());
1254 handle.reset(); 1254 handle.reset();
1255 } 1255 }
1256 1256
1257 // Wait. 1257 // Wait.
1258 EXPECT_EQ(MOJO_RESULT_OK, 1258 EXPECT_EQ(MOJO_RESULT_OK,
1259 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 1259 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
1260 EXPECT_EQ(123u, context); 1260 EXPECT_EQ(123u, context);
1261 hss = HandleSignalsState(); 1261 hss = HandleSignalsState();
1262 mp1->RemoveAwakable(1, &waiter, &hss); 1262 mp1->RemoveAwakable(1, false, &waiter, 0, &hss);
1263 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1263 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1264 hss.satisfied_signals); 1264 hss.satisfied_signals);
1265 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 1265 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
1266 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1266 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1267 hss.satisfiable_signals); 1267 hss.satisfiable_signals);
1268 1268
1269 // Read from MP 1, port 1. 1269 // Read from MP 1, port 1.
1270 char read_buffer[100] = {0}; 1270 char read_buffer[100] = {0};
1271 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 1271 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
1272 HandleVector read_handles; 1272 HandleVector read_handles;
(...skipping 15 matching lines...) Expand all
1288 read_handles[0].rights); 1288 read_handles[0].rights);
1289 handle = std::move(read_handles[0]); 1289 handle = std::move(read_handles[0]);
1290 read_handles.clear(); 1290 read_handles.clear();
1291 1291
1292 // Now pass it back. 1292 // Now pass it back.
1293 1293
1294 // Prepare to wait on MP 0, port 0. (Add the waiter now. Otherwise, if we do 1294 // Prepare to wait on MP 0, port 0. (Add the waiter now. Otherwise, if we do
1295 // it later, it might already be readable.) 1295 // it later, it might already be readable.)
1296 waiter.Init(); 1296 waiter.Init();
1297 ASSERT_EQ(MOJO_RESULT_OK, 1297 ASSERT_EQ(MOJO_RESULT_OK,
1298 mp0->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 1298 mp0->AddAwakable(0, &waiter, 456, false,
1299 456, nullptr)); 1299 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
1300 1300
1301 // Write to MP 1, port 1. 1301 // Write to MP 1, port 1.
1302 { 1302 {
1303 HandleTransport transport(test::HandleTryStartTransport(handle)); 1303 HandleTransport transport(test::HandleTryStartTransport(handle));
1304 EXPECT_TRUE(transport.is_valid()); 1304 EXPECT_TRUE(transport.is_valid());
1305 1305
1306 std::vector<HandleTransport> transports; 1306 std::vector<HandleTransport> transports;
1307 transports.push_back(transport); 1307 transports.push_back(transport);
1308 EXPECT_EQ( 1308 EXPECT_EQ(
1309 MOJO_RESULT_OK, 1309 MOJO_RESULT_OK,
1310 mp1->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld), 1310 mp1->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld),
1311 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); 1311 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE));
1312 transport.End(); 1312 transport.End();
1313 1313
1314 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when 1314 // |handle.dispatcher| should have been closed. This is |DCHECK()|ed when
1315 // the |handle.dispatcher| is destroyed. 1315 // the |handle.dispatcher| is destroyed.
1316 EXPECT_TRUE(handle.dispatcher->HasOneRef()); 1316 EXPECT_TRUE(handle.dispatcher->HasOneRef());
1317 handle.reset(); 1317 handle.reset();
1318 } 1318 }
1319 1319
1320 // Wait. 1320 // Wait.
1321 EXPECT_EQ(MOJO_RESULT_OK, 1321 EXPECT_EQ(MOJO_RESULT_OK,
1322 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 1322 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
1323 EXPECT_EQ(456u, context); 1323 EXPECT_EQ(456u, context);
1324 hss = HandleSignalsState(); 1324 hss = HandleSignalsState();
1325 mp0->RemoveAwakable(0, &waiter, &hss); 1325 mp0->RemoveAwakable(0, false, &waiter, 0, &hss);
1326 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1326 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1327 hss.satisfied_signals); 1327 hss.satisfied_signals);
1328 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 1328 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
1329 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1329 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1330 hss.satisfiable_signals); 1330 hss.satisfiable_signals);
1331 1331
1332 // Read from MP 0, port 0. 1332 // Read from MP 0, port 0.
1333 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 1333 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
1334 read_num_handles = 10; // Maximum to get. 1334 read_num_handles = 10; // Maximum to get.
1335 EXPECT_EQ(MOJO_RESULT_OK, 1335 EXPECT_EQ(MOJO_RESULT_OK,
(...skipping 11 matching lines...) Expand all
1347 read_handles[0].dispatcher->GetType()); 1347 read_handles[0].dispatcher->GetType());
1348 EXPECT_EQ(MessagePipeDispatcher::kDefaultHandleRights, 1348 EXPECT_EQ(MessagePipeDispatcher::kDefaultHandleRights,
1349 read_handles[0].rights); 1349 read_handles[0].rights);
1350 dispatcher = RefPtr<MessagePipeDispatcher>( 1350 dispatcher = RefPtr<MessagePipeDispatcher>(
1351 static_cast<MessagePipeDispatcher*>(read_handles[0].dispatcher.get())); 1351 static_cast<MessagePipeDispatcher*>(read_handles[0].dispatcher.get()));
1352 read_handles.clear(); 1352 read_handles.clear();
1353 1353
1354 // Add the waiter now, before it becomes readable to avoid a race. 1354 // Add the waiter now, before it becomes readable to avoid a race.
1355 waiter.Init(); 1355 waiter.Init();
1356 ASSERT_EQ(MOJO_RESULT_OK, 1356 ASSERT_EQ(MOJO_RESULT_OK,
1357 dispatcher->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, 1357 dispatcher->AddAwakable(&waiter, 789, false,
1358 nullptr)); 1358 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
1359 1359
1360 // Write to "local_mp", port 1. 1360 // Write to "local_mp", port 1.
1361 EXPECT_EQ( 1361 EXPECT_EQ(
1362 MOJO_RESULT_OK, 1362 MOJO_RESULT_OK,
1363 local_mp->WriteMessage(1, UserPointer<const void>(kHello), sizeof(kHello), 1363 local_mp->WriteMessage(1, UserPointer<const void>(kHello), sizeof(kHello),
1364 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 1364 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
1365 1365
1366 // Wait for the dispatcher to become readable. 1366 // Wait for the dispatcher to become readable.
1367 EXPECT_EQ(MOJO_RESULT_OK, 1367 EXPECT_EQ(MOJO_RESULT_OK,
1368 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 1368 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
1369 EXPECT_EQ(789u, context); 1369 EXPECT_EQ(789u, context);
1370 hss = HandleSignalsState(); 1370 hss = HandleSignalsState();
1371 dispatcher->RemoveAwakable(&waiter, &hss); 1371 dispatcher->RemoveAwakable(false, &waiter, 0, &hss);
1372 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1372 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1373 hss.satisfied_signals); 1373 hss.satisfied_signals);
1374 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 1374 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
1375 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1375 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1376 hss.satisfiable_signals); 1376 hss.satisfiable_signals);
1377 1377
1378 // Read from the dispatcher. 1378 // Read from the dispatcher.
1379 memset(read_buffer, 0, sizeof(read_buffer)); 1379 memset(read_buffer, 0, sizeof(read_buffer));
1380 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 1380 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
1381 EXPECT_EQ(MOJO_RESULT_OK, 1381 EXPECT_EQ(MOJO_RESULT_OK,
1382 dispatcher->ReadMessage(UserPointer<void>(read_buffer), 1382 dispatcher->ReadMessage(UserPointer<void>(read_buffer),
1383 MakeUserPointer(&read_buffer_size), 0, 1383 MakeUserPointer(&read_buffer_size), 0,
1384 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); 1384 nullptr, MOJO_READ_MESSAGE_FLAG_NONE));
1385 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); 1385 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size));
1386 EXPECT_STREQ(kHello, read_buffer); 1386 EXPECT_STREQ(kHello, read_buffer);
1387 1387
1388 // Prepare to wait on "local_mp", port 1. 1388 // Prepare to wait on "local_mp", port 1.
1389 waiter.Init(); 1389 waiter.Init();
1390 ASSERT_EQ(MOJO_RESULT_OK, 1390 ASSERT_EQ(MOJO_RESULT_OK,
1391 local_mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 1391 local_mp->AddAwakable(1, &waiter, 789, false,
1392 false, 789, nullptr)); 1392 MOJO_HANDLE_SIGNAL_READABLE, nullptr));
1393 1393
1394 // Write to the dispatcher. 1394 // Write to the dispatcher.
1395 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage( 1395 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage(
1396 UserPointer<const void>(kHello), sizeof(kHello), 1396 UserPointer<const void>(kHello), sizeof(kHello),
1397 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 1397 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
1398 1398
1399 // Wait. 1399 // Wait.
1400 EXPECT_EQ(MOJO_RESULT_OK, 1400 EXPECT_EQ(MOJO_RESULT_OK,
1401 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 1401 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
1402 EXPECT_EQ(789u, context); 1402 EXPECT_EQ(789u, context);
1403 hss = HandleSignalsState(); 1403 hss = HandleSignalsState();
1404 local_mp->RemoveAwakable(1, &waiter, &hss); 1404 local_mp->RemoveAwakable(1, false, &waiter, 0, &hss);
1405 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1405 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1406 hss.satisfied_signals); 1406 hss.satisfied_signals);
1407 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 1407 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
1408 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1408 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1409 hss.satisfiable_signals); 1409 hss.satisfiable_signals);
1410 1410
1411 // Read from "local_mp", port 1. 1411 // Read from "local_mp", port 1.
1412 memset(read_buffer, 0, sizeof(read_buffer)); 1412 memset(read_buffer, 0, sizeof(read_buffer));
1413 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 1413 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
1414 EXPECT_EQ(MOJO_RESULT_OK, 1414 EXPECT_EQ(MOJO_RESULT_OK,
(...skipping 10 matching lines...) Expand all
1425 mp0->Close(0); 1425 mp0->Close(0);
1426 mp1->Close(1); 1426 mp1->Close(1);
1427 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); 1427 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close());
1428 // Note that |local_mp|'s port 0 belong to |dispatcher|, which was closed. 1428 // Note that |local_mp|'s port 0 belong to |dispatcher|, which was closed.
1429 local_mp->Close(1); 1429 local_mp->Close(1);
1430 } 1430 }
1431 1431
1432 } // namespace 1432 } // namespace
1433 } // namespace system 1433 } // namespace system
1434 } // namespace mojo 1434 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/remote_data_pipe_impl_unittest.cc ('k') | mojo/edk/system/simple_dispatcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698