| 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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 TEST(AwakableListTest, BasicAwakeSatisfied) { | 66 TEST(AwakableListTest, BasicAwakeSatisfied) { |
| 67 MojoResult result; | 67 MojoResult result; |
| 68 uint64_t context; | 68 uint64_t context; |
| 69 | 69 |
| 70 // Awake immediately after thread start. | 70 // Awake immediately after thread start. |
| 71 { | 71 { |
| 72 AwakableList awakable_list; | 72 AwakableList awakable_list; |
| 73 test::SimpleWaiterThread thread(&result, &context); | 73 test::SimpleWaiterThread thread(&result, &context); |
| 74 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 1); | 74 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 1); |
| 75 thread.Start(); | 75 thread.Start(); |
| 76 awakable_list.AwakeForStateChange(HandleSignalsState( | 76 awakable_list.OnStateChange( |
| 77 MOJO_HANDLE_SIGNAL_READABLE, | 77 HandleSignalsState( |
| 78 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); | 78 MOJO_HANDLE_SIGNAL_NONE, |
| 79 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), |
| 80 HandleSignalsState( |
| 81 MOJO_HANDLE_SIGNAL_READABLE, |
| 82 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 79 awakable_list.Remove(thread.waiter()); | 83 awakable_list.Remove(thread.waiter()); |
| 80 } // Join |thread|. | 84 } // Join |thread|. |
| 81 EXPECT_EQ(MOJO_RESULT_OK, result); | 85 EXPECT_EQ(MOJO_RESULT_OK, result); |
| 82 EXPECT_EQ(1u, context); | 86 EXPECT_EQ(1u, context); |
| 83 | 87 |
| 84 // Awake before after thread start. | 88 // Awake before after thread start. |
| 85 { | 89 { |
| 86 AwakableList awakable_list; | 90 AwakableList awakable_list; |
| 87 test::SimpleWaiterThread thread(&result, &context); | 91 test::SimpleWaiterThread thread(&result, &context); |
| 88 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_WRITABLE, 2); | 92 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_WRITABLE, 2); |
| 89 awakable_list.AwakeForStateChange(HandleSignalsState( | 93 awakable_list.OnStateChange( |
| 90 MOJO_HANDLE_SIGNAL_WRITABLE, | 94 HandleSignalsState( |
| 91 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); | 95 MOJO_HANDLE_SIGNAL_NONE, |
| 96 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), |
| 97 HandleSignalsState( |
| 98 MOJO_HANDLE_SIGNAL_WRITABLE, |
| 99 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 92 awakable_list.Remove(thread.waiter()); | 100 awakable_list.Remove(thread.waiter()); |
| 93 // Double-remove okay: | 101 // Double-remove okay: |
| 94 awakable_list.Remove(thread.waiter()); | 102 awakable_list.Remove(thread.waiter()); |
| 95 thread.Start(); | 103 thread.Start(); |
| 96 } // Join |thread|. | 104 } // Join |thread|. |
| 97 EXPECT_EQ(MOJO_RESULT_OK, result); | 105 EXPECT_EQ(MOJO_RESULT_OK, result); |
| 98 EXPECT_EQ(2u, context); | 106 EXPECT_EQ(2u, context); |
| 99 | 107 |
| 100 // Awake some time after thread start. | 108 // Awake some time after thread start. |
| 101 { | 109 { |
| 102 AwakableList awakable_list; | 110 AwakableList awakable_list; |
| 103 test::SimpleWaiterThread thread(&result, &context); | 111 test::SimpleWaiterThread thread(&result, &context); |
| 104 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 3); | 112 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 3); |
| 105 thread.Start(); | 113 thread.Start(); |
| 106 ThreadSleep(2 * test::EpsilonTimeout()); | 114 ThreadSleep(2 * test::EpsilonTimeout()); |
| 107 awakable_list.AwakeForStateChange(HandleSignalsState( | 115 awakable_list.OnStateChange( |
| 108 MOJO_HANDLE_SIGNAL_READABLE, | 116 HandleSignalsState( |
| 109 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); | 117 MOJO_HANDLE_SIGNAL_NONE, |
| 118 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), |
| 119 HandleSignalsState( |
| 120 MOJO_HANDLE_SIGNAL_READABLE, |
| 121 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 110 awakable_list.Remove(thread.waiter()); | 122 awakable_list.Remove(thread.waiter()); |
| 111 } // Join |thread|. | 123 } // Join |thread|. |
| 112 EXPECT_EQ(MOJO_RESULT_OK, result); | 124 EXPECT_EQ(MOJO_RESULT_OK, result); |
| 113 EXPECT_EQ(3u, context); | 125 EXPECT_EQ(3u, context); |
| 114 } | 126 } |
| 115 | 127 |
| 116 TEST(AwakableListTest, BasicAwakeUnsatisfiable) { | 128 TEST(AwakableListTest, BasicAwakeUnsatisfiable) { |
| 117 MojoResult result; | 129 MojoResult result; |
| 118 uint64_t context; | 130 uint64_t context; |
| 119 | 131 |
| 120 // Awake (for unsatisfiability) immediately after thread start. | 132 // Awake (for unsatisfiability) immediately after thread start. |
| 121 { | 133 { |
| 122 AwakableList awakable_list; | 134 AwakableList awakable_list; |
| 123 test::SimpleWaiterThread thread(&result, &context); | 135 test::SimpleWaiterThread thread(&result, &context); |
| 124 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 1); | 136 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 1); |
| 125 thread.Start(); | 137 thread.Start(); |
| 126 awakable_list.AwakeForStateChange(HandleSignalsState( | 138 awakable_list.OnStateChange( |
| 127 MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE)); | 139 HandleSignalsState( |
| 140 MOJO_HANDLE_SIGNAL_NONE, |
| 141 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), |
| 142 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, |
| 143 MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 128 awakable_list.Remove(thread.waiter()); | 144 awakable_list.Remove(thread.waiter()); |
| 129 } // Join |thread|. | 145 } // Join |thread|. |
| 130 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); | 146 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); |
| 131 EXPECT_EQ(1u, context); | 147 EXPECT_EQ(1u, context); |
| 132 | 148 |
| 133 // Awake (for unsatisfiability) before after thread start. | 149 // Awake (for unsatisfiability) before after thread start. |
| 134 { | 150 { |
| 135 AwakableList awakable_list; | 151 AwakableList awakable_list; |
| 136 test::SimpleWaiterThread thread(&result, &context); | 152 test::SimpleWaiterThread thread(&result, &context); |
| 137 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_WRITABLE, 2); | 153 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_WRITABLE, 2); |
| 138 awakable_list.AwakeForStateChange(HandleSignalsState( | 154 awakable_list.OnStateChange( |
| 139 MOJO_HANDLE_SIGNAL_READABLE, MOJO_HANDLE_SIGNAL_READABLE)); | 155 HandleSignalsState( |
| 156 MOJO_HANDLE_SIGNAL_NONE, |
| 157 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), |
| 158 HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE, |
| 159 MOJO_HANDLE_SIGNAL_READABLE)); |
| 140 awakable_list.Remove(thread.waiter()); | 160 awakable_list.Remove(thread.waiter()); |
| 141 thread.Start(); | 161 thread.Start(); |
| 142 } // Join |thread|. | 162 } // Join |thread|. |
| 143 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); | 163 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); |
| 144 EXPECT_EQ(2u, context); | 164 EXPECT_EQ(2u, context); |
| 145 | 165 |
| 146 // Awake (for unsatisfiability) some time after thread start. | 166 // Awake (for unsatisfiability) some time after thread start. |
| 147 { | 167 { |
| 148 AwakableList awakable_list; | 168 AwakableList awakable_list; |
| 149 test::SimpleWaiterThread thread(&result, &context); | 169 test::SimpleWaiterThread thread(&result, &context); |
| 150 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 3); | 170 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 3); |
| 151 thread.Start(); | 171 thread.Start(); |
| 152 ThreadSleep(2 * test::EpsilonTimeout()); | 172 ThreadSleep(2 * test::EpsilonTimeout()); |
| 153 awakable_list.AwakeForStateChange(HandleSignalsState( | 173 awakable_list.OnStateChange( |
| 154 MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE)); | 174 HandleSignalsState( |
| 175 MOJO_HANDLE_SIGNAL_NONE, |
| 176 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), |
| 177 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, |
| 178 MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 155 awakable_list.Remove(thread.waiter()); | 179 awakable_list.Remove(thread.waiter()); |
| 156 // Double-remove okay: | 180 // Double-remove okay: |
| 157 awakable_list.Remove(thread.waiter()); | 181 awakable_list.Remove(thread.waiter()); |
| 158 } // Join |thread|. | 182 } // Join |thread|. |
| 159 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); | 183 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); |
| 160 EXPECT_EQ(3u, context); | 184 EXPECT_EQ(3u, context); |
| 161 } | 185 } |
| 162 | 186 |
| 163 TEST(AwakableListTest, MultipleAwakables) { | 187 TEST(AwakableListTest, MultipleAwakables) { |
| 164 MojoResult result1; | 188 MojoResult result1; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 190 // Awake one awakable, cancel other. | 214 // Awake one awakable, cancel other. |
| 191 { | 215 { |
| 192 AwakableList awakable_list; | 216 AwakableList awakable_list; |
| 193 test::SimpleWaiterThread thread1(&result1, &context1); | 217 test::SimpleWaiterThread thread1(&result1, &context1); |
| 194 awakable_list.Add(thread1.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 3); | 218 awakable_list.Add(thread1.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 3); |
| 195 thread1.Start(); | 219 thread1.Start(); |
| 196 test::SimpleWaiterThread thread2(&result2, &context2); | 220 test::SimpleWaiterThread thread2(&result2, &context2); |
| 197 awakable_list.Add(thread2.waiter(), MOJO_HANDLE_SIGNAL_WRITABLE, 4); | 221 awakable_list.Add(thread2.waiter(), MOJO_HANDLE_SIGNAL_WRITABLE, 4); |
| 198 thread2.Start(); | 222 thread2.Start(); |
| 199 ThreadSleep(2 * test::EpsilonTimeout()); | 223 ThreadSleep(2 * test::EpsilonTimeout()); |
| 200 awakable_list.AwakeForStateChange(HandleSignalsState( | 224 awakable_list.OnStateChange( |
| 201 MOJO_HANDLE_SIGNAL_READABLE, | 225 HandleSignalsState( |
| 202 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); | 226 MOJO_HANDLE_SIGNAL_NONE, |
| 227 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), |
| 228 HandleSignalsState( |
| 229 MOJO_HANDLE_SIGNAL_READABLE, |
| 230 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 203 awakable_list.Remove(thread1.waiter()); | 231 awakable_list.Remove(thread1.waiter()); |
| 204 awakable_list.CancelAll(); | 232 awakable_list.CancelAll(); |
| 205 } // Join threads. | 233 } // Join threads. |
| 206 EXPECT_EQ(MOJO_RESULT_OK, result1); | 234 EXPECT_EQ(MOJO_RESULT_OK, result1); |
| 207 EXPECT_EQ(3u, context1); | 235 EXPECT_EQ(3u, context1); |
| 208 EXPECT_EQ(MOJO_RESULT_CANCELLED, result2); | 236 EXPECT_EQ(MOJO_RESULT_CANCELLED, result2); |
| 209 EXPECT_EQ(4u, context2); | 237 EXPECT_EQ(4u, context2); |
| 210 | 238 |
| 211 // Cancel one awakable, awake other for unsatisfiability. | 239 // Cancel one awakable, awake other for unsatisfiability. |
| 212 { | 240 { |
| 213 AwakableList awakable_list; | 241 AwakableList awakable_list; |
| 214 test::SimpleWaiterThread thread1(&result1, &context1); | 242 test::SimpleWaiterThread thread1(&result1, &context1); |
| 215 awakable_list.Add(thread1.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 5); | 243 awakable_list.Add(thread1.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 5); |
| 216 thread1.Start(); | 244 thread1.Start(); |
| 217 test::SimpleWaiterThread thread2(&result2, &context2); | 245 test::SimpleWaiterThread thread2(&result2, &context2); |
| 218 awakable_list.Add(thread2.waiter(), MOJO_HANDLE_SIGNAL_WRITABLE, 6); | 246 awakable_list.Add(thread2.waiter(), MOJO_HANDLE_SIGNAL_WRITABLE, 6); |
| 219 thread2.Start(); | 247 thread2.Start(); |
| 220 ThreadSleep(2 * test::EpsilonTimeout()); | 248 ThreadSleep(2 * test::EpsilonTimeout()); |
| 221 awakable_list.AwakeForStateChange(HandleSignalsState( | 249 awakable_list.OnStateChange( |
| 222 MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_READABLE)); | 250 HandleSignalsState( |
| 251 MOJO_HANDLE_SIGNAL_NONE, |
| 252 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), |
| 253 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, |
| 254 MOJO_HANDLE_SIGNAL_READABLE)); |
| 223 awakable_list.Remove(thread2.waiter()); | 255 awakable_list.Remove(thread2.waiter()); |
| 224 awakable_list.CancelAll(); | 256 awakable_list.CancelAll(); |
| 225 } // Join threads. | 257 } // Join threads. |
| 226 EXPECT_EQ(MOJO_RESULT_CANCELLED, result1); | 258 EXPECT_EQ(MOJO_RESULT_CANCELLED, result1); |
| 227 EXPECT_EQ(5u, context1); | 259 EXPECT_EQ(5u, context1); |
| 228 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result2); | 260 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result2); |
| 229 EXPECT_EQ(6u, context2); | 261 EXPECT_EQ(6u, context2); |
| 230 | 262 |
| 231 // Cancel one awakable, awake other for unsatisfiability. | 263 // Cancel one awakable, awake other for unsatisfiability. |
| 232 { | 264 { |
| 233 AwakableList awakable_list; | 265 AwakableList awakable_list; |
| 234 test::SimpleWaiterThread thread1(&result1, &context1); | 266 test::SimpleWaiterThread thread1(&result1, &context1); |
| 235 awakable_list.Add(thread1.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 7); | 267 awakable_list.Add(thread1.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 7); |
| 236 thread1.Start(); | 268 thread1.Start(); |
| 237 | 269 |
| 238 ThreadSleep(1 * test::EpsilonTimeout()); | 270 ThreadSleep(1 * test::EpsilonTimeout()); |
| 239 | 271 |
| 240 // Should do nothing. | 272 // Should do nothing. |
| 241 awakable_list.AwakeForStateChange(HandleSignalsState( | 273 awakable_list.OnStateChange( |
| 242 MOJO_HANDLE_SIGNAL_NONE, | 274 HandleSignalsState( |
| 243 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); | 275 MOJO_HANDLE_SIGNAL_NONE, |
| 276 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), |
| 277 HandleSignalsState( |
| 278 MOJO_HANDLE_SIGNAL_NONE, |
| 279 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 244 | 280 |
| 245 test::SimpleWaiterThread thread2(&result2, &context2); | 281 test::SimpleWaiterThread thread2(&result2, &context2); |
| 246 awakable_list.Add(thread2.waiter(), MOJO_HANDLE_SIGNAL_WRITABLE, 8); | 282 awakable_list.Add(thread2.waiter(), MOJO_HANDLE_SIGNAL_WRITABLE, 8); |
| 247 thread2.Start(); | 283 thread2.Start(); |
| 248 | 284 |
| 249 ThreadSleep(1 * test::EpsilonTimeout()); | 285 ThreadSleep(1 * test::EpsilonTimeout()); |
| 250 | 286 |
| 251 // Awake #1. | 287 // Awake #1. |
| 252 awakable_list.AwakeForStateChange(HandleSignalsState( | 288 awakable_list.OnStateChange( |
| 253 MOJO_HANDLE_SIGNAL_READABLE, | 289 HandleSignalsState( |
| 254 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); | 290 MOJO_HANDLE_SIGNAL_NONE, |
| 291 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), |
| 292 HandleSignalsState( |
| 293 MOJO_HANDLE_SIGNAL_READABLE, |
| 294 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 255 awakable_list.Remove(thread1.waiter()); | 295 awakable_list.Remove(thread1.waiter()); |
| 256 | 296 |
| 257 ThreadSleep(1 * test::EpsilonTimeout()); | 297 ThreadSleep(1 * test::EpsilonTimeout()); |
| 258 | 298 |
| 259 test::SimpleWaiterThread thread3(&result3, &context3); | 299 test::SimpleWaiterThread thread3(&result3, &context3); |
| 260 awakable_list.Add(thread3.waiter(), MOJO_HANDLE_SIGNAL_WRITABLE, 9); | 300 awakable_list.Add(thread3.waiter(), MOJO_HANDLE_SIGNAL_WRITABLE, 9); |
| 261 thread3.Start(); | 301 thread3.Start(); |
| 262 | 302 |
| 263 test::SimpleWaiterThread thread4(&result4, &context4); | 303 test::SimpleWaiterThread thread4(&result4, &context4); |
| 264 awakable_list.Add(thread4.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 10); | 304 awakable_list.Add(thread4.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 10); |
| 265 thread4.Start(); | 305 thread4.Start(); |
| 266 | 306 |
| 267 ThreadSleep(1 * test::EpsilonTimeout()); | 307 ThreadSleep(1 * test::EpsilonTimeout()); |
| 268 | 308 |
| 269 // Awake #2 and #3 for unsatisfiability. | 309 // Awake #2 and #3 for unsatisfiability. |
| 270 awakable_list.AwakeForStateChange(HandleSignalsState( | 310 awakable_list.OnStateChange( |
| 271 MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_READABLE)); | 311 HandleSignalsState( |
| 312 MOJO_HANDLE_SIGNAL_NONE, |
| 313 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), |
| 314 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, |
| 315 MOJO_HANDLE_SIGNAL_READABLE)); |
| 272 awakable_list.Remove(thread2.waiter()); | 316 awakable_list.Remove(thread2.waiter()); |
| 273 awakable_list.Remove(thread3.waiter()); | 317 awakable_list.Remove(thread3.waiter()); |
| 274 | 318 |
| 275 // Cancel #4. | 319 // Cancel #4. |
| 276 awakable_list.CancelAll(); | 320 awakable_list.CancelAll(); |
| 277 } // Join threads. | 321 } // Join threads. |
| 278 EXPECT_EQ(MOJO_RESULT_OK, result1); | 322 EXPECT_EQ(MOJO_RESULT_OK, result1); |
| 279 EXPECT_EQ(7u, context1); | 323 EXPECT_EQ(7u, context1); |
| 280 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result2); | 324 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result2); |
| 281 EXPECT_EQ(8u, context2); | 325 EXPECT_EQ(8u, context2); |
| 282 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result3); | 326 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result3); |
| 283 EXPECT_EQ(9u, context3); | 327 EXPECT_EQ(9u, context3); |
| 284 EXPECT_EQ(MOJO_RESULT_CANCELLED, result4); | 328 EXPECT_EQ(MOJO_RESULT_CANCELLED, result4); |
| 285 EXPECT_EQ(10u, context4); | 329 EXPECT_EQ(10u, context4); |
| 286 } | 330 } |
| 287 | 331 |
| 288 TEST(AwakableListTest, RemoveWithContext) { | 332 TEST(AwakableListTest, RemoveWithContext) { |
| 289 MojoResult result; | 333 MojoResult result; |
| 290 uint64_t context; | 334 uint64_t context; |
| 291 | 335 |
| 292 { | 336 { |
| 293 AwakableList awakable_list; | 337 AwakableList awakable_list; |
| 294 test::SimpleWaiterThread thread(&result, &context); | 338 test::SimpleWaiterThread thread(&result, &context); |
| 295 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 1); | 339 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 1); |
| 296 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 2); | 340 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 2); |
| 297 thread.Start(); | 341 thread.Start(); |
| 298 awakable_list.RemoveWithContext(thread.waiter(), 2); | 342 awakable_list.RemoveWithContext(thread.waiter(), 2); |
| 299 awakable_list.AwakeForStateChange(HandleSignalsState( | 343 awakable_list.OnStateChange( |
| 300 MOJO_HANDLE_SIGNAL_READABLE, | 344 HandleSignalsState( |
| 301 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); | 345 MOJO_HANDLE_SIGNAL_NONE, |
| 346 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), |
| 347 HandleSignalsState( |
| 348 MOJO_HANDLE_SIGNAL_READABLE, |
| 349 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 302 awakable_list.RemoveWithContext(thread.waiter(), 1); | 350 awakable_list.RemoveWithContext(thread.waiter(), 1); |
| 303 // Double-remove okay: | 351 // Double-remove okay: |
| 304 awakable_list.RemoveWithContext(thread.waiter(), 1); | 352 awakable_list.RemoveWithContext(thread.waiter(), 1); |
| 305 } // Join |thread|. | 353 } // Join |thread|. |
| 306 EXPECT_EQ(MOJO_RESULT_OK, result); | 354 EXPECT_EQ(MOJO_RESULT_OK, result); |
| 307 EXPECT_EQ(1u, context); | 355 EXPECT_EQ(1u, context); |
| 308 | 356 |
| 309 // Try the same thing, but remove "1" before the awake instead. | 357 // Try the same thing, but remove "1" before the awake instead. |
| 310 { | 358 { |
| 311 AwakableList awakable_list; | 359 AwakableList awakable_list; |
| 312 test::SimpleWaiterThread thread(&result, &context); | 360 test::SimpleWaiterThread thread(&result, &context); |
| 313 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 1); | 361 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 1); |
| 314 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 2); | 362 awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 2); |
| 315 thread.Start(); | 363 thread.Start(); |
| 316 awakable_list.RemoveWithContext(thread.waiter(), 1); | 364 awakable_list.RemoveWithContext(thread.waiter(), 1); |
| 317 awakable_list.AwakeForStateChange(HandleSignalsState( | 365 awakable_list.OnStateChange( |
| 318 MOJO_HANDLE_SIGNAL_READABLE, | 366 HandleSignalsState( |
| 319 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); | 367 MOJO_HANDLE_SIGNAL_NONE, |
| 368 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE), |
| 369 HandleSignalsState( |
| 370 MOJO_HANDLE_SIGNAL_READABLE, |
| 371 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 320 awakable_list.RemoveWithContext(thread.waiter(), 2); | 372 awakable_list.RemoveWithContext(thread.waiter(), 2); |
| 321 } // Join |thread|. | 373 } // Join |thread|. |
| 322 EXPECT_EQ(MOJO_RESULT_OK, result); | 374 EXPECT_EQ(MOJO_RESULT_OK, result); |
| 323 EXPECT_EQ(2u, context); | 375 EXPECT_EQ(2u, context); |
| 324 } | 376 } |
| 325 | 377 |
| 326 class KeepAwakable : public Awakable { | 378 class KeepAwakable : public Awakable { |
| 327 public: | 379 public: |
| 328 KeepAwakable() : awake_count(0) {} | 380 KeepAwakable() : awake_count(0) {} |
| 329 | 381 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 351 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoveAwakable); | 403 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoveAwakable); |
| 352 }; | 404 }; |
| 353 | 405 |
| 354 TEST(AwakableListTest, KeepAwakablesReturningTrue) { | 406 TEST(AwakableListTest, KeepAwakablesReturningTrue) { |
| 355 KeepAwakable keep0; | 407 KeepAwakable keep0; |
| 356 KeepAwakable keep1; | 408 KeepAwakable keep1; |
| 357 RemoveAwakable remove0; | 409 RemoveAwakable remove0; |
| 358 RemoveAwakable remove1; | 410 RemoveAwakable remove1; |
| 359 RemoveAwakable remove2; | 411 RemoveAwakable remove2; |
| 360 | 412 |
| 361 HandleSignalsState hss(MOJO_HANDLE_SIGNAL_WRITABLE, | |
| 362 MOJO_HANDLE_SIGNAL_WRITABLE); | |
| 363 | |
| 364 AwakableList remove_all; | 413 AwakableList remove_all; |
| 365 remove_all.Add(&remove0, MOJO_HANDLE_SIGNAL_WRITABLE, 0); | 414 remove_all.Add(&remove0, MOJO_HANDLE_SIGNAL_WRITABLE, 0); |
| 366 remove_all.Add(&remove1, MOJO_HANDLE_SIGNAL_WRITABLE, 0); | 415 remove_all.Add(&remove1, MOJO_HANDLE_SIGNAL_WRITABLE, 0); |
| 367 | 416 |
| 368 remove_all.AwakeForStateChange(hss); | 417 remove_all.OnStateChange( |
| 418 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE), |
| 419 HandleSignalsState(MOJO_HANDLE_SIGNAL_WRITABLE, |
| 420 MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 369 EXPECT_EQ(remove0.awake_count, 1); | 421 EXPECT_EQ(remove0.awake_count, 1); |
| 370 EXPECT_EQ(remove1.awake_count, 1); | 422 EXPECT_EQ(remove1.awake_count, 1); |
| 371 | 423 |
| 372 remove_all.AwakeForStateChange(hss); | 424 remove_all.OnStateChange( |
| 425 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE), |
| 426 HandleSignalsState(MOJO_HANDLE_SIGNAL_WRITABLE, |
| 427 MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 373 EXPECT_EQ(remove0.awake_count, 1); | 428 EXPECT_EQ(remove0.awake_count, 1); |
| 374 EXPECT_EQ(remove1.awake_count, 1); | 429 EXPECT_EQ(remove1.awake_count, 1); |
| 375 | 430 |
| 376 AwakableList remove_first; | 431 AwakableList remove_first; |
| 377 remove_first.Add(&remove2, MOJO_HANDLE_SIGNAL_WRITABLE, 0); | 432 remove_first.Add(&remove2, MOJO_HANDLE_SIGNAL_WRITABLE, 0); |
| 378 remove_first.Add(&keep0, MOJO_HANDLE_SIGNAL_WRITABLE, 0); | 433 remove_first.Add(&keep0, MOJO_HANDLE_SIGNAL_WRITABLE, 0); |
| 379 remove_first.Add(&keep1, MOJO_HANDLE_SIGNAL_WRITABLE, 0); | 434 remove_first.Add(&keep1, MOJO_HANDLE_SIGNAL_WRITABLE, 0); |
| 380 | 435 |
| 381 remove_first.AwakeForStateChange(hss); | 436 remove_first.OnStateChange( |
| 437 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE), |
| 438 HandleSignalsState(MOJO_HANDLE_SIGNAL_WRITABLE, |
| 439 MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 382 EXPECT_EQ(keep0.awake_count, 1); | 440 EXPECT_EQ(keep0.awake_count, 1); |
| 383 EXPECT_EQ(keep1.awake_count, 1); | 441 EXPECT_EQ(keep1.awake_count, 1); |
| 384 EXPECT_EQ(remove2.awake_count, 1); | 442 EXPECT_EQ(remove2.awake_count, 1); |
| 385 | 443 |
| 386 remove_first.AwakeForStateChange(hss); | 444 remove_first.OnStateChange( |
| 445 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE), |
| 446 HandleSignalsState(MOJO_HANDLE_SIGNAL_WRITABLE, |
| 447 MOJO_HANDLE_SIGNAL_WRITABLE)); |
| 387 EXPECT_EQ(keep0.awake_count, 2); | 448 EXPECT_EQ(keep0.awake_count, 2); |
| 388 EXPECT_EQ(keep1.awake_count, 2); | 449 EXPECT_EQ(keep1.awake_count, 2); |
| 389 EXPECT_EQ(remove2.awake_count, 1); | 450 EXPECT_EQ(remove2.awake_count, 1); |
| 390 | 451 |
| 391 remove_first.Remove(&keep0); | 452 remove_first.Remove(&keep0); |
| 392 remove_first.Remove(&keep1); | 453 remove_first.Remove(&keep1); |
| 393 } | 454 } |
| 394 | 455 |
| 395 } // namespace | 456 } // namespace |
| 396 } // namespace system | 457 } // namespace system |
| 397 } // namespace mojo | 458 } // namespace mojo |
| OLD | NEW |