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