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