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 #ifndef LIBRARIES_NACL_IO_EVENT_EMITTER_H_
      6 #define LIBRARIES_NACL_IO_EVENT_EMITTER_H_
      7 
      8 #include <stdint.h>
      9 
     10 #include <map>
     11 #include <set>
     12 
     13 #include "nacl_io/error.h"
     14 
     15 #include "sdk_util/ref_object.h"
     16 #include "sdk_util/scoped_ref.h"
     17 #include "sdk_util/simple_lock.h"
     18 
     19 
     20 namespace nacl_io {
     21 
     22 class EventEmitter;
     23 class EventListener;
     24 
     25 // A ref counted object (non POD derived from RefObject) for storing the
     26 // state of a single signal request.  Requests are unique to any
     27 // FD/EventListener pair.
     28 struct EventInfo : public sdk_util::RefObject {
     29   // User provied data to be returned on EventListener::Wait
     30   uint64_t user_data;
     31 
     32   // Bitfield of POLL events currently signaled.
     33   uint32_t events;
     34 
     35   // Bitfield of POLL events of interest.
     36   uint32_t filter;
     37 
     38   // We do not use a ScopedRef to prevent circular references.
     39   EventEmitter* emitter;
     40   EventListener* listener;
     41   uint32_t id;
     42 };
     43 
     44 typedef sdk_util::ScopedRef<EventInfo> ScopedEventInfo;
     45 
     46 // Provide comparison for std::map and std::set
     47 bool operator<(const ScopedEventInfo& src_a, const ScopedEventInfo& src_b);
     48 
     49 typedef std::map<int, ScopedEventInfo> EventInfoMap_t;
     50 typedef std::set<ScopedEventInfo> EventInfoSet_t;
     51 
     52 // EventEmitter
     53 //
     54 // The EventEmitter class provides notification of events to EventListeners
     55 // by registering EventInfo objects and signaling the EventListener
     56 // whenever thier state is changed.
     57 //
     58 // See "Kernel Events" in event_listener.h for additional information.
     59 class EventEmitter : public sdk_util::RefObject {
     60  protected:
     61   // Called automatically prior to delete to inform the EventListeners that
     62   // this EventEmitter is abandoning an associated EventInfo.
     63   virtual void Destroy();
     64 
     65  private:
     66   // Register or unregister an EventInfo.  The lock of the EventListener
     67   // associated with this EventInfo must be held prior to calling these
     68   // functions.  These functions are private to ensure they are called by the
     69   // EventListener.
     70   void RegisterEventInfo(const ScopedEventInfo& info);
     71   void UnregisterEventInfo(const ScopedEventInfo& info);
     72 
     73  public:
     74   // Returns the current state of the emitter as POLL events bitfield.
     75   virtual uint32_t GetEventStatus() = 0;
     76 
     77   // Returns the type of the emitter (compatible with st_mode in stat)
     78   virtual int GetType() = 0;
     79 
     80  protected:
     81   // Called by the thread causing the Event.
     82   void RaiseEvent(uint32_t events);
     83 
     84   // Provided to allow one EventEmitter to register the same EventInfo with
     85   // a child EventEmitter so that they can both signal the EventListener.
     86   // Called after registering locally, but while lock is still held.
     87   virtual void ChainRegisterEventInfo(const ScopedEventInfo& event);
     88 
     89   // Called before unregistering locally, but while lock is still held.
     90   virtual void ChainUnregisterEventInfo(const ScopedEventInfo& event);
     91 
     92 private:
     93   sdk_util::SimpleLock emitter_lock_;
     94   EventInfoSet_t events_;
     95   friend class EventListener;
     96 };
     97 
     98 typedef sdk_util::ScopedRef<EventEmitter> ScopedEventEmitter;
     99 
    100 }  // namespace nacl_io
    101 
    102 
    103 #endif  // LIBRARIES_NACL_IO_EVENT_EMITTER_H_