| 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/message_pipe.h" | 5 #include "mojo/edk/system/message_pipe.h" |
| 6 | 6 |
| 7 #include "mojo/edk/system/waiter.h" | 7 #include "mojo/edk/system/waiter.h" |
| 8 #include "mojo/edk/system/waiter_test_utils.h" | 8 #include "mojo/edk/system/waiter_test_utils.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 | 10 |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 328 | 328 |
| 329 int32_t buffer[1]; | 329 int32_t buffer[1]; |
| 330 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 330 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
| 331 uint32_t buffer_size; | 331 uint32_t buffer_size; |
| 332 | 332 |
| 333 // Always writable (until the other port is closed). | 333 // Always writable (until the other port is closed). |
| 334 waiter.Init(); | 334 waiter.Init(); |
| 335 hss = HandleSignalsState(); | 335 hss = HandleSignalsState(); |
| 336 EXPECT_EQ( | 336 EXPECT_EQ( |
| 337 MOJO_RESULT_ALREADY_EXISTS, | 337 MOJO_RESULT_ALREADY_EXISTS, |
| 338 mp->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, false, 0, &hss)); | 338 mp->AddAwakable(0, &waiter, 0, false, MOJO_HANDLE_SIGNAL_WRITABLE, &hss)); |
| 339 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 339 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 340 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 340 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 341 waiter.Init(); | 341 waiter.Init(); |
| 342 hss = HandleSignalsState(); | 342 hss = HandleSignalsState(); |
| 343 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 343 EXPECT_EQ( |
| 344 mp->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE | | 344 MOJO_RESULT_ALREADY_EXISTS, |
| 345 MOJO_HANDLE_SIGNAL_WRITABLE, | 345 mp->AddAwakable(0, &waiter, 0, false, |
| 346 false, 0, &hss)); | 346 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 347 &hss)); |
| 347 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 348 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 348 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 349 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 349 | 350 |
| 350 // Not yet readable. | 351 // Not yet readable. |
| 351 waiter.Init(); | 352 waiter.Init(); |
| 352 ASSERT_EQ(MOJO_RESULT_OK, | 353 ASSERT_EQ(MOJO_RESULT_OK, |
| 353 mp->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 1, | 354 mp->AddAwakable(0, &waiter, 1, false, MOJO_HANDLE_SIGNAL_READABLE, |
| 354 nullptr)); | 355 nullptr)); |
| 355 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr, nullptr)); | 356 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr, nullptr)); |
| 356 hss = HandleSignalsState(); | 357 hss = HandleSignalsState(); |
| 357 mp->RemoveAwakable(0, &waiter, &hss); | 358 mp->RemoveAwakable(0, false, &waiter, 0, &hss); |
| 358 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 359 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 359 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 360 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 360 | 361 |
| 361 // The peer is not closed. | 362 // The peer is not closed. |
| 362 waiter.Init(); | 363 waiter.Init(); |
| 363 ASSERT_EQ(MOJO_RESULT_OK, | 364 ASSERT_EQ(MOJO_RESULT_OK, |
| 364 mp->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, false, | 365 mp->AddAwakable(0, &waiter, 2, false, |
| 365 2, nullptr)); | 366 MOJO_HANDLE_SIGNAL_PEER_CLOSED, nullptr)); |
| 366 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr, nullptr)); | 367 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr, nullptr)); |
| 367 hss = HandleSignalsState(); | 368 hss = HandleSignalsState(); |
| 368 mp->RemoveAwakable(0, &waiter, &hss); | 369 mp->RemoveAwakable(0, false, &waiter, 0, &hss); |
| 369 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 370 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 370 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 371 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 371 | 372 |
| 372 // Write from port 0 (to port 1), to make port 1 readable. | 373 // Write from port 0 (to port 1), to make port 1 readable. |
| 373 buffer[0] = 123456789; | 374 buffer[0] = 123456789; |
| 374 EXPECT_EQ(MOJO_RESULT_OK, | 375 EXPECT_EQ(MOJO_RESULT_OK, |
| 375 mp->WriteMessage(0, UserPointer<const void>(buffer), kBufferSize, | 376 mp->WriteMessage(0, UserPointer<const void>(buffer), kBufferSize, |
| 376 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 377 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 377 | 378 |
| 378 // Port 1 should already be readable now. | 379 // Port 1 should already be readable now. |
| 379 waiter.Init(); | 380 waiter.Init(); |
| 380 hss = HandleSignalsState(); | 381 hss = HandleSignalsState(); |
| 381 EXPECT_EQ( | 382 EXPECT_EQ( |
| 382 MOJO_RESULT_ALREADY_EXISTS, | 383 MOJO_RESULT_ALREADY_EXISTS, |
| 383 mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 3, &hss)); | 384 mp->AddAwakable(1, &waiter, 3, false, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 384 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 385 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 385 hss.satisfied_signals); | 386 hss.satisfied_signals); |
| 386 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 387 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 387 waiter.Init(); | 388 waiter.Init(); |
| 388 hss = HandleSignalsState(); | 389 hss = HandleSignalsState(); |
| 389 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 390 EXPECT_EQ( |
| 390 mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE | | 391 MOJO_RESULT_ALREADY_EXISTS, |
| 391 MOJO_HANDLE_SIGNAL_WRITABLE, | 392 mp->AddAwakable(1, &waiter, 0, false, |
| 392 false, 0, &hss)); | 393 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 394 &hss)); |
| 393 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 395 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 394 hss.satisfied_signals); | 396 hss.satisfied_signals); |
| 395 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 397 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 396 // ... and still writable. | 398 // ... and still writable. |
| 397 waiter.Init(); | 399 waiter.Init(); |
| 398 hss = HandleSignalsState(); | 400 hss = HandleSignalsState(); |
| 399 EXPECT_EQ( | 401 EXPECT_EQ( |
| 400 MOJO_RESULT_ALREADY_EXISTS, | 402 MOJO_RESULT_ALREADY_EXISTS, |
| 401 mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, false, 4, &hss)); | 403 mp->AddAwakable(1, &waiter, 4, false, MOJO_HANDLE_SIGNAL_WRITABLE, &hss)); |
| 402 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 404 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 403 hss.satisfied_signals); | 405 hss.satisfied_signals); |
| 404 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 406 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 405 | 407 |
| 406 // Close port 0. | 408 // Close port 0. |
| 407 mp->Close(0); | 409 mp->Close(0); |
| 408 | 410 |
| 409 // Port 1 should be signaled with peer closed. | 411 // Port 1 should be signaled with peer closed. |
| 410 waiter.Init(); | 412 waiter.Init(); |
| 411 hss = HandleSignalsState(); | 413 hss = HandleSignalsState(); |
| 412 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 414 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 413 mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, false, | 415 mp->AddAwakable(1, &waiter, 5, false, |
| 414 5, &hss)); | 416 MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss)); |
| 415 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 417 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 416 hss.satisfied_signals); | 418 hss.satisfied_signals); |
| 417 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 419 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 418 hss.satisfiable_signals); | 420 hss.satisfiable_signals); |
| 419 | 421 |
| 420 // Port 1 should not be writable. | 422 // Port 1 should not be writable. |
| 421 waiter.Init(); | 423 waiter.Init(); |
| 422 hss = HandleSignalsState(); | 424 hss = HandleSignalsState(); |
| 423 EXPECT_EQ( | 425 EXPECT_EQ( |
| 424 MOJO_RESULT_FAILED_PRECONDITION, | 426 MOJO_RESULT_FAILED_PRECONDITION, |
| 425 mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, false, 6, &hss)); | 427 mp->AddAwakable(1, &waiter, 6, false, MOJO_HANDLE_SIGNAL_WRITABLE, &hss)); |
| 426 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 428 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 427 hss.satisfied_signals); | 429 hss.satisfied_signals); |
| 428 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 430 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 429 hss.satisfiable_signals); | 431 hss.satisfiable_signals); |
| 430 | 432 |
| 431 // But it should still be readable. | 433 // But it should still be readable. |
| 432 waiter.Init(); | 434 waiter.Init(); |
| 433 hss = HandleSignalsState(); | 435 hss = HandleSignalsState(); |
| 434 EXPECT_EQ( | 436 EXPECT_EQ( |
| 435 MOJO_RESULT_ALREADY_EXISTS, | 437 MOJO_RESULT_ALREADY_EXISTS, |
| 436 mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 7, &hss)); | 438 mp->AddAwakable(1, &waiter, 7, false, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 437 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 439 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 438 hss.satisfied_signals); | 440 hss.satisfied_signals); |
| 439 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 441 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 440 hss.satisfiable_signals); | 442 hss.satisfiable_signals); |
| 441 | 443 |
| 442 // Read from port 1. | 444 // Read from port 1. |
| 443 buffer[0] = 0; | 445 buffer[0] = 0; |
| 444 buffer_size = kBufferSize; | 446 buffer_size = kBufferSize; |
| 445 EXPECT_EQ(MOJO_RESULT_OK, | 447 EXPECT_EQ(MOJO_RESULT_OK, |
| 446 mp->ReadMessage(1, UserPointer<void>(buffer), | 448 mp->ReadMessage(1, UserPointer<void>(buffer), |
| 447 MakeUserPointer(&buffer_size), 0, nullptr, | 449 MakeUserPointer(&buffer_size), 0, nullptr, |
| 448 MOJO_READ_MESSAGE_FLAG_NONE)); | 450 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 449 EXPECT_EQ(123456789, buffer[0]); | 451 EXPECT_EQ(123456789, buffer[0]); |
| 450 | 452 |
| 451 // Now port 1 should no longer be readable. | 453 // Now port 1 should no longer be readable. |
| 452 waiter.Init(); | 454 waiter.Init(); |
| 453 hss = HandleSignalsState(); | 455 hss = HandleSignalsState(); |
| 454 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 456 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 455 mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 8, | 457 mp->AddAwakable(1, &waiter, 8, false, MOJO_HANDLE_SIGNAL_READABLE, |
| 456 nullptr)); | 458 nullptr)); |
| 457 EXPECT_EQ(0u, hss.satisfied_signals); | 459 EXPECT_EQ(0u, hss.satisfied_signals); |
| 458 EXPECT_EQ(0u, hss.satisfiable_signals); | 460 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 459 | 461 |
| 460 mp->Close(1); | 462 mp->Close(1); |
| 461 } | 463 } |
| 462 | 464 |
| 463 TEST(MessagePipeTest, ThreadedWaiting) { | 465 TEST(MessagePipeTest, ThreadedWaiting) { |
| 464 int32_t buffer[1]; | 466 int32_t buffer[1]; |
| 465 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 467 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
| 466 | 468 |
| 467 MojoResult result; | 469 MojoResult result; |
| 468 uint64_t context; | 470 uint64_t context; |
| 469 | 471 |
| 470 // Write to wake up waiter waiting for read. | 472 // Write to wake up waiter waiting for read. |
| 471 { | 473 { |
| 472 auto mp = MessagePipe::CreateLocalLocal(); | 474 auto mp = MessagePipe::CreateLocalLocal(); |
| 473 test::SimpleWaiterThread thread(&result, &context); | 475 test::SimpleWaiterThread thread(&result, &context); |
| 474 | 476 |
| 475 thread.waiter()->Init(); | 477 thread.waiter()->Init(); |
| 476 ASSERT_EQ(MOJO_RESULT_OK, | 478 ASSERT_EQ(MOJO_RESULT_OK, |
| 477 mp->AddAwakable(1, thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, | 479 mp->AddAwakable(1, thread.waiter(), 1, false, |
| 478 false, 1, nullptr)); | 480 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 479 thread.Start(); | 481 thread.Start(); |
| 480 | 482 |
| 481 buffer[0] = 123456789; | 483 buffer[0] = 123456789; |
| 482 // Write from port 0 (to port 1), which should wake up the waiter. | 484 // Write from port 0 (to port 1), which should wake up the waiter. |
| 483 EXPECT_EQ(MOJO_RESULT_OK, | 485 EXPECT_EQ(MOJO_RESULT_OK, |
| 484 mp->WriteMessage(0, UserPointer<const void>(buffer), kBufferSize, | 486 mp->WriteMessage(0, UserPointer<const void>(buffer), kBufferSize, |
| 485 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 487 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 486 | 488 |
| 487 HandleSignalsState hss; | 489 HandleSignalsState hss; |
| 488 mp->RemoveAwakable(1, thread.waiter(), &hss); | 490 mp->RemoveAwakable(1, false, thread.waiter(), 0, &hss); |
| 489 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 491 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 490 hss.satisfied_signals); | 492 hss.satisfied_signals); |
| 491 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 493 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 492 | 494 |
| 493 mp->Close(0); | 495 mp->Close(0); |
| 494 mp->Close(1); | 496 mp->Close(1); |
| 495 } // Joins |thread|. | 497 } // Joins |thread|. |
| 496 // The waiter should have woken up successfully. | 498 // The waiter should have woken up successfully. |
| 497 EXPECT_EQ(MOJO_RESULT_OK, result); | 499 EXPECT_EQ(MOJO_RESULT_OK, result); |
| 498 EXPECT_EQ(1u, context); | 500 EXPECT_EQ(1u, context); |
| 499 | 501 |
| 500 // Close to cancel waiter. | 502 // Close to cancel waiter. |
| 501 { | 503 { |
| 502 auto mp = MessagePipe::CreateLocalLocal(); | 504 auto mp = MessagePipe::CreateLocalLocal(); |
| 503 test::SimpleWaiterThread thread(&result, &context); | 505 test::SimpleWaiterThread thread(&result, &context); |
| 504 | 506 |
| 505 thread.waiter()->Init(); | 507 thread.waiter()->Init(); |
| 506 ASSERT_EQ(MOJO_RESULT_OK, | 508 ASSERT_EQ(MOJO_RESULT_OK, |
| 507 mp->AddAwakable(1, thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, | 509 mp->AddAwakable(1, thread.waiter(), 2, false, |
| 508 false, 2, nullptr)); | 510 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 509 thread.Start(); | 511 thread.Start(); |
| 510 | 512 |
| 511 // Close port 1 first -- this should result in the waiter being cancelled. | 513 // Close port 1 first -- this should result in the waiter being cancelled. |
| 512 mp->CancelAllState(1); | 514 mp->CancelAllState(1); |
| 513 mp->Close(1); | 515 mp->Close(1); |
| 514 | 516 |
| 515 // Port 1 is closed, so |Dispatcher::RemoveAwakable()| wouldn't call into | 517 // Port 1 is closed, so |Dispatcher::RemoveAwakable()| wouldn't call into |
| 516 // the |MessagePipe| to remove any waiter. | 518 // the |MessagePipe| to remove any waiter. |
| 517 | 519 |
| 518 mp->Close(0); | 520 mp->Close(0); |
| 519 } // Joins |thread|. | 521 } // Joins |thread|. |
| 520 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); | 522 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); |
| 521 EXPECT_EQ(2u, context); | 523 EXPECT_EQ(2u, context); |
| 522 | 524 |
| 523 // Close to cancel waiter using peer closed signal. | 525 // Close to cancel waiter using peer closed signal. |
| 524 { | 526 { |
| 525 auto mp = MessagePipe::CreateLocalLocal(); | 527 auto mp = MessagePipe::CreateLocalLocal(); |
| 526 test::SimpleWaiterThread thread(&result, &context); | 528 test::SimpleWaiterThread thread(&result, &context); |
| 527 | 529 |
| 528 thread.waiter()->Init(); | 530 thread.waiter()->Init(); |
| 529 ASSERT_EQ(MOJO_RESULT_OK, mp->AddAwakable(1, thread.waiter(), | 531 ASSERT_EQ(MOJO_RESULT_OK, |
| 530 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 532 mp->AddAwakable(1, thread.waiter(), 3, false, |
| 531 false, 3, nullptr)); | 533 MOJO_HANDLE_SIGNAL_PEER_CLOSED, nullptr)); |
| 532 thread.Start(); | 534 thread.Start(); |
| 533 | 535 |
| 534 // Close port 1 first -- this should result in the waiter being cancelled. | 536 // Close port 1 first -- this should result in the waiter being cancelled. |
| 535 mp->CancelAllState(1); | 537 mp->CancelAllState(1); |
| 536 mp->Close(1); | 538 mp->Close(1); |
| 537 | 539 |
| 538 // Port 1 is closed, so |Dispatcher::RemoveAwakable()| wouldn't call into | 540 // Port 1 is closed, so |Dispatcher::RemoveAwakable()| wouldn't call into |
| 539 // the |MessagePipe| to remove any waiter. | 541 // the |MessagePipe| to remove any waiter. |
| 540 | 542 |
| 541 mp->Close(0); | 543 mp->Close(0); |
| 542 } // Joins |thread|. | 544 } // Joins |thread|. |
| 543 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); | 545 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); |
| 544 EXPECT_EQ(3u, context); | 546 EXPECT_EQ(3u, context); |
| 545 | 547 |
| 546 // Close to make waiter un-wake-up-able. | 548 // Close to make waiter un-wake-up-able. |
| 547 { | 549 { |
| 548 auto mp = MessagePipe::CreateLocalLocal(); | 550 auto mp = MessagePipe::CreateLocalLocal(); |
| 549 test::SimpleWaiterThread thread(&result, &context); | 551 test::SimpleWaiterThread thread(&result, &context); |
| 550 | 552 |
| 551 thread.waiter()->Init(); | 553 thread.waiter()->Init(); |
| 552 ASSERT_EQ(MOJO_RESULT_OK, | 554 ASSERT_EQ(MOJO_RESULT_OK, |
| 553 mp->AddAwakable(1, thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, | 555 mp->AddAwakable(1, thread.waiter(), 4, false, |
| 554 false, 4, nullptr)); | 556 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 555 thread.Start(); | 557 thread.Start(); |
| 556 | 558 |
| 557 // Close port 0 first -- this should wake the waiter up, since port 1 will | 559 // Close port 0 first -- this should wake the waiter up, since port 1 will |
| 558 // never be readable. | 560 // never be readable. |
| 559 mp->CancelAllState(0); | 561 mp->CancelAllState(0); |
| 560 mp->Close(0); | 562 mp->Close(0); |
| 561 | 563 |
| 562 HandleSignalsState hss; | 564 HandleSignalsState hss; |
| 563 mp->RemoveAwakable(1, thread.waiter(), &hss); | 565 mp->RemoveAwakable(1, false, thread.waiter(), 0, &hss); |
| 564 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 566 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 565 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 567 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 566 | 568 |
| 567 mp->CancelAllState(1); | 569 mp->CancelAllState(1); |
| 568 mp->Close(1); | 570 mp->Close(1); |
| 569 } // Joins |thread|. | 571 } // Joins |thread|. |
| 570 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); | 572 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); |
| 571 EXPECT_EQ(4u, context); | 573 EXPECT_EQ(4u, context); |
| 572 } | 574 } |
| 573 | 575 |
| 574 } // namespace | 576 } // namespace |
| 575 } // namespace system | 577 } // namespace system |
| 576 } // namespace mojo | 578 } // namespace mojo |
| OLD | NEW |