| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |