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

Side by Side Diff: mojo/edk/system/awakable_list_unittest.cc

Issue 2072353002: Give AwakableList's wake-up method the old state in addition to the new state. (Closed) Base URL: https://github.com/domokit/mojo.git@master
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 unified diff | Download patch
« no previous file with comments | « mojo/edk/system/awakable_list.cc ('k') | mojo/edk/system/data_pipe.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « mojo/edk/system/awakable_list.cc ('k') | mojo/edk/system/data_pipe.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698