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

Unified Diff: mojo/edk/system/awakable_list_unittest.cc

Issue 2090763002: AwakableList: For persistent awakables, make Add() call Awake() with reason INITIALIZE. (Closed) Base URL: https://github.com/domokit/mojo.git@work795_wait_set_4.7-x-work794_wait_set_4.6
Patch Set: 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/edk/system/awakable_list.cc ('k') | mojo/edk/system/data_pipe.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/edk/system/awakable_list_unittest.cc
diff --git a/mojo/edk/system/awakable_list_unittest.cc b/mojo/edk/system/awakable_list_unittest.cc
index 483d86edb8dc0bb55c33d7d0ca48acb190fd5205..268a168e8931ffadc5f5df327d01999eb6e45804 100644
--- a/mojo/edk/system/awakable_list_unittest.cc
+++ b/mojo/edk/system/awakable_list_unittest.cc
@@ -30,7 +30,8 @@ TEST(AwakableListTest, BasicCancelAndRemoveAll) {
{
AwakableList awakable_list;
test::SimpleWaiterThread thread(&result, &context);
- awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE);
+ awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE,
+ HandleSignalsState());
thread.Start();
awakable_list.CancelAndRemoveAll();
// Double-remove okay:
@@ -43,7 +44,8 @@ TEST(AwakableListTest, BasicCancelAndRemoveAll) {
{
AwakableList awakable_list;
test::SimpleWaiterThread thread(&result, &context);
- awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_WRITABLE,
+ HandleSignalsState());
awakable_list.CancelAndRemoveAll();
thread.Start();
} // Join |thread|.
@@ -54,7 +56,8 @@ TEST(AwakableListTest, BasicCancelAndRemoveAll) {
{
AwakableList awakable_list;
test::SimpleWaiterThread thread(&result, &context);
- awakable_list.Add(thread.waiter(), 3, false, MOJO_HANDLE_SIGNAL_READABLE);
+ awakable_list.Add(thread.waiter(), 3, false, MOJO_HANDLE_SIGNAL_READABLE,
+ HandleSignalsState());
thread.Start();
ThreadSleep(2 * test::EpsilonTimeout());
awakable_list.CancelAndRemoveAll();
@@ -71,15 +74,16 @@ TEST(AwakableListTest, BasicAwakeSatisfied) {
{
AwakableList awakable_list;
test::SimpleWaiterThread thread(&result, &context);
- awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE);
+ HandleSignalsState old_state(
+ MOJO_HANDLE_SIGNAL_NONE,
+ MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE,
+ old_state);
thread.Start();
awakable_list.OnStateChange(
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE),
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_READABLE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE));
+ old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
+ MOJO_HANDLE_SIGNAL_READABLE |
+ MOJO_HANDLE_SIGNAL_WRITABLE));
awakable_list.Remove(false, thread.waiter(), 0);
} // Join |thread|.
EXPECT_EQ(MOJO_RESULT_OK, result);
@@ -89,14 +93,15 @@ TEST(AwakableListTest, BasicAwakeSatisfied) {
{
AwakableList awakable_list;
test::SimpleWaiterThread thread(&result, &context);
- awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_WRITABLE);
+ HandleSignalsState old_state(
+ MOJO_HANDLE_SIGNAL_NONE,
+ MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_WRITABLE,
+ old_state);
awakable_list.OnStateChange(
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE),
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_WRITABLE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE));
+ old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_WRITABLE,
+ MOJO_HANDLE_SIGNAL_READABLE |
+ MOJO_HANDLE_SIGNAL_WRITABLE));
awakable_list.Remove(false, thread.waiter(), 0);
// Double-remove okay:
awakable_list.Remove(false, thread.waiter(), 0);
@@ -109,16 +114,17 @@ TEST(AwakableListTest, BasicAwakeSatisfied) {
{
AwakableList awakable_list;
test::SimpleWaiterThread thread(&result, &context);
- awakable_list.Add(thread.waiter(), 3, false, MOJO_HANDLE_SIGNAL_READABLE);
+ HandleSignalsState old_state(
+ MOJO_HANDLE_SIGNAL_NONE,
+ MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(thread.waiter(), 3, false, MOJO_HANDLE_SIGNAL_READABLE,
+ old_state);
thread.Start();
ThreadSleep(2 * test::EpsilonTimeout());
awakable_list.OnStateChange(
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE),
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_READABLE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE));
+ old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
+ MOJO_HANDLE_SIGNAL_READABLE |
+ MOJO_HANDLE_SIGNAL_WRITABLE));
awakable_list.Remove(false, thread.waiter(), 0);
} // Join |thread|.
EXPECT_EQ(MOJO_RESULT_OK, result);
@@ -133,14 +139,15 @@ TEST(AwakableListTest, BasicAwakeUnsatisfiable) {
{
AwakableList awakable_list;
test::SimpleWaiterThread thread(&result, &context);
- awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE);
+ HandleSignalsState old_state(
+ MOJO_HANDLE_SIGNAL_NONE,
+ MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE,
+ old_state);
thread.Start();
awakable_list.OnStateChange(
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE),
- HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_WRITABLE));
+ old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE,
+ MOJO_HANDLE_SIGNAL_WRITABLE));
awakable_list.Remove(false, thread.waiter(), 0);
} // Join |thread|.
EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
@@ -150,13 +157,14 @@ TEST(AwakableListTest, BasicAwakeUnsatisfiable) {
{
AwakableList awakable_list;
test::SimpleWaiterThread thread(&result, &context);
- awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_WRITABLE);
+ HandleSignalsState old_state(
+ MOJO_HANDLE_SIGNAL_NONE,
+ MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_WRITABLE,
+ old_state);
awakable_list.OnStateChange(
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE),
- HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
- MOJO_HANDLE_SIGNAL_READABLE));
+ old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
+ MOJO_HANDLE_SIGNAL_READABLE));
awakable_list.Remove(false, thread.waiter(), 0);
thread.Start();
} // Join |thread|.
@@ -167,15 +175,16 @@ TEST(AwakableListTest, BasicAwakeUnsatisfiable) {
{
AwakableList awakable_list;
test::SimpleWaiterThread thread(&result, &context);
- awakable_list.Add(thread.waiter(), 3, false, MOJO_HANDLE_SIGNAL_READABLE);
+ HandleSignalsState old_state(
+ MOJO_HANDLE_SIGNAL_NONE,
+ MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(thread.waiter(), 3, false, MOJO_HANDLE_SIGNAL_READABLE,
+ old_state);
thread.Start();
ThreadSleep(2 * test::EpsilonTimeout());
awakable_list.OnStateChange(
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE),
- HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_WRITABLE));
+ old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE,
+ MOJO_HANDLE_SIGNAL_WRITABLE));
awakable_list.Remove(false, thread.waiter(), 0);
// Double-remove okay:
awakable_list.Remove(false, thread.waiter(), 0);
@@ -198,10 +207,12 @@ TEST(AwakableListTest, MultipleAwakables) {
{
AwakableList awakable_list;
test::SimpleWaiterThread thread1(&result1, &context1);
- awakable_list.Add(thread1.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE);
+ awakable_list.Add(thread1.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE,
+ HandleSignalsState());
thread1.Start();
test::SimpleWaiterThread thread2(&result2, &context2);
- awakable_list.Add(thread2.waiter(), 2, false, MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(thread2.waiter(), 2, false, MOJO_HANDLE_SIGNAL_WRITABLE,
+ HandleSignalsState());
thread2.Start();
ThreadSleep(2 * test::EpsilonTimeout());
awakable_list.CancelAndRemoveAll();
@@ -215,19 +226,21 @@ TEST(AwakableListTest, MultipleAwakables) {
{
AwakableList awakable_list;
test::SimpleWaiterThread thread1(&result1, &context1);
- awakable_list.Add(thread1.waiter(), 3, false, MOJO_HANDLE_SIGNAL_READABLE);
+ HandleSignalsState old_state(
+ MOJO_HANDLE_SIGNAL_NONE,
+ MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(thread1.waiter(), 3, false, MOJO_HANDLE_SIGNAL_READABLE,
+ old_state);
thread1.Start();
test::SimpleWaiterThread thread2(&result2, &context2);
- awakable_list.Add(thread2.waiter(), 4, false, MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(thread2.waiter(), 4, false, MOJO_HANDLE_SIGNAL_WRITABLE,
+ old_state);
thread2.Start();
ThreadSleep(2 * test::EpsilonTimeout());
awakable_list.OnStateChange(
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE),
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_READABLE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE));
+ old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
+ MOJO_HANDLE_SIGNAL_READABLE |
+ MOJO_HANDLE_SIGNAL_WRITABLE));
awakable_list.Remove(false, thread1.waiter(), 0);
awakable_list.CancelAndRemoveAll();
} // Join threads.
@@ -240,18 +253,20 @@ TEST(AwakableListTest, MultipleAwakables) {
{
AwakableList awakable_list;
test::SimpleWaiterThread thread1(&result1, &context1);
- awakable_list.Add(thread1.waiter(), 5, false, MOJO_HANDLE_SIGNAL_READABLE);
+ HandleSignalsState old_state(
+ MOJO_HANDLE_SIGNAL_NONE,
+ MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(thread1.waiter(), 5, false, MOJO_HANDLE_SIGNAL_READABLE,
+ old_state);
thread1.Start();
test::SimpleWaiterThread thread2(&result2, &context2);
- awakable_list.Add(thread2.waiter(), 6, false, MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(thread2.waiter(), 6, false, MOJO_HANDLE_SIGNAL_WRITABLE,
+ old_state);
thread2.Start();
ThreadSleep(2 * test::EpsilonTimeout());
awakable_list.OnStateChange(
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE),
- HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_READABLE));
+ old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE,
+ MOJO_HANDLE_SIGNAL_READABLE));
awakable_list.Remove(false, thread2.waiter(), 0);
awakable_list.CancelAndRemoveAll();
} // Join threads.
@@ -264,55 +279,55 @@ TEST(AwakableListTest, MultipleAwakables) {
{
AwakableList awakable_list;
test::SimpleWaiterThread thread1(&result1, &context1);
- awakable_list.Add(thread1.waiter(), 7, false, MOJO_HANDLE_SIGNAL_READABLE);
+ HandleSignalsState old_state(
+ MOJO_HANDLE_SIGNAL_NONE,
+ MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(thread1.waiter(), 7, false, MOJO_HANDLE_SIGNAL_READABLE,
+ old_state);
thread1.Start();
ThreadSleep(1 * test::EpsilonTimeout());
// Should do nothing.
- awakable_list.OnStateChange(
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE),
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE));
+ HandleSignalsState new_state(
+ MOJO_HANDLE_SIGNAL_NONE,
+ MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.OnStateChange(old_state, new_state);
+ old_state = new_state;
test::SimpleWaiterThread thread2(&result2, &context2);
- awakable_list.Add(thread2.waiter(), 8, false, MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(thread2.waiter(), 8, false, MOJO_HANDLE_SIGNAL_WRITABLE,
+ old_state);
thread2.Start();
ThreadSleep(1 * test::EpsilonTimeout());
// Awake #1.
- awakable_list.OnStateChange(
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE),
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_READABLE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE));
+ new_state = HandleSignalsState(
+ MOJO_HANDLE_SIGNAL_READABLE,
+ MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.OnStateChange(old_state, new_state);
+ old_state = new_state;
awakable_list.Remove(false, thread1.waiter(), 0);
ThreadSleep(1 * test::EpsilonTimeout());
test::SimpleWaiterThread thread3(&result3, &context3);
- awakable_list.Add(thread3.waiter(), 9, false, MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(thread3.waiter(), 9, false, MOJO_HANDLE_SIGNAL_WRITABLE,
+ old_state);
thread3.Start();
test::SimpleWaiterThread thread4(&result4, &context4);
- awakable_list.Add(thread4.waiter(), 10, false, MOJO_HANDLE_SIGNAL_READABLE);
+ awakable_list.Add(thread4.waiter(), 10, false, MOJO_HANDLE_SIGNAL_READABLE,
+ old_state);
thread4.Start();
ThreadSleep(1 * test::EpsilonTimeout());
// Awake #2 and #3 for unsatisfiability.
- awakable_list.OnStateChange(
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE),
- HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_READABLE));
+ new_state = HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE,
+ MOJO_HANDLE_SIGNAL_READABLE);
+ awakable_list.OnStateChange(old_state, new_state);
awakable_list.Remove(false, thread2.waiter(), 0);
awakable_list.Remove(false, thread3.waiter(), 0);
@@ -336,17 +351,19 @@ TEST(AwakableListTest, RemoveMatchContext1) {
{
AwakableList awakable_list;
test::SimpleWaiterThread thread(&result, &context);
- awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE);
- awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_READABLE);
+ HandleSignalsState old_state(
+ MOJO_HANDLE_SIGNAL_NONE,
+ MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE,
+ old_state);
+ awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_READABLE,
+ old_state);
thread.Start();
awakable_list.Remove(true, thread.waiter(), 2);
awakable_list.OnStateChange(
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE),
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_READABLE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE));
+ old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
+ MOJO_HANDLE_SIGNAL_READABLE |
+ MOJO_HANDLE_SIGNAL_WRITABLE));
awakable_list.Remove(true, thread.waiter(), 1);
// Double-remove okay:
awakable_list.Remove(true, thread.waiter(), 1);
@@ -358,17 +375,19 @@ TEST(AwakableListTest, RemoveMatchContext1) {
{
AwakableList awakable_list;
test::SimpleWaiterThread thread(&result, &context);
- awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE);
- awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_READABLE);
+ HandleSignalsState old_state(
+ MOJO_HANDLE_SIGNAL_NONE,
+ MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE,
+ old_state);
+ awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_READABLE,
+ old_state);
thread.Start();
awakable_list.Remove(true, thread.waiter(), 1);
awakable_list.OnStateChange(
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_NONE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE),
- HandleSignalsState(
- MOJO_HANDLE_SIGNAL_READABLE,
- MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE));
+ old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
+ MOJO_HANDLE_SIGNAL_READABLE |
+ MOJO_HANDLE_SIGNAL_WRITABLE));
awakable_list.Remove(true, thread.waiter(), 2);
} // Join |thread|.
EXPECT_EQ(MOJO_RESULT_OK, result);
@@ -403,50 +422,58 @@ TEST(AwakableListTest, PersistentVsOneShot1) {
TestAwakable oneshot0;
TestAwakable oneshot1;
- awakable_list.Add(&persistent0, 100, true, MOJO_HANDLE_SIGNAL_WRITABLE);
- awakable_list.Add(&persistent1, 101, true, MOJO_HANDLE_SIGNAL_WRITABLE);
- awakable_list.Add(&oneshot0, 200, false, MOJO_HANDLE_SIGNAL_WRITABLE);
- awakable_list.Add(&oneshot1, 201, false, MOJO_HANDLE_SIGNAL_WRITABLE);
- EXPECT_EQ(persistent0.awake_count, 0u);
- EXPECT_EQ(persistent1.awake_count, 0u);
+ HandleSignalsState old_state(MOJO_HANDLE_SIGNAL_NONE,
+ MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.Add(&persistent0, 100, true, MOJO_HANDLE_SIGNAL_WRITABLE,
+ old_state);
+ EXPECT_EQ(persistent0.awake_count, 1u);
+ EXPECT_EQ(persistent0.last_context, 100u);
+ EXPECT_EQ(persistent0.last_reason, Awakable::AwakeReason::INITIALIZE);
+ EXPECT_TRUE(persistent0.last_state.equals(old_state));
+ awakable_list.Add(&persistent1, 101, true, MOJO_HANDLE_SIGNAL_WRITABLE,
+ old_state);
+ EXPECT_EQ(persistent1.awake_count, 1u);
+ EXPECT_EQ(persistent1.last_context, 101u);
+ EXPECT_EQ(persistent1.last_reason, Awakable::AwakeReason::INITIALIZE);
+ EXPECT_TRUE(persistent1.last_state.equals(old_state));
+ awakable_list.Add(&oneshot0, 200, false, MOJO_HANDLE_SIGNAL_WRITABLE,
+ old_state);
EXPECT_EQ(oneshot0.awake_count, 0u);
+ awakable_list.Add(&oneshot1, 201, false, MOJO_HANDLE_SIGNAL_WRITABLE,
+ old_state);
EXPECT_EQ(oneshot1.awake_count, 0u);
- awakable_list.OnStateChange(
- HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE),
- HandleSignalsState(MOJO_HANDLE_SIGNAL_WRITABLE,
- MOJO_HANDLE_SIGNAL_WRITABLE));
- EXPECT_EQ(persistent0.awake_count, 1u);
+ HandleSignalsState new_state(MOJO_HANDLE_SIGNAL_WRITABLE,
+ MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.OnStateChange(old_state, new_state);
+ old_state = new_state;
+ EXPECT_EQ(persistent0.awake_count, 2u);
EXPECT_EQ(persistent0.last_context, 100u);
EXPECT_EQ(persistent0.last_reason, Awakable::AwakeReason::CHANGED);
- EXPECT_TRUE(persistent0.last_state.equals(HandleSignalsState(
- MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_HANDLE_SIGNAL_WRITABLE)));
- EXPECT_EQ(persistent1.awake_count, 1u);
+ EXPECT_TRUE(persistent0.last_state.equals(old_state));
+ EXPECT_EQ(persistent1.awake_count, 2u);
EXPECT_EQ(persistent1.last_context, 101u);
EXPECT_EQ(persistent1.last_reason, Awakable::AwakeReason::CHANGED);
- EXPECT_TRUE(persistent1.last_state.equals(HandleSignalsState(
- MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_HANDLE_SIGNAL_WRITABLE)));
+ EXPECT_TRUE(persistent1.last_state.equals(old_state));
EXPECT_EQ(oneshot0.awake_count, 1u);
EXPECT_EQ(oneshot0.last_context, 200u);
EXPECT_EQ(oneshot0.last_reason, Awakable::AwakeReason::SATISFIED);
- EXPECT_TRUE(oneshot0.last_state.equals(HandleSignalsState(
- MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_HANDLE_SIGNAL_WRITABLE)));
+ EXPECT_TRUE(oneshot0.last_state.equals(old_state));
EXPECT_EQ(oneshot1.awake_count, 1u);
EXPECT_EQ(oneshot1.last_context, 201u);
EXPECT_EQ(oneshot1.last_reason, Awakable::AwakeReason::SATISFIED);
- EXPECT_TRUE(oneshot1.last_state.equals(HandleSignalsState(
- MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_HANDLE_SIGNAL_WRITABLE)));
+ EXPECT_TRUE(oneshot1.last_state.equals(old_state));
- awakable_list.OnStateChange(
- HandleSignalsState(MOJO_HANDLE_SIGNAL_WRITABLE,
- MOJO_HANDLE_SIGNAL_WRITABLE),
- HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE));
- EXPECT_EQ(persistent0.awake_count, 2u);
+ new_state =
+ HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.OnStateChange(old_state, new_state);
+ old_state = new_state;
+ EXPECT_EQ(persistent0.awake_count, 3u);
EXPECT_EQ(persistent0.last_context, 100u);
EXPECT_EQ(persistent0.last_reason, Awakable::AwakeReason::CHANGED);
EXPECT_TRUE(persistent0.last_state.equals(HandleSignalsState(
MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE)));
- EXPECT_EQ(persistent1.awake_count, 2u);
+ EXPECT_EQ(persistent1.awake_count, 3u);
EXPECT_EQ(persistent1.last_context, 101u);
EXPECT_EQ(persistent1.last_reason, Awakable::AwakeReason::CHANGED);
EXPECT_TRUE(persistent1.last_state.equals(HandleSignalsState(
@@ -454,16 +481,16 @@ TEST(AwakableListTest, PersistentVsOneShot1) {
EXPECT_EQ(oneshot0.awake_count, 1u);
EXPECT_EQ(oneshot1.awake_count, 1u);
- awakable_list.OnStateChange(
- HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE),
- HandleSignalsState(MOJO_HANDLE_SIGNAL_WRITABLE,
- MOJO_HANDLE_SIGNAL_WRITABLE));
- EXPECT_EQ(persistent0.awake_count, 3u);
+ new_state = HandleSignalsState(MOJO_HANDLE_SIGNAL_WRITABLE,
+ MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.OnStateChange(old_state, new_state);
+ old_state = new_state;
+ EXPECT_EQ(persistent0.awake_count, 4u);
EXPECT_EQ(persistent0.last_context, 100u);
EXPECT_EQ(persistent0.last_reason, Awakable::AwakeReason::CHANGED);
EXPECT_TRUE(persistent0.last_state.equals(HandleSignalsState(
MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_HANDLE_SIGNAL_WRITABLE)));
- EXPECT_EQ(persistent1.awake_count, 3u);
+ EXPECT_EQ(persistent1.awake_count, 4u);
EXPECT_EQ(persistent1.last_context, 101u);
EXPECT_EQ(persistent1.last_reason, Awakable::AwakeReason::CHANGED);
EXPECT_TRUE(persistent1.last_state.equals(HandleSignalsState(
@@ -473,17 +500,17 @@ TEST(AwakableListTest, PersistentVsOneShot1) {
awakable_list.Remove(false, &persistent0, 0);
awakable_list.Remove(false, &persistent1, 0);
- EXPECT_EQ(persistent0.awake_count, 3u);
- EXPECT_EQ(persistent1.awake_count, 3u);
+ EXPECT_EQ(persistent0.awake_count, 4u);
+ EXPECT_EQ(persistent1.awake_count, 4u);
EXPECT_EQ(oneshot0.awake_count, 1u);
EXPECT_EQ(oneshot1.awake_count, 1u);
- awakable_list.OnStateChange(
- HandleSignalsState(MOJO_HANDLE_SIGNAL_WRITABLE,
- MOJO_HANDLE_SIGNAL_WRITABLE),
- HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE));
- EXPECT_EQ(persistent0.awake_count, 3u);
- EXPECT_EQ(persistent1.awake_count, 3u);
+ new_state =
+ HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE);
+ awakable_list.OnStateChange(old_state, new_state);
+ old_state = new_state;
+ EXPECT_EQ(persistent0.awake_count, 4u);
+ EXPECT_EQ(persistent1.awake_count, 4u);
EXPECT_EQ(oneshot0.awake_count, 1u);
EXPECT_EQ(oneshot1.awake_count, 1u);
}
@@ -505,59 +532,63 @@ TEST(AwakableListTest, PersistentVsOneShot2) {
HandleSignalsState new_state = old_state;
// Watch R and PC; we'll do the same for |oneshot|, but add/remove each time.
- awakable_list.Add(&persistent, 123, true, kR | kPC);
- EXPECT_EQ(persistent.awake_count, 0u);
+ awakable_list.Add(&persistent, 123, true, kR | kPC, old_state);
+ EXPECT_EQ(persistent.awake_count, 1u);
+ EXPECT_EQ(persistent.last_reason, Awakable::AwakeReason::INITIALIZE);
// Satisfied: +R.
- awakable_list.Add(&oneshot, 456, false, kR | kPC);
+ awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state);
new_state.satisfied_signals |= kR;
awakable_list.OnStateChange(old_state, new_state);
old_state = new_state;
- EXPECT_EQ(persistent.awake_count, 1u);
+ EXPECT_EQ(persistent.awake_count, 2u);
+ EXPECT_EQ(persistent.last_reason, Awakable::AwakeReason::CHANGED);
EXPECT_EQ(oneshot.awake_count, 1u);
EXPECT_EQ(oneshot.last_reason, Awakable::AwakeReason::SATISFIED);
awakable_list.Remove(true, &oneshot, 456);
// Satisfied: -R.
oneshot.awake_count = 0;
- awakable_list.Add(&oneshot, 456, false, kR | kPC);
+ awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state);
new_state.satisfied_signals &= ~kR;
awakable_list.OnStateChange(old_state, new_state);
old_state = new_state;
- EXPECT_EQ(persistent.awake_count, 2u);
+ EXPECT_EQ(persistent.awake_count, 3u);
+ EXPECT_EQ(persistent.last_reason, Awakable::AwakeReason::CHANGED);
EXPECT_EQ(oneshot.awake_count, 0u);
awakable_list.Remove(true, &oneshot, 456);
// Satisfied: +W.
oneshot.awake_count = 0;
- awakable_list.Add(&oneshot, 456, false, kR | kPC);
+ awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state);
new_state.satisfied_signals |= kW;
awakable_list.OnStateChange(old_state, new_state);
old_state = new_state;
- EXPECT_EQ(persistent.awake_count, 2u);
+ EXPECT_EQ(persistent.awake_count, 3u);
EXPECT_EQ(oneshot.awake_count, 0u);
awakable_list.Remove(true, &oneshot, 456);
// Satisfied: +PC -W.
oneshot.awake_count = 0;
- awakable_list.Add(&oneshot, 456, false, kR | kPC);
+ awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state);
new_state.satisfied_signals |= kPC;
new_state.satisfied_signals &= ~kW;
awakable_list.OnStateChange(old_state, new_state);
old_state = new_state;
- EXPECT_EQ(persistent.awake_count, 3u);
+ EXPECT_EQ(persistent.awake_count, 4u);
EXPECT_EQ(oneshot.awake_count, 1u);
EXPECT_EQ(oneshot.last_reason, Awakable::AwakeReason::SATISFIED);
awakable_list.Remove(true, &oneshot, 456);
// Satisfied: +R -PC.
oneshot.awake_count = 0;
- awakable_list.Add(&oneshot, 456, false, kR | kPC);
+ awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state);
new_state.satisfied_signals |= kR;
new_state.satisfied_signals &= ~kPC;
awakable_list.OnStateChange(old_state, new_state);
old_state = new_state;
- EXPECT_EQ(persistent.awake_count, 4u);
+ EXPECT_EQ(persistent.awake_count, 5u);
+ EXPECT_EQ(persistent.last_reason, Awakable::AwakeReason::CHANGED);
// It was previously satisfied and remains satisfied (for different reasons),
// so the one-shot does not observe this change.
EXPECT_EQ(oneshot.awake_count, 0u);
@@ -565,32 +596,34 @@ TEST(AwakableListTest, PersistentVsOneShot2) {
// Satisfiable: -PC.
oneshot.awake_count = 0;
- awakable_list.Add(&oneshot, 456, false, kR | kPC);
+ awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state);
new_state.satisfiable_signals &= ~kPC;
awakable_list.OnStateChange(old_state, new_state);
old_state = new_state;
- EXPECT_EQ(persistent.awake_count, 5u);
+ EXPECT_EQ(persistent.awake_count, 6u);
+ EXPECT_EQ(persistent.last_reason, Awakable::AwakeReason::CHANGED);
EXPECT_EQ(oneshot.awake_count, 0u);
awakable_list.Remove(true, &oneshot, 456);
// Satisfiable: -W.
oneshot.awake_count = 0;
- awakable_list.Add(&oneshot, 456, false, kR | kPC);
+ awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state);
new_state.satisfiable_signals &= ~kW;
awakable_list.OnStateChange(old_state, new_state);
old_state = new_state;
- EXPECT_EQ(persistent.awake_count, 5u);
+ EXPECT_EQ(persistent.awake_count, 6u);
EXPECT_EQ(oneshot.awake_count, 0u);
awakable_list.Remove(true, &oneshot, 456);
// Satisfied: -R. Satisfiable: -R.
oneshot.awake_count = 0;
- awakable_list.Add(&oneshot, 456, false, kR | kPC);
+ awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state);
new_state.satisfied_signals &= ~kR;
new_state.satisfiable_signals &= ~kR;
awakable_list.OnStateChange(old_state, new_state);
old_state = new_state;
- EXPECT_EQ(persistent.awake_count, 6u);
+ EXPECT_EQ(persistent.awake_count, 7u);
+ EXPECT_EQ(persistent.last_reason, Awakable::AwakeReason::CHANGED);
// "Leading edge" for one-shot is "rising" for (overall) satisfied-ness and
// "falling" for (overall) satisfiability, so it's really picking up the -R in
// satisfiability here.
@@ -600,17 +633,18 @@ TEST(AwakableListTest, PersistentVsOneShot2) {
// Satisfiable: +R:
oneshot.awake_count = 0;
- awakable_list.Add(&oneshot, 456, false, kR | kPC);
+ awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state);
new_state.satisfiable_signals |= kR;
awakable_list.OnStateChange(old_state, new_state);
old_state = new_state;
- EXPECT_EQ(persistent.awake_count, 7u);
+ EXPECT_EQ(persistent.awake_count, 8u);
+ EXPECT_EQ(persistent.last_reason, Awakable::AwakeReason::CHANGED);
// And the one-shot doesn't pick up the +R in satisfiability here.
EXPECT_EQ(oneshot.awake_count, 0u);
awakable_list.Remove(true, &oneshot, 456);
awakable_list.Remove(true, &persistent, 123);
- EXPECT_EQ(persistent.awake_count, 7u);
+ EXPECT_EQ(persistent.awake_count, 8u);
}
TEST(AwakableListTest, RemoveNoMatchContext) {
@@ -622,34 +656,35 @@ TEST(AwakableListTest, RemoveNoMatchContext) {
TestAwakable persistent1;
// Add |persistent0| twice, with different contexts.
- awakable_list.Add(&persistent0, 12, true, kR);
- awakable_list.Add(&persistent0, 34, true, kR);
- awakable_list.Add(&persistent1, 56, true, kR);
- EXPECT_EQ(persistent0.awake_count, 0u);
- EXPECT_EQ(persistent1.awake_count, 0u);
+ awakable_list.Add(&persistent0, 12, true, kR, HandleSignalsState(kNone, kR));
+ EXPECT_EQ(persistent0.awake_count, 1u);
+ awakable_list.Add(&persistent0, 34, true, kR, HandleSignalsState(kNone, kR));
+ EXPECT_EQ(persistent0.awake_count, 2u);
+ awakable_list.Add(&persistent1, 56, true, kR, HandleSignalsState(kNone, kR));
+ EXPECT_EQ(persistent1.awake_count, 1u);
awakable_list.OnStateChange(HandleSignalsState(kNone, kR),
HandleSignalsState(kR, kR));
- EXPECT_EQ(persistent0.awake_count, 2u);
- EXPECT_EQ(persistent1.awake_count, 1u);
+ EXPECT_EQ(persistent0.awake_count, 4u);
+ EXPECT_EQ(persistent1.awake_count, 2u);
awakable_list.OnStateChange(HandleSignalsState(kNone, kR),
HandleSignalsState(kNone, kR));
- EXPECT_EQ(persistent0.awake_count, 2u);
- EXPECT_EQ(persistent1.awake_count, 1u);
+ EXPECT_EQ(persistent0.awake_count, 4u);
+ EXPECT_EQ(persistent1.awake_count, 2u);
awakable_list.Remove(false, &persistent0, 0);
- EXPECT_EQ(persistent0.awake_count, 2u);
- EXPECT_EQ(persistent1.awake_count, 1u);
+ EXPECT_EQ(persistent0.awake_count, 4u);
+ EXPECT_EQ(persistent1.awake_count, 2u);
awakable_list.OnStateChange(HandleSignalsState(kNone, kR),
HandleSignalsState(kR, kR));
- EXPECT_EQ(persistent0.awake_count, 2u);
- EXPECT_EQ(persistent1.awake_count, 2u);
+ EXPECT_EQ(persistent0.awake_count, 4u);
+ EXPECT_EQ(persistent1.awake_count, 3u);
awakable_list.Remove(false, &persistent1, 0);
- EXPECT_EQ(persistent0.awake_count, 2u);
- EXPECT_EQ(persistent1.awake_count, 2u);
+ EXPECT_EQ(persistent0.awake_count, 4u);
+ EXPECT_EQ(persistent1.awake_count, 3u);
}
TEST(AwakableListTest, RemoveMatchContext2) {
@@ -661,60 +696,61 @@ TEST(AwakableListTest, RemoveMatchContext2) {
TestAwakable persistent1;
// Add |persistent0| twice, with different contexts.
- awakable_list.Add(&persistent0, 12, true, kR);
- awakable_list.Add(&persistent0, 34, true, kR);
- awakable_list.Add(&persistent1, 56, true, kR);
- EXPECT_EQ(persistent0.awake_count, 0u);
- EXPECT_EQ(persistent1.awake_count, 0u);
+ awakable_list.Add(&persistent0, 12, true, kR, HandleSignalsState(kNone, kR));
+ EXPECT_EQ(persistent0.awake_count, 1u);
+ awakable_list.Add(&persistent0, 34, true, kR, HandleSignalsState(kNone, kR));
+ EXPECT_EQ(persistent0.awake_count, 2u);
+ awakable_list.Add(&persistent1, 56, true, kR, HandleSignalsState(kNone, kR));
+ EXPECT_EQ(persistent1.awake_count, 1u);
awakable_list.OnStateChange(HandleSignalsState(kNone, kR),
HandleSignalsState(kR, kR));
- EXPECT_EQ(persistent0.awake_count, 2u);
- EXPECT_EQ(persistent1.awake_count, 1u);
+ EXPECT_EQ(persistent0.awake_count, 4u);
+ EXPECT_EQ(persistent1.awake_count, 2u);
awakable_list.OnStateChange(HandleSignalsState(kNone, kR),
HandleSignalsState(kNone, kR));
- EXPECT_EQ(persistent0.awake_count, 2u);
- EXPECT_EQ(persistent1.awake_count, 1u);
+ EXPECT_EQ(persistent0.awake_count, 4u);
+ EXPECT_EQ(persistent1.awake_count, 2u);
awakable_list.Remove(true, &persistent0, 34);
- EXPECT_EQ(persistent0.awake_count, 2u);
- EXPECT_EQ(persistent1.awake_count, 1u);
+ EXPECT_EQ(persistent0.awake_count, 4u);
+ EXPECT_EQ(persistent1.awake_count, 2u);
awakable_list.OnStateChange(HandleSignalsState(kNone, kR),
HandleSignalsState(kR, kR));
- EXPECT_EQ(persistent0.awake_count, 3u);
+ EXPECT_EQ(persistent0.awake_count, 5u);
EXPECT_EQ(persistent0.last_context, 12u);
- EXPECT_EQ(persistent1.awake_count, 2u);
+ EXPECT_EQ(persistent1.awake_count, 3u);
// No-op: non-existent context.
awakable_list.Remove(true, &persistent1, 0);
- EXPECT_EQ(persistent0.awake_count, 3u);
- EXPECT_EQ(persistent1.awake_count, 2u);
+ EXPECT_EQ(persistent0.awake_count, 5u);
+ EXPECT_EQ(persistent1.awake_count, 3u);
awakable_list.OnStateChange(HandleSignalsState(kNone, kR),
HandleSignalsState(kNone, kR));
- EXPECT_EQ(persistent0.awake_count, 3u);
- EXPECT_EQ(persistent1.awake_count, 2u);
+ EXPECT_EQ(persistent0.awake_count, 5u);
+ EXPECT_EQ(persistent1.awake_count, 3u);
awakable_list.OnStateChange(HandleSignalsState(kNone, kR),
HandleSignalsState(kR, kR));
- EXPECT_EQ(persistent0.awake_count, 4u);
+ EXPECT_EQ(persistent0.awake_count, 6u);
EXPECT_EQ(persistent0.last_context, 12u);
- EXPECT_EQ(persistent1.awake_count, 3u);
+ EXPECT_EQ(persistent1.awake_count, 4u);
awakable_list.Remove(true, &persistent0, 12);
awakable_list.Remove(true, &persistent1, 56);
awakable_list.OnStateChange(HandleSignalsState(kNone, kR),
HandleSignalsState(kNone, kR));
- EXPECT_EQ(persistent0.awake_count, 4u);
- EXPECT_EQ(persistent1.awake_count, 3u);
+ EXPECT_EQ(persistent0.awake_count, 6u);
+ EXPECT_EQ(persistent1.awake_count, 4u);
awakable_list.OnStateChange(HandleSignalsState(kNone, kR),
HandleSignalsState(kR, kR));
- EXPECT_EQ(persistent0.awake_count, 4u);
- EXPECT_EQ(persistent1.awake_count, 3u);
+ EXPECT_EQ(persistent0.awake_count, 6u);
+ EXPECT_EQ(persistent1.awake_count, 4u);
}
} // namespace
« no previous file with comments | « mojo/edk/system/awakable_list.cc ('k') | mojo/edk/system/data_pipe.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698