| // Copyright (c) 2011 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 "base/synchronization/waitable_event_watcher.h" |
| |
| #include "base/compiler_specific.h" |
| #include "base/synchronization/waitable_event.h" |
| #include "base/win/object_watcher.h" |
| |
| namespace base { |
| |
| WaitableEventWatcher::ObjectWatcherHelper::ObjectWatcherHelper( |
| WaitableEventWatcher* watcher) |
| : watcher_(watcher) { |
| }; |
| |
| void WaitableEventWatcher::ObjectWatcherHelper::OnObjectSignaled(HANDLE h) { |
| watcher_->OnObjectSignaled(); |
| } |
| |
| |
| WaitableEventWatcher::WaitableEventWatcher() |
| : ALLOW_THIS_IN_INITIALIZER_LIST(helper_(this)), |
| event_(NULL), |
| delegate_(NULL) { |
| } |
| |
| WaitableEventWatcher::~WaitableEventWatcher() { |
| } |
| |
| bool WaitableEventWatcher::StartWatching(WaitableEvent* event, |
| Delegate* delegate) { |
| delegate_ = delegate; |
| event_ = event; |
| |
| return watcher_.StartWatching(event->handle(), &helper_); |
| } |
| |
| void WaitableEventWatcher::StopWatching() { |
| delegate_ = NULL; |
| event_ = NULL; |
| watcher_.StopWatching(); |
| } |
| |
| WaitableEvent* WaitableEventWatcher::GetWatchedEvent() { |
| return event_; |
| } |
| |
| void WaitableEventWatcher::OnObjectSignaled() { |
| WaitableEvent* event = event_; |
| Delegate* delegate = delegate_; |
| event_ = NULL; |
| delegate_ = NULL; |
| DCHECK(event); |
| |
| delegate->OnWaitableEventSignaled(event); |
| } |
| |
| } // namespace base |