1// Copyright (c) 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 <assert.h>
6#include <poll.h>
7
8#include "nacl_io/event_emitter.h"
9#include "nacl_io/event_listener.h"
10#include "nacl_io/fifo_interface.h"
11
12#include "sdk_util/auto_lock.h"
13
14namespace nacl_io {
15
16bool operator<(const ScopedEventEmitter& src_a,
17               const ScopedEventEmitter& src_b) {
18  return src_a.get() < src_b.get();
19}
20
21EventEmitter::EventEmitter() : event_status_(0) {
22}
23
24void EventEmitter::RegisterListener(EventListener* listener, uint32_t events) {
25  AUTO_LOCK(emitter_lock_);
26  RegisterListener_Locked(listener, events);
27}
28
29void EventEmitter::UnregisterListener(EventListener* listener) {
30  AUTO_LOCK(emitter_lock_);
31  UnregisterListener_Locked(listener);
32}
33
34void EventEmitter::RegisterListener_Locked(EventListener* listener,
35                                           uint32_t events) {
36  assert(listeners_.count(listener) == 0);
37  listeners_[listener] = events;
38}
39
40void EventEmitter::UnregisterListener_Locked(EventListener* listener) {
41  assert(listeners_.count(listener) == 1);
42  listeners_.erase(listener);
43}
44
45void EventEmitter::ClearEvents_Locked(uint32_t event_bits) {
46  event_status_ &= ~event_bits;
47}
48
49void EventEmitter::RaiseEvents_Locked(uint32_t event_bits) {
50  event_status_ |= event_bits;
51
52  EventListenerMap_t::iterator it;
53  for (it = listeners_.begin(); it != listeners_.end(); it++) {
54    uint32_t bits = it->second & event_bits;
55    if (0 != bits)
56      it->first->ReceiveEvents(this, bits);
57  }
58}
59
60}  // namespace nacl_io
61