@daneren2005/shared-memory-objects 0.0.9 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/memory-buffer.ts +2 -2
- package/src/memory-heap.ts +25 -10
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@daneren2005/shared-memory-objects",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.10",
|
|
4
4
|
"author": "daneren2005@gmail.com",
|
|
5
5
|
"description": "Creating objects with a SharedArrayBuffer",
|
|
6
6
|
"homepage": "https://github.com/daneren2005/shared-memory-objects#readme",
|
package/src/memory-buffer.ts
CHANGED
|
@@ -338,7 +338,7 @@ export default class MemoryBuffer {
|
|
|
338
338
|
this.state[STATE_ALIGN] = x;
|
|
339
339
|
}
|
|
340
340
|
|
|
341
|
-
|
|
341
|
+
get end() {
|
|
342
342
|
return this.state[STATE_END];
|
|
343
343
|
}
|
|
344
344
|
|
|
@@ -346,7 +346,7 @@ export default class MemoryBuffer {
|
|
|
346
346
|
this.state[STATE_END] = x;
|
|
347
347
|
}
|
|
348
348
|
|
|
349
|
-
|
|
349
|
+
get top() {
|
|
350
350
|
return Atomics.load(this.state, STATE_TOP);
|
|
351
351
|
}
|
|
352
352
|
|
package/src/memory-heap.ts
CHANGED
|
@@ -6,6 +6,7 @@ import MemoryBuffer from './memory-buffer';
|
|
|
6
6
|
const DEFAULT_BUFFER_SIZE = 8_192;
|
|
7
7
|
const BUFFER_SIZE_INDEX = 0;
|
|
8
8
|
const BUFFER_COUNT_INDEX = 1;
|
|
9
|
+
const BUFFER_AUTO_GROW_INDEX = 2;
|
|
9
10
|
export default class MemoryHeap {
|
|
10
11
|
buffers: Array<MemoryBuffer>;
|
|
11
12
|
private onGrowBufferHandlers: Array<OnGrowBuffer> = [];
|
|
@@ -45,7 +46,7 @@ export default class MemoryHeap {
|
|
|
45
46
|
this.buffers = [
|
|
46
47
|
startBuffer
|
|
47
48
|
];
|
|
48
|
-
const data = startBuffer.callocAs('u32',
|
|
49
|
+
const data = startBuffer.callocAs('u32', 3);
|
|
49
50
|
if(data) {
|
|
50
51
|
this.memory = new AllocatedMemory(this, {
|
|
51
52
|
bufferPosition: 0,
|
|
@@ -56,6 +57,7 @@ export default class MemoryHeap {
|
|
|
56
57
|
}
|
|
57
58
|
this.memory.data[BUFFER_SIZE_INDEX] = bufferSize;
|
|
58
59
|
this.memory.data[BUFFER_COUNT_INDEX] = 1;
|
|
60
|
+
this.memory.data[BUFFER_AUTO_GROW_INDEX] = config?.autoGrowSize ?? 100;
|
|
59
61
|
this.isClone = false;
|
|
60
62
|
|
|
61
63
|
for(let i = 1; i < (config?.initialBuffers ?? 1); i++) {
|
|
@@ -71,6 +73,18 @@ export default class MemoryHeap {
|
|
|
71
73
|
});
|
|
72
74
|
}
|
|
73
75
|
|
|
76
|
+
private growBuffer() {
|
|
77
|
+
const buffer = this.createBuffer();
|
|
78
|
+
let nextBufferPosition = Atomics.add(this.memory.data, BUFFER_COUNT_INDEX, 1);
|
|
79
|
+
// Setting index set by internal Atomic count so we can create new buffers from multiple threads and keep position consistent
|
|
80
|
+
this.buffers[nextBufferPosition] = buffer;
|
|
81
|
+
this.onGrowBufferHandlers.forEach(handler => handler({
|
|
82
|
+
bufferPosition: nextBufferPosition,
|
|
83
|
+
buffer: buffer.buf as SharedArrayBuffer
|
|
84
|
+
}));
|
|
85
|
+
|
|
86
|
+
return buffer;
|
|
87
|
+
}
|
|
74
88
|
private createBuffer(bufferSize?: number): MemoryBuffer {
|
|
75
89
|
const usedBufferSize = bufferSize ?? this.bufferSize;
|
|
76
90
|
let buf: ArrayBuffer | SharedArrayBuffer;
|
|
@@ -107,6 +121,14 @@ export default class MemoryHeap {
|
|
|
107
121
|
// Should be fine to initialize all values as 0s since unsigned/signed ints and floats all store 0 as all 0s
|
|
108
122
|
const data = buffer.callocAs('u32', count);
|
|
109
123
|
if(data) {
|
|
124
|
+
// Auto grow when nearly full when we need buffer to already be sync'd between threads BEFORE we try to use it
|
|
125
|
+
if(i === (this.buffers.length - 1) && Atomics.load(this.memory.data, BUFFER_COUNT_INDEX) === this.buffers.length && this.memory.data[BUFFER_AUTO_GROW_INDEX] < 100 && this.memory.data[BUFFER_AUTO_GROW_INDEX] > 0) {
|
|
126
|
+
const percentFull = buffer.top / buffer.end;
|
|
127
|
+
if(percentFull > (this.memory.data[BUFFER_AUTO_GROW_INDEX] / 100)) {
|
|
128
|
+
this.growBuffer();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
110
132
|
return new AllocatedMemory(this, {
|
|
111
133
|
data,
|
|
112
134
|
buffer
|
|
@@ -119,15 +141,7 @@ export default class MemoryHeap {
|
|
|
119
141
|
}
|
|
120
142
|
|
|
121
143
|
// If we get here we need to grow another buffer to continue allocating new memory
|
|
122
|
-
|
|
123
|
-
let nextBufferPosition = Atomics.add(this.memory.data, BUFFER_COUNT_INDEX, 1);
|
|
124
|
-
// Setting index set by internal Atomic count so we can create new buffers from multiple threads and keep position consistent
|
|
125
|
-
this.buffers[nextBufferPosition] = buffer;
|
|
126
|
-
this.onGrowBufferHandlers.forEach(handler => handler({
|
|
127
|
-
bufferPosition: nextBufferPosition,
|
|
128
|
-
buffer: buffer.buf as SharedArrayBuffer
|
|
129
|
-
}));
|
|
130
|
-
|
|
144
|
+
let buffer = this.growBuffer();
|
|
131
145
|
const data = buffer.callocAs('u32', count);
|
|
132
146
|
if(data) {
|
|
133
147
|
return new AllocatedMemory(this, {
|
|
@@ -183,6 +197,7 @@ interface GrowBufferData {
|
|
|
183
197
|
interface MemoryHeapConfig {
|
|
184
198
|
bufferSize?: number
|
|
185
199
|
initialBuffers?: number
|
|
200
|
+
autoGrowSize?: number
|
|
186
201
|
}
|
|
187
202
|
interface MemoryHeapMemory {
|
|
188
203
|
buffers: Array<SharedArrayBuffer>
|