@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@daneren2005/shared-memory-objects",
3
- "version": "0.0.9",
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",
@@ -338,7 +338,7 @@ export default class MemoryBuffer {
338
338
  this.state[STATE_ALIGN] = x;
339
339
  }
340
340
 
341
- protected get end() {
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
- protected get top() {
349
+ get top() {
350
350
  return Atomics.load(this.state, STATE_TOP);
351
351
  }
352
352
 
@@ -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', 2);
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
- const buffer = this.createBuffer();
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>