1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch/* Copyright (c) 2013 The Chromium Authors. All rights reserved. 2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * Use of this source code is governed by a BSD-style license that can be 3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * found in the LICENSE file. 4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch */ 5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include <assert.h> 6ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "nacl_io/event_emitter.h" 8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "nacl_io/event_listener.h" 9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "sdk_util/auto_lock.h" 11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace nacl_io { 13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool operator<(const ScopedEventInfo& src_a, const ScopedEventInfo& src_b) { 15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return src_a.get() < src_b.get(); 16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid EventEmitter::Destroy() { 19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // We can not grab the EmitterLock prior to grabbing the EventListener lock, 20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // however the ref count proves this is the only thread which has a 21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // reference to the emitter at this point so accessing events_ is safe. 22ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EventInfoSet_t::iterator it; 23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (it = events_.begin(); it != events_.end(); it++) { 24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ScopedEventInfo info = *it; 25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch info->listener->AbandonedEventInfo(info); 26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 27ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid EventEmitter::RegisterEventInfo(const ScopedEventInfo& info) { 30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch AUTO_LOCK(emitter_lock_); 31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch events_.insert(info); 33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ChainRegisterEventInfo(info); 34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid EventEmitter::UnregisterEventInfo(const ScopedEventInfo& info) { 37ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch AUTO_LOCK(emitter_lock_); 38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ChainUnregisterEventInfo(info); 40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch events_.erase(info); 41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid EventEmitter::RaiseEvent(uint32_t event_bits) { 43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch AUTO_LOCK(emitter_lock_); 44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EventInfoSet_t::iterator it; 46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (it = events_.begin(); it != events_.end(); it++) { 47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // If this event is allowed by the filter, signal it 48ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ScopedEventInfo info = *it; 49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (info->filter & event_bits) { 50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch info->events |= event_bits & info->filter; 51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch info->listener->Signal(info); 52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid EventEmitter::ChainRegisterEventInfo(const ScopedEventInfo& info) {} 57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid EventEmitter::ChainUnregisterEventInfo(const ScopedEventInfo& info) {} 58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} // namespace nacl_io 60