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
3// found in the LICENSE file.
4
5#include "mojo/system/simple_dispatcher.h"
6
7#include "base/logging.h"
8
9namespace mojo {
10namespace system {
11
12SimpleDispatcher::SimpleDispatcher() {
13}
14
15SimpleDispatcher::~SimpleDispatcher() {
16}
17
18void SimpleDispatcher::HandleSignalsStateChangedNoLock() {
19  lock().AssertAcquired();
20  waiter_list_.AwakeWaitersForStateChange(GetHandleSignalsStateImplNoLock());
21}
22
23void SimpleDispatcher::CancelAllWaitersNoLock() {
24  lock().AssertAcquired();
25  waiter_list_.CancelAllWaiters();
26}
27
28MojoResult SimpleDispatcher::AddWaiterImplNoLock(
29    Waiter* waiter,
30    MojoHandleSignals signals,
31    uint32_t context,
32    HandleSignalsState* signals_state) {
33  lock().AssertAcquired();
34
35  HandleSignalsState state(GetHandleSignalsStateImplNoLock());
36  if (state.satisfies(signals)) {
37    if (signals_state)
38      *signals_state = state;
39    return MOJO_RESULT_ALREADY_EXISTS;
40  }
41  if (!state.can_satisfy(signals)) {
42    if (signals_state)
43      *signals_state = state;
44    return MOJO_RESULT_FAILED_PRECONDITION;
45  }
46
47  waiter_list_.AddWaiter(waiter, signals, context);
48  return MOJO_RESULT_OK;
49}
50
51void SimpleDispatcher::RemoveWaiterImplNoLock(
52    Waiter* waiter,
53    HandleSignalsState* signals_state) {
54  lock().AssertAcquired();
55  waiter_list_.RemoveWaiter(waiter);
56  if (signals_state)
57    *signals_state = GetHandleSignalsStateImplNoLock();
58}
59
60}  // namespace system
61}  // namespace mojo
62