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

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

Issue 2090763002: AwakableList: For persistent awakables, make Add() call Awake() with reason INITIALIZE. (Closed) Base URL: https://github.com/domokit/mojo.git@work795_wait_set_4.7-x-work794_wait_set_4.6
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « mojo/edk/system/awakable_list.cc ('k') | mojo/edk/system/data_pipe.cc » ('j') | no next file with comments »
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 12 matching lines...) Expand all
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
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
OLDNEW
« no previous file with comments | « mojo/edk/system/awakable_list.cc ('k') | mojo/edk/system/data_pipe.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698