| Index: mojo/edk/system/waiter_unittest.cc
|
| diff --git a/mojo/edk/system/waiter_unittest.cc b/mojo/edk/system/waiter_unittest.cc
|
| index cfb0c31b306a02bbf7dd45e62db55e4ef25f514d..436207251c84eb36e92f474069c915d737561928 100644
|
| --- a/mojo/edk/system/waiter_unittest.cc
|
| +++ b/mojo/edk/system/waiter_unittest.cc
|
| @@ -44,6 +44,7 @@ class WaitingThread : public test::SimpleTestThread {
|
|
|
| void WaitUntilDone(MojoResult* result,
|
| uint64_t* context,
|
| + HandleSignalsState* signals_state,
|
| MojoDeadline* elapsed) {
|
| for (;;) {
|
| {
|
| @@ -51,6 +52,7 @@ class WaitingThread : public test::SimpleTestThread {
|
| if (done_) {
|
| *result = result_;
|
| *context = context_;
|
| + *signals_state = signals_state_;
|
| *elapsed = elapsed_;
|
| break;
|
| }
|
| @@ -67,10 +69,11 @@ class WaitingThread : public test::SimpleTestThread {
|
| Stopwatch stopwatch;
|
| MojoResult result;
|
| uint64_t context = static_cast<uint64_t>(-1);
|
| + HandleSignalsState signals_state;
|
| MojoDeadline elapsed;
|
|
|
| stopwatch.Start();
|
| - result = waiter_.Wait(deadline_, &context);
|
| + result = waiter_.Wait(deadline_, &context, &signals_state);
|
| elapsed = stopwatch.Elapsed();
|
|
|
| {
|
| @@ -78,6 +81,7 @@ class WaitingThread : public test::SimpleTestThread {
|
| done_ = true;
|
| result_ = result;
|
| context_ = context;
|
| + signals_state_ = signals_state;
|
| elapsed_ = elapsed;
|
| }
|
| }
|
| @@ -89,6 +93,7 @@ class WaitingThread : public test::SimpleTestThread {
|
| bool done_ MOJO_GUARDED_BY(mutex_);
|
| MojoResult result_ MOJO_GUARDED_BY(mutex_);
|
| uint64_t context_ MOJO_GUARDED_BY(mutex_);
|
| + HandleSignalsState signals_state_ MOJO_GUARDED_BY(mutex_);
|
| MojoDeadline elapsed_ MOJO_GUARDED_BY(mutex_);
|
|
|
| MOJO_DISALLOW_COPY_AND_ASSIGN(WaitingThread);
|
| @@ -97,6 +102,7 @@ class WaitingThread : public test::SimpleTestThread {
|
| TEST(WaiterTest, Basic) {
|
| MojoResult result;
|
| uint64_t context;
|
| + HandleSignalsState hss;
|
| MojoDeadline elapsed;
|
|
|
| // Finite deadline.
|
| @@ -106,10 +112,13 @@ TEST(WaiterTest, Basic) {
|
| WaitingThread thread(10 * test::EpsilonTimeout());
|
| thread.Start();
|
| thread.waiter()->Awake(1, Awakable::AwakeReason::SATISFIED,
|
| - HandleSignalsState());
|
| - thread.WaitUntilDone(&result, &context, &elapsed);
|
| + HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
|
| + MOJO_HANDLE_SIGNAL_READABLE));
|
| + thread.WaitUntilDone(&result, &context, &hss, &elapsed);
|
| EXPECT_EQ(MOJO_RESULT_OK, result);
|
| EXPECT_EQ(1u, context);
|
| + EXPECT_TRUE(hss.equals(HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
|
| + MOJO_HANDLE_SIGNAL_READABLE)));
|
| EXPECT_LT(elapsed, test::EpsilonTimeout());
|
| }
|
|
|
| @@ -117,11 +126,14 @@ TEST(WaiterTest, Basic) {
|
| {
|
| WaitingThread thread(10 * test::EpsilonTimeout());
|
| thread.waiter()->Awake(2, Awakable::AwakeReason::CANCELLED,
|
| - HandleSignalsState());
|
| + HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE,
|
| + MOJO_HANDLE_SIGNAL_WRITABLE));
|
| thread.Start();
|
| - thread.WaitUntilDone(&result, &context, &elapsed);
|
| + thread.WaitUntilDone(&result, &context, &hss, &elapsed);
|
| EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
|
| EXPECT_EQ(2u, context);
|
| + EXPECT_TRUE(hss.equals(HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE,
|
| + MOJO_HANDLE_SIGNAL_WRITABLE)));
|
| EXPECT_LT(elapsed, test::EpsilonTimeout());
|
| }
|
|
|
| @@ -131,10 +143,15 @@ TEST(WaiterTest, Basic) {
|
| thread.Start();
|
| ThreadSleep(2 * test::EpsilonTimeout());
|
| thread.waiter()->Awake(3, Awakable::AwakeReason::SATISFIED,
|
| - HandleSignalsState());
|
| - thread.WaitUntilDone(&result, &context, &elapsed);
|
| + HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
|
| + MOJO_HANDLE_SIGNAL_READABLE |
|
| + MOJO_HANDLE_SIGNAL_WRITABLE));
|
| + thread.WaitUntilDone(&result, &context, &hss, &elapsed);
|
| EXPECT_EQ(MOJO_RESULT_OK, result);
|
| EXPECT_EQ(3u, context);
|
| + EXPECT_TRUE(hss.equals(HandleSignalsState(
|
| + MOJO_HANDLE_SIGNAL_READABLE,
|
| + MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)));
|
| EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
|
| EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
|
| }
|
| @@ -146,9 +163,10 @@ TEST(WaiterTest, Basic) {
|
| ThreadSleep(5 * test::EpsilonTimeout());
|
| thread.waiter()->Awake(4, Awakable::AwakeReason::UNSATISFIABLE,
|
| HandleSignalsState());
|
| - thread.WaitUntilDone(&result, &context, &elapsed);
|
| + thread.WaitUntilDone(&result, &context, &hss, &elapsed);
|
| EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
|
| EXPECT_EQ(4u, context);
|
| + EXPECT_TRUE(hss.equals(HandleSignalsState()));
|
| EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout());
|
| EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout());
|
| }
|
| @@ -157,7 +175,7 @@ TEST(WaiterTest, Basic) {
|
| {
|
| WaitingThread thread(2 * test::EpsilonTimeout());
|
| thread.Start();
|
| - thread.WaitUntilDone(&result, &context, &elapsed);
|
| + thread.WaitUntilDone(&result, &context, &hss, &elapsed);
|
| EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, result);
|
| EXPECT_EQ(static_cast<uint64_t>(-1), context);
|
| EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
|
| @@ -171,10 +189,13 @@ TEST(WaiterTest, Basic) {
|
| WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
|
| thread.Start();
|
| thread.waiter()->Awake(5, Awakable::AwakeReason::SATISFIED,
|
| - HandleSignalsState());
|
| - thread.WaitUntilDone(&result, &context, &elapsed);
|
| + HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
|
| + MOJO_HANDLE_SIGNAL_READABLE));
|
| + thread.WaitUntilDone(&result, &context, &hss, &elapsed);
|
| EXPECT_EQ(MOJO_RESULT_OK, result);
|
| EXPECT_EQ(5u, context);
|
| + EXPECT_TRUE(hss.equals(HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
|
| + MOJO_HANDLE_SIGNAL_READABLE)));
|
| EXPECT_LT(elapsed, test::EpsilonTimeout());
|
| }
|
|
|
| @@ -184,9 +205,10 @@ TEST(WaiterTest, Basic) {
|
| thread.waiter()->Awake(6, Awakable::AwakeReason::CANCELLED,
|
| HandleSignalsState());
|
| thread.Start();
|
| - thread.WaitUntilDone(&result, &context, &elapsed);
|
| + thread.WaitUntilDone(&result, &context, &hss, &elapsed);
|
| EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
|
| EXPECT_EQ(6u, context);
|
| + EXPECT_TRUE(hss.equals(HandleSignalsState()));
|
| EXPECT_LT(elapsed, test::EpsilonTimeout());
|
| }
|
|
|
| @@ -196,10 +218,13 @@ TEST(WaiterTest, Basic) {
|
| thread.Start();
|
| ThreadSleep(2 * test::EpsilonTimeout());
|
| thread.waiter()->Awake(7, Awakable::AwakeReason::UNSATISFIABLE,
|
| - HandleSignalsState());
|
| - thread.WaitUntilDone(&result, &context, &elapsed);
|
| + HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE,
|
| + MOJO_HANDLE_SIGNAL_WRITABLE));
|
| + thread.WaitUntilDone(&result, &context, &hss, &elapsed);
|
| EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
|
| EXPECT_EQ(7u, context);
|
| + EXPECT_TRUE(hss.equals(HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE,
|
| + MOJO_HANDLE_SIGNAL_WRITABLE)));
|
| EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
|
| EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
|
| }
|
| @@ -210,10 +235,13 @@ TEST(WaiterTest, Basic) {
|
| thread.Start();
|
| ThreadSleep(5 * test::EpsilonTimeout());
|
| thread.waiter()->Awake(8, Awakable::AwakeReason::CANCELLED,
|
| - HandleSignalsState());
|
| - thread.WaitUntilDone(&result, &context, &elapsed);
|
| + HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
|
| + MOJO_HANDLE_SIGNAL_READABLE));
|
| + thread.WaitUntilDone(&result, &context, &hss, &elapsed);
|
| EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
|
| EXPECT_EQ(8u, context);
|
| + EXPECT_TRUE(hss.equals(HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
|
| + MOJO_HANDLE_SIGNAL_READABLE)));
|
| EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout());
|
| EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout());
|
| }
|
| @@ -228,7 +256,7 @@ TEST(WaiterTest, TimeOut) {
|
|
|
| waiter.Init();
|
| stopwatch.Start();
|
| - EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, &context));
|
| + EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, &context, nullptr));
|
| elapsed = stopwatch.Elapsed();
|
| EXPECT_LT(elapsed, test::EpsilonTimeout());
|
| EXPECT_EQ(123u, context);
|
| @@ -236,7 +264,7 @@ TEST(WaiterTest, TimeOut) {
|
| waiter.Init();
|
| stopwatch.Start();
|
| EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
|
| - waiter.Wait(2 * test::EpsilonTimeout(), &context));
|
| + waiter.Wait(2 * test::EpsilonTimeout(), &context, nullptr));
|
| elapsed = stopwatch.Elapsed();
|
| EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
|
| EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
|
| @@ -245,7 +273,7 @@ TEST(WaiterTest, TimeOut) {
|
| waiter.Init();
|
| stopwatch.Start();
|
| EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
|
| - waiter.Wait(5 * test::EpsilonTimeout(), &context));
|
| + waiter.Wait(5 * test::EpsilonTimeout(), &context, nullptr));
|
| elapsed = stopwatch.Elapsed();
|
| EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout());
|
| EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout());
|
| @@ -256,18 +284,22 @@ TEST(WaiterTest, TimeOut) {
|
| TEST(WaiterTest, MultipleAwakes) {
|
| MojoResult result;
|
| uint64_t context;
|
| + HandleSignalsState hss;
|
| MojoDeadline elapsed;
|
|
|
| {
|
| WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
|
| thread.Start();
|
| thread.waiter()->Awake(1, Awakable::AwakeReason::SATISFIED,
|
| - HandleSignalsState());
|
| + HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
|
| + MOJO_HANDLE_SIGNAL_READABLE));
|
| thread.waiter()->Awake(2, Awakable::AwakeReason::UNSATISFIABLE,
|
| HandleSignalsState());
|
| - thread.WaitUntilDone(&result, &context, &elapsed);
|
| + thread.WaitUntilDone(&result, &context, &hss, &elapsed);
|
| EXPECT_EQ(MOJO_RESULT_OK, result);
|
| EXPECT_EQ(1u, context);
|
| + EXPECT_TRUE(hss.equals(HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
|
| + MOJO_HANDLE_SIGNAL_READABLE)));
|
| EXPECT_LT(elapsed, test::EpsilonTimeout());
|
| }
|
|
|
| @@ -277,10 +309,12 @@ TEST(WaiterTest, MultipleAwakes) {
|
| HandleSignalsState());
|
| thread.Start();
|
| thread.waiter()->Awake(4, Awakable::AwakeReason::SATISFIED,
|
| - HandleSignalsState());
|
| - thread.WaitUntilDone(&result, &context, &elapsed);
|
| + HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
|
| + MOJO_HANDLE_SIGNAL_READABLE));
|
| + thread.WaitUntilDone(&result, &context, &hss, &elapsed);
|
| EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
|
| EXPECT_EQ(3u, context);
|
| + EXPECT_TRUE(hss.equals(HandleSignalsState()));
|
| EXPECT_LT(elapsed, test::EpsilonTimeout());
|
| }
|
|
|
| @@ -291,10 +325,12 @@ TEST(WaiterTest, MultipleAwakes) {
|
| HandleSignalsState());
|
| ThreadSleep(2 * test::EpsilonTimeout());
|
| thread.waiter()->Awake(6, Awakable::AwakeReason::UNSATISFIABLE,
|
| - HandleSignalsState());
|
| - thread.WaitUntilDone(&result, &context, &elapsed);
|
| + HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
|
| + MOJO_HANDLE_SIGNAL_READABLE));
|
| + thread.WaitUntilDone(&result, &context, &hss, &elapsed);
|
| EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
|
| EXPECT_EQ(5u, context);
|
| + EXPECT_TRUE(hss.equals(HandleSignalsState()));
|
| EXPECT_LT(elapsed, test::EpsilonTimeout());
|
| }
|
|
|
| @@ -306,10 +342,12 @@ TEST(WaiterTest, MultipleAwakes) {
|
| HandleSignalsState());
|
| ThreadSleep(2 * test::EpsilonTimeout());
|
| thread.waiter()->Awake(8, Awakable::AwakeReason::SATISFIED,
|
| - HandleSignalsState());
|
| - thread.WaitUntilDone(&result, &context, &elapsed);
|
| + HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
|
| + MOJO_HANDLE_SIGNAL_READABLE));
|
| + thread.WaitUntilDone(&result, &context, &hss, &elapsed);
|
| EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
|
| EXPECT_EQ(7u, context);
|
| + EXPECT_TRUE(hss.equals(HandleSignalsState()));
|
| EXPECT_GT(elapsed, (1 - 1) * test::EpsilonTimeout());
|
| EXPECT_LT(elapsed, (1 + 1) * test::EpsilonTimeout());
|
| }
|
|
|