@jawis/shared-buffer-store
Version:
Store for variable sized buffers to use in concurrent programs.
88 lines (87 loc) • 3.45 kB
JavaScript
"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;