1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include <assert.h> 668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <poll.h> 7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "nacl_io/event_emitter.h" 9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "nacl_io/event_listener.h" 1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "nacl_io/fifo_interface.h" 11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "sdk_util/auto_lock.h" 13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace nacl_io { 15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool operator<(const ScopedEventEmitter& src_a, 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const ScopedEventEmitter& src_b) { 18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return src_a.get() < src_b.get(); 19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)EventEmitter::EventEmitter() : event_status_(0) { 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void EventEmitter::RegisterListener(EventListener* listener, uint32_t events) { 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AUTO_LOCK(emitter_lock_); 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) RegisterListener_Locked(listener, events); 27ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void EventEmitter::UnregisterListener(EventListener* listener) { 30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch AUTO_LOCK(emitter_lock_); 3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UnregisterListener_Locked(listener); 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void EventEmitter::RegisterListener_Locked(EventListener* listener, 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) uint32_t events) { 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) assert(listeners_.count(listener) == 0); 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) listeners_[listener] = events; 38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void EventEmitter::UnregisterListener_Locked(EventListener* listener) { 4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) assert(listeners_.count(listener) == 1); 4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) listeners_.erase(listener); 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void EventEmitter::ClearEvents_Locked(uint32_t event_bits) { 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) event_status_ &= ~event_bits; 47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 48ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void EventEmitter::RaiseEvents_Locked(uint32_t event_bits) { 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) event_status_ |= event_bits; 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EventListenerMap_t::iterator it; 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for (it = listeners_.begin(); it != listeners_.end(); it++) { 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) uint32_t bits = it->second & event_bits; 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (0 != bits) 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) it->first->ReceiveEvents(this, bits); 57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} // namespace nacl_io 61