Home | History | Annotate | Download | only in nacl_io
      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 
     14 namespace nacl_io {
     15 
     16 bool operator<(const ScopedEventEmitter& src_a,
     17                const ScopedEventEmitter& src_b) {
     18   return src_a.get() < src_b.get();
     19 }
     20 
     21 EventEmitter::EventEmitter() : event_status_(0) {
     22 }
     23 
     24 void EventEmitter::RegisterListener(EventListener* listener, uint32_t events) {
     25   AUTO_LOCK(emitter_lock_);
     26   RegisterListener_Locked(listener, events);
     27 }
     28 
     29 void EventEmitter::UnregisterListener(EventListener* listener) {
     30   AUTO_LOCK(emitter_lock_);
     31   UnregisterListener_Locked(listener);
     32 }
     33 
     34 void EventEmitter::RegisterListener_Locked(EventListener* listener,
     35                                            uint32_t events) {
     36   assert(listeners_.count(listener) == 0);
     37   listeners_[listener] = events;
     38 }
     39 
     40 void EventEmitter::UnregisterListener_Locked(EventListener* listener) {
     41   assert(listeners_.count(listener) == 1);
     42   listeners_.erase(listener);
     43 }
     44 
     45 void EventEmitter::ClearEvents_Locked(uint32_t event_bits) {
     46   event_status_ &= ~event_bits;
     47 }
     48 
     49 void 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