| Index: native_client_sdk/src/libraries/nacl_io/event_emitter.cc
|
| diff --git a/native_client_sdk/src/libraries/nacl_io/event_emitter.cc b/native_client_sdk/src/libraries/nacl_io/event_emitter.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..bec2f75146362bf49d7fd9a00b0c8f692bc462e7
|
| --- /dev/null
|
| +++ b/native_client_sdk/src/libraries/nacl_io/event_emitter.cc
|
| @@ -0,0 +1,55 @@
|
| +/* 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.
|
| + */
|
| +#include <assert.h>
|
| +
|
| +#include "nacl_io/event_emitter.h"
|
| +#include "nacl_io/event_listener.h"
|
| +
|
| +#include "sdk_util/auto_lock.h"
|
| +
|
| +bool operator<(const ScopedEventInfo& src_a, const ScopedEventInfo& src_b) {
|
| + return src_a.get() < src_b.get();
|
| +}
|
| +
|
| +void EventEmitter::Destroy() {
|
| + // We can not grab the EmitterLock prior to grabbing the EventListener lock,
|
| + // however the ref count proves this is the only thread which has a
|
| + // reference to the emitter at this point so accessing events_ is safe.
|
| + EventInfoSet_t::iterator it;
|
| + for (it = events_.begin(); it != events_.end(); it++) {
|
| + ScopedEventInfo info = *it;
|
| + info->listener->AbandonedEventInfo(info);
|
| + }
|
| +}
|
| +
|
| +void EventEmitter::RegisterEventInfo(const ScopedEventInfo& info) {
|
| + AutoLock lock(emitter_lock_);
|
| +
|
| + events_.insert(info);
|
| + ChainRegister(info);
|
| +}
|
| +
|
| +void EventEmitter::UnregisterEventInfo(const ScopedEventInfo& info) {
|
| + AutoLock lock(emitter_lock_);
|
| +
|
| + ChainUnregister(info);
|
| + events_.erase(info);
|
| +}
|
| +void EventEmitter::RaiseEvent(uint32_t event_bits) {
|
| + AutoLock lock(emitter_lock_);
|
| +
|
| + EventInfoSet_t::iterator it;
|
| + for (it = events_.begin(); it != events_.end(); it++) {
|
| + // If this event is allowed by the filter, signal it
|
| + ScopedEventInfo info = *it;
|
| + if (info->filter & event_bits) {
|
| + info->events |= event_bits & info->filter;
|
| + info->listener->Signal(info);
|
| + }
|
| + }
|
| +}
|
| +
|
| +void EventEmitter::ChainRegister(const ScopedEventInfo& info) {}
|
| +void EventEmitter::ChainUnregister(const ScopedEventInfo& info) {}
|
|
|