UNPKG

hjs-future

Version:

Future classes of Hubrijs framework

1,251 lines (1,133 loc) 55.8 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.PoolExecutorService = exports.AbstractExecutorService = exports.ExecutorCompletionService = exports.CompletionService = exports.FutureTask = undefined; var _from = require('babel-runtime/core-js/array/from'); var _from2 = _interopRequireDefault(_from); var _get2 = require('babel-runtime/helpers/get'); var _get3 = _interopRequireDefault(_get2); var _getIterator2 = require('babel-runtime/core-js/get-iterator'); var _getIterator3 = _interopRequireDefault(_getIterator2); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _time = require('hjs-core/lib/time'); var _handler = require('hjs-message/lib/handler'); var _executor = require('./executor'); var _future = require('./future'); var _queue = require('./queue'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var FutureTask = exports.FutureTask = function (_RunnableFuture) { (0, _inherits3.default)(FutureTask, _RunnableFuture); function FutureTask() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$done = _ref.done, done = _ref$done === undefined ? null : _ref$done, _ref$callable = _ref.callable, callable = _ref$callable === undefined ? null : _ref$callable, _ref$runnable = _ref.runnable, runnable = _ref$runnable === undefined ? null : _ref$runnable, _ref$result = _ref.result, result = _ref$result === undefined ? null : _ref$result; (0, _classCallCheck3.default)(this, FutureTask); var _this = (0, _possibleConstructorReturn3.default)(this, (FutureTask.__proto__ || (0, _getPrototypeOf2.default)(FutureTask)).call(this)); _this.mWaitId = -1; _this.mState = _future.FutureState.NEW; if (callable) { if (callable instanceof _future.Callable) { _this.mCallable = callable; } else if (callable.compute) { _this.mCallable = new _future.Callable(callable); } else if (typeof callable === "function") { _this.mCallable = new _future.Callable({ compute: callable }); } else { throw new TypeError("IllegalArgumentsException not a callable type"); } } else if (runnable) { if (runnable instanceof _handler.Runnable) { _this.mCallable = _executor.Executors.callable(runnable, result); } else if (runnable.run) { _this.mCallable = _executor.Executors.callable(runnable, result); } else if (typeof runnable === "function") { _this.mCallable = _executor.Executors.callable({ run: runnable }, result); } else { throw new TypeError("IllegalArgumentsException not a runnable type"); } } else { throw new ReferenceError('NullPointerException'); } if (done) { _this.done = done; } return _this; } (0, _createClass3.default)(FutureTask, [{ key: 'awaitDone', value: function awaitDone() { var s = this.mState; var done = s === _future.FutureState.COMPLETING; if (done) { this.set(this.report(s)); } else { switch (s) { case _future.FutureState.NORMAL: this.mState = _future.FutureState.COMPLETING; this.set(this.report(s)); break; case _future.FutureState.EXCEPTIONAL: this.setException(this.mOutcome); break; case _future.FutureState.CANCELLED: this.report(s); break; case _future.FutureState.INTERRUPTED: this.report(s); break; } } } }, { key: 'cancel', value: function cancel() { var mayInterruptIfRunning = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; if (this.mState === _future.FutureState.NORMAL) { return false; } var isNew = this.mState === _future.FutureState.NEW; this.mState = mayInterruptIfRunning ? _future.FutureState.INTERRUPTING : _future.FutureState.CANCELLED; if (isNew) { return false; } this.compute(); return true; } }, { key: 'compute', value: function compute(result) { this.finalize(); var s = this.mState; if (s >= _future.FutureState.INTERRUPTING) { this.setInterrupted(s); } else if (s >= _future.FutureState.CANCELLED) { this.setCancelled(s); } else { this.set(result); } } }, { key: 'done', value: function done() { var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; } }, { key: 'finalize', value: function finalize() { if (this.mCallable) { this.mCallable.removeAllListeners(_future.Callable.COMPUTE); this.mCallable.removeAllListeners(_future.Callable.CANCEL); } if (this.mWaitId > -1) { clearTimeout(this.mWaitId); this.mWaitId = -1; } } }, { key: 'finishCompletion', value: function finishCompletion() { this.emit(_future.Future.DONE, this.mOutcome); this.done(this.mOutcome); this.mCallable = null; } }, { key: 'get', value: function get() { var _this2 = this; var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref2$timeout = _ref2.timeout, timeout = _ref2$timeout === undefined ? 0 : _ref2$timeout, _ref2$unit = _ref2.unit, unit = _ref2$unit === undefined ? _time.MILLISECONDS : _ref2$unit, _ref2$done = _ref2.done, done = _ref2$done === undefined ? null : _ref2$done; if (done) { this.on(_future.Future.DONE, function () { var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; _this2.removeAllListeners(_future.Future.DONE); done(result); }); } this.run(); var s = this.mState; if (s <= _future.FutureState.COMPLETING) { var millis = unit.toMillis(timeout); if (millis > 0) { this.mWaitId = setTimeout(function () { _this2.finalize(); var s = _this2.mState; if (s === _future.FutureState.CANCELLED) { _this2.setCancelled(); } else { _this2.mState = _future.FutureState.INTERRUPTING; _this2.setInterrupted(); } }, millis); } return null; } try { return this.report(this.mState); } catch (ex) { this.setException(ex); return ex; } } }, { key: 'handlePossibleCancellationInterrupt', value: function handlePossibleCancellationInterrupt(s) { if (s === _future.FutureState.INTERRUPTING) { this.mState = _future.FutureState.INTERRUPTED; } } }, { key: 'isCancelled', value: function isCancelled() { return this.mState >= _future.FutureState.CANCELLED; } }, { key: 'isDone', value: function isDone() { return this.mState === _future.FutureState.NORMAL; } }, { key: 'isInterrupted', value: function isInterrupted() { return this.mState >= _future.FutureState.INTERRUPTING; } }, { key: 'report', value: function report(s) { var x = this.mOutcome; if (s === _future.FutureState.NORMAL) { return x; } if (s >= _future.FutureState.CANCELLED) { throw new RangeError("CancellationException"); } if (s >= _future.FutureState.INTERRUPTING) { throw new RangeError("InterruptedException"); } throw new EvalError("ExecutionException " + x); } }, { key: 'run', value: function run() { var _this3 = this; var isNew = this.mState === _future.FutureState.NEW; if (isNew) { var callable = this.mCallable; if (callable) { try { this.mState = _future.FutureState.COMPLETING; callable.on(_future.Callable.COMPUTE, function (result) { _this3.compute(result); }); callable.on(_future.Callable.CANCEL, function () { _this3.cancel(); }); callable.call(); } catch (ex) { this.setException(ex); } } } } }, { key: 'set', value: function set(v) { if (this.mState === _future.FutureState.COMPLETING) { this.mOutcome = v; this.mState = _future.FutureState.NORMAL; this.finishCompletion(); } } }, { key: 'setException', value: function setException(ex) { var isException = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; if (this.mState === _future.FutureState.NEW || this.mState === _future.FutureState.COMPLETING || this.mState === _future.FutureState.NORMAL || this.mState === _future.FutureState.CANCELLED || this.mState === _future.FutureState.INTERRUPTING || this.mState === _future.FutureState.INTERRUPTED) { this.mOutcome = ex; if (isException) { this.mState = _future.FutureState.EXCEPTIONAL; } this.finishCompletion(); } } }, { key: 'setCancelled', value: function setCancelled() { try { this.awaitDone(); } catch (ex) { this.setException(ex, false); } } }, { key: 'setInterrupted', value: function setInterrupted() { var s = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _future.FutureState.INTERRUPTING; try { this.handlePossibleCancellationInterrupt(s); this.awaitDone(); } catch (ex) { this.setException(ex, false); } } }], [{ key: 'create', value: function create() { var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref3$callable = _ref3.callable, callable = _ref3$callable === undefined ? null : _ref3$callable, _ref3$runnable = _ref3.runnable, runnable = _ref3$runnable === undefined ? null : _ref3$runnable, _ref3$result = _ref3.result, result = _ref3$result === undefined ? null : _ref3$result, _ref3$done = _ref3.done, done = _ref3$done === undefined ? null : _ref3$done; if (!callable && !runnable) { throw new ReferenceError("NullPointerException"); } return new FutureTask({ callable: callable, runnable: runnable, result: result, done: done }); } }]); return FutureTask; }(_future.RunnableFuture); /** @babel */ var CompletionService = exports.CompletionService = function () { function CompletionService() { (0, _classCallCheck3.default)(this, CompletionService); } (0, _createClass3.default)(CompletionService, [{ key: 'newTaskFor', value: function newTaskFor() { var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref4$callable = _ref4.callable, callable = _ref4$callable === undefined ? null : _ref4$callable, _ref4$runnable = _ref4.runnable, runnable = _ref4$runnable === undefined ? null : _ref4$runnable, _ref4$result = _ref4.result, result = _ref4$result === undefined ? null : _ref4$result, _ref4$done = _ref4.done, done = _ref4$done === undefined ? null : _ref4$done; return null; } }, { key: 'poll', value: function poll() { var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref5$timeout = _ref5.timeout, timeout = _ref5$timeout === undefined ? 0 : _ref5$timeout, _ref5$unit = _ref5.unit, unit = _ref5$unit === undefined ? _time.MILLISECONDS : _ref5$unit, _ref5$callback = _ref5.callback, callback = _ref5$callback === undefined ? null : _ref5$callback; return null; } }, { key: 'submit', value: function submit() { var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref6$timeout = _ref6.timeout, timeout = _ref6$timeout === undefined ? 0 : _ref6$timeout, _ref6$unit = _ref6.unit, unit = _ref6$unit === undefined ? _time.MILLISECONDS : _ref6$unit, _ref6$callable = _ref6.callable, callable = _ref6$callable === undefined ? null : _ref6$callable, _ref6$runnable = _ref6.runnable, runnable = _ref6$runnable === undefined ? null : _ref6$runnable, _ref6$result = _ref6.result, result = _ref6$result === undefined ? null : _ref6$result, _ref6$done = _ref6.done, done = _ref6$done === undefined ? null : _ref6$done; return null; } }, { key: 'take', value: function take() { var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; return null; } }]); return CompletionService; }(); var ExecutorCompletionService = exports.ExecutorCompletionService = function (_CompletionService) { (0, _inherits3.default)(ExecutorCompletionService, _CompletionService); function ExecutorCompletionService() { var _ref7 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref7$executor = _ref7.executor, executor = _ref7$executor === undefined ? null : _ref7$executor, _ref7$capacity = _ref7.capacity, capacity = _ref7$capacity === undefined ? Number.MAX_VALUE : _ref7$capacity, _ref7$queue = _ref7.queue, queue = _ref7$queue === undefined ? null : _ref7$queue; (0, _classCallCheck3.default)(this, ExecutorCompletionService); var _this4 = (0, _possibleConstructorReturn3.default)(this, (ExecutorCompletionService.__proto__ || (0, _getPrototypeOf2.default)(ExecutorCompletionService)).call(this)); _this4.mExecutor = executor ? executor : new _executor.Executor(); _this4.mCompletionQueue = queue ? queue : new _queue.LinkedBlockingQueue({ capacity: capacity }); _this4.mAes = queue instanceof AbstractExecutorService ? queue : null; return _this4; } (0, _createClass3.default)(ExecutorCompletionService, [{ key: 'newTaskFor', value: function newTaskFor() { var _ref8 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref8$callable = _ref8.callable, callable = _ref8$callable === undefined ? null : _ref8$callable, _ref8$runnable = _ref8.runnable, runnable = _ref8$runnable === undefined ? null : _ref8$runnable, _ref8$result = _ref8.result, result = _ref8$result === undefined ? null : _ref8$result, _ref8$done = _ref8.done, done = _ref8$done === undefined ? null : _ref8$done; if (this.mAes) { return this.mAes.newTaskFor({ callable: callable, runnable: runnable, result: result, done: done }); } return FutureTask.create({ callable: callable, runnable: runnable, result: result, done: done }); } }, { key: 'poll', value: function poll() { var _ref9 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref9$timeout = _ref9.timeout, timeout = _ref9$timeout === undefined ? 0 : _ref9$timeout, _ref9$unit = _ref9.unit, unit = _ref9$unit === undefined ? _time.MILLISECONDS : _ref9$unit, _ref9$callback = _ref9.callback, callback = _ref9$callback === undefined ? null : _ref9$callback; return this.mCompletionQueue.poll({ timeout: timeout, unit: unit, callback: callback }); } }, { key: 'submit', value: function submit() { var _this5 = this; var _ref10 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref10$timeout = _ref10.timeout, timeout = _ref10$timeout === undefined ? 0 : _ref10$timeout, _ref10$unit = _ref10.unit, unit = _ref10$unit === undefined ? _time.MILLISECONDS : _ref10$unit, _ref10$callable = _ref10.callable, callable = _ref10$callable === undefined ? null : _ref10$callable, _ref10$runnable = _ref10.runnable, runnable = _ref10$runnable === undefined ? null : _ref10$runnable, _ref10$result = _ref10.result, result = _ref10$result === undefined ? null : _ref10$result, _ref10$done = _ref10.done, done = _ref10$done === undefined ? null : _ref10$done; var future = null; if (callable || runnable) { future = this.newTaskFor({ callable: callable, runnable: runnable, result: result }); } else { throw new ReferenceError("NullPointerException"); } this.mCompletionQueue.offer(future, { callback: function callback() { var item = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; if (item instanceof Error) { done(item); } else { _this5.mExecutor.execute(item, timeout, unit, done); } } }); return future; } }, { key: 'take', value: function take() { var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; return this.mCompletionQueue.take(callback); } }]); return ExecutorCompletionService; }(CompletionService); var cancelAll = function cancelAll(futures) { var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var f = null; var len = futures.length; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = (0, _getIterator3.default)(futures), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var _f = _step.value; if (_f && !_f.isDone() && !_f.isCancelled()) { _f.cancel(); } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } }; var AbstractExecutorService = exports.AbstractExecutorService = function (_ExecutorService) { (0, _inherits3.default)(AbstractExecutorService, _ExecutorService); function AbstractExecutorService() { (0, _classCallCheck3.default)(this, AbstractExecutorService); return (0, _possibleConstructorReturn3.default)(this, (AbstractExecutorService.__proto__ || (0, _getPrototypeOf2.default)(AbstractExecutorService)).call(this)); } (0, _createClass3.default)(AbstractExecutorService, [{ key: 'execute', value: function execute(r) { for (var _len = arguments.length, params = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { params[_key - 1] = arguments[_key]; } if (!r) { throw new ReferenceError("NullPointerException"); } var timeout = void 0, unit = void 0, done = void 0; if (r instanceof _future.Future) { timeout = params[0] || 0; unit = params[1] || _time.MILLISECONDS; done = params[2]; r.get({ timeout: timeout, unit: unit, done: done }); return r; } else if (r.runnable) { timeout = r.timeout || 0; unit = r.unit || _time.MILLISECONDS; done = r.done; r = r.runnable; r.get({ timeout: timeout, unit: unit, done: done }); return r; } return (0, _get3.default)(AbstractExecutorService.prototype.__proto__ || (0, _getPrototypeOf2.default)(AbstractExecutorService.prototype), 'execute', this).apply(this, (0, _from2.default)(arguments)); } }, { key: 'invokeAll', value: function invokeAll() { var _this7 = this; var _ref11 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, tasks = _ref11.tasks, _ref11$timeout = _ref11.timeout, timeout = _ref11$timeout === undefined ? 0 : _ref11$timeout, _ref11$unit = _ref11.unit, unit = _ref11$unit === undefined ? _time.MILLISECONDS : _ref11$unit, _ref11$done = _ref11.done, _done = _ref11$done === undefined ? null : _ref11$done; if (!tasks || !Array.isArray(tasks) || tasks.length < 1) { throw new RangeError("IllegalArgumentException"); } var completeTasks = []; var futures = tasks.map(function (callable) { var future = _this7.submit({ callable: callable, timeout: timeout, unit: unit, done: function done() { var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; completeTasks.push(future); if (completeTasks.length === tasks.length) { _done(completeTasks); cancelAll(futures); } } }); }); if (completeTasks.length === tasks.length) { _done(completeTasks); cancelAll(futures); } return futures; } }, { key: 'invokeAny', value: function invokeAny() { var _this8 = this; var _ref12 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, tasks = _ref12.tasks, _ref12$timeout = _ref12.timeout, timeout = _ref12$timeout === undefined ? 0 : _ref12$timeout, _ref12$unit = _ref12.unit, unit = _ref12$unit === undefined ? _time.MILLISECONDS : _ref12$unit, _ref12$done = _ref12.done, _done2 = _ref12$done === undefined ? null : _ref12$done; if (!tasks || !Array.isArray(tasks) || tasks.length < 1) { throw new RangeError("IllegalArgumentException"); } var completeTask = false; var futures = tasks.map(function (callable, index) { return _this8.submit({ callable: callable, timeout: timeout, unit: unit, done: function done() { var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; if (!completeTask) { var complete = index === tasks.length - 1; if (result instanceof Error) { if (complete) { completeTask = true; } } else { completeTask = true; } if (completeTask) { _done2(result); cancelAll(futures); } } } }); }); return futures; } }, { key: 'newTaskFor', value: function newTaskFor() { var _ref13 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref13$callable = _ref13.callable, callable = _ref13$callable === undefined ? null : _ref13$callable, _ref13$runnable = _ref13.runnable, runnable = _ref13$runnable === undefined ? null : _ref13$runnable, _ref13$result = _ref13.result, result = _ref13$result === undefined ? null : _ref13$result, _ref13$done = _ref13.done, done = _ref13$done === undefined ? null : _ref13$done; return FutureTask.create({ callable: callable, runnable: runnable, result: result, done: done }); } }, { key: 'submit', value: function submit() { var _ref14 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref14$timeout = _ref14.timeout, timeout = _ref14$timeout === undefined ? 0 : _ref14$timeout, _ref14$unit = _ref14.unit, unit = _ref14$unit === undefined ? _time.MILLISECONDS : _ref14$unit, _ref14$callable = _ref14.callable, callable = _ref14$callable === undefined ? null : _ref14$callable, _ref14$runnable = _ref14.runnable, runnable = _ref14$runnable === undefined ? null : _ref14$runnable, _ref14$result = _ref14.result, result = _ref14$result === undefined ? null : _ref14$result, _ref14$done = _ref14.done, done = _ref14$done === undefined ? null : _ref14$done; var future = runnable instanceof _future.Future ? runnable : this.newTaskFor({ callable: callable, runnable: runnable, result: result }); return this.execute(future, timeout, unit, done); } }]); return AbstractExecutorService; }(_executor.ExecutorService); var COUNT_BITS = 32 - 3; var CAPACITY = (1 << COUNT_BITS) - 1; var RUNNING = -1 << COUNT_BITS; var SHUTDOWN = 0 << COUNT_BITS; var STOP = 1 << COUNT_BITS; var TIDYING = 2 << COUNT_BITS; var TERMINATED = 3 << COUNT_BITS; var PoolExecutorService = exports.PoolExecutorService = function (_AbstractExecutorServ) { (0, _inherits3.default)(PoolExecutorService, _AbstractExecutorServ); function PoolExecutorService() { var _ref15 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref15$corePoolSize = _ref15.corePoolSize, corePoolSize = _ref15$corePoolSize === undefined ? 8 : _ref15$corePoolSize, _ref15$maximumPoolSiz = _ref15.maximumPoolSize, maximumPoolSize = _ref15$maximumPoolSiz === undefined ? 0 : _ref15$maximumPoolSiz, _ref15$allowCoreTimeO = _ref15.allowCoreTimeOut, allowCoreTimeOut = _ref15$allowCoreTimeO === undefined ? false : _ref15$allowCoreTimeO, _ref15$keepAliveTime = _ref15.keepAliveTime, keepAliveTime = _ref15$keepAliveTime === undefined ? 0 : _ref15$keepAliveTime, _ref15$unit = _ref15.unit, unit = _ref15$unit === undefined ? _time.MILLISECONDS : _ref15$unit, _ref15$afterExecute = _ref15.afterExecute, afterExecute = _ref15$afterExecute === undefined ? null : _ref15$afterExecute, _ref15$beforeExecute = _ref15.beforeExecute, beforeExecute = _ref15$beforeExecute === undefined ? null : _ref15$beforeExecute, _ref15$onShutdown = _ref15.onShutdown, onShutdown = _ref15$onShutdown === undefined ? null : _ref15$onShutdown, _ref15$reject = _ref15.reject, reject = _ref15$reject === undefined ? null : _ref15$reject, _ref15$terminated = _ref15.terminated, terminated = _ref15$terminated === undefined ? null : _ref15$terminated; (0, _classCallCheck3.default)(this, PoolExecutorService); var _this9 = (0, _possibleConstructorReturn3.default)(this, (PoolExecutorService.__proto__ || (0, _getPrototypeOf2.default)(PoolExecutorService)).call(this)); if (corePoolSize < 0 || keepAliveTime < 0) { throw new RangeError("IllegalArgumentException"); } _this9.mWorkers = []; _this9.mState = RUNNING; _this9.mCorePoolSize = corePoolSize; _this9.maximumPoolSize = maximumPoolSize; if (_this9.maximumPoolSize <= 0 || _this9.maximumPoolSize < _this9.corePoolSize) { throw new RangeError("IllegalArgumentException"); } _this9.mAllowCoreTimeOut = allowCoreTimeOut; _this9.mKeepAliveTime = unit.toMillis(keepAliveTime); _this9.mCompletedTaskCount = _this9.mLargestPoolSize = 0; _this9.mWorkQueue = new _queue.LinkedBlockingQueue({ capacity: corePoolSize }); if (afterExecute) { _this9.afterExecute = afterExecute; } if (beforeExecute) { _this9.beforeExecute = beforeExecute; } if (onShutdown) { _this9.onShutdown = onShutdown; } if (reject) { _this9.reject = reject; } if (terminated) { _this9.terminated = terminated; } return _this9; } (0, _createClass3.default)(PoolExecutorService, [{ key: 'add', value: function add(future) { var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; return this.push(future, false, 0, _time.MILLISECONDS, callback); } }, { key: 'addAll', value: function addAll() { var futures = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; var modified = false; var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = (0, _getIterator3.default)(futures), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var future = _step2.value; if (this.add(future, callback)) { modified = true; } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } return modified; } }, { key: 'afterExecute', value: function afterExecute(future) { var thrown = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; } }, { key: 'awaitTermination', value: function awaitTermination() { var _ref16 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref16$timeout = _ref16.timeout, timeout = _ref16$timeout === undefined ? 0 : _ref16$timeout, _ref16$unit = _ref16.unit, unit = _ref16$unit === undefined ? _time.MILLISECONDS : _ref16$unit; var nanos = unit.toNanos(timeout); if (this.mState >= TERMINATED) { return true; } if (nanos <= 0) { return false; } return true; } }, { key: 'beforeExecute', value: function beforeExecute(future) {} }, { key: 'clear', value: function clear() {} }, { key: 'contains', value: function contains(future) { return this.mWorkers.indexOf(future) !== -1 || this.mWorkQueue.contains(future) !== -1; } }, { key: 'drainQueue', value: function drainQueue() { var q = this.mWorkQueue; var taskList = []; q.drainTo(taskList); if (!q.isEmpty()) { var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = (0, _getIterator3.default)(taskList), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var r = _step3.value; q.remove(r); } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } } return taskList; } }, { key: 'element', value: function element() { return this.mWorkQueue.element(); } }, { key: 'ensurePrestart', value: function ensurePrestart() { var _ref17 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref17$timeout = _ref17.timeout, timeout = _ref17$timeout === undefined ? 0 : _ref17$timeout, _ref17$unit = _ref17.unit, unit = _ref17$unit === undefined ? _time.MILLISECONDS : _ref17$unit, _ref17$callback = _ref17.callback, callback = _ref17$callback === undefined ? null : _ref17$callback; return this.push(null, this.isCore(), timeout, unit, callback); } }, { key: 'execute', value: function execute(r) { if (!r) { throw new ReferenceError("NullPointerException"); } var size = this.isCore() ? this.corePoolSize : this.maximumPoolSize; if (this.isShutdown() || this.donePoolSize >= this.maximumPoolSize || !(r instanceof _future.Future || r.runnable)) { this.reject(r); } else { var timeout = (arguments.length <= 1 ? undefined : arguments[1]) || 0; var unit = (arguments.length <= 2 ? undefined : arguments[2]) || _time.MILLISECONDS; var done = arguments.length <= 3 ? undefined : arguments[3]; var callable = arguments.length <= 4 ? undefined : arguments[4]; if (r.runnable) { timeout = r.timeout || 0; unit = r.unit || _time.MILLISECONDS; done = r.done; r = r.runnable; } if (callable) { r.mCallable.compute = callable.compute; } r.get({ timeout: timeout, unit: unit, done: done }); return r; } return null; } }, { key: 'finalize', value: function finalize() { this.shutdown(); } }, { key: 'getKeepAliveTime', value: function getKeepAliveTime() { var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _time.MILLISECONDS; return unit.convert(this.keepAliveTime); } }, { key: 'interruptIdleFutures', value: function interruptIdleFutures() { var to = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var onlyOne = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var len = this.mWorkers.length; while (len-- && len !== to) { var w = this.mWorkers[len]; if (!w.isDone()) { if (!w.cancel()) { w.finalize(); } this.mWorkers.splice(len, 1); if (onlyOne) { break; } } } } }, { key: 'interruptFutures', value: function interruptFutures() { this.interruptIdleFutures(); } }, { key: 'isCore', value: function isCore() { return this.poolSize < this.corePoolSize; } }, { key: 'isCorePoolSize', value: function isCorePoolSize() { return this.poolSize === (this.isCore() ? this.corePoolSize : this.maximumPoolSize); } }, { key: 'isDonePoolSize', value: function isDonePoolSize() { return this.donePoolSize === (this.isCore() ? this.corePoolSize : this.maximumPoolSize); } }, { key: 'isRunning', value: function isRunning() { return this.mState === RUNNING; } }, { key: 'isRunningOrShutdown', value: function isRunningOrShutdown() { return this.isRunning() || this.isShutdown(); } }, { key: 'isShutdown', value: function isShutdown() { return this.mState >= SHUTDOWN; } }, { key: 'isStop', value: function isStop() { return this.mState >= STOP; } }, { key: 'isTerminated', value: function isTerminated() { return this.isShutdown() && this.isTerminating(); } }, { key: 'isTerminating', value: function isTerminating() { return this.mState >= TERMINATED; } }, { key: 'offer', value: function offer() { var _ref18 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref18$timeout = _ref18.timeout, timeout = _ref18$timeout === undefined ? 0 : _ref18$timeout, _ref18$unit = _ref18.unit, unit = _ref18$unit === undefined ? _time.MILLISECONDS : _ref18$unit, _ref18$callable = _ref18.callable, callable = _ref18$callable === undefined ? null : _ref18$callable, _ref18$runnable = _ref18.runnable, runnable = _ref18$runnable === undefined ? null : _ref18$runnable, _ref18$result = _ref18.result, result = _ref18$result === undefined ? null : _ref18$result, _ref18$callback = _ref18.callback, callback = _ref18$callback === undefined ? null : _ref18$callback; var task = null; if (callable || runnable) { task = this.newTaskFor({ callable: callable, runnable: runnable, result: result }); } if (!this.push(task, false, timeout, unit, callback)) {} return task; } }, { key: 'onShutdown', value: function onShutdown() {} }, { key: 'peek', value: function peek() { return this.mWorkQueue.peek(); } }, { key: 'poll', value: function poll() { var _this10 = this; var _ref19 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref19$timeout = _ref19.timeout, timeout = _ref19$timeout === undefined ? 0 : _ref19$timeout, _ref19$unit = _ref19.unit, unit = _ref19$unit === undefined ? _time.MILLISECONDS : _ref19$unit, _ref19$callable = _ref19.callable, callable = _ref19$callable === undefined ? null : _ref19$callable, _ref19$done = _ref19.done, done = _ref19$done === undefined ? null : _ref19$done; if (this.isShutdown() || this.isStop() || this.poolSize > this.maximumPoolSize) { return null; } return this.mWorkQueue.poll({ timeout: this.allowCoreTimeOut ? this.keepAliveTime : 0, callback: function callback() { var item = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; if (_this10.isStop() || item instanceof Error) { _this10.reject(item); } else { _this10.beforeExecute(item); _this10.execute(item, timeout, unit, function () { var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; var thrown = null; try { done(result); } catch (e) { thrown = e; } finally { _this10.afterExecute(item, thrown); _this10.releaseFuture(item, thrown !== null); } }, callable); } } }); } }, { key: 'prestart', value: function prestart() { var _ref20 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref20$timeout = _ref20.timeout, timeout = _ref20$timeout === undefined ? 0 : _ref20$timeout, _ref20$unit = _ref20.unit, unit = _ref20$unit === undefined ? _time.MILLISECONDS : _ref20$unit, _ref20$callable = _ref20.callable, callable = _ref20$callable === undefined ? null : _ref20$callable, _ref20$callback = _ref20.callback, callback = _ref20$callback === undefined ? null : _ref20$callback, _ref20$all = _ref20.all, all = _ref20$all === undefined ? true : _ref20$all; if (all) { var n = 0; while (this.push(null, this.isCore(), timeout, unit, callback, callable)) { ++n; } return n; } var core = this.isCore(); return core && this.push(null, core, timeout, unit, callback, callable); } }, { key: 'purge', value: function purge() { var q = this.mWorkQueue; var it = q.iterator(); while (it.hasNext()) { var r = it.next(); if (r instanceof _future.Future && r.isCancelled()) { it.remove(); } } } }, { key: 'push', value: function push() { var _this11 = this; var future = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; var core = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; if (this.isShutdown() || this.isStop()) { return false; } var timeout = this.allowCoreTimeOut ? arguments.length <= 2 ? undefined : arguments[2] : 0; var unit = (arguments.length <= 3 ? undefined : arguments[3]) || _time.MILLISECONDS; var _callback = arguments.length <= 4 ? undefined : arguments[4]; if (!future) { var callable = (arguments.length <= 5 ? undefined : arguments[5]) || { compute: function compute() { this.signal(); } }; //this.poolSize >= (core ? this.corePoolSize : this.maximumPoolSize) future = this.newTaskFor({ callable: callable }); } return this.mWorkQueue.offer(future, { timeout: timeout, unit: unit, callback: function callback() { var item = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; if (_this11.isStop() || item instanceof Error) { _this11.reject(future); } else { _this11.mWorkers.push(future); _this11.largestPoolSize = _this11.poolSize; if (_callback) { _callback(item); } } } }); } }, { key: 'reject', value: function reject(future) {} }, { key: 'put', value: function put(future) { var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; this.push(future, false, 0, _time.MILLISECONDS, callback); } }, { key: 'releaseFuture', value: function releaseFuture(future) { var completedAbruptly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var index = this.mWorkers.indexOf(future); if (index !== -1) { this.mWorkers.splice(index, 1); if (!completedAbruptly) { this.mCompletedTaskCount++; } future.finalize(); } } }, { key: 'remove', value: function remove(future) { var removed = this.mWorkQueue.remove(future); if (removed) { this.tryTerminate(); } return removed; } }, { key: 'setKeepAliveTime', value: function setKeepAliveTime() { var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _time.MILLISECONDS; if (time < 0) { throw new RangeError("IllegalArgumentException"); } if (time === 0 && this.allowCoreTimeOut) { throw new RangeError("IllegalArgumentException Core must have nonzero keep alive times"); } var keepAliveTime = unit.toMillis(time); var delta = keepAliveTime - this.keepAliveTime; this.mKeepAliveTime = keepAliveTime; if (delta < 0) { this.interruptIdleFutures(); } } }, { key: 'shutdown', value: function shutdown() { if (this.mState < SHUTDOWN) { this.mState = SHUTDOWN; this.interruptFutures(); this.onShutdown(); this.tryTerminate(); } }