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

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

Issue 2075353002: Plumb the handle signals state out of Waiter::Wait(). (Closed) Base URL: https://github.com/domokit/mojo.git@work795_wait_set_4.3-x-work794_wait_set_4.2
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
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/waiter.h" 10 #include "mojo/edk/system/waiter.h"
(...skipping 26 matching lines...) Expand all
37 done_(false), 37 done_(false),
38 result_(MOJO_RESULT_UNKNOWN), 38 result_(MOJO_RESULT_UNKNOWN),
39 context_(static_cast<uint64_t>(-1)) { 39 context_(static_cast<uint64_t>(-1)) {
40 waiter_.Init(); 40 waiter_.Init();
41 } 41 }
42 42
43 ~WaitingThread() override { Join(); } 43 ~WaitingThread() override { Join(); }
44 44
45 void WaitUntilDone(MojoResult* result, 45 void WaitUntilDone(MojoResult* result,
46 uint64_t* context, 46 uint64_t* context,
47 HandleSignalsState* signals_state,
47 MojoDeadline* elapsed) { 48 MojoDeadline* elapsed) {
48 for (;;) { 49 for (;;) {
49 { 50 {
50 MutexLocker locker(&mutex_); 51 MutexLocker locker(&mutex_);
51 if (done_) { 52 if (done_) {
52 *result = result_; 53 *result = result_;
53 *context = context_; 54 *context = context_;
55 *signals_state = signals_state_;
54 *elapsed = elapsed_; 56 *elapsed = elapsed_;
55 break; 57 break;
56 } 58 }
57 } 59 }
58 60
59 ThreadSleep(test::DeadlineFromMilliseconds(kPollTimeMs)); 61 ThreadSleep(test::DeadlineFromMilliseconds(kPollTimeMs));
60 } 62 }
61 } 63 }
62 64
63 Waiter* waiter() { return &waiter_; } 65 Waiter* waiter() { return &waiter_; }
64 66
65 private: 67 private:
66 void Run() override { 68 void Run() override {
67 Stopwatch stopwatch; 69 Stopwatch stopwatch;
68 MojoResult result; 70 MojoResult result;
69 uint64_t context = static_cast<uint64_t>(-1); 71 uint64_t context = static_cast<uint64_t>(-1);
72 HandleSignalsState signals_state;
70 MojoDeadline elapsed; 73 MojoDeadline elapsed;
71 74
72 stopwatch.Start(); 75 stopwatch.Start();
73 result = waiter_.Wait(deadline_, &context); 76 result = waiter_.Wait(deadline_, &context, &signals_state);
74 elapsed = stopwatch.Elapsed(); 77 elapsed = stopwatch.Elapsed();
75 78
76 { 79 {
77 MutexLocker locker(&mutex_); 80 MutexLocker locker(&mutex_);
78 done_ = true; 81 done_ = true;
79 result_ = result; 82 result_ = result;
80 context_ = context; 83 context_ = context;
84 signals_state_ = signals_state;
81 elapsed_ = elapsed; 85 elapsed_ = elapsed;
82 } 86 }
83 } 87 }
84 88
85 const MojoDeadline deadline_; 89 const MojoDeadline deadline_;
86 Waiter waiter_; // Thread-safe. 90 Waiter waiter_; // Thread-safe.
87 91
88 Mutex mutex_; 92 Mutex mutex_;
89 bool done_ MOJO_GUARDED_BY(mutex_); 93 bool done_ MOJO_GUARDED_BY(mutex_);
90 MojoResult result_ MOJO_GUARDED_BY(mutex_); 94 MojoResult result_ MOJO_GUARDED_BY(mutex_);
91 uint64_t context_ MOJO_GUARDED_BY(mutex_); 95 uint64_t context_ MOJO_GUARDED_BY(mutex_);
96 HandleSignalsState signals_state_ MOJO_GUARDED_BY(mutex_);
92 MojoDeadline elapsed_ MOJO_GUARDED_BY(mutex_); 97 MojoDeadline elapsed_ MOJO_GUARDED_BY(mutex_);
93 98
94 MOJO_DISALLOW_COPY_AND_ASSIGN(WaitingThread); 99 MOJO_DISALLOW_COPY_AND_ASSIGN(WaitingThread);
95 }; 100 };
96 101
97 TEST(WaiterTest, Basic) { 102 TEST(WaiterTest, Basic) {
98 MojoResult result; 103 MojoResult result;
99 uint64_t context; 104 uint64_t context;
105 HandleSignalsState hss;
100 MojoDeadline elapsed; 106 MojoDeadline elapsed;
101 107
102 // Finite deadline. 108 // Finite deadline.
103 109
104 // Awake immediately after thread start. 110 // Awake immediately after thread start.
105 { 111 {
106 WaitingThread thread(10 * test::EpsilonTimeout()); 112 WaitingThread thread(10 * test::EpsilonTimeout());
107 thread.Start(); 113 thread.Start();
108 thread.waiter()->Awake(1, Awakable::AwakeReason::SATISFIED, 114 thread.waiter()->Awake(1, Awakable::AwakeReason::SATISFIED,
109 HandleSignalsState()); 115 HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
110 thread.WaitUntilDone(&result, &context, &elapsed); 116 MOJO_HANDLE_SIGNAL_READABLE));
117 thread.WaitUntilDone(&result, &context, &hss, &elapsed);
111 EXPECT_EQ(MOJO_RESULT_OK, result); 118 EXPECT_EQ(MOJO_RESULT_OK, result);
112 EXPECT_EQ(1u, context); 119 EXPECT_EQ(1u, context);
120 EXPECT_TRUE(hss.equals(HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
121 MOJO_HANDLE_SIGNAL_READABLE)));
113 EXPECT_LT(elapsed, test::EpsilonTimeout()); 122 EXPECT_LT(elapsed, test::EpsilonTimeout());
114 } 123 }
115 124
116 // Awake before after thread start. 125 // Awake before after thread start.
117 { 126 {
118 WaitingThread thread(10 * test::EpsilonTimeout()); 127 WaitingThread thread(10 * test::EpsilonTimeout());
119 thread.waiter()->Awake(2, Awakable::AwakeReason::CANCELLED, 128 thread.waiter()->Awake(2, Awakable::AwakeReason::CANCELLED,
120 HandleSignalsState()); 129 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE,
130 MOJO_HANDLE_SIGNAL_WRITABLE));
121 thread.Start(); 131 thread.Start();
122 thread.WaitUntilDone(&result, &context, &elapsed); 132 thread.WaitUntilDone(&result, &context, &hss, &elapsed);
123 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); 133 EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
124 EXPECT_EQ(2u, context); 134 EXPECT_EQ(2u, context);
135 EXPECT_TRUE(hss.equals(HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE,
136 MOJO_HANDLE_SIGNAL_WRITABLE)));
125 EXPECT_LT(elapsed, test::EpsilonTimeout()); 137 EXPECT_LT(elapsed, test::EpsilonTimeout());
126 } 138 }
127 139
128 // Awake some time after thread start. 140 // Awake some time after thread start.
129 { 141 {
130 WaitingThread thread(10 * test::EpsilonTimeout()); 142 WaitingThread thread(10 * test::EpsilonTimeout());
131 thread.Start(); 143 thread.Start();
132 ThreadSleep(2 * test::EpsilonTimeout()); 144 ThreadSleep(2 * test::EpsilonTimeout());
133 thread.waiter()->Awake(3, Awakable::AwakeReason::SATISFIED, 145 thread.waiter()->Awake(3, Awakable::AwakeReason::SATISFIED,
134 HandleSignalsState()); 146 HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
135 thread.WaitUntilDone(&result, &context, &elapsed); 147 MOJO_HANDLE_SIGNAL_READABLE |
148 MOJO_HANDLE_SIGNAL_WRITABLE));
149 thread.WaitUntilDone(&result, &context, &hss, &elapsed);
136 EXPECT_EQ(MOJO_RESULT_OK, result); 150 EXPECT_EQ(MOJO_RESULT_OK, result);
137 EXPECT_EQ(3u, context); 151 EXPECT_EQ(3u, context);
152 EXPECT_TRUE(hss.equals(HandleSignalsState(
153 MOJO_HANDLE_SIGNAL_READABLE,
154 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE)));
138 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); 155 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
139 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); 156 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
140 } 157 }
141 158
142 // Awake some longer time after thread start. 159 // Awake some longer time after thread start.
143 { 160 {
144 WaitingThread thread(10 * test::EpsilonTimeout()); 161 WaitingThread thread(10 * test::EpsilonTimeout());
145 thread.Start(); 162 thread.Start();
146 ThreadSleep(5 * test::EpsilonTimeout()); 163 ThreadSleep(5 * test::EpsilonTimeout());
147 thread.waiter()->Awake(4, Awakable::AwakeReason::UNSATISFIABLE, 164 thread.waiter()->Awake(4, Awakable::AwakeReason::UNSATISFIABLE,
148 HandleSignalsState()); 165 HandleSignalsState());
149 thread.WaitUntilDone(&result, &context, &elapsed); 166 thread.WaitUntilDone(&result, &context, &hss, &elapsed);
150 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); 167 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
151 EXPECT_EQ(4u, context); 168 EXPECT_EQ(4u, context);
169 EXPECT_TRUE(hss.equals(HandleSignalsState()));
152 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout()); 170 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout());
153 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout()); 171 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout());
154 } 172 }
155 173
156 // Don't awake -- time out (on another thread). 174 // Don't awake -- time out (on another thread).
157 { 175 {
158 WaitingThread thread(2 * test::EpsilonTimeout()); 176 WaitingThread thread(2 * test::EpsilonTimeout());
159 thread.Start(); 177 thread.Start();
160 thread.WaitUntilDone(&result, &context, &elapsed); 178 thread.WaitUntilDone(&result, &context, &hss, &elapsed);
161 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, result); 179 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, result);
162 EXPECT_EQ(static_cast<uint64_t>(-1), context); 180 EXPECT_EQ(static_cast<uint64_t>(-1), context);
163 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); 181 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
164 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); 182 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
165 } 183 }
166 184
167 // No (indefinite) deadline. 185 // No (indefinite) deadline.
168 186
169 // Awake immediately after thread start. 187 // Awake immediately after thread start.
170 { 188 {
171 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); 189 WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
172 thread.Start(); 190 thread.Start();
173 thread.waiter()->Awake(5, Awakable::AwakeReason::SATISFIED, 191 thread.waiter()->Awake(5, Awakable::AwakeReason::SATISFIED,
174 HandleSignalsState()); 192 HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
175 thread.WaitUntilDone(&result, &context, &elapsed); 193 MOJO_HANDLE_SIGNAL_READABLE));
194 thread.WaitUntilDone(&result, &context, &hss, &elapsed);
176 EXPECT_EQ(MOJO_RESULT_OK, result); 195 EXPECT_EQ(MOJO_RESULT_OK, result);
177 EXPECT_EQ(5u, context); 196 EXPECT_EQ(5u, context);
197 EXPECT_TRUE(hss.equals(HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
198 MOJO_HANDLE_SIGNAL_READABLE)));
178 EXPECT_LT(elapsed, test::EpsilonTimeout()); 199 EXPECT_LT(elapsed, test::EpsilonTimeout());
179 } 200 }
180 201
181 // Awake before after thread start. 202 // Awake before after thread start.
182 { 203 {
183 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); 204 WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
184 thread.waiter()->Awake(6, Awakable::AwakeReason::CANCELLED, 205 thread.waiter()->Awake(6, Awakable::AwakeReason::CANCELLED,
185 HandleSignalsState()); 206 HandleSignalsState());
186 thread.Start(); 207 thread.Start();
187 thread.WaitUntilDone(&result, &context, &elapsed); 208 thread.WaitUntilDone(&result, &context, &hss, &elapsed);
188 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); 209 EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
189 EXPECT_EQ(6u, context); 210 EXPECT_EQ(6u, context);
211 EXPECT_TRUE(hss.equals(HandleSignalsState()));
190 EXPECT_LT(elapsed, test::EpsilonTimeout()); 212 EXPECT_LT(elapsed, test::EpsilonTimeout());
191 } 213 }
192 214
193 // Awake some time after thread start. 215 // Awake some time after thread start.
194 { 216 {
195 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); 217 WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
196 thread.Start(); 218 thread.Start();
197 ThreadSleep(2 * test::EpsilonTimeout()); 219 ThreadSleep(2 * test::EpsilonTimeout());
198 thread.waiter()->Awake(7, Awakable::AwakeReason::UNSATISFIABLE, 220 thread.waiter()->Awake(7, Awakable::AwakeReason::UNSATISFIABLE,
199 HandleSignalsState()); 221 HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE,
200 thread.WaitUntilDone(&result, &context, &elapsed); 222 MOJO_HANDLE_SIGNAL_WRITABLE));
223 thread.WaitUntilDone(&result, &context, &hss, &elapsed);
201 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); 224 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
202 EXPECT_EQ(7u, context); 225 EXPECT_EQ(7u, context);
226 EXPECT_TRUE(hss.equals(HandleSignalsState(MOJO_HANDLE_SIGNAL_NONE,
227 MOJO_HANDLE_SIGNAL_WRITABLE)));
203 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); 228 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
204 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); 229 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
205 } 230 }
206 231
207 // Awake some longer time after thread start. 232 // Awake some longer time after thread start.
208 { 233 {
209 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); 234 WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
210 thread.Start(); 235 thread.Start();
211 ThreadSleep(5 * test::EpsilonTimeout()); 236 ThreadSleep(5 * test::EpsilonTimeout());
212 thread.waiter()->Awake(8, Awakable::AwakeReason::CANCELLED, 237 thread.waiter()->Awake(8, Awakable::AwakeReason::CANCELLED,
213 HandleSignalsState()); 238 HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
214 thread.WaitUntilDone(&result, &context, &elapsed); 239 MOJO_HANDLE_SIGNAL_READABLE));
240 thread.WaitUntilDone(&result, &context, &hss, &elapsed);
215 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); 241 EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
216 EXPECT_EQ(8u, context); 242 EXPECT_EQ(8u, context);
243 EXPECT_TRUE(hss.equals(HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
244 MOJO_HANDLE_SIGNAL_READABLE)));
217 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout()); 245 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout());
218 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout()); 246 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout());
219 } 247 }
220 } 248 }
221 249
222 TEST(WaiterTest, TimeOut) { 250 TEST(WaiterTest, TimeOut) {
223 Stopwatch stopwatch; 251 Stopwatch stopwatch;
224 MojoDeadline elapsed; 252 MojoDeadline elapsed;
225 253
226 Waiter waiter; 254 Waiter waiter;
227 uint64_t context = 123; 255 uint64_t context = 123;
228 256
229 waiter.Init(); 257 waiter.Init();
230 stopwatch.Start(); 258 stopwatch.Start();
231 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, &context)); 259 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, &context, nullptr));
232 elapsed = stopwatch.Elapsed(); 260 elapsed = stopwatch.Elapsed();
233 EXPECT_LT(elapsed, test::EpsilonTimeout()); 261 EXPECT_LT(elapsed, test::EpsilonTimeout());
234 EXPECT_EQ(123u, context); 262 EXPECT_EQ(123u, context);
235 263
236 waiter.Init(); 264 waiter.Init();
237 stopwatch.Start(); 265 stopwatch.Start();
238 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, 266 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
239 waiter.Wait(2 * test::EpsilonTimeout(), &context)); 267 waiter.Wait(2 * test::EpsilonTimeout(), &context, nullptr));
240 elapsed = stopwatch.Elapsed(); 268 elapsed = stopwatch.Elapsed();
241 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); 269 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
242 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); 270 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
243 EXPECT_EQ(123u, context); 271 EXPECT_EQ(123u, context);
244 272
245 waiter.Init(); 273 waiter.Init();
246 stopwatch.Start(); 274 stopwatch.Start();
247 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, 275 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
248 waiter.Wait(5 * test::EpsilonTimeout(), &context)); 276 waiter.Wait(5 * test::EpsilonTimeout(), &context, nullptr));
249 elapsed = stopwatch.Elapsed(); 277 elapsed = stopwatch.Elapsed();
250 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout()); 278 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout());
251 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout()); 279 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout());
252 EXPECT_EQ(123u, context); 280 EXPECT_EQ(123u, context);
253 } 281 }
254 282
255 // The first |Awake()| should always win. 283 // The first |Awake()| should always win.
256 TEST(WaiterTest, MultipleAwakes) { 284 TEST(WaiterTest, MultipleAwakes) {
257 MojoResult result; 285 MojoResult result;
258 uint64_t context; 286 uint64_t context;
287 HandleSignalsState hss;
259 MojoDeadline elapsed; 288 MojoDeadline elapsed;
260 289
261 { 290 {
262 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); 291 WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
263 thread.Start(); 292 thread.Start();
264 thread.waiter()->Awake(1, Awakable::AwakeReason::SATISFIED, 293 thread.waiter()->Awake(1, Awakable::AwakeReason::SATISFIED,
265 HandleSignalsState()); 294 HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
295 MOJO_HANDLE_SIGNAL_READABLE));
266 thread.waiter()->Awake(2, Awakable::AwakeReason::UNSATISFIABLE, 296 thread.waiter()->Awake(2, Awakable::AwakeReason::UNSATISFIABLE,
267 HandleSignalsState()); 297 HandleSignalsState());
268 thread.WaitUntilDone(&result, &context, &elapsed); 298 thread.WaitUntilDone(&result, &context, &hss, &elapsed);
269 EXPECT_EQ(MOJO_RESULT_OK, result); 299 EXPECT_EQ(MOJO_RESULT_OK, result);
270 EXPECT_EQ(1u, context); 300 EXPECT_EQ(1u, context);
301 EXPECT_TRUE(hss.equals(HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
302 MOJO_HANDLE_SIGNAL_READABLE)));
271 EXPECT_LT(elapsed, test::EpsilonTimeout()); 303 EXPECT_LT(elapsed, test::EpsilonTimeout());
272 } 304 }
273 305
274 { 306 {
275 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); 307 WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
276 thread.waiter()->Awake(3, Awakable::AwakeReason::UNSATISFIABLE, 308 thread.waiter()->Awake(3, Awakable::AwakeReason::UNSATISFIABLE,
277 HandleSignalsState()); 309 HandleSignalsState());
278 thread.Start(); 310 thread.Start();
279 thread.waiter()->Awake(4, Awakable::AwakeReason::SATISFIED, 311 thread.waiter()->Awake(4, Awakable::AwakeReason::SATISFIED,
280 HandleSignalsState()); 312 HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
281 thread.WaitUntilDone(&result, &context, &elapsed); 313 MOJO_HANDLE_SIGNAL_READABLE));
314 thread.WaitUntilDone(&result, &context, &hss, &elapsed);
282 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); 315 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
283 EXPECT_EQ(3u, context); 316 EXPECT_EQ(3u, context);
317 EXPECT_TRUE(hss.equals(HandleSignalsState()));
284 EXPECT_LT(elapsed, test::EpsilonTimeout()); 318 EXPECT_LT(elapsed, test::EpsilonTimeout());
285 } 319 }
286 320
287 { 321 {
288 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); 322 WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
289 thread.Start(); 323 thread.Start();
290 thread.waiter()->Awake(5, Awakable::AwakeReason::CANCELLED, 324 thread.waiter()->Awake(5, Awakable::AwakeReason::CANCELLED,
291 HandleSignalsState()); 325 HandleSignalsState());
292 ThreadSleep(2 * test::EpsilonTimeout()); 326 ThreadSleep(2 * test::EpsilonTimeout());
293 thread.waiter()->Awake(6, Awakable::AwakeReason::UNSATISFIABLE, 327 thread.waiter()->Awake(6, Awakable::AwakeReason::UNSATISFIABLE,
294 HandleSignalsState()); 328 HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
295 thread.WaitUntilDone(&result, &context, &elapsed); 329 MOJO_HANDLE_SIGNAL_READABLE));
330 thread.WaitUntilDone(&result, &context, &hss, &elapsed);
296 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); 331 EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
297 EXPECT_EQ(5u, context); 332 EXPECT_EQ(5u, context);
333 EXPECT_TRUE(hss.equals(HandleSignalsState()));
298 EXPECT_LT(elapsed, test::EpsilonTimeout()); 334 EXPECT_LT(elapsed, test::EpsilonTimeout());
299 } 335 }
300 336
301 { 337 {
302 WaitingThread thread(10 * test::EpsilonTimeout()); 338 WaitingThread thread(10 * test::EpsilonTimeout());
303 thread.Start(); 339 thread.Start();
304 ThreadSleep(1 * test::EpsilonTimeout()); 340 ThreadSleep(1 * test::EpsilonTimeout());
305 thread.waiter()->Awake(7, Awakable::AwakeReason::UNSATISFIABLE, 341 thread.waiter()->Awake(7, Awakable::AwakeReason::UNSATISFIABLE,
306 HandleSignalsState()); 342 HandleSignalsState());
307 ThreadSleep(2 * test::EpsilonTimeout()); 343 ThreadSleep(2 * test::EpsilonTimeout());
308 thread.waiter()->Awake(8, Awakable::AwakeReason::SATISFIED, 344 thread.waiter()->Awake(8, Awakable::AwakeReason::SATISFIED,
309 HandleSignalsState()); 345 HandleSignalsState(MOJO_HANDLE_SIGNAL_READABLE,
310 thread.WaitUntilDone(&result, &context, &elapsed); 346 MOJO_HANDLE_SIGNAL_READABLE));
347 thread.WaitUntilDone(&result, &context, &hss, &elapsed);
311 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); 348 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
312 EXPECT_EQ(7u, context); 349 EXPECT_EQ(7u, context);
350 EXPECT_TRUE(hss.equals(HandleSignalsState()));
313 EXPECT_GT(elapsed, (1 - 1) * test::EpsilonTimeout()); 351 EXPECT_GT(elapsed, (1 - 1) * test::EpsilonTimeout());
314 EXPECT_LT(elapsed, (1 + 1) * test::EpsilonTimeout()); 352 EXPECT_LT(elapsed, (1 + 1) * test::EpsilonTimeout());
315 } 353 }
316 } 354 }
317 355
318 } // namespace 356 } // namespace
319 } // namespace system 357 } // namespace system
320 } // namespace mojo 358 } // namespace mojo
OLDNEW
« mojo/edk/system/waiter.cc ('K') | « mojo/edk/system/waiter_test_utils.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698