15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event_watcher.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/object_watcher.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WaitableEventWatcher::WaitableEventWatcher()
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : event_(NULL) {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WaitableEventWatcher::~WaitableEventWatcher() {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WaitableEventWatcher::StartWatching(
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WaitableEvent* event,
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const EventCallback& callback) {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback_ = callback;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event_ = event;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return watcher_.StartWatching(event->handle(), this);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WaitableEventWatcher::StopWatching() {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback_.Reset();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event_ = NULL;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  watcher_.StopWatching();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WaitableEvent* WaitableEventWatcher::GetWatchedEvent() {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return event_;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WaitableEventWatcher::OnObjectSignaled(HANDLE h) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitableEvent* event = event_;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EventCallback callback = callback_;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  event_ = NULL;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback_.Reset();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(event);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback.Run(event);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
49