blob: ed404d5d9711b3b9389328b724757deb1e08732f [file] [log] [blame]
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef LIBRARIES_NACL_IO_EVENT_EMITTER_H_
#define LIBRARIES_NACL_IO_EVENT_EMITTER_H_
#include <stdint.h>
#include <map>
#include <set>
#include "nacl_io/error.h"
#include "sdk_util/auto_lock.h"
#include "sdk_util/macros.h"
#include "sdk_util/ref_object.h"
#include "sdk_util/scoped_ref.h"
#include "sdk_util/simple_lock.h"
namespace nacl_io {
class EventEmitter;
class EventListener;
typedef sdk_util::ScopedRef<EventEmitter> ScopedEventEmitter;
typedef std::map<EventListener*, uint32_t> EventListenerMap_t;
bool operator<(const ScopedEventEmitter& src_a,
const ScopedEventEmitter& src_b);
// EventEmitter
//
// The EventEmitter class provides notification of events to EventListeners
// by registering EventInfo objects and signaling the EventListener
// whenever thier state is changed.
//
// See "Kernel Events" in event_listener.h for additional information.
class EventEmitter : public sdk_util::RefObject {
public:
EventEmitter();
// This returns a snapshot, to ensure the status doesn't change from
// fetch to use, hold the lock and call GetEventStatus_Locked.
uint32_t GetEventStatus() {
AUTO_LOCK(emitter_lock_);
return GetEventStatus_Locked();
}
uint32_t GetEventStatus_Locked() { return event_status_; }
sdk_util::SimpleLock& GetLock() { return emitter_lock_; }
// Updates the specified bits in the event status, and signals any
// listeners waiting on those bits.
void RaiseEvents_Locked(uint32_t events);
// Clears the specified bits in the event status.
void ClearEvents_Locked(uint32_t events);
// Register or unregister an EventInfo. The lock of the EventListener
// associated with this EventInfo must be held prior to calling these
// functions. These functions are private to ensure they are called by the
// EventListener.
void RegisterListener(EventListener* listener, uint32_t events);
void UnregisterListener(EventListener* listener);
void RegisterListener_Locked(EventListener* listener, uint32_t events);
void UnregisterListener_Locked(EventListener* listener);
private:
uint32_t event_status_;
sdk_util::SimpleLock emitter_lock_;
EventListenerMap_t listeners_;
DISALLOW_COPY_AND_ASSIGN(EventEmitter);
};
} // namespace nacl_io
#endif // LIBRARIES_NACL_IO_EVENT_EMITTER_H_