| 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 // NOTE(vtl): Some of these tests are inherently flaky (e.g., if run on a | 5 // NOTE(vtl): Some of these tests are inherently flaky (e.g., if run on a |
| 6 // heavily-loaded system). Sorry. |test::EpsilonTimeout()| may be increased to | 6 // heavily-loaded system). Sorry. |test::EpsilonTimeout()| may be increased to |
| 7 // increase tolerance and reduce observed flakiness (though doing so reduces the | 7 // increase tolerance and reduce observed flakiness (though doing so reduces the |
| 8 // meaningfulness of the test). | 8 // meaningfulness of the test). |
| 9 | 9 |
| 10 #include "mojo/edk/system/awakable_list.h" | 10 #include "mojo/edk/system/awakable_list.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 namespace { | 23 namespace { |
| 24 | 24 |
| 25 TEST(AwakableListTest, BasicCancelAndRemoveAll) { | 25 TEST(AwakableListTest, BasicCancelAndRemoveAll) { |
| 26 MojoResult result; | 26 MojoResult result; |
| 27 uint64_t context; | 27 uint64_t context; |
| 28 | 28 |
| 29 // Cancel immediately after thread start. | 29 // Cancel immediately after thread start. |
| 30 { | 30 { |
| 31 AwakableList awakable_list; | 31 AwakableList awakable_list; |
| 32 test::SimpleWaiterThread thread(&result, &context); | 32 test::SimpleWaiterThread thread(&result, &context); |
| 33 awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE); | 33 awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE, |
| 34 HandleSignalsState()); |
| 34 thread.Start(); | 35 thread.Start(); |
| 35 awakable_list.CancelAndRemoveAll(); | 36 awakable_list.CancelAndRemoveAll(); |
| 36 // Double-remove okay: | 37 // Double-remove okay: |
| 37 awakable_list.Remove(false, thread.waiter(), 0); | 38 awakable_list.Remove(false, thread.waiter(), 0); |
| 38 } // Join |thread|. | 39 } // Join |thread|. |
| 39 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); | 40 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); |
| 40 EXPECT_EQ(1u, context); | 41 EXPECT_EQ(1u, context); |
| 41 | 42 |
| 42 // Cancel before after thread start. | 43 // Cancel before after thread start. |
| 43 { | 44 { |
| 44 AwakableList awakable_list; | 45 AwakableList awakable_list; |
| 45 test::SimpleWaiterThread thread(&result, &context); | 46 test::SimpleWaiterThread thread(&result, &context); |
| 46 awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_WRITABLE); | 47 awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 48 HandleSignalsState()); |
| 47 awakable_list.CancelAndRemoveAll(); | 49 awakable_list.CancelAndRemoveAll(); |
| 48 thread.Start(); | 50 thread.Start(); |
| 49 } // Join |thread|. | 51 } // Join |thread|. |
| 50 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); | 52 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); |
| 51 EXPECT_EQ(2u, context); | 53 EXPECT_EQ(2u, context); |
| 52 | 54 |
| 53 // Cancel some time after thread start. | 55 // Cancel some time after thread start. |
| 54 { | 56 { |
| 55 AwakableList awakable_list; | 57 AwakableList awakable_list; |
| 56 test::SimpleWaiterThread thread(&result, &context); | 58 test::SimpleWaiterThread thread(&result, &context); |
| 57 awakable_list.Add(thread.waiter(), 3, false, MOJO_HANDLE_SIGNAL_READABLE); | 59 awakable_list.Add(thread.waiter(), 3, false, MOJO_HANDLE_SIGNAL_READABLE, |
| 60 HandleSignalsState()); |
| 58 thread.Start(); | 61 thread.Start(); |
| 59 ThreadSleep(2 * test::EpsilonTimeout()); | 62 ThreadSleep(2 * test::EpsilonTimeout()); |
| 60 awakable_list.CancelAndRemoveAll(); | 63 awakable_list.CancelAndRemoveAll(); |
| 61 } // Join |thread|. | 64 } // Join |thread|. |
| 62 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); | 65 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); |
| 63 EXPECT_EQ(3u, context); | 66 EXPECT_EQ(3u, context); |
| 64 } | 67 } |
| 65 | 68 |
| 66 TEST(AwakableListTest, BasicAwakeSatisfied) { | 69 TEST(AwakableListTest, BasicAwakeSatisfied) { |
| 67 MojoResult result; | 70 MojoResult result; |
| 68 uint64_t context; | 71 uint64_t context; |
| 69 | 72 |
| 70 // Awake immediately after thread start. | 73 // Awake immediately after thread start. |
| 71 { | 74 { |
| 72 AwakableList awakable_list; | 75 AwakableList awakable_list; |
| 73 test::SimpleWaiterThread thread(&result, &context); | 76 test::SimpleWaiterThread thread(&result, &context); |
| 74 awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE); | 77 HandleSignalsState old_state( |
| 78 MOJO_HANDLE_SIGNAL_NONE, |
| 79 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 80 awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE, |
| 81 old_state); |
| 75 thread.Start(); | 82 thread.Start(); |
| 76 awakable_list.OnStateChange( | 83 awakable_list.OnStateChange( |
| 77 HandleSignalsState( | 84 old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE, |
| 78 MOJO_HANDLE_SIGNAL_NONE, | 85 MOJO_HANDLE_SIGNAL_READABLE | |
| 79 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), | 86 MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 80 HandleSignalsState( | |
| 81 MOJO_HANDLE_SIGNAL_READABLE, | |
| 82 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); | |
| 83 awakable_list.Remove(false, thread.waiter(), 0); | 87 awakable_list.Remove(false, thread.waiter(), 0); |
| 84 } // Join |thread|. | 88 } // Join |thread|. |
| 85 EXPECT_EQ(MOJO_RESULT_OK, result); | 89 EXPECT_EQ(MOJO_RESULT_OK, result); |
| 86 EXPECT_EQ(1u, context); | 90 EXPECT_EQ(1u, context); |
| 87 | 91 |
| 88 // Awake before after thread start. | 92 // Awake before after thread start. |
| 89 { | 93 { |
| 90 AwakableList awakable_list; | 94 AwakableList awakable_list; |
| 91 test::SimpleWaiterThread thread(&result, &context); | 95 test::SimpleWaiterThread thread(&result, &context); |
| 92 awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_WRITABLE); | 96 HandleSignalsState old_state( |
| 97 MOJO_HANDLE_SIGNAL_NONE, |
| 98 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 99 awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 100 old_state); |
| 93 awakable_list.OnStateChange( | 101 awakable_list.OnStateChange( |
| 94 HandleSignalsState( | 102 old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_WRITABLE, |
| 95 MOJO_HANDLE_SIGNAL_NONE, | 103 MOJO_HANDLE_SIGNAL_READABLE | |
| 96 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), | 104 MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 97 HandleSignalsState( | |
| 98 MOJO_HANDLE_SIGNAL_WRITABLE, | |
| 99 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); | |
| 100 awakable_list.Remove(false, thread.waiter(), 0); | 105 awakable_list.Remove(false, thread.waiter(), 0); |
| 101 // Double-remove okay: | 106 // Double-remove okay: |
| 102 awakable_list.Remove(false, thread.waiter(), 0); | 107 awakable_list.Remove(false, thread.waiter(), 0); |
| 103 thread.Start(); | 108 thread.Start(); |
| 104 } // Join |thread|. | 109 } // Join |thread|. |
| 105 EXPECT_EQ(MOJO_RESULT_OK, result); | 110 EXPECT_EQ(MOJO_RESULT_OK, result); |
| 106 EXPECT_EQ(2u, context); | 111 EXPECT_EQ(2u, context); |
| 107 | 112 |
| 108 // Awake some time after thread start. | 113 // Awake some time after thread start. |
| 109 { | 114 { |
| 110 AwakableList awakable_list; | 115 AwakableList awakable_list; |
| 111 test::SimpleWaiterThread thread(&result, &context); | 116 test::SimpleWaiterThread thread(&result, &context); |
| 112 awakable_list.Add(thread.waiter(), 3, false, MOJO_HANDLE_SIGNAL_READABLE); | 117 HandleSignalsState old_state( |
| 118 MOJO_HANDLE_SIGNAL_NONE, |
| 119 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 120 awakable_list.Add(thread.waiter(), 3, false, MOJO_HANDLE_SIGNAL_READABLE, |
| 121 old_state); |
| 113 thread.Start(); | 122 thread.Start(); |
| 114 ThreadSleep(2 * test::EpsilonTimeout()); | 123 ThreadSleep(2 * test::EpsilonTimeout()); |
| 115 awakable_list.OnStateChange( | 124 awakable_list.OnStateChange( |
| 116 HandleSignalsState( | 125 old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE, |
| 117 MOJO_HANDLE_SIGNAL_NONE, | 126 MOJO_HANDLE_SIGNAL_READABLE | |
| 118 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), | 127 MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 119 HandleSignalsState( | |
| 120 MOJO_HANDLE_SIGNAL_READABLE, | |
| 121 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); | |
| 122 awakable_list.Remove(false, thread.waiter(), 0); | 128 awakable_list.Remove(false, thread.waiter(), 0); |
| 123 } // Join |thread|. | 129 } // Join |thread|. |
| 124 EXPECT_EQ(MOJO_RESULT_OK, result); | 130 EXPECT_EQ(MOJO_RESULT_OK, result); |
| 125 EXPECT_EQ(3u, context); | 131 EXPECT_EQ(3u, context); |
| 126 } | 132 } |
| 127 | 133 |
| 128 TEST(AwakableListTest, BasicAwakeUnsatisfiable) { | 134 TEST(AwakableListTest, BasicAwakeUnsatisfiable) { |
| 129 MojoResult result; | 135 MojoResult result; |
| 130 uint64_t context; | 136 uint64_t context; |
| 131 | 137 |
| 132 // Awake (for unsatisfiability) immediately after thread start. | 138 // Awake (for unsatisfiability) immediately after thread start. |
| 133 { | 139 { |
| 134 AwakableList awakable_list; | 140 AwakableList awakable_list; |
| 135 test::SimpleWaiterThread thread(&result, &context); | 141 test::SimpleWaiterThread thread(&result, &context); |
| 136 awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE); | 142 HandleSignalsState old_state( |
| 143 MOJO_HANDLE_SIGNAL_NONE, |
| 144 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 145 awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE, |
| 146 old_state); |
| 137 thread.Start(); | 147 thread.Start(); |
| 138 awakable_list.OnStateChange( | 148 awakable_list.OnStateChange( |
| 139 HandleSignalsState( | 149 old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, |
| 140 MOJO_HANDLE_SIGNAL_NONE, | 150 MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 141 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), | |
| 142 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, | |
| 143 MOJO_HANDLE_SIGNAL_WRITABLE)); | |
| 144 awakable_list.Remove(false, thread.waiter(), 0); | 151 awakable_list.Remove(false, thread.waiter(), 0); |
| 145 } // Join |thread|. | 152 } // Join |thread|. |
| 146 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); | 153 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); |
| 147 EXPECT_EQ(1u, context); | 154 EXPECT_EQ(1u, context); |
| 148 | 155 |
| 149 // Awake (for unsatisfiability) before after thread start. | 156 // Awake (for unsatisfiability) before after thread start. |
| 150 { | 157 { |
| 151 AwakableList awakable_list; | 158 AwakableList awakable_list; |
| 152 test::SimpleWaiterThread thread(&result, &context); | 159 test::SimpleWaiterThread thread(&result, &context); |
| 153 awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_WRITABLE); | 160 HandleSignalsState old_state( |
| 161 MOJO_HANDLE_SIGNAL_NONE, |
| 162 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 163 awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 164 old_state); |
| 154 awakable_list.OnStateChange( | 165 awakable_list.OnStateChange( |
| 155 HandleSignalsState( | 166 old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE, |
| 156 MOJO_HANDLE_SIGNAL_NONE, | 167 MOJO_HANDLE_SIGNAL_READABLE)); |
| 157 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), | |
| 158 HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE, | |
| 159 MOJO_HANDLE_SIGNAL_READABLE)); | |
| 160 awakable_list.Remove(false, thread.waiter(), 0); | 168 awakable_list.Remove(false, thread.waiter(), 0); |
| 161 thread.Start(); | 169 thread.Start(); |
| 162 } // Join |thread|. | 170 } // Join |thread|. |
| 163 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); | 171 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); |
| 164 EXPECT_EQ(2u, context); | 172 EXPECT_EQ(2u, context); |
| 165 | 173 |
| 166 // Awake (for unsatisfiability) some time after thread start. | 174 // Awake (for unsatisfiability) some time after thread start. |
| 167 { | 175 { |
| 168 AwakableList awakable_list; | 176 AwakableList awakable_list; |
| 169 test::SimpleWaiterThread thread(&result, &context); | 177 test::SimpleWaiterThread thread(&result, &context); |
| 170 awakable_list.Add(thread.waiter(), 3, false, MOJO_HANDLE_SIGNAL_READABLE); | 178 HandleSignalsState old_state( |
| 179 MOJO_HANDLE_SIGNAL_NONE, |
| 180 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 181 awakable_list.Add(thread.waiter(), 3, false, MOJO_HANDLE_SIGNAL_READABLE, |
| 182 old_state); |
| 171 thread.Start(); | 183 thread.Start(); |
| 172 ThreadSleep(2 * test::EpsilonTimeout()); | 184 ThreadSleep(2 * test::EpsilonTimeout()); |
| 173 awakable_list.OnStateChange( | 185 awakable_list.OnStateChange( |
| 174 HandleSignalsState( | 186 old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, |
| 175 MOJO_HANDLE_SIGNAL_NONE, | 187 MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 176 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), | |
| 177 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, | |
| 178 MOJO_HANDLE_SIGNAL_WRITABLE)); | |
| 179 awakable_list.Remove(false, thread.waiter(), 0); | 188 awakable_list.Remove(false, thread.waiter(), 0); |
| 180 // Double-remove okay: | 189 // Double-remove okay: |
| 181 awakable_list.Remove(false, thread.waiter(), 0); | 190 awakable_list.Remove(false, thread.waiter(), 0); |
| 182 } // Join |thread|. | 191 } // Join |thread|. |
| 183 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); | 192 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); |
| 184 EXPECT_EQ(3u, context); | 193 EXPECT_EQ(3u, context); |
| 185 } | 194 } |
| 186 | 195 |
| 187 TEST(AwakableListTest, MultipleAwakables) { | 196 TEST(AwakableListTest, MultipleAwakables) { |
| 188 MojoResult result1; | 197 MojoResult result1; |
| 189 MojoResult result2; | 198 MojoResult result2; |
| 190 MojoResult result3; | 199 MojoResult result3; |
| 191 MojoResult result4; | 200 MojoResult result4; |
| 192 uint64_t context1; | 201 uint64_t context1; |
| 193 uint64_t context2; | 202 uint64_t context2; |
| 194 uint64_t context3; | 203 uint64_t context3; |
| 195 uint64_t context4; | 204 uint64_t context4; |
| 196 | 205 |
| 197 // Cancel two awakables. | 206 // Cancel two awakables. |
| 198 { | 207 { |
| 199 AwakableList awakable_list; | 208 AwakableList awakable_list; |
| 200 test::SimpleWaiterThread thread1(&result1, &context1); | 209 test::SimpleWaiterThread thread1(&result1, &context1); |
| 201 awakable_list.Add(thread1.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE); | 210 awakable_list.Add(thread1.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE, |
| 211 HandleSignalsState()); |
| 202 thread1.Start(); | 212 thread1.Start(); |
| 203 test::SimpleWaiterThread thread2(&result2, &context2); | 213 test::SimpleWaiterThread thread2(&result2, &context2); |
| 204 awakable_list.Add(thread2.waiter(), 2, false, MOJO_HANDLE_SIGNAL_WRITABLE); | 214 awakable_list.Add(thread2.waiter(), 2, false, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 215 HandleSignalsState()); |
| 205 thread2.Start(); | 216 thread2.Start(); |
| 206 ThreadSleep(2 * test::EpsilonTimeout()); | 217 ThreadSleep(2 * test::EpsilonTimeout()); |
| 207 awakable_list.CancelAndRemoveAll(); | 218 awakable_list.CancelAndRemoveAll(); |
| 208 } // Join threads. | 219 } // Join threads. |
| 209 EXPECT_EQ(MOJO_RESULT_CANCELLED, result1); | 220 EXPECT_EQ(MOJO_RESULT_CANCELLED, result1); |
| 210 EXPECT_EQ(1u, context1); | 221 EXPECT_EQ(1u, context1); |
| 211 EXPECT_EQ(MOJO_RESULT_CANCELLED, result2); | 222 EXPECT_EQ(MOJO_RESULT_CANCELLED, result2); |
| 212 EXPECT_EQ(2u, context2); | 223 EXPECT_EQ(2u, context2); |
| 213 | 224 |
| 214 // Awake one awakable, cancel other. | 225 // Awake one awakable, cancel other. |
| 215 { | 226 { |
| 216 AwakableList awakable_list; | 227 AwakableList awakable_list; |
| 217 test::SimpleWaiterThread thread1(&result1, &context1); | 228 test::SimpleWaiterThread thread1(&result1, &context1); |
| 218 awakable_list.Add(thread1.waiter(), 3, false, MOJO_HANDLE_SIGNAL_READABLE); | 229 HandleSignalsState old_state( |
| 230 MOJO_HANDLE_SIGNAL_NONE, |
| 231 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 232 awakable_list.Add(thread1.waiter(), 3, false, MOJO_HANDLE_SIGNAL_READABLE, |
| 233 old_state); |
| 219 thread1.Start(); | 234 thread1.Start(); |
| 220 test::SimpleWaiterThread thread2(&result2, &context2); | 235 test::SimpleWaiterThread thread2(&result2, &context2); |
| 221 awakable_list.Add(thread2.waiter(), 4, false, MOJO_HANDLE_SIGNAL_WRITABLE); | 236 awakable_list.Add(thread2.waiter(), 4, false, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 237 old_state); |
| 222 thread2.Start(); | 238 thread2.Start(); |
| 223 ThreadSleep(2 * test::EpsilonTimeout()); | 239 ThreadSleep(2 * test::EpsilonTimeout()); |
| 224 awakable_list.OnStateChange( | 240 awakable_list.OnStateChange( |
| 225 HandleSignalsState( | 241 old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE, |
| 226 MOJO_HANDLE_SIGNAL_NONE, | 242 MOJO_HANDLE_SIGNAL_READABLE | |
| 227 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), | 243 MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 228 HandleSignalsState( | |
| 229 MOJO_HANDLE_SIGNAL_READABLE, | |
| 230 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); | |
| 231 awakable_list.Remove(false, thread1.waiter(), 0); | 244 awakable_list.Remove(false, thread1.waiter(), 0); |
| 232 awakable_list.CancelAndRemoveAll(); | 245 awakable_list.CancelAndRemoveAll(); |
| 233 } // Join threads. | 246 } // Join threads. |
| 234 EXPECT_EQ(MOJO_RESULT_OK, result1); | 247 EXPECT_EQ(MOJO_RESULT_OK, result1); |
| 235 EXPECT_EQ(3u, context1); | 248 EXPECT_EQ(3u, context1); |
| 236 EXPECT_EQ(MOJO_RESULT_CANCELLED, result2); | 249 EXPECT_EQ(MOJO_RESULT_CANCELLED, result2); |
| 237 EXPECT_EQ(4u, context2); | 250 EXPECT_EQ(4u, context2); |
| 238 | 251 |
| 239 // Cancel one awakable, awake other for unsatisfiability. | 252 // Cancel one awakable, awake other for unsatisfiability. |
| 240 { | 253 { |
| 241 AwakableList awakable_list; | 254 AwakableList awakable_list; |
| 242 test::SimpleWaiterThread thread1(&result1, &context1); | 255 test::SimpleWaiterThread thread1(&result1, &context1); |
| 243 awakable_list.Add(thread1.waiter(), 5, false, MOJO_HANDLE_SIGNAL_READABLE); | 256 HandleSignalsState old_state( |
| 257 MOJO_HANDLE_SIGNAL_NONE, |
| 258 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 259 awakable_list.Add(thread1.waiter(), 5, false, MOJO_HANDLE_SIGNAL_READABLE, |
| 260 old_state); |
| 244 thread1.Start(); | 261 thread1.Start(); |
| 245 test::SimpleWaiterThread thread2(&result2, &context2); | 262 test::SimpleWaiterThread thread2(&result2, &context2); |
| 246 awakable_list.Add(thread2.waiter(), 6, false, MOJO_HANDLE_SIGNAL_WRITABLE); | 263 awakable_list.Add(thread2.waiter(), 6, false, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 264 old_state); |
| 247 thread2.Start(); | 265 thread2.Start(); |
| 248 ThreadSleep(2 * test::EpsilonTimeout()); | 266 ThreadSleep(2 * test::EpsilonTimeout()); |
| 249 awakable_list.OnStateChange( | 267 awakable_list.OnStateChange( |
| 250 HandleSignalsState( | 268 old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, |
| 251 MOJO_HANDLE_SIGNAL_NONE, | 269 MOJO_HANDLE_SIGNAL_READABLE)); |
| 252 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), | |
| 253 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, | |
| 254 MOJO_HANDLE_SIGNAL_READABLE)); | |
| 255 awakable_list.Remove(false, thread2.waiter(), 0); | 270 awakable_list.Remove(false, thread2.waiter(), 0); |
| 256 awakable_list.CancelAndRemoveAll(); | 271 awakable_list.CancelAndRemoveAll(); |
| 257 } // Join threads. | 272 } // Join threads. |
| 258 EXPECT_EQ(MOJO_RESULT_CANCELLED, result1); | 273 EXPECT_EQ(MOJO_RESULT_CANCELLED, result1); |
| 259 EXPECT_EQ(5u, context1); | 274 EXPECT_EQ(5u, context1); |
| 260 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result2); | 275 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result2); |
| 261 EXPECT_EQ(6u, context2); | 276 EXPECT_EQ(6u, context2); |
| 262 | 277 |
| 263 // Cancel one awakable, awake other for unsatisfiability. | 278 // Cancel one awakable, awake other for unsatisfiability. |
| 264 { | 279 { |
| 265 AwakableList awakable_list; | 280 AwakableList awakable_list; |
| 266 test::SimpleWaiterThread thread1(&result1, &context1); | 281 test::SimpleWaiterThread thread1(&result1, &context1); |
| 267 awakable_list.Add(thread1.waiter(), 7, false, MOJO_HANDLE_SIGNAL_READABLE); | 282 HandleSignalsState old_state( |
| 283 MOJO_HANDLE_SIGNAL_NONE, |
| 284 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 285 awakable_list.Add(thread1.waiter(), 7, false, MOJO_HANDLE_SIGNAL_READABLE, |
| 286 old_state); |
| 268 thread1.Start(); | 287 thread1.Start(); |
| 269 | 288 |
| 270 ThreadSleep(1 * test::EpsilonTimeout()); | 289 ThreadSleep(1 * test::EpsilonTimeout()); |
| 271 | 290 |
| 272 // Should do nothing. | 291 // Should do nothing. |
| 273 awakable_list.OnStateChange( | 292 HandleSignalsState new_state( |
| 274 HandleSignalsState( | 293 MOJO_HANDLE_SIGNAL_NONE, |
| 275 MOJO_HANDLE_SIGNAL_NONE, | 294 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 276 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), | 295 awakable_list.OnStateChange(old_state, new_state); |
| 277 HandleSignalsState( | 296 old_state = new_state; |
| 278 MOJO_HANDLE_SIGNAL_NONE, | |
| 279 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); | |
| 280 | 297 |
| 281 test::SimpleWaiterThread thread2(&result2, &context2); | 298 test::SimpleWaiterThread thread2(&result2, &context2); |
| 282 awakable_list.Add(thread2.waiter(), 8, false, MOJO_HANDLE_SIGNAL_WRITABLE); | 299 awakable_list.Add(thread2.waiter(), 8, false, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 300 old_state); |
| 283 thread2.Start(); | 301 thread2.Start(); |
| 284 | 302 |
| 285 ThreadSleep(1 * test::EpsilonTimeout()); | 303 ThreadSleep(1 * test::EpsilonTimeout()); |
| 286 | 304 |
| 287 // Awake #1. | 305 // Awake #1. |
| 288 awakable_list.OnStateChange( | 306 new_state = HandleSignalsState( |
| 289 HandleSignalsState( | 307 MOJO_HANDLE_SIGNAL_READABLE, |
| 290 MOJO_HANDLE_SIGNAL_NONE, | 308 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 291 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), | 309 awakable_list.OnStateChange(old_state, new_state); |
| 292 HandleSignalsState( | 310 old_state = new_state; |
| 293 MOJO_HANDLE_SIGNAL_READABLE, | |
| 294 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); | |
| 295 awakable_list.Remove(false, thread1.waiter(), 0); | 311 awakable_list.Remove(false, thread1.waiter(), 0); |
| 296 | 312 |
| 297 ThreadSleep(1 * test::EpsilonTimeout()); | 313 ThreadSleep(1 * test::EpsilonTimeout()); |
| 298 | 314 |
| 299 test::SimpleWaiterThread thread3(&result3, &context3); | 315 test::SimpleWaiterThread thread3(&result3, &context3); |
| 300 awakable_list.Add(thread3.waiter(), 9, false, MOJO_HANDLE_SIGNAL_WRITABLE); | 316 awakable_list.Add(thread3.waiter(), 9, false, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 317 old_state); |
| 301 thread3.Start(); | 318 thread3.Start(); |
| 302 | 319 |
| 303 test::SimpleWaiterThread thread4(&result4, &context4); | 320 test::SimpleWaiterThread thread4(&result4, &context4); |
| 304 awakable_list.Add(thread4.waiter(), 10, false, MOJO_HANDLE_SIGNAL_READABLE); | 321 awakable_list.Add(thread4.waiter(), 10, false, MOJO_HANDLE_SIGNAL_READABLE, |
| 322 old_state); |
| 305 thread4.Start(); | 323 thread4.Start(); |
| 306 | 324 |
| 307 ThreadSleep(1 * test::EpsilonTimeout()); | 325 ThreadSleep(1 * test::EpsilonTimeout()); |
| 308 | 326 |
| 309 // Awake #2 and #3 for unsatisfiability. | 327 // Awake #2 and #3 for unsatisfiability. |
| 310 awakable_list.OnStateChange( | 328 new_state = HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, |
| 311 HandleSignalsState( | 329 MOJO_HANDLE_SIGNAL_READABLE); |
| 312 MOJO_HANDLE_SIGNAL_NONE, | 330 awakable_list.OnStateChange(old_state, new_state); |
| 313 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), | |
| 314 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, | |
| 315 MOJO_HANDLE_SIGNAL_READABLE)); | |
| 316 awakable_list.Remove(false, thread2.waiter(), 0); | 331 awakable_list.Remove(false, thread2.waiter(), 0); |
| 317 awakable_list.Remove(false, thread3.waiter(), 0); | 332 awakable_list.Remove(false, thread3.waiter(), 0); |
| 318 | 333 |
| 319 // Cancel #4. | 334 // Cancel #4. |
| 320 awakable_list.CancelAndRemoveAll(); | 335 awakable_list.CancelAndRemoveAll(); |
| 321 } // Join threads. | 336 } // Join threads. |
| 322 EXPECT_EQ(MOJO_RESULT_OK, result1); | 337 EXPECT_EQ(MOJO_RESULT_OK, result1); |
| 323 EXPECT_EQ(7u, context1); | 338 EXPECT_EQ(7u, context1); |
| 324 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result2); | 339 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result2); |
| 325 EXPECT_EQ(8u, context2); | 340 EXPECT_EQ(8u, context2); |
| 326 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result3); | 341 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result3); |
| 327 EXPECT_EQ(9u, context3); | 342 EXPECT_EQ(9u, context3); |
| 328 EXPECT_EQ(MOJO_RESULT_CANCELLED, result4); | 343 EXPECT_EQ(MOJO_RESULT_CANCELLED, result4); |
| 329 EXPECT_EQ(10u, context4); | 344 EXPECT_EQ(10u, context4); |
| 330 } | 345 } |
| 331 | 346 |
| 332 TEST(AwakableListTest, RemoveMatchContext1) { | 347 TEST(AwakableListTest, RemoveMatchContext1) { |
| 333 MojoResult result; | 348 MojoResult result; |
| 334 uint64_t context; | 349 uint64_t context; |
| 335 | 350 |
| 336 { | 351 { |
| 337 AwakableList awakable_list; | 352 AwakableList awakable_list; |
| 338 test::SimpleWaiterThread thread(&result, &context); | 353 test::SimpleWaiterThread thread(&result, &context); |
| 339 awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE); | 354 HandleSignalsState old_state( |
| 340 awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_READABLE); | 355 MOJO_HANDLE_SIGNAL_NONE, |
| 356 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 357 awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE, |
| 358 old_state); |
| 359 awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_READABLE, |
| 360 old_state); |
| 341 thread.Start(); | 361 thread.Start(); |
| 342 awakable_list.Remove(true, thread.waiter(), 2); | 362 awakable_list.Remove(true, thread.waiter(), 2); |
| 343 awakable_list.OnStateChange( | 363 awakable_list.OnStateChange( |
| 344 HandleSignalsState( | 364 old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE, |
| 345 MOJO_HANDLE_SIGNAL_NONE, | 365 MOJO_HANDLE_SIGNAL_READABLE | |
| 346 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), | 366 MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 347 HandleSignalsState( | |
| 348 MOJO_HANDLE_SIGNAL_READABLE, | |
| 349 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); | |
| 350 awakable_list.Remove(true, thread.waiter(), 1); | 367 awakable_list.Remove(true, thread.waiter(), 1); |
| 351 // Double-remove okay: | 368 // Double-remove okay: |
| 352 awakable_list.Remove(true, thread.waiter(), 1); | 369 awakable_list.Remove(true, thread.waiter(), 1); |
| 353 } // Join |thread|. | 370 } // Join |thread|. |
| 354 EXPECT_EQ(MOJO_RESULT_OK, result); | 371 EXPECT_EQ(MOJO_RESULT_OK, result); |
| 355 EXPECT_EQ(1u, context); | 372 EXPECT_EQ(1u, context); |
| 356 | 373 |
| 357 // Try the same thing, but remove "1" before the awake instead. | 374 // Try the same thing, but remove "1" before the awake instead. |
| 358 { | 375 { |
| 359 AwakableList awakable_list; | 376 AwakableList awakable_list; |
| 360 test::SimpleWaiterThread thread(&result, &context); | 377 test::SimpleWaiterThread thread(&result, &context); |
| 361 awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE); | 378 HandleSignalsState old_state( |
| 362 awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_READABLE); | 379 MOJO_HANDLE_SIGNAL_NONE, |
| 380 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 381 awakable_list.Add(thread.waiter(), 1, false, MOJO_HANDLE_SIGNAL_READABLE, |
| 382 old_state); |
| 383 awakable_list.Add(thread.waiter(), 2, false, MOJO_HANDLE_SIGNAL_READABLE, |
| 384 old_state); |
| 363 thread.Start(); | 385 thread.Start(); |
| 364 awakable_list.Remove(true, thread.waiter(), 1); | 386 awakable_list.Remove(true, thread.waiter(), 1); |
| 365 awakable_list.OnStateChange( | 387 awakable_list.OnStateChange( |
| 366 HandleSignalsState( | 388 old_state, HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE, |
| 367 MOJO_HANDLE_SIGNAL_NONE, | 389 MOJO_HANDLE_SIGNAL_READABLE | |
| 368 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), | 390 MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 369 HandleSignalsState( | |
| 370 MOJO_HANDLE_SIGNAL_READABLE, | |
| 371 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); | |
| 372 awakable_list.Remove(true, thread.waiter(), 2); | 391 awakable_list.Remove(true, thread.waiter(), 2); |
| 373 } // Join |thread|. | 392 } // Join |thread|. |
| 374 EXPECT_EQ(MOJO_RESULT_OK, result); | 393 EXPECT_EQ(MOJO_RESULT_OK, result); |
| 375 EXPECT_EQ(2u, context); | 394 EXPECT_EQ(2u, context); |
| 376 } | 395 } |
| 377 | 396 |
| 378 class TestAwakable : public Awakable { | 397 class TestAwakable : public Awakable { |
| 379 public: | 398 public: |
| 380 TestAwakable() {} | 399 TestAwakable() {} |
| 381 | 400 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 396 MOJO_DISALLOW_COPY_AND_ASSIGN(TestAwakable); | 415 MOJO_DISALLOW_COPY_AND_ASSIGN(TestAwakable); |
| 397 }; | 416 }; |
| 398 | 417 |
| 399 TEST(AwakableListTest, PersistentVsOneShot1) { | 418 TEST(AwakableListTest, PersistentVsOneShot1) { |
| 400 AwakableList awakable_list; | 419 AwakableList awakable_list; |
| 401 TestAwakable persistent0; | 420 TestAwakable persistent0; |
| 402 TestAwakable persistent1; | 421 TestAwakable persistent1; |
| 403 TestAwakable oneshot0; | 422 TestAwakable oneshot0; |
| 404 TestAwakable oneshot1; | 423 TestAwakable oneshot1; |
| 405 | 424 |
| 406 awakable_list.Add(&persistent0, 100, true, MOJO_HANDLE_SIGNAL_WRITABLE); | 425 HandleSignalsState old_state(MOJO_HANDLE_SIGNAL_NONE, |
| 407 awakable_list.Add(&persistent1, 101, true, MOJO_HANDLE_SIGNAL_WRITABLE); | 426 MOJO_HANDLE_SIGNAL_WRITABLE); |
| 408 awakable_list.Add(&oneshot0, 200, false, MOJO_HANDLE_SIGNAL_WRITABLE); | 427 awakable_list.Add(&persistent0, 100, true, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 409 awakable_list.Add(&oneshot1, 201, false, MOJO_HANDLE_SIGNAL_WRITABLE); | 428 old_state); |
| 410 EXPECT_EQ(persistent0.awake_count, 0u); | 429 EXPECT_EQ(persistent0.awake_count, 1u); |
| 411 EXPECT_EQ(persistent1.awake_count, 0u); | 430 EXPECT_EQ(persistent0.last_context, 100u); |
| 431 EXPECT_EQ(persistent0.last_reason, Awakable::AwakeReason::INITIALIZE); |
| 432 EXPECT_TRUE(persistent0.last_state.equals(old_state)); |
| 433 awakable_list.Add(&persistent1, 101, true, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 434 old_state); |
| 435 EXPECT_EQ(persistent1.awake_count, 1u); |
| 436 EXPECT_EQ(persistent1.last_context, 101u); |
| 437 EXPECT_EQ(persistent1.last_reason, Awakable::AwakeReason::INITIALIZE); |
| 438 EXPECT_TRUE(persistent1.last_state.equals(old_state)); |
| 439 awakable_list.Add(&oneshot0, 200, false, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 440 old_state); |
| 412 EXPECT_EQ(oneshot0.awake_count, 0u); | 441 EXPECT_EQ(oneshot0.awake_count, 0u); |
| 442 awakable_list.Add(&oneshot1, 201, false, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 443 old_state); |
| 413 EXPECT_EQ(oneshot1.awake_count, 0u); | 444 EXPECT_EQ(oneshot1.awake_count, 0u); |
| 414 | 445 |
| 415 awakable_list.OnStateChange( | 446 HandleSignalsState new_state(MOJO_HANDLE_SIGNAL_WRITABLE, |
| 416 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE), | 447 MOJO_HANDLE_SIGNAL_WRITABLE); |
| 417 HandleSignalsState(MOJO_HANDLE_SIGNAL_WRITABLE, | 448 awakable_list.OnStateChange(old_state, new_state); |
| 418 MOJO_HANDLE_SIGNAL_WRITABLE)); | 449 old_state = new_state; |
| 419 EXPECT_EQ(persistent0.awake_count, 1u); | 450 EXPECT_EQ(persistent0.awake_count, 2u); |
| 420 EXPECT_EQ(persistent0.last_context, 100u); | 451 EXPECT_EQ(persistent0.last_context, 100u); |
| 421 EXPECT_EQ(persistent0.last_reason, Awakable::AwakeReason::CHANGED); | 452 EXPECT_EQ(persistent0.last_reason, Awakable::AwakeReason::CHANGED); |
| 422 EXPECT_TRUE(persistent0.last_state.equals(HandleSignalsState( | 453 EXPECT_TRUE(persistent0.last_state.equals(old_state)); |
| 423 MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_HANDLE_SIGNAL_WRITABLE))); | 454 EXPECT_EQ(persistent1.awake_count, 2u); |
| 424 EXPECT_EQ(persistent1.awake_count, 1u); | |
| 425 EXPECT_EQ(persistent1.last_context, 101u); | 455 EXPECT_EQ(persistent1.last_context, 101u); |
| 426 EXPECT_EQ(persistent1.last_reason, Awakable::AwakeReason::CHANGED); | 456 EXPECT_EQ(persistent1.last_reason, Awakable::AwakeReason::CHANGED); |
| 427 EXPECT_TRUE(persistent1.last_state.equals(HandleSignalsState( | 457 EXPECT_TRUE(persistent1.last_state.equals(old_state)); |
| 428 MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_HANDLE_SIGNAL_WRITABLE))); | |
| 429 EXPECT_EQ(oneshot0.awake_count, 1u); | 458 EXPECT_EQ(oneshot0.awake_count, 1u); |
| 430 EXPECT_EQ(oneshot0.last_context, 200u); | 459 EXPECT_EQ(oneshot0.last_context, 200u); |
| 431 EXPECT_EQ(oneshot0.last_reason, Awakable::AwakeReason::SATISFIED); | 460 EXPECT_EQ(oneshot0.last_reason, Awakable::AwakeReason::SATISFIED); |
| 432 EXPECT_TRUE(oneshot0.last_state.equals(HandleSignalsState( | 461 EXPECT_TRUE(oneshot0.last_state.equals(old_state)); |
| 433 MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_HANDLE_SIGNAL_WRITABLE))); | |
| 434 EXPECT_EQ(oneshot1.awake_count, 1u); | 462 EXPECT_EQ(oneshot1.awake_count, 1u); |
| 435 EXPECT_EQ(oneshot1.last_context, 201u); | 463 EXPECT_EQ(oneshot1.last_context, 201u); |
| 436 EXPECT_EQ(oneshot1.last_reason, Awakable::AwakeReason::SATISFIED); | 464 EXPECT_EQ(oneshot1.last_reason, Awakable::AwakeReason::SATISFIED); |
| 437 EXPECT_TRUE(oneshot1.last_state.equals(HandleSignalsState( | 465 EXPECT_TRUE(oneshot1.last_state.equals(old_state)); |
| 438 MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_HANDLE_SIGNAL_WRITABLE))); | |
| 439 | 466 |
| 440 awakable_list.OnStateChange( | 467 new_state = |
| 441 HandleSignalsState(MOJO_HANDLE_SIGNAL_WRITABLE, | 468 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE); |
| 442 MOJO_HANDLE_SIGNAL_WRITABLE), | 469 awakable_list.OnStateChange(old_state, new_state); |
| 443 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE)); | 470 old_state = new_state; |
| 444 EXPECT_EQ(persistent0.awake_count, 2u); | 471 EXPECT_EQ(persistent0.awake_count, 3u); |
| 445 EXPECT_EQ(persistent0.last_context, 100u); | 472 EXPECT_EQ(persistent0.last_context, 100u); |
| 446 EXPECT_EQ(persistent0.last_reason, Awakable::AwakeReason::CHANGED); | 473 EXPECT_EQ(persistent0.last_reason, Awakable::AwakeReason::CHANGED); |
| 447 EXPECT_TRUE(persistent0.last_state.equals(HandleSignalsState( | 474 EXPECT_TRUE(persistent0.last_state.equals(HandleSignalsState( |
| 448 MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE))); | 475 MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE))); |
| 449 EXPECT_EQ(persistent1.awake_count, 2u); | 476 EXPECT_EQ(persistent1.awake_count, 3u); |
| 450 EXPECT_EQ(persistent1.last_context, 101u); | 477 EXPECT_EQ(persistent1.last_context, 101u); |
| 451 EXPECT_EQ(persistent1.last_reason, Awakable::AwakeReason::CHANGED); | 478 EXPECT_EQ(persistent1.last_reason, Awakable::AwakeReason::CHANGED); |
| 452 EXPECT_TRUE(persistent1.last_state.equals(HandleSignalsState( | 479 EXPECT_TRUE(persistent1.last_state.equals(HandleSignalsState( |
| 453 MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE))); | 480 MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE))); |
| 454 EXPECT_EQ(oneshot0.awake_count, 1u); | 481 EXPECT_EQ(oneshot0.awake_count, 1u); |
| 455 EXPECT_EQ(oneshot1.awake_count, 1u); | 482 EXPECT_EQ(oneshot1.awake_count, 1u); |
| 456 | 483 |
| 457 awakable_list.OnStateChange( | 484 new_state = HandleSignalsState(MOJO_HANDLE_SIGNAL_WRITABLE, |
| 458 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE), | 485 MOJO_HANDLE_SIGNAL_WRITABLE); |
| 459 HandleSignalsState(MOJO_HANDLE_SIGNAL_WRITABLE, | 486 awakable_list.OnStateChange(old_state, new_state); |
| 460 MOJO_HANDLE_SIGNAL_WRITABLE)); | 487 old_state = new_state; |
| 461 EXPECT_EQ(persistent0.awake_count, 3u); | 488 EXPECT_EQ(persistent0.awake_count, 4u); |
| 462 EXPECT_EQ(persistent0.last_context, 100u); | 489 EXPECT_EQ(persistent0.last_context, 100u); |
| 463 EXPECT_EQ(persistent0.last_reason, Awakable::AwakeReason::CHANGED); | 490 EXPECT_EQ(persistent0.last_reason, Awakable::AwakeReason::CHANGED); |
| 464 EXPECT_TRUE(persistent0.last_state.equals(HandleSignalsState( | 491 EXPECT_TRUE(persistent0.last_state.equals(HandleSignalsState( |
| 465 MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_HANDLE_SIGNAL_WRITABLE))); | 492 MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_HANDLE_SIGNAL_WRITABLE))); |
| 466 EXPECT_EQ(persistent1.awake_count, 3u); | 493 EXPECT_EQ(persistent1.awake_count, 4u); |
| 467 EXPECT_EQ(persistent1.last_context, 101u); | 494 EXPECT_EQ(persistent1.last_context, 101u); |
| 468 EXPECT_EQ(persistent1.last_reason, Awakable::AwakeReason::CHANGED); | 495 EXPECT_EQ(persistent1.last_reason, Awakable::AwakeReason::CHANGED); |
| 469 EXPECT_TRUE(persistent1.last_state.equals(HandleSignalsState( | 496 EXPECT_TRUE(persistent1.last_state.equals(HandleSignalsState( |
| 470 MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_HANDLE_SIGNAL_WRITABLE))); | 497 MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_HANDLE_SIGNAL_WRITABLE))); |
| 471 EXPECT_EQ(oneshot0.awake_count, 1u); | 498 EXPECT_EQ(oneshot0.awake_count, 1u); |
| 472 EXPECT_EQ(oneshot1.awake_count, 1u); | 499 EXPECT_EQ(oneshot1.awake_count, 1u); |
| 473 | 500 |
| 474 awakable_list.Remove(false, &persistent0, 0); | 501 awakable_list.Remove(false, &persistent0, 0); |
| 475 awakable_list.Remove(false, &persistent1, 0); | 502 awakable_list.Remove(false, &persistent1, 0); |
| 476 EXPECT_EQ(persistent0.awake_count, 3u); | 503 EXPECT_EQ(persistent0.awake_count, 4u); |
| 477 EXPECT_EQ(persistent1.awake_count, 3u); | 504 EXPECT_EQ(persistent1.awake_count, 4u); |
| 478 EXPECT_EQ(oneshot0.awake_count, 1u); | 505 EXPECT_EQ(oneshot0.awake_count, 1u); |
| 479 EXPECT_EQ(oneshot1.awake_count, 1u); | 506 EXPECT_EQ(oneshot1.awake_count, 1u); |
| 480 | 507 |
| 481 awakable_list.OnStateChange( | 508 new_state = |
| 482 HandleSignalsState(MOJO_HANDLE_SIGNAL_WRITABLE, | 509 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE); |
| 483 MOJO_HANDLE_SIGNAL_WRITABLE), | 510 awakable_list.OnStateChange(old_state, new_state); |
| 484 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE)); | 511 old_state = new_state; |
| 485 EXPECT_EQ(persistent0.awake_count, 3u); | 512 EXPECT_EQ(persistent0.awake_count, 4u); |
| 486 EXPECT_EQ(persistent1.awake_count, 3u); | 513 EXPECT_EQ(persistent1.awake_count, 4u); |
| 487 EXPECT_EQ(oneshot0.awake_count, 1u); | 514 EXPECT_EQ(oneshot0.awake_count, 1u); |
| 488 EXPECT_EQ(oneshot1.awake_count, 1u); | 515 EXPECT_EQ(oneshot1.awake_count, 1u); |
| 489 } | 516 } |
| 490 | 517 |
| 491 // Checks carefully that persistent awakables see all changes whereas one-shot | 518 // Checks carefully that persistent awakables see all changes whereas one-shot |
| 492 // awakables see only "leading edges". | 519 // awakables see only "leading edges". |
| 493 TEST(AwakableListTest, PersistentVsOneShot2) { | 520 TEST(AwakableListTest, PersistentVsOneShot2) { |
| 494 static constexpr MojoHandleSignals kNone = MOJO_HANDLE_SIGNAL_NONE; | 521 static constexpr MojoHandleSignals kNone = MOJO_HANDLE_SIGNAL_NONE; |
| 495 static constexpr MojoHandleSignals kR = MOJO_HANDLE_SIGNAL_READABLE; | 522 static constexpr MojoHandleSignals kR = MOJO_HANDLE_SIGNAL_READABLE; |
| 496 static constexpr MojoHandleSignals kW = MOJO_HANDLE_SIGNAL_WRITABLE; | 523 static constexpr MojoHandleSignals kW = MOJO_HANDLE_SIGNAL_WRITABLE; |
| 497 static constexpr MojoHandleSignals kPC = MOJO_HANDLE_SIGNAL_PEER_CLOSED; | 524 static constexpr MojoHandleSignals kPC = MOJO_HANDLE_SIGNAL_PEER_CLOSED; |
| 498 | 525 |
| 499 AwakableList awakable_list; | 526 AwakableList awakable_list; |
| 500 TestAwakable persistent; | 527 TestAwakable persistent; |
| 501 TestAwakable oneshot; | 528 TestAwakable oneshot; |
| 502 | 529 |
| 503 // Starting state: Satisfied: None. Satisfiable: R | W | PC. | 530 // Starting state: Satisfied: None. Satisfiable: R | W | PC. |
| 504 HandleSignalsState old_state(kNone, kR | kW | kPC); | 531 HandleSignalsState old_state(kNone, kR | kW | kPC); |
| 505 HandleSignalsState new_state = old_state; | 532 HandleSignalsState new_state = old_state; |
| 506 | 533 |
| 507 // Watch R and PC; we'll do the same for |oneshot|, but add/remove each time. | 534 // Watch R and PC; we'll do the same for |oneshot|, but add/remove each time. |
| 508 awakable_list.Add(&persistent, 123, true, kR | kPC); | 535 awakable_list.Add(&persistent, 123, true, kR | kPC, old_state); |
| 509 EXPECT_EQ(persistent.awake_count, 0u); | 536 EXPECT_EQ(persistent.awake_count, 1u); |
| 537 EXPECT_EQ(persistent.last_reason, Awakable::AwakeReason::INITIALIZE); |
| 510 | 538 |
| 511 // Satisfied: +R. | 539 // Satisfied: +R. |
| 512 awakable_list.Add(&oneshot, 456, false, kR | kPC); | 540 awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state); |
| 513 new_state.satisfied_signals |= kR; | 541 new_state.satisfied_signals |= kR; |
| 514 awakable_list.OnStateChange(old_state, new_state); | 542 awakable_list.OnStateChange(old_state, new_state); |
| 515 old_state = new_state; | 543 old_state = new_state; |
| 516 EXPECT_EQ(persistent.awake_count, 1u); | 544 EXPECT_EQ(persistent.awake_count, 2u); |
| 545 EXPECT_EQ(persistent.last_reason, Awakable::AwakeReason::CHANGED); |
| 517 EXPECT_EQ(oneshot.awake_count, 1u); | 546 EXPECT_EQ(oneshot.awake_count, 1u); |
| 518 EXPECT_EQ(oneshot.last_reason, Awakable::AwakeReason::SATISFIED); | 547 EXPECT_EQ(oneshot.last_reason, Awakable::AwakeReason::SATISFIED); |
| 519 awakable_list.Remove(true, &oneshot, 456); | 548 awakable_list.Remove(true, &oneshot, 456); |
| 520 | 549 |
| 521 // Satisfied: -R. | 550 // Satisfied: -R. |
| 522 oneshot.awake_count = 0; | 551 oneshot.awake_count = 0; |
| 523 awakable_list.Add(&oneshot, 456, false, kR | kPC); | 552 awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state); |
| 524 new_state.satisfied_signals &= ~kR; | 553 new_state.satisfied_signals &= ~kR; |
| 525 awakable_list.OnStateChange(old_state, new_state); | 554 awakable_list.OnStateChange(old_state, new_state); |
| 526 old_state = new_state; | 555 old_state = new_state; |
| 527 EXPECT_EQ(persistent.awake_count, 2u); | 556 EXPECT_EQ(persistent.awake_count, 3u); |
| 557 EXPECT_EQ(persistent.last_reason, Awakable::AwakeReason::CHANGED); |
| 528 EXPECT_EQ(oneshot.awake_count, 0u); | 558 EXPECT_EQ(oneshot.awake_count, 0u); |
| 529 awakable_list.Remove(true, &oneshot, 456); | 559 awakable_list.Remove(true, &oneshot, 456); |
| 530 | 560 |
| 531 // Satisfied: +W. | 561 // Satisfied: +W. |
| 532 oneshot.awake_count = 0; | 562 oneshot.awake_count = 0; |
| 533 awakable_list.Add(&oneshot, 456, false, kR | kPC); | 563 awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state); |
| 534 new_state.satisfied_signals |= kW; | 564 new_state.satisfied_signals |= kW; |
| 535 awakable_list.OnStateChange(old_state, new_state); | 565 awakable_list.OnStateChange(old_state, new_state); |
| 536 old_state = new_state; | 566 old_state = new_state; |
| 537 EXPECT_EQ(persistent.awake_count, 2u); | 567 EXPECT_EQ(persistent.awake_count, 3u); |
| 538 EXPECT_EQ(oneshot.awake_count, 0u); | 568 EXPECT_EQ(oneshot.awake_count, 0u); |
| 539 awakable_list.Remove(true, &oneshot, 456); | 569 awakable_list.Remove(true, &oneshot, 456); |
| 540 | 570 |
| 541 // Satisfied: +PC -W. | 571 // Satisfied: +PC -W. |
| 542 oneshot.awake_count = 0; | 572 oneshot.awake_count = 0; |
| 543 awakable_list.Add(&oneshot, 456, false, kR | kPC); | 573 awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state); |
| 544 new_state.satisfied_signals |= kPC; | 574 new_state.satisfied_signals |= kPC; |
| 545 new_state.satisfied_signals &= ~kW; | 575 new_state.satisfied_signals &= ~kW; |
| 546 awakable_list.OnStateChange(old_state, new_state); | 576 awakable_list.OnStateChange(old_state, new_state); |
| 547 old_state = new_state; | 577 old_state = new_state; |
| 548 EXPECT_EQ(persistent.awake_count, 3u); | 578 EXPECT_EQ(persistent.awake_count, 4u); |
| 549 EXPECT_EQ(oneshot.awake_count, 1u); | 579 EXPECT_EQ(oneshot.awake_count, 1u); |
| 550 EXPECT_EQ(oneshot.last_reason, Awakable::AwakeReason::SATISFIED); | 580 EXPECT_EQ(oneshot.last_reason, Awakable::AwakeReason::SATISFIED); |
| 551 awakable_list.Remove(true, &oneshot, 456); | 581 awakable_list.Remove(true, &oneshot, 456); |
| 552 | 582 |
| 553 // Satisfied: +R -PC. | 583 // Satisfied: +R -PC. |
| 554 oneshot.awake_count = 0; | 584 oneshot.awake_count = 0; |
| 555 awakable_list.Add(&oneshot, 456, false, kR | kPC); | 585 awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state); |
| 556 new_state.satisfied_signals |= kR; | 586 new_state.satisfied_signals |= kR; |
| 557 new_state.satisfied_signals &= ~kPC; | 587 new_state.satisfied_signals &= ~kPC; |
| 558 awakable_list.OnStateChange(old_state, new_state); | 588 awakable_list.OnStateChange(old_state, new_state); |
| 559 old_state = new_state; | 589 old_state = new_state; |
| 560 EXPECT_EQ(persistent.awake_count, 4u); | 590 EXPECT_EQ(persistent.awake_count, 5u); |
| 591 EXPECT_EQ(persistent.last_reason, Awakable::AwakeReason::CHANGED); |
| 561 // It was previously satisfied and remains satisfied (for different reasons), | 592 // It was previously satisfied and remains satisfied (for different reasons), |
| 562 // so the one-shot does not observe this change. | 593 // so the one-shot does not observe this change. |
| 563 EXPECT_EQ(oneshot.awake_count, 0u); | 594 EXPECT_EQ(oneshot.awake_count, 0u); |
| 564 awakable_list.Remove(true, &oneshot, 456); | 595 awakable_list.Remove(true, &oneshot, 456); |
| 565 | 596 |
| 566 // Satisfiable: -PC. | 597 // Satisfiable: -PC. |
| 567 oneshot.awake_count = 0; | 598 oneshot.awake_count = 0; |
| 568 awakable_list.Add(&oneshot, 456, false, kR | kPC); | 599 awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state); |
| 569 new_state.satisfiable_signals &= ~kPC; | 600 new_state.satisfiable_signals &= ~kPC; |
| 570 awakable_list.OnStateChange(old_state, new_state); | 601 awakable_list.OnStateChange(old_state, new_state); |
| 571 old_state = new_state; | 602 old_state = new_state; |
| 572 EXPECT_EQ(persistent.awake_count, 5u); | 603 EXPECT_EQ(persistent.awake_count, 6u); |
| 604 EXPECT_EQ(persistent.last_reason, Awakable::AwakeReason::CHANGED); |
| 573 EXPECT_EQ(oneshot.awake_count, 0u); | 605 EXPECT_EQ(oneshot.awake_count, 0u); |
| 574 awakable_list.Remove(true, &oneshot, 456); | 606 awakable_list.Remove(true, &oneshot, 456); |
| 575 | 607 |
| 576 // Satisfiable: -W. | 608 // Satisfiable: -W. |
| 577 oneshot.awake_count = 0; | 609 oneshot.awake_count = 0; |
| 578 awakable_list.Add(&oneshot, 456, false, kR | kPC); | 610 awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state); |
| 579 new_state.satisfiable_signals &= ~kW; | 611 new_state.satisfiable_signals &= ~kW; |
| 580 awakable_list.OnStateChange(old_state, new_state); | 612 awakable_list.OnStateChange(old_state, new_state); |
| 581 old_state = new_state; | 613 old_state = new_state; |
| 582 EXPECT_EQ(persistent.awake_count, 5u); | 614 EXPECT_EQ(persistent.awake_count, 6u); |
| 583 EXPECT_EQ(oneshot.awake_count, 0u); | 615 EXPECT_EQ(oneshot.awake_count, 0u); |
| 584 awakable_list.Remove(true, &oneshot, 456); | 616 awakable_list.Remove(true, &oneshot, 456); |
| 585 | 617 |
| 586 // Satisfied: -R. Satisfiable: -R. | 618 // Satisfied: -R. Satisfiable: -R. |
| 587 oneshot.awake_count = 0; | 619 oneshot.awake_count = 0; |
| 588 awakable_list.Add(&oneshot, 456, false, kR | kPC); | 620 awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state); |
| 589 new_state.satisfied_signals &= ~kR; | 621 new_state.satisfied_signals &= ~kR; |
| 590 new_state.satisfiable_signals &= ~kR; | 622 new_state.satisfiable_signals &= ~kR; |
| 591 awakable_list.OnStateChange(old_state, new_state); | 623 awakable_list.OnStateChange(old_state, new_state); |
| 592 old_state = new_state; | 624 old_state = new_state; |
| 593 EXPECT_EQ(persistent.awake_count, 6u); | 625 EXPECT_EQ(persistent.awake_count, 7u); |
| 626 EXPECT_EQ(persistent.last_reason, Awakable::AwakeReason::CHANGED); |
| 594 // "Leading edge" for one-shot is "rising" for (overall) satisfied-ness and | 627 // "Leading edge" for one-shot is "rising" for (overall) satisfied-ness and |
| 595 // "falling" for (overall) satisfiability, so it's really picking up the -R in | 628 // "falling" for (overall) satisfiability, so it's really picking up the -R in |
| 596 // satisfiability here. | 629 // satisfiability here. |
| 597 EXPECT_EQ(oneshot.awake_count, 1u); | 630 EXPECT_EQ(oneshot.awake_count, 1u); |
| 598 EXPECT_EQ(oneshot.last_reason, Awakable::AwakeReason::UNSATISFIABLE); | 631 EXPECT_EQ(oneshot.last_reason, Awakable::AwakeReason::UNSATISFIABLE); |
| 599 awakable_list.Remove(true, &oneshot, 456); | 632 awakable_list.Remove(true, &oneshot, 456); |
| 600 | 633 |
| 601 // Satisfiable: +R: | 634 // Satisfiable: +R: |
| 602 oneshot.awake_count = 0; | 635 oneshot.awake_count = 0; |
| 603 awakable_list.Add(&oneshot, 456, false, kR | kPC); | 636 awakable_list.Add(&oneshot, 456, false, kR | kPC, old_state); |
| 604 new_state.satisfiable_signals |= kR; | 637 new_state.satisfiable_signals |= kR; |
| 605 awakable_list.OnStateChange(old_state, new_state); | 638 awakable_list.OnStateChange(old_state, new_state); |
| 606 old_state = new_state; | 639 old_state = new_state; |
| 607 EXPECT_EQ(persistent.awake_count, 7u); | 640 EXPECT_EQ(persistent.awake_count, 8u); |
| 641 EXPECT_EQ(persistent.last_reason, Awakable::AwakeReason::CHANGED); |
| 608 // And the one-shot doesn't pick up the +R in satisfiability here. | 642 // And the one-shot doesn't pick up the +R in satisfiability here. |
| 609 EXPECT_EQ(oneshot.awake_count, 0u); | 643 EXPECT_EQ(oneshot.awake_count, 0u); |
| 610 awakable_list.Remove(true, &oneshot, 456); | 644 awakable_list.Remove(true, &oneshot, 456); |
| 611 | 645 |
| 612 awakable_list.Remove(true, &persistent, 123); | 646 awakable_list.Remove(true, &persistent, 123); |
| 613 EXPECT_EQ(persistent.awake_count, 7u); | 647 EXPECT_EQ(persistent.awake_count, 8u); |
| 614 } | 648 } |
| 615 | 649 |
| 616 TEST(AwakableListTest, RemoveNoMatchContext) { | 650 TEST(AwakableListTest, RemoveNoMatchContext) { |
| 617 static constexpr MojoHandleSignals kNone = MOJO_HANDLE_SIGNAL_NONE; | 651 static constexpr MojoHandleSignals kNone = MOJO_HANDLE_SIGNAL_NONE; |
| 618 static constexpr MojoHandleSignals kR = MOJO_HANDLE_SIGNAL_READABLE; | 652 static constexpr MojoHandleSignals kR = MOJO_HANDLE_SIGNAL_READABLE; |
| 619 | 653 |
| 620 AwakableList awakable_list; | 654 AwakableList awakable_list; |
| 621 TestAwakable persistent0; | 655 TestAwakable persistent0; |
| 622 TestAwakable persistent1; | 656 TestAwakable persistent1; |
| 623 | 657 |
| 624 // Add |persistent0| twice, with different contexts. | 658 // Add |persistent0| twice, with different contexts. |
| 625 awakable_list.Add(&persistent0, 12, true, kR); | 659 awakable_list.Add(&persistent0, 12, true, kR, HandleSignalsState(kNone, kR)); |
| 626 awakable_list.Add(&persistent0, 34, true, kR); | 660 EXPECT_EQ(persistent0.awake_count, 1u); |
| 627 awakable_list.Add(&persistent1, 56, true, kR); | 661 awakable_list.Add(&persistent0, 34, true, kR, HandleSignalsState(kNone, kR)); |
| 628 EXPECT_EQ(persistent0.awake_count, 0u); | |
| 629 EXPECT_EQ(persistent1.awake_count, 0u); | |
| 630 | |
| 631 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), | |
| 632 HandleSignalsState(kR, kR)); | |
| 633 EXPECT_EQ(persistent0.awake_count, 2u); | 662 EXPECT_EQ(persistent0.awake_count, 2u); |
| 634 EXPECT_EQ(persistent1.awake_count, 1u); | 663 awakable_list.Add(&persistent1, 56, true, kR, HandleSignalsState(kNone, kR)); |
| 635 | |
| 636 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), | |
| 637 HandleSignalsState(kNone, kR)); | |
| 638 EXPECT_EQ(persistent0.awake_count, 2u); | |
| 639 EXPECT_EQ(persistent1.awake_count, 1u); | |
| 640 | |
| 641 awakable_list.Remove(false, &persistent0, 0); | |
| 642 EXPECT_EQ(persistent0.awake_count, 2u); | |
| 643 EXPECT_EQ(persistent1.awake_count, 1u); | 664 EXPECT_EQ(persistent1.awake_count, 1u); |
| 644 | 665 |
| 645 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), | 666 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), |
| 646 HandleSignalsState(kR, kR)); | 667 HandleSignalsState(kR, kR)); |
| 647 EXPECT_EQ(persistent0.awake_count, 2u); | 668 EXPECT_EQ(persistent0.awake_count, 4u); |
| 648 EXPECT_EQ(persistent1.awake_count, 2u); | 669 EXPECT_EQ(persistent1.awake_count, 2u); |
| 649 | 670 |
| 671 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), |
| 672 HandleSignalsState(kNone, kR)); |
| 673 EXPECT_EQ(persistent0.awake_count, 4u); |
| 674 EXPECT_EQ(persistent1.awake_count, 2u); |
| 675 |
| 676 awakable_list.Remove(false, &persistent0, 0); |
| 677 EXPECT_EQ(persistent0.awake_count, 4u); |
| 678 EXPECT_EQ(persistent1.awake_count, 2u); |
| 679 |
| 680 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), |
| 681 HandleSignalsState(kR, kR)); |
| 682 EXPECT_EQ(persistent0.awake_count, 4u); |
| 683 EXPECT_EQ(persistent1.awake_count, 3u); |
| 684 |
| 650 awakable_list.Remove(false, &persistent1, 0); | 685 awakable_list.Remove(false, &persistent1, 0); |
| 651 EXPECT_EQ(persistent0.awake_count, 2u); | 686 EXPECT_EQ(persistent0.awake_count, 4u); |
| 652 EXPECT_EQ(persistent1.awake_count, 2u); | 687 EXPECT_EQ(persistent1.awake_count, 3u); |
| 653 } | 688 } |
| 654 | 689 |
| 655 TEST(AwakableListTest, RemoveMatchContext2) { | 690 TEST(AwakableListTest, RemoveMatchContext2) { |
| 656 static constexpr MojoHandleSignals kNone = MOJO_HANDLE_SIGNAL_NONE; | 691 static constexpr MojoHandleSignals kNone = MOJO_HANDLE_SIGNAL_NONE; |
| 657 static constexpr MojoHandleSignals kR = MOJO_HANDLE_SIGNAL_READABLE; | 692 static constexpr MojoHandleSignals kR = MOJO_HANDLE_SIGNAL_READABLE; |
| 658 | 693 |
| 659 AwakableList awakable_list; | 694 AwakableList awakable_list; |
| 660 TestAwakable persistent0; | 695 TestAwakable persistent0; |
| 661 TestAwakable persistent1; | 696 TestAwakable persistent1; |
| 662 | 697 |
| 663 // Add |persistent0| twice, with different contexts. | 698 // Add |persistent0| twice, with different contexts. |
| 664 awakable_list.Add(&persistent0, 12, true, kR); | 699 awakable_list.Add(&persistent0, 12, true, kR, HandleSignalsState(kNone, kR)); |
| 665 awakable_list.Add(&persistent0, 34, true, kR); | 700 EXPECT_EQ(persistent0.awake_count, 1u); |
| 666 awakable_list.Add(&persistent1, 56, true, kR); | 701 awakable_list.Add(&persistent0, 34, true, kR, HandleSignalsState(kNone, kR)); |
| 667 EXPECT_EQ(persistent0.awake_count, 0u); | |
| 668 EXPECT_EQ(persistent1.awake_count, 0u); | |
| 669 | |
| 670 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), | |
| 671 HandleSignalsState(kR, kR)); | |
| 672 EXPECT_EQ(persistent0.awake_count, 2u); | 702 EXPECT_EQ(persistent0.awake_count, 2u); |
| 673 EXPECT_EQ(persistent1.awake_count, 1u); | 703 awakable_list.Add(&persistent1, 56, true, kR, HandleSignalsState(kNone, kR)); |
| 674 | |
| 675 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), | |
| 676 HandleSignalsState(kNone, kR)); | |
| 677 EXPECT_EQ(persistent0.awake_count, 2u); | |
| 678 EXPECT_EQ(persistent1.awake_count, 1u); | |
| 679 | |
| 680 awakable_list.Remove(true, &persistent0, 34); | |
| 681 EXPECT_EQ(persistent0.awake_count, 2u); | |
| 682 EXPECT_EQ(persistent1.awake_count, 1u); | 704 EXPECT_EQ(persistent1.awake_count, 1u); |
| 683 | 705 |
| 684 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), | 706 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), |
| 685 HandleSignalsState(kR, kR)); | 707 HandleSignalsState(kR, kR)); |
| 686 EXPECT_EQ(persistent0.awake_count, 3u); | 708 EXPECT_EQ(persistent0.awake_count, 4u); |
| 687 EXPECT_EQ(persistent0.last_context, 12u); | |
| 688 EXPECT_EQ(persistent1.awake_count, 2u); | |
| 689 | |
| 690 // No-op: non-existent context. | |
| 691 awakable_list.Remove(true, &persistent1, 0); | |
| 692 EXPECT_EQ(persistent0.awake_count, 3u); | |
| 693 EXPECT_EQ(persistent1.awake_count, 2u); | 709 EXPECT_EQ(persistent1.awake_count, 2u); |
| 694 | 710 |
| 695 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), | 711 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), |
| 696 HandleSignalsState(kNone, kR)); | 712 HandleSignalsState(kNone, kR)); |
| 697 EXPECT_EQ(persistent0.awake_count, 3u); | 713 EXPECT_EQ(persistent0.awake_count, 4u); |
| 714 EXPECT_EQ(persistent1.awake_count, 2u); |
| 715 |
| 716 awakable_list.Remove(true, &persistent0, 34); |
| 717 EXPECT_EQ(persistent0.awake_count, 4u); |
| 698 EXPECT_EQ(persistent1.awake_count, 2u); | 718 EXPECT_EQ(persistent1.awake_count, 2u); |
| 699 | 719 |
| 700 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), | 720 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), |
| 701 HandleSignalsState(kR, kR)); | 721 HandleSignalsState(kR, kR)); |
| 702 EXPECT_EQ(persistent0.awake_count, 4u); | 722 EXPECT_EQ(persistent0.awake_count, 5u); |
| 703 EXPECT_EQ(persistent0.last_context, 12u); | 723 EXPECT_EQ(persistent0.last_context, 12u); |
| 704 EXPECT_EQ(persistent1.awake_count, 3u); | 724 EXPECT_EQ(persistent1.awake_count, 3u); |
| 705 | 725 |
| 726 // No-op: non-existent context. |
| 727 awakable_list.Remove(true, &persistent1, 0); |
| 728 EXPECT_EQ(persistent0.awake_count, 5u); |
| 729 EXPECT_EQ(persistent1.awake_count, 3u); |
| 730 |
| 731 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), |
| 732 HandleSignalsState(kNone, kR)); |
| 733 EXPECT_EQ(persistent0.awake_count, 5u); |
| 734 EXPECT_EQ(persistent1.awake_count, 3u); |
| 735 |
| 736 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), |
| 737 HandleSignalsState(kR, kR)); |
| 738 EXPECT_EQ(persistent0.awake_count, 6u); |
| 739 EXPECT_EQ(persistent0.last_context, 12u); |
| 740 EXPECT_EQ(persistent1.awake_count, 4u); |
| 741 |
| 706 awakable_list.Remove(true, &persistent0, 12); | 742 awakable_list.Remove(true, &persistent0, 12); |
| 707 awakable_list.Remove(true, &persistent1, 56); | 743 awakable_list.Remove(true, &persistent1, 56); |
| 708 | 744 |
| 709 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), | 745 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), |
| 710 HandleSignalsState(kNone, kR)); | 746 HandleSignalsState(kNone, kR)); |
| 711 EXPECT_EQ(persistent0.awake_count, 4u); | 747 EXPECT_EQ(persistent0.awake_count, 6u); |
| 712 EXPECT_EQ(persistent1.awake_count, 3u); | 748 EXPECT_EQ(persistent1.awake_count, 4u); |
| 713 | 749 |
| 714 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), | 750 awakable_list.OnStateChange(HandleSignalsState(kNone, kR), |
| 715 HandleSignalsState(kR, kR)); | 751 HandleSignalsState(kR, kR)); |
| 716 EXPECT_EQ(persistent0.awake_count, 4u); | 752 EXPECT_EQ(persistent0.awake_count, 6u); |
| 717 EXPECT_EQ(persistent1.awake_count, 3u); | 753 EXPECT_EQ(persistent1.awake_count, 4u); |
| 718 } | 754 } |
| 719 | 755 |
| 720 } // namespace | 756 } // namespace |
| 721 } // namespace system | 757 } // namespace system |
| 722 } // namespace mojo | 758 } // namespace mojo |
| OLD | NEW |