hjs-future
Version:
Future classes of Hubrijs framework
1,251 lines (1,133 loc) • 55.8 kB
JavaScript
'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();
}
}