16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file.
46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "device/serial/async_waiter.h"
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace device {
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)AsyncWaiter::AsyncWaiter(mojo::Handle handle,
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                         MojoHandleSignals signals,
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                         const Callback& callback)
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : waiter_(mojo::Environment::GetDefaultAsyncWaiter()),
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      id_(0),
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      callback_(callback) {
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  id_ = waiter_->AsyncWait(handle.value(),
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                           signals,
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                           MOJO_DEADLINE_INDEFINITE,
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                           &AsyncWaiter::WaitComplete,
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                           this);
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)AsyncWaiter::~AsyncWaiter() {
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (id_)
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    waiter_->CancelWait(id_);
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// static
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void AsyncWaiter::WaitComplete(void* waiter, MojoResult result) {
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  static_cast<AsyncWaiter*>(waiter)->WaitCompleteInternal(result);
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void AsyncWaiter::WaitCompleteInternal(MojoResult result) {
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  id_ = 0;
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  callback_.Run(result);
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}  // namespace device
38