UNPKG

@jawis/shared-buffer-store

Version:

Store for variable sized buffers to use in concurrent programs.

88 lines (87 loc) 3.45 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MetaData = exports.META_DATA_BYTES = exports.META_DATA_LENGTH = exports.LOCK_OFFSET = exports.BYTE_USAGE_OFFSET = exports.BUFFER_COUNT_OFFSET = void 0; const _shared_lock_1 = require("^shared-lock"); const _jab_1 = require("^jab"); exports.BUFFER_COUNT_OFFSET = 0; exports.BYTE_USAGE_OFFSET = exports.BUFFER_COUNT_OFFSET + 1; exports.LOCK_OFFSET = exports.BYTE_USAGE_OFFSET + 1; const lockLength = _shared_lock_1.SharedLockBytes / Uint32Array.BYTES_PER_ELEMENT; exports.META_DATA_LENGTH = exports.LOCK_OFFSET + lockLength; exports.META_DATA_BYTES = Uint32Array.BYTES_PER_ELEMENT * exports.META_DATA_LENGTH; /** * * todo * - CUR_USAGE_OFFSET is the amount of used bytes. Not directly the same as the free pointer. * Just have the free pointer directly */ class MetaData { /** * */ constructor(deps) { this.deps = deps; /** * */ this.getCount = () => this.metaDataBuffer[exports.BUFFER_COUNT_OFFSET]; /** * Move the free pointer, so there is made the amount of space available. * */ this.tryMoveFreePointer = (amount, key) => { this.lock.assertValidForWrite(key); const curUsage = this.metaDataBuffer[exports.BYTE_USAGE_OFFSET]; if (curUsage + amount > this.deps.byteSize) { throw new Error("overflow not impl."); } let old; if (this.deps.direction === "right") { old = curUsage; } else { old = this.deps.byteSize - curUsage; } this.metaDataBuffer[exports.BYTE_USAGE_OFFSET] += amount; return old; }; /** * Returns the index of the free pointer */ this.getFreePointer = (key) => { this.lock.assertValidForWrite(key); if (this.deps.direction === "right") { return this.metaDataBuffer[exports.BYTE_USAGE_OFFSET]; } else { return this.deps.byteSize - this.metaDataBuffer[exports.BYTE_USAGE_OFFSET]; } }; if (this.deps.direction === "right") { this.metaDataBuffer = (0, _jab_1.makeTypedArray)(this.deps.sharedArray, Uint32Array, 0, exports.META_DATA_LENGTH); // prettier-ignore } else { this.metaDataBuffer = (0, _jab_1.makeTypedArray)(this.deps.sharedArray, Uint32Array, this.deps.byteSize - exports.META_DATA_BYTES, exports.META_DATA_LENGTH); // prettier-ignore } this.lock = new _shared_lock_1.ReadWriteLock(Object.assign(Object.assign({}, deps), { type: "meta", sharedArray: (0, _jab_1.makeTypedArray)(this.metaDataBuffer, Int32Array, exports.LOCK_OFFSET * Uint32Array.BYTES_PER_ELEMENT, _shared_lock_1.LockSharedArrayLength) })); if (!deps.initialized) { this.metaDataBuffer[exports.BUFFER_COUNT_OFFSET] = 0; this.metaDataBuffer[exports.BYTE_USAGE_OFFSET] = exports.META_DATA_BYTES; } } /** * */ incCount(key) { this.lock.assertValidForWrite(key); this.metaDataBuffer[exports.BUFFER_COUNT_OFFSET]++; } /** * */ decCount(key) { this.lock.assertValidForWrite(key); this.metaDataBuffer[exports.BUFFER_COUNT_OFFSET]--; } } exports.MetaData = MetaData;