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

Side by Side Diff: mojo/edk/system/wait_set_dispatcher.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/simple_dispatcher.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 #include "mojo/edk/system/wait_set_dispatcher.h" 5 #include "mojo/edk/system/wait_set_dispatcher.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "mojo/edk/system/configuration.h" 10 #include "mojo/edk/system/configuration.h"
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 return; 269 return;
270 } 270 }
271 271
272 auto it = entries_.find(context); 272 auto it = entries_.find(context);
273 DCHECK(it != entries_.end()); 273 DCHECK(it != entries_.end());
274 const auto& entry = it->second; 274 const auto& entry = it->second;
275 // We should only ever get at most one "closed" (cancelled). 275 // We should only ever get at most one "closed" (cancelled).
276 DCHECK_NE(static_cast<int>(entry->trigger_state), 276 DCHECK_NE(static_cast<int>(entry->trigger_state),
277 static_cast<int>(Entry::TriggerState::CLOSED)); 277 static_cast<int>(Entry::TriggerState::CLOSED));
278 switch (reason) { 278 switch (reason) {
279 case AwakeReason::CANCELLED:
280 if (entry->trigger_state == Entry::TriggerState::NOT_TRIGGERED) {
281 AddPossiblyTriggeredNoLock(entry.get(), Entry::TriggerState::CLOSED);
282 } else {
283 entry->trigger_state = Entry::TriggerState::CLOSED;
284 }
285 entry->dispatcher = nullptr;
286 break;
279 case AwakeReason::SATISFIED: 287 case AwakeReason::SATISFIED:
280 case AwakeReason::UNSATISFIABLE: 288 case AwakeReason::UNSATISFIABLE:
281 // We shouldn't see these since we're used as a persistent |Awakable|. 289 // We shouldn't see these since we're used as a persistent |Awakable|.
282 NOTREACHED(); 290 NOTREACHED();
283 // Fall through. 291 break;
292 case AwakeReason::INITIALIZE:
293 // TODO(vtl): Save the initial state here (and maybe add to the triggered
294 // list), and then update state on CHANGED.
295 break;
284 case AwakeReason::CHANGED: 296 case AwakeReason::CHANGED:
285 if (signals_state.satisfies(entry->signals)) { 297 if (signals_state.satisfies(entry->signals)) {
286 if (entry->trigger_state == Entry::TriggerState::NOT_TRIGGERED) { 298 if (entry->trigger_state == Entry::TriggerState::NOT_TRIGGERED) {
287 AddPossiblyTriggeredNoLock(entry.get(), 299 AddPossiblyTriggeredNoLock(entry.get(),
288 Entry::TriggerState::SATISFIED); 300 Entry::TriggerState::SATISFIED);
289 } else { 301 } else {
290 entry->trigger_state = Entry::TriggerState::SATISFIED; 302 entry->trigger_state = Entry::TriggerState::SATISFIED;
291 } 303 }
292 } else if (!signals_state.can_satisfy(entry->signals)) { 304 } else if (!signals_state.can_satisfy(entry->signals)) {
293 if (entry->trigger_state == Entry::TriggerState::NOT_TRIGGERED) { 305 if (entry->trigger_state == Entry::TriggerState::NOT_TRIGGERED) {
294 AddPossiblyTriggeredNoLock(entry.get(), 306 AddPossiblyTriggeredNoLock(entry.get(),
295 Entry::TriggerState::UNSATISFIABLE); 307 Entry::TriggerState::UNSATISFIABLE);
296 } else { 308 } else {
297 entry->trigger_state = Entry::TriggerState::UNSATISFIABLE; 309 entry->trigger_state = Entry::TriggerState::UNSATISFIABLE;
298 } 310 }
299 } else { 311 } else {
300 if (entry->trigger_state != Entry::TriggerState::NOT_TRIGGERED) 312 if (entry->trigger_state != Entry::TriggerState::NOT_TRIGGERED)
301 RemovePossiblyTriggeredNoLock(entry.get()); 313 RemovePossiblyTriggeredNoLock(entry.get());
302 } 314 }
303 break; 315 break;
304 case AwakeReason::CANCELLED:
305 if (entry->trigger_state == Entry::TriggerState::NOT_TRIGGERED) {
306 AddPossiblyTriggeredNoLock(entry.get(), Entry::TriggerState::CLOSED);
307 } else {
308 entry->trigger_state = Entry::TriggerState::CLOSED;
309 }
310 entry->dispatcher = nullptr;
311 break;
312 } 316 }
313 } 317 }
314 318
315 void WaitSetDispatcher::AddPossiblyTriggeredNoLock( 319 void WaitSetDispatcher::AddPossiblyTriggeredNoLock(
316 Entry* entry, 320 Entry* entry,
317 Entry::TriggerState new_trigger_state) { 321 Entry::TriggerState new_trigger_state) {
318 DCHECK_EQ(static_cast<int>(entry->trigger_state), 322 DCHECK_EQ(static_cast<int>(entry->trigger_state),
319 static_cast<int>(Entry::TriggerState::NOT_TRIGGERED)); 323 static_cast<int>(Entry::TriggerState::NOT_TRIGGERED));
320 DCHECK(!entry->possibly_triggered_previous); 324 DCHECK(!entry->possibly_triggered_previous);
321 DCHECK(!entry->possibly_triggered_next); 325 DCHECK(!entry->possibly_triggered_next);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 entry->possibly_triggered_next->possibly_triggered_previous = 364 entry->possibly_triggered_next->possibly_triggered_previous =
361 entry->possibly_triggered_previous; 365 entry->possibly_triggered_previous;
362 } 366 }
363 367
364 entry->possibly_triggered_previous = nullptr; 368 entry->possibly_triggered_previous = nullptr;
365 entry->possibly_triggered_next = nullptr; 369 entry->possibly_triggered_next = nullptr;
366 } 370 }
367 371
368 } // namespace system 372 } // namespace system
369 } // namespace mojo 373 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/simple_dispatcher.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698