19bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
29bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
39bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)// found in the LICENSE file.
49bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
59bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)define('async_waiter', [
69bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    'mojo/public/js/bindings/support',
79bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)], function(supportModule) {
89bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)  /**
99bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   * @module async_waiter
109bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   */
119bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)  /**
139bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   * @callback module:async_waiter.AsyncWaiter.Callback
149bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   * @param {number} result The result of waiting.
159bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   */
169bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
179bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)  /**
189bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   * A waiter that waits for a handle to be ready for either reading or writing.
199bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   * @param {!MojoHandle} handle The handle to wait on.
209bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   * @param {number} signals The signals to wait for handle to be ready for.
219bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   * @param {module:async_waiter.AsyncWaiter.Callback} callback The callback to
229bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   *     call when handle is ready.
239bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   * @constructor
249bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   * @alias module:async_waiter.AsyncWaiter
259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   */
269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)  function AsyncWaiter(handle, signals, callback) {
279bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    /**
289bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)     * The handle to wait on.
299bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)     * @type {!MojoHandle}
309bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)     * @private
319bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)     */
329bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    this.handle_ = handle;
33bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    /**
35c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * The signals to wait for.
369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)     * @type {number}
37bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)     * @private
38bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)     */
39bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    this.signals_ = signals;
40f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
41bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    /**
429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)     * The callback to invoke when
43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * |[handle_]{@link module:async_waiter.AsyncWaiter#handle_}| is ready.
449bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)     * @type {module:async_waiter.AsyncWaiter.Callback}
459bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)     * @private
469bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)     */
47f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    this.callback_ = callback;
489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    this.id_ = null;
49a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)  }
50a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
51197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch  /**
52197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch   * Start waiting for the handle to be ready.
53197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch   * @throws Will throw if this is already waiting.
54197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch   */
559bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)  AsyncWaiter.prototype.start = function() {
569bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (this.id_)
579bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)      throw new Error('Already started');
589bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    this.id_ = supportModule.asyncWait(
599bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        this.handle_, this.signals_, this.onHandleReady_.bind(this));
609bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)  };
61197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
629bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)  /**
639bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   * Stop waiting for the handle to be ready.
649bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   */
659bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)  AsyncWaiter.prototype.stop = function() {
669bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!this.id_)
679bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)      return;
68d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
69197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    supportModule.cancelWait(this.id_);
709bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    this.id_ = null;
719bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)  };
729bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
739bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)  /**
749bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   * Returns whether this {@link AsyncWaiter} is waiting.
75d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)   * @return {boolean} Whether this AsyncWaiter is waiting.
76d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)   */
779bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)  AsyncWaiter.prototype.isWaiting = function() {
78f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return !!this.id_;
799bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)  };
809bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
819bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)  /**
82197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch   * Invoked when |[handle_]{@link module:async_waiter.AsyncWaiter#handle_}| is
839bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   * ready.
849bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   * @param {number} result The result of the wait.
859bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   * @private
869bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)   */
879bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)  AsyncWaiter.prototype.onHandleReady_ = function(result) {
889bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    this.id_ = null;
899bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    this.callback_(result);
909bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)  };
919bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
929bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)  return {AsyncWaiter: AsyncWaiter};
93});
94