13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
53f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/synchronization/waitable_event_watcher.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/compiler_specific.h"
83f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/synchronization/waitable_event.h"
93f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/win/object_watcher.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base {
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottWaitableEventWatcher::ObjectWatcherHelper::ObjectWatcherHelper(
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    WaitableEventWatcher* watcher)
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    : watcher_(watcher) {
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid WaitableEventWatcher::ObjectWatcherHelper::OnObjectSignaled(HANDLE h) {
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  watcher_->OnObjectSignaled();
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottWaitableEventWatcher::WaitableEventWatcher()
243f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    : ALLOW_THIS_IN_INITIALIZER_LIST(helper_(this)),
253f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      event_(NULL),
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      delegate_(NULL) {
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottWaitableEventWatcher::~WaitableEventWatcher() {
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool WaitableEventWatcher::StartWatching(WaitableEvent* event,
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                         Delegate* delegate) {
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  delegate_ = delegate;
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  event_ = event;
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return watcher_.StartWatching(event->handle(), &helper_);
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid WaitableEventWatcher::StopWatching() {
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  delegate_ = NULL;
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  event_ = NULL;
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  watcher_.StopWatching();
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottWaitableEvent* WaitableEventWatcher::GetWatchedEvent() {
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return event_;
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid WaitableEventWatcher::OnObjectSignaled() {
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  WaitableEvent* event = event_;
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Delegate* delegate = delegate_;
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  event_ = NULL;
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  delegate_ = NULL;
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(event);
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  delegate->OnWaitableEventSignaled(event);
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace base
61