@divine/synchronization
Advanced tools
Comparing version 1.0.0 to 1.1.0
(function (global, factory) { | ||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : | ||
typeof define === 'function' && define.amd ? define('@divine/synchronization', ['exports'], factory) : | ||
(factory((global['@divine'] = global['@divine'] || {}, global['@divine'].synchronization = {}))); | ||
(global = global || self, factory((global['@divine'] = global['@divine'] || {}, global['@divine'].synchronization = {}))); | ||
}(this, (function (exports) { 'use strict'; | ||
function unwrapExports (x) { | ||
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x.default : x; | ||
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; | ||
} | ||
@@ -16,14 +16,14 @@ | ||
/*! ***************************************************************************** | ||
Copyright (c) Microsoft Corporation. All rights reserved. | ||
Licensed under the Apache License, Version 2.0 (the "License"); you may not use | ||
this file except in compliance with the License. You may obtain a copy of the | ||
License at http://www.apache.org/licenses/LICENSE-2.0 | ||
Copyright (c) Microsoft Corporation. | ||
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED | ||
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, | ||
MERCHANTABLITY OR NON-INFRINGEMENT. | ||
Permission to use, copy, modify, and/or distribute this software for any | ||
purpose with or without fee is hereby granted. | ||
See the Apache Version 2.0 License for specific language governing permissions | ||
and limitations under the License. | ||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | ||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | ||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
PERFORMANCE OF THIS SOFTWARE. | ||
***************************************************************************** */ | ||
@@ -61,4 +61,6 @@ /* global Reflect, Promise */ | ||
if (s != null && typeof Object.getOwnPropertySymbols === "function") | ||
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) | ||
t[p[i]] = s[p[i]]; | ||
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { | ||
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) | ||
t[p[i]] = s[p[i]]; | ||
} | ||
return t; | ||
@@ -83,6 +85,7 @@ } | ||
function __awaiter(thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
@@ -120,10 +123,18 @@ }); | ||
var __createBinding = Object.create ? (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||
}) : (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
o[k2] = m[k]; | ||
}); | ||
function __exportStar(m, exports) { | ||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p); | ||
} | ||
function __values(o) { | ||
var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0; | ||
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; | ||
if (m) return m.call(o); | ||
return { | ||
if (o && typeof o.length === "number") return { | ||
next: function () { | ||
@@ -134,2 +145,3 @@ if (o && i >= o.length) o = void 0; | ||
}; | ||
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); | ||
} | ||
@@ -160,2 +172,9 @@ | ||
function __spreadArrays() { | ||
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; | ||
for (var r = Array(s), k = 0, i = 0; i < il; i++) | ||
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) | ||
r[k] = a[j]; | ||
return r; | ||
} | ||
function __await(v) { | ||
@@ -195,7 +214,13 @@ return this instanceof __await ? (this.v = v, this) : new __await(v); | ||
} | ||
var __setModuleDefault = Object.create ? (function(o, v) { | ||
Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||
}) : function(o, v) { | ||
o["default"] = v; | ||
}; | ||
function __importStar(mod) { | ||
if (mod && mod.__esModule) return mod; | ||
var result = {}; | ||
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | ||
result.default = mod; | ||
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||
__setModuleDefault(result, mod); | ||
return result; | ||
@@ -208,3 +233,19 @@ } | ||
function __classPrivateFieldGet(receiver, privateMap) { | ||
if (!privateMap.has(receiver)) { | ||
throw new TypeError("attempted to get private field on non-instance"); | ||
} | ||
return privateMap.get(receiver); | ||
} | ||
function __classPrivateFieldSet(receiver, privateMap, value) { | ||
if (!privateMap.has(receiver)) { | ||
throw new TypeError("attempted to set private field on non-instance"); | ||
} | ||
privateMap.set(receiver, value); | ||
return value; | ||
} | ||
var tslib_es6 = /*#__PURE__*/Object.freeze({ | ||
__proto__: null, | ||
__extends: __extends, | ||
@@ -218,2 +259,3 @@ get __assign () { return __assign; }, | ||
__generator: __generator, | ||
__createBinding: __createBinding, | ||
__exportStar: __exportStar, | ||
@@ -223,2 +265,3 @@ __values: __values, | ||
__spread: __spread, | ||
__spreadArrays: __spreadArrays, | ||
__await: __await, | ||
@@ -230,3 +273,5 @@ __asyncGenerator: __asyncGenerator, | ||
__importStar: __importStar, | ||
__importDefault: __importDefault | ||
__importDefault: __importDefault, | ||
__classPrivateFieldGet: __classPrivateFieldGet, | ||
__classPrivateFieldSet: __classPrivateFieldSet | ||
}); | ||
@@ -478,3 +523,3 @@ | ||
} | ||
if (index < size / 2) { | ||
if (i < size / 2) { | ||
this._head = (this._head + index + count + len) & this._capacityMask; | ||
@@ -489,2 +534,3 @@ for (k = index; k > 0; k--) { | ||
} | ||
if (index < 0) this._tail = i; | ||
} else { | ||
@@ -673,2 +719,3 @@ this._tail = i; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.DRRQueue = void 0; | ||
@@ -695,3 +742,3 @@ var denque_1 = tslib_es6.__importDefault(denque); | ||
}, | ||
enumerable: true, | ||
enumerable: false, | ||
configurable: true | ||
@@ -755,2 +802,3 @@ }); | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.FairCondition = exports.Condition = exports.FairSignal = exports.Signal = exports.SignalBase = void 0; | ||
@@ -763,2 +811,9 @@ var denque_1 = tslib_es6.__importDefault(denque); | ||
} | ||
Object.defineProperty(SignalBase.prototype, "value", { | ||
get: function () { | ||
return this._value; | ||
}, | ||
enumerable: false, | ||
configurable: true | ||
}); | ||
SignalBase.prototype.notify = function (value) { | ||
@@ -768,2 +823,3 @@ if (value === undefined) { | ||
} | ||
this._value = value; | ||
for (var waiter = this._waiters.shift(); waiter; waiter = this._waiters.shift()) { | ||
@@ -871,10 +927,11 @@ if (!waiter.aborted) { | ||
unwrapExports(condition); | ||
var condition_1 = condition.SignalBase; | ||
var condition_2 = condition.Signal; | ||
var condition_1 = condition.FairCondition; | ||
var condition_2 = condition.Condition; | ||
var condition_3 = condition.FairSignal; | ||
var condition_4 = condition.Condition; | ||
var condition_5 = condition.FairCondition; | ||
var condition_4 = condition.Signal; | ||
var condition_5 = condition.SignalBase; | ||
var queue = createCommonjsModule(function (module, exports) { | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.FairQueue = exports.Queue = exports.BlockingQueue = void 0; | ||
@@ -895,3 +952,3 @@ var denque_1 = tslib_es6.__importDefault(denque); | ||
}, | ||
enumerable: true, | ||
enumerable: false, | ||
configurable: true | ||
@@ -1008,8 +1065,9 @@ }); | ||
unwrapExports(queue); | ||
var queue_1 = queue.BlockingQueue; | ||
var queue_1 = queue.FairQueue; | ||
var queue_2 = queue.Queue; | ||
var queue_3 = queue.FairQueue; | ||
var queue_3 = queue.BlockingQueue; | ||
var semaphore = createCommonjsModule(function (module, exports) { | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.FairMutex = exports.FairSemaphore = exports.Mutex = exports.Semaphore = void 0; | ||
@@ -1183,9 +1241,10 @@ | ||
unwrapExports(semaphore); | ||
var semaphore_1 = semaphore.Semaphore; | ||
var semaphore_2 = semaphore.Mutex; | ||
var semaphore_3 = semaphore.FairSemaphore; | ||
var semaphore_4 = semaphore.FairMutex; | ||
var semaphore_1 = semaphore.FairMutex; | ||
var semaphore_2 = semaphore.FairSemaphore; | ||
var semaphore_3 = semaphore.Mutex; | ||
var semaphore_4 = semaphore.Semaphore; | ||
var extras = createCommonjsModule(function (module, exports) { | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.ReadWriteLock = exports.Lightswitch = exports.Barrier = void 0; | ||
@@ -1349,61 +1408,154 @@ | ||
unwrapExports(extras); | ||
var extras_1 = extras.Barrier; | ||
var extras_1 = extras.ReadWriteLock; | ||
var extras_2 = extras.Lightswitch; | ||
var extras_3 = extras.ReadWriteLock; | ||
var extras_3 = extras.Barrier; | ||
var pubsub = createCommonjsModule(function (module, exports) { | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.FairPubSub = exports.PubSub = void 0; | ||
var PubSubBase = /** @class */ (function () { | ||
function PubSubBase() { | ||
this._topic = new Set(); | ||
} | ||
PubSubBase.prototype.publish = function (data) { | ||
var e_1, _a; | ||
var result = 0; | ||
try { | ||
for (var _b = tslib_es6.__values(this._topic), _c = _b.next(); !_c.done; _c = _b.next()) { | ||
var queue = _c.value; | ||
try { | ||
queue.push(data); | ||
++result; | ||
} | ||
catch (ex) { | ||
if (ex instanceof RangeError !== true) { | ||
throw ex; | ||
} | ||
} | ||
} | ||
} | ||
catch (e_1_1) { e_1 = { error: e_1_1 }; } | ||
finally { | ||
try { | ||
if (_c && !_c.done && (_a = _b.return)) _a.call(_b); | ||
} | ||
finally { if (e_1) throw e_1.error; } | ||
} | ||
return result; | ||
}; | ||
PubSubBase.prototype.publishOrWait = function (data, timeout) { | ||
return tslib_es6.__awaiter(this, void 0, void 0, function () { | ||
var result; | ||
return tslib_es6.__generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, Promise.all(tslib_es6.__spread(this._topic).map(function (queue) { return queue.pushOrWait(data, timeout); }))]; | ||
case 1: | ||
result = _a.sent(); | ||
return [2 /*return*/, result.filter(function (res) { return res !== undefined; }).length]; | ||
} | ||
}); | ||
}); | ||
}; | ||
PubSubBase.prototype.subscribe = function (timeout) { | ||
return tslib_es6.__asyncGenerator(this, arguments, function subscribe_1() { | ||
var queue; | ||
return tslib_es6.__generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
queue = this._createQueue(); | ||
_a.label = 1; | ||
case 1: | ||
_a.trys.push([1, , 7, 8]); | ||
this._topic.add(queue); | ||
_a.label = 2; | ||
case 2: | ||
return [4 /*yield*/, tslib_es6.__await(queue.shiftOrWait(timeout))]; | ||
case 3: return [4 /*yield*/, tslib_es6.__await.apply(void 0, [_a.sent()])]; | ||
case 4: return [4 /*yield*/, _a.sent()]; | ||
case 5: | ||
_a.sent(); | ||
return [3 /*break*/, 2]; | ||
case 6: return [3 /*break*/, 8]; | ||
case 7: | ||
this._topic.delete(queue); | ||
return [7 /*endfinally*/]; | ||
case 8: return [2 /*return*/]; | ||
} | ||
}); | ||
}); | ||
}; | ||
Object.defineProperty(PubSubBase.prototype, "subscribers", { | ||
get: function () { | ||
return this._topic.size; | ||
}, | ||
enumerable: false, | ||
configurable: true | ||
}); | ||
return PubSubBase; | ||
}()); | ||
var PubSub = /** @class */ (function (_super) { | ||
tslib_es6.__extends(PubSub, _super); | ||
function PubSub(_capacity) { | ||
var _this = _super.call(this) || this; | ||
_this._capacity = _capacity; | ||
return _this; | ||
} | ||
PubSub.prototype._createQueue = function () { | ||
return new queue.Queue(this._capacity); | ||
}; | ||
return PubSub; | ||
}(PubSubBase)); | ||
exports.PubSub = PubSub; | ||
var FairPubSub = /** @class */ (function (_super) { | ||
tslib_es6.__extends(FairPubSub, _super); | ||
function FairPubSub(_capacity) { | ||
var _this = _super.call(this) || this; | ||
_this._capacity = _capacity; | ||
return _this; | ||
} | ||
FairPubSub.prototype._createQueue = function () { | ||
return new queue.FairQueue(this._capacity); | ||
}; | ||
return FairPubSub; | ||
}(PubSubBase)); | ||
exports.FairPubSub = FairPubSub; | ||
}); | ||
unwrapExports(pubsub); | ||
var pubsub_1 = pubsub.FairPubSub; | ||
var pubsub_2 = pubsub.PubSub; | ||
var src = createCommonjsModule(function (module, exports) { | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.DRRQueue = drrQueue.DRRQueue; | ||
Object.defineProperty(exports, "DRRQueue", { enumerable: true, get: function () { return drrQueue.DRRQueue; } }); | ||
exports.Signal = condition.Signal; | ||
exports.FairSignal = condition.FairSignal; | ||
exports.Condition = condition.Condition; | ||
exports.FairCondition = condition.FairCondition; | ||
Object.defineProperty(exports, "Signal", { enumerable: true, get: function () { return condition.Signal; } }); | ||
Object.defineProperty(exports, "FairSignal", { enumerable: true, get: function () { return condition.FairSignal; } }); | ||
Object.defineProperty(exports, "Condition", { enumerable: true, get: function () { return condition.Condition; } }); | ||
Object.defineProperty(exports, "FairCondition", { enumerable: true, get: function () { return condition.FairCondition; } }); | ||
exports.Queue = queue.Queue; | ||
exports.FairQueue = queue.FairQueue; | ||
Object.defineProperty(exports, "Queue", { enumerable: true, get: function () { return queue.Queue; } }); | ||
Object.defineProperty(exports, "FairQueue", { enumerable: true, get: function () { return queue.FairQueue; } }); | ||
exports.Semaphore = semaphore.Semaphore; | ||
exports.FairSemaphore = semaphore.FairSemaphore; | ||
exports.Mutex = semaphore.Mutex; | ||
exports.FairMutex = semaphore.FairMutex; | ||
Object.defineProperty(exports, "Semaphore", { enumerable: true, get: function () { return semaphore.Semaphore; } }); | ||
Object.defineProperty(exports, "FairSemaphore", { enumerable: true, get: function () { return semaphore.FairSemaphore; } }); | ||
Object.defineProperty(exports, "Mutex", { enumerable: true, get: function () { return semaphore.Mutex; } }); | ||
Object.defineProperty(exports, "FairMutex", { enumerable: true, get: function () { return semaphore.FairMutex; } }); | ||
exports.Barrier = extras.Barrier; | ||
exports.Lightswitch = extras.Lightswitch; | ||
exports.ReadWriteLock = extras.ReadWriteLock; | ||
Object.defineProperty(exports, "Barrier", { enumerable: true, get: function () { return extras.Barrier; } }); | ||
Object.defineProperty(exports, "Lightswitch", { enumerable: true, get: function () { return extras.Lightswitch; } }); | ||
Object.defineProperty(exports, "ReadWriteLock", { enumerable: true, get: function () { return extras.ReadWriteLock; } }); | ||
Object.defineProperty(exports, "PubSub", { enumerable: true, get: function () { return pubsub.PubSub; } }); | ||
Object.defineProperty(exports, "FairPubSub", { enumerable: true, get: function () { return pubsub.FairPubSub; } }); | ||
}); | ||
var index = unwrapExports(src); | ||
var src_1 = src.DRRQueue; | ||
var src_2 = src.Signal; | ||
var src_3 = src.FairSignal; | ||
var src_4 = src.Condition; | ||
var src_5 = src.FairCondition; | ||
var src_6 = src.Queue; | ||
var src_7 = src.FairQueue; | ||
var src_8 = src.Semaphore; | ||
var src_9 = src.FairSemaphore; | ||
var src_10 = src.Mutex; | ||
var src_11 = src.FairMutex; | ||
var src_12 = src.Barrier; | ||
var src_13 = src.Lightswitch; | ||
var src_14 = src.ReadWriteLock; | ||
exports.default = index; | ||
exports.DRRQueue = src_1; | ||
exports.Signal = src_2; | ||
exports.FairSignal = src_3; | ||
exports.Condition = src_4; | ||
exports.FairCondition = src_5; | ||
exports.Queue = src_6; | ||
exports.FairQueue = src_7; | ||
exports.Semaphore = src_8; | ||
exports.FairSemaphore = src_9; | ||
exports.Mutex = src_10; | ||
exports.FairMutex = src_11; | ||
exports.Barrier = src_12; | ||
exports.Lightswitch = src_13; | ||
exports.ReadWriteLock = src_14; | ||
@@ -1410,0 +1562,0 @@ Object.defineProperty(exports, '__esModule', { value: true }); |
@@ -13,3 +13,5 @@ import { DRRData } from './drr-queue'; | ||
private _waiters; | ||
private _value; | ||
constructor(_waiters: BackingQueue<Waiter<T>, W>); | ||
get value(): T | undefined; | ||
notify(value: T): boolean; | ||
@@ -16,0 +18,0 @@ notifyAll(value: T): boolean; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.FairCondition = exports.Condition = exports.FairSignal = exports.Signal = exports.SignalBase = void 0; | ||
var tslib_1 = require("tslib"); | ||
@@ -10,2 +11,9 @@ var denque_1 = tslib_1.__importDefault(require("denque")); | ||
} | ||
Object.defineProperty(SignalBase.prototype, "value", { | ||
get: function () { | ||
return this._value; | ||
}, | ||
enumerable: false, | ||
configurable: true | ||
}); | ||
SignalBase.prototype.notify = function (value) { | ||
@@ -15,2 +23,3 @@ if (value === undefined) { | ||
} | ||
this._value = value; | ||
for (var waiter = this._waiters.shift(); waiter; waiter = this._waiters.shift()) { | ||
@@ -17,0 +26,0 @@ if (!waiter.aborted) { |
@@ -13,3 +13,3 @@ export interface DRRData<T> { | ||
constructor(quantumSize?: number); | ||
readonly length: number; | ||
get length(): number; | ||
push(_data: DRRData<T>): number; | ||
@@ -16,0 +16,0 @@ shift(): T | undefined; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.DRRQueue = void 0; | ||
var tslib_1 = require("tslib"); | ||
@@ -24,3 +25,3 @@ var denque_1 = tslib_1.__importDefault(require("denque")); | ||
}, | ||
enumerable: true, | ||
enumerable: false, | ||
configurable: true | ||
@@ -27,0 +28,0 @@ }); |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.ReadWriteLock = exports.Lightswitch = exports.Barrier = void 0; | ||
var tslib_1 = require("tslib"); | ||
@@ -4,0 +5,0 @@ var semaphore_1 = require("./semaphore"); |
@@ -6,1 +6,2 @@ export { DRRData, DRRQueue } from './drr-queue'; | ||
export { Barrier, Lightswitch, ReadWriteLock } from './extras'; | ||
export { PubSub, FairPubSub } from './pubsub'; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
var drr_queue_1 = require("./drr-queue"); | ||
exports.DRRQueue = drr_queue_1.DRRQueue; | ||
Object.defineProperty(exports, "DRRQueue", { enumerable: true, get: function () { return drr_queue_1.DRRQueue; } }); | ||
var condition_1 = require("./condition"); | ||
exports.Signal = condition_1.Signal; | ||
exports.FairSignal = condition_1.FairSignal; | ||
exports.Condition = condition_1.Condition; | ||
exports.FairCondition = condition_1.FairCondition; | ||
Object.defineProperty(exports, "Signal", { enumerable: true, get: function () { return condition_1.Signal; } }); | ||
Object.defineProperty(exports, "FairSignal", { enumerable: true, get: function () { return condition_1.FairSignal; } }); | ||
Object.defineProperty(exports, "Condition", { enumerable: true, get: function () { return condition_1.Condition; } }); | ||
Object.defineProperty(exports, "FairCondition", { enumerable: true, get: function () { return condition_1.FairCondition; } }); | ||
var queue_1 = require("./queue"); | ||
exports.Queue = queue_1.Queue; | ||
exports.FairQueue = queue_1.FairQueue; | ||
Object.defineProperty(exports, "Queue", { enumerable: true, get: function () { return queue_1.Queue; } }); | ||
Object.defineProperty(exports, "FairQueue", { enumerable: true, get: function () { return queue_1.FairQueue; } }); | ||
var semaphore_1 = require("./semaphore"); | ||
exports.Semaphore = semaphore_1.Semaphore; | ||
exports.FairSemaphore = semaphore_1.FairSemaphore; | ||
exports.Mutex = semaphore_1.Mutex; | ||
exports.FairMutex = semaphore_1.FairMutex; | ||
Object.defineProperty(exports, "Semaphore", { enumerable: true, get: function () { return semaphore_1.Semaphore; } }); | ||
Object.defineProperty(exports, "FairSemaphore", { enumerable: true, get: function () { return semaphore_1.FairSemaphore; } }); | ||
Object.defineProperty(exports, "Mutex", { enumerable: true, get: function () { return semaphore_1.Mutex; } }); | ||
Object.defineProperty(exports, "FairMutex", { enumerable: true, get: function () { return semaphore_1.FairMutex; } }); | ||
var extras_1 = require("./extras"); | ||
exports.Barrier = extras_1.Barrier; | ||
exports.Lightswitch = extras_1.Lightswitch; | ||
exports.ReadWriteLock = extras_1.ReadWriteLock; | ||
Object.defineProperty(exports, "Barrier", { enumerable: true, get: function () { return extras_1.Barrier; } }); | ||
Object.defineProperty(exports, "Lightswitch", { enumerable: true, get: function () { return extras_1.Lightswitch; } }); | ||
Object.defineProperty(exports, "ReadWriteLock", { enumerable: true, get: function () { return extras_1.ReadWriteLock; } }); | ||
var pubsub_1 = require("./pubsub"); | ||
Object.defineProperty(exports, "PubSub", { enumerable: true, get: function () { return pubsub_1.PubSub; } }); | ||
Object.defineProperty(exports, "FairPubSub", { enumerable: true, get: function () { return pubsub_1.FairPubSub; } }); | ||
//# sourceMappingURL=index.js.map |
@@ -11,3 +11,3 @@ import { DRRData } from './drr-queue'; | ||
protected abstract _notifyWriter(): void; | ||
readonly length: number; | ||
get length(): number; | ||
isEmpty(): boolean; | ||
@@ -25,4 +25,4 @@ isFull(): boolean; | ||
constructor(capacity?: number); | ||
_waitForWrite(_data: T, timeout?: number): Promise<boolean>; | ||
_notifyWriter(): void; | ||
protected _waitForWrite(_data: T, timeout?: number): Promise<boolean>; | ||
protected _notifyWriter(): void; | ||
} | ||
@@ -32,4 +32,4 @@ export declare class FairQueue<T> extends BlockingQueue<T, DRRData<T>> { | ||
constructor(capacity?: number); | ||
_waitForWrite(data: DRRData<T>, timeout?: number): Promise<boolean>; | ||
_notifyWriter(): void; | ||
protected _waitForWrite(data: DRRData<T>, timeout?: number): Promise<boolean>; | ||
protected _notifyWriter(): void; | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.FairQueue = exports.Queue = exports.BlockingQueue = void 0; | ||
var tslib_1 = require("tslib"); | ||
@@ -18,3 +19,3 @@ var denque_1 = tslib_1.__importDefault(require("denque")); | ||
}, | ||
enumerable: true, | ||
enumerable: false, | ||
configurable: true | ||
@@ -21,0 +22,0 @@ }); |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.FairMutex = exports.FairSemaphore = exports.Mutex = exports.Semaphore = void 0; | ||
var tslib_1 = require("tslib"); | ||
@@ -4,0 +5,0 @@ var condition_1 = require("./condition"); |
{ | ||
"name": "@divine/synchronization", | ||
"version": "1.0.0", | ||
"version": "1.1.0", | ||
"description": "The Divine Synchronization Library", | ||
@@ -12,7 +12,20 @@ "main": "lib/src/index.js", | ||
"keywords": [ | ||
"synchronization", "lock", | ||
"signal", "condition", "condition variable", | ||
"queue", "blocking queue", "fair queue", "ddr-queue", "deficit round-robin", | ||
"semaphore", "fair semaphore", "mutex", "fair mutex", | ||
"barrier", "cyclic barrier", "lightswitch", "read-write lock" | ||
"synchronization", | ||
"lock", | ||
"signal", | ||
"condition", | ||
"condition variable", | ||
"queue", | ||
"blocking queue", | ||
"fair queue", | ||
"ddr-queue", | ||
"deficit round-robin", | ||
"semaphore", | ||
"fair semaphore", | ||
"mutex", | ||
"fair mutex", | ||
"barrier", | ||
"cyclic barrier", | ||
"lightswitch", | ||
"read-write lock" | ||
], | ||
@@ -29,14 +42,14 @@ "scripts": { | ||
"denque": "^1.4.0", | ||
"tslib": "^1.9.3" | ||
"tslib": "^2.0.0" | ||
}, | ||
"devDependencies": { | ||
"alsatian": "alpha", | ||
"alsatian": "3.2.1", | ||
"coveralls": "^3.0.2", | ||
"nyc": "^13.1.0", | ||
"rollup": "^0.67.3", | ||
"rollup-plugin-commonjs": "^9.2.0", | ||
"rollup-plugin-node-resolve": "^3.4.0", | ||
"rollup-plugin-sourcemaps": "^0.4.2", | ||
"typescript": "^3.1.6" | ||
"nyc": "15.1.0", | ||
"rollup": "^2.16.1", | ||
"rollup-plugin-commonjs": "^10.1.0", | ||
"rollup-plugin-node-resolve": "^5.2.0", | ||
"rollup-plugin-sourcemaps": "^0.6.2", | ||
"typescript": "^3.9.5" | ||
} | ||
} |
# The Divine Synchronization Library | ||
[](https://badge.fury.io/js/%40divine%2Fsynchronization) | ||
[](https://travis-ci.org/LeviticusMB/divine-synchronization) | ||
@@ -48,2 +49,10 @@ [](https://coveralls.io/github/LeviticusMB/divine-synchronization?branch=master) | ||
***NOTE***: *Don't mistake this for a* Pub/Sub *primitive!* While possible, it's very difficult to use these two | ||
primitives as event emitters without losing messages. See below instead. | ||
### `PubSub` and `FairPubSub` | ||
A *Pub/Sub* primitive, with configurable capacity, blocking publishing and generator-based subscription, suitable to be | ||
used in a `for await`-loop. | ||
### `Semaphore` and `FairSemaphore` | ||
@@ -50,0 +59,0 @@ |
@@ -17,4 +17,10 @@ import Deque from 'denque'; | ||
export class SignalBase<T, W> { | ||
private _value: T | undefined; | ||
constructor(private _waiters: BackingQueue<Waiter<T>, W>) {} | ||
get value(): T | undefined { | ||
return this._value; | ||
} | ||
notify(value: T): boolean { | ||
@@ -25,2 +31,4 @@ if (value === undefined) { | ||
this._value = value; | ||
for (let waiter = this._waiters.shift(); waiter; waiter = this._waiters.shift()) { | ||
@@ -27,0 +35,0 @@ if (!waiter.aborted) { |
@@ -7,1 +7,2 @@ export { DRRData, DRRQueue } from './drr-queue'; | ||
export { Barrier, Lightswitch, ReadWriteLock } from './extras'; | ||
export { PubSub, FairPubSub } from './pubsub'; |
@@ -87,7 +87,7 @@ import Deque from 'denque'; | ||
_waitForWrite(_data: T, timeout?: number) { | ||
protected _waitForWrite(_data: T, timeout?: number) { | ||
return this._writeCondition.wait(timeout); | ||
} | ||
_notifyWriter() { | ||
protected _notifyWriter() { | ||
this._writeCondition.notify(); | ||
@@ -104,9 +104,9 @@ } | ||
_waitForWrite(data: DRRData<T>, timeout?: number) { | ||
protected _waitForWrite(data: DRRData<T>, timeout?: number) { | ||
return this._writeCondition.wait(data.id, timeout); | ||
} | ||
_notifyWriter() { | ||
protected _notifyWriter() { | ||
this._writeCondition.notify(); | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Mixed license
License(Experimental) Package contains multiple licenses.
Found 1 instance in 1 package
215057
32
0
2932
69
+ Addedtslib@2.8.1(transitive)
- Removedtslib@1.14.1(transitive)
Updatedtslib@^2.0.0