1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "device/serial/async_waiter.h"
6
7namespace device {
8
9AsyncWaiter::AsyncWaiter(mojo::Handle handle,
10                         MojoHandleSignals signals,
11                         const Callback& callback)
12    : waiter_(mojo::Environment::GetDefaultAsyncWaiter()),
13      id_(0),
14      callback_(callback) {
15  id_ = waiter_->AsyncWait(handle.value(),
16                           signals,
17                           MOJO_DEADLINE_INDEFINITE,
18                           &AsyncWaiter::WaitComplete,
19                           this);
20}
21
22AsyncWaiter::~AsyncWaiter() {
23  if (id_)
24    waiter_->CancelWait(id_);
25}
26
27// static
28void AsyncWaiter::WaitComplete(void* waiter, MojoResult result) {
29  static_cast<AsyncWaiter*>(waiter)->WaitCompleteInternal(result);
30}
31
32void AsyncWaiter::WaitCompleteInternal(MojoResult result) {
33  id_ = 0;
34  callback_.Run(result);
35}
36
37}  // namespace device
38