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