knitting 0.1.46
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/LICENSE +202 -0
- package/README.md +632 -0
- package/knitting.d.ts +4 -0
- package/knitting.js +5 -0
- package/map.md +264 -0
- package/package.json +77 -0
- package/prebuilds/darwin-arm64-node-127/knitting_shared_memory.node +0 -0
- package/prebuilds/darwin-arm64-node-127/knitting_shm.node +0 -0
- package/prebuilds/darwin-arm64-node-137/knitting_shared_memory.node +0 -0
- package/prebuilds/darwin-arm64-node-137/knitting_shm.node +0 -0
- package/prebuilds/darwin-x64-node-127/knitting_shared_memory.node +0 -0
- package/prebuilds/darwin-x64-node-127/knitting_shm.node +0 -0
- package/prebuilds/darwin-x64-node-137/knitting_shared_memory.node +0 -0
- package/prebuilds/darwin-x64-node-137/knitting_shm.node +0 -0
- package/prebuilds/linux-x64-node-127/knitting_shared_memory.node +0 -0
- package/prebuilds/linux-x64-node-127/knitting_shm.node +0 -0
- package/prebuilds/linux-x64-node-137/knitting_shared_memory.node +0 -0
- package/prebuilds/linux-x64-node-137/knitting_shm.node +0 -0
- package/process-shared-buffer.d.ts +1 -0
- package/process-shared-buffer.js +1 -0
- package/scripts/build-native-addons.ts +295 -0
- package/src/api.d.ts +55 -0
- package/src/api.js +384 -0
- package/src/common/envelope.d.ts +11 -0
- package/src/common/envelope.js +8 -0
- package/src/common/module-url.d.ts +1 -0
- package/src/common/module-url.js +24 -0
- package/src/common/node-compat.d.ts +20 -0
- package/src/common/node-compat.js +24 -0
- package/src/common/path-canonical.d.ts +6 -0
- package/src/common/path-canonical.js +41 -0
- package/src/common/runtime.d.ts +15 -0
- package/src/common/runtime.js +91 -0
- package/src/common/shared-buffer-region.d.ts +11 -0
- package/src/common/shared-buffer-region.js +21 -0
- package/src/common/shared-buffer-text.d.ts +16 -0
- package/src/common/shared-buffer-text.js +65 -0
- package/src/common/task-source.d.ts +2 -0
- package/src/common/task-source.js +79 -0
- package/src/common/task-symbol.d.ts +1 -0
- package/src/common/task-symbol.js +1 -0
- package/src/common/with-resolvers.d.ts +9 -0
- package/src/common/with-resolvers.js +23 -0
- package/src/common/worker-runtime.d.ts +40 -0
- package/src/common/worker-runtime.js +52 -0
- package/src/connections/bun.d.ts +20 -0
- package/src/connections/bun.js +159 -0
- package/src/connections/deno.d.ts +20 -0
- package/src/connections/deno.js +150 -0
- package/src/connections/file-descriptor.d.ts +37 -0
- package/src/connections/file-descriptor.js +139 -0
- package/src/connections/index.d.ts +3 -0
- package/src/connections/index.js +3 -0
- package/src/connections/node-addons.d.ts +5 -0
- package/src/connections/node-addons.js +43 -0
- package/src/connections/node.d.ts +29 -0
- package/src/connections/node.js +59 -0
- package/src/connections/posix.d.ts +31 -0
- package/src/connections/posix.js +71 -0
- package/src/connections/process-shared-buffer.d.ts +67 -0
- package/src/connections/process-shared-buffer.js +267 -0
- package/src/connections/types.d.ts +48 -0
- package/src/connections/types.js +37 -0
- package/src/error.d.ts +13 -0
- package/src/error.js +49 -0
- package/src/ipc/tools/ring-queue.d.ts +33 -0
- package/src/ipc/tools/ring-queue.js +159 -0
- package/src/ipc/transport/shared-memory.d.ts +25 -0
- package/src/ipc/transport/shared-memory.js +35 -0
- package/src/knitting_shared_memory.cc +436 -0
- package/src/knitting_shm.cc +476 -0
- package/src/memory/byte-carpet.d.ts +73 -0
- package/src/memory/byte-carpet.js +157 -0
- package/src/memory/lock.d.ts +190 -0
- package/src/memory/lock.js +856 -0
- package/src/memory/payload-config.d.ts +22 -0
- package/src/memory/payload-config.js +67 -0
- package/src/memory/payloadCodec.d.ts +46 -0
- package/src/memory/payloadCodec.js +1157 -0
- package/src/memory/regionRegistry.d.ts +17 -0
- package/src/memory/regionRegistry.js +285 -0
- package/src/memory/shared-buffer-io.d.ts +53 -0
- package/src/memory/shared-buffer-io.js +380 -0
- package/src/permission/index.d.ts +2 -0
- package/src/permission/index.js +2 -0
- package/src/permission/protocol.d.ts +166 -0
- package/src/permission/protocol.js +640 -0
- package/src/runtime/balancer.d.ts +19 -0
- package/src/runtime/balancer.js +149 -0
- package/src/runtime/dispatcher.d.ts +34 -0
- package/src/runtime/dispatcher.js +142 -0
- package/src/runtime/inline-executor.d.ts +10 -0
- package/src/runtime/inline-executor.js +270 -0
- package/src/runtime/pool.d.ts +43 -0
- package/src/runtime/pool.js +922 -0
- package/src/runtime/tx-queue.d.ts +25 -0
- package/src/runtime/tx-queue.js +144 -0
- package/src/shared/abortSignal.d.ts +23 -0
- package/src/shared/abortSignal.js +126 -0
- package/src/types.d.ts +283 -0
- package/src/types.js +2 -0
- package/src/worker/composable-runners.d.ts +12 -0
- package/src/worker/composable-runners.js +105 -0
- package/src/worker/loop.d.ts +2 -0
- package/src/worker/loop.js +453 -0
- package/src/worker/rx-queue.d.ts +22 -0
- package/src/worker/rx-queue.js +124 -0
- package/src/worker/safety/index.d.ts +4 -0
- package/src/worker/safety/index.js +4 -0
- package/src/worker/safety/performance.d.ts +1 -0
- package/src/worker/safety/performance.js +17 -0
- package/src/worker/safety/process.d.ts +2 -0
- package/src/worker/safety/process.js +79 -0
- package/src/worker/safety/startup.d.ts +16 -0
- package/src/worker/safety/startup.js +30 -0
- package/src/worker/safety/worker-data.d.ts +2 -0
- package/src/worker/safety/worker-data.js +36 -0
- package/src/worker/task-loader.d.ts +26 -0
- package/src/worker/task-loader.js +66 -0
- package/src/worker/timers.d.ts +18 -0
- package/src/worker/timers.js +97 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Task } from "./lock.js";
|
|
2
|
+
import { type SharedBufferSource } from "../common/shared-buffer-region.js";
|
|
3
|
+
export type RegisterMalloc = ReturnType<typeof register>;
|
|
4
|
+
export type RegionRegistryPublishMode = "plain" | "atomic";
|
|
5
|
+
export declare const register: ({ lockSector, publishMode, }: {
|
|
6
|
+
lockSector?: SharedBufferSource;
|
|
7
|
+
publishMode?: RegionRegistryPublishMode;
|
|
8
|
+
}) => {
|
|
9
|
+
allocTask: (task: Task) => number;
|
|
10
|
+
setSlotLength: (slotIndex: number, payloadLen: number) => boolean;
|
|
11
|
+
lockSAB: import("../common/shared-buffer-region.js").SharedBuffer;
|
|
12
|
+
free: (index: number) => void;
|
|
13
|
+
hostBits: Int32Array<import("../common/shared-buffer-region.js").SharedBuffer>;
|
|
14
|
+
workerBits: Int32Array<import("../common/shared-buffer-region.js").SharedBuffer>;
|
|
15
|
+
updateTable: () => void;
|
|
16
|
+
startAndIndexToArray: (length: number) => Uint32Array<ArrayBuffer>;
|
|
17
|
+
};
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { LOCK_SECTOR_BYTE_LENGTH, LockBound, PAYLOAD_LOCK_HOST_BITS_OFFSET_BYTES, PAYLOAD_LOCK_WORKER_BITS_OFFSET_BYTES, TASK_SLOT_INDEX_MASK, TaskIndex, } from "./lock.js";
|
|
2
|
+
import { createWasmSharedArrayBuffer } from "../common/runtime.js";
|
|
3
|
+
import { toSharedBufferRegion, } from "../common/shared-buffer-region.js";
|
|
4
|
+
// Low 5 bits = slot index, high 27 bits = caller meta.
|
|
5
|
+
// Inlined from setTaskSlotIndex to avoid cross-closure call on hot path.
|
|
6
|
+
const SLOT_META_PACKED_MASK = 0xFFFFFFE0; // (~0x1F) >>> 0
|
|
7
|
+
export const register = ({ lockSector, publishMode = "plain", }) => {
|
|
8
|
+
const lockRegion = toSharedBufferRegion(lockSector ?? createWasmSharedArrayBuffer(LOCK_SECTOR_BYTE_LENGTH));
|
|
9
|
+
const lockSAB = lockRegion.sab;
|
|
10
|
+
const hostBits = new Int32Array(lockSAB, lockRegion.byteOffset + PAYLOAD_LOCK_HOST_BITS_OFFSET_BYTES, 1);
|
|
11
|
+
const workerBits = new Int32Array(lockSAB, lockRegion.byteOffset + PAYLOAD_LOCK_WORKER_BITS_OFFSET_BYTES, 1);
|
|
12
|
+
const startAndIndex = new Uint32Array(LockBound.slots);
|
|
13
|
+
const size64bit = new Uint32Array(LockBound.slots);
|
|
14
|
+
const clz32 = Math.clz32;
|
|
15
|
+
const a_load = Atomics.load;
|
|
16
|
+
const a_store = Atomics.store;
|
|
17
|
+
const useAtomicPublish = publishMode === "atomic";
|
|
18
|
+
const EMPTY = 0xFFFFFFFF >>> 0;
|
|
19
|
+
const SLOT_MASK = TASK_SLOT_INDEX_MASK;
|
|
20
|
+
const START_MASK = (~SLOT_MASK) >>> 0;
|
|
21
|
+
startAndIndex.fill(EMPTY);
|
|
22
|
+
let tableLength = 0;
|
|
23
|
+
let usedBits = 0 | 0;
|
|
24
|
+
// scalar state (faster than Uint32Array(1))
|
|
25
|
+
let hostLast = 0 | 0;
|
|
26
|
+
let workerLast = 0 | 0;
|
|
27
|
+
const startAndIndexToArray = (length) => startAndIndex.slice(0, length);
|
|
28
|
+
const compactFreeBitsStable = (b, freeBits) => {
|
|
29
|
+
const sai = startAndIndex;
|
|
30
|
+
let w = 0 | 0;
|
|
31
|
+
b = b | 0;
|
|
32
|
+
freeBits = freeBits >>> 0;
|
|
33
|
+
for (let r = 0; r < b; r++) {
|
|
34
|
+
const v = sai[r];
|
|
35
|
+
if (v === EMPTY)
|
|
36
|
+
continue;
|
|
37
|
+
if ((freeBits & (1 << (v & SLOT_MASK))) !== 0)
|
|
38
|
+
continue;
|
|
39
|
+
if (w !== r)
|
|
40
|
+
sai[w] = v;
|
|
41
|
+
w++;
|
|
42
|
+
}
|
|
43
|
+
const live = w;
|
|
44
|
+
for (; w < b; w++)
|
|
45
|
+
sai[w] = EMPTY;
|
|
46
|
+
return live;
|
|
47
|
+
};
|
|
48
|
+
const updateTable = () => {
|
|
49
|
+
// state = which bits are currently "in use" under toggle-protocol
|
|
50
|
+
const w = a_load(workerBits, 0) | 0;
|
|
51
|
+
const state = (hostLast ^ w) >>> 0;
|
|
52
|
+
// freeBits = bits where host/worker agree (toggle resolved)
|
|
53
|
+
let freeBits = (~state) >>> 0;
|
|
54
|
+
if (tableLength === 0 || freeBits === 0)
|
|
55
|
+
return;
|
|
56
|
+
// all cleared
|
|
57
|
+
if (freeBits === EMPTY) {
|
|
58
|
+
tableLength = 0;
|
|
59
|
+
usedBits = 0 | 0;
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// only bother with bits we actually consider used
|
|
63
|
+
freeBits &= usedBits;
|
|
64
|
+
if (freeBits === 0)
|
|
65
|
+
return;
|
|
66
|
+
usedBits &= ~freeBits;
|
|
67
|
+
tableLength = compactFreeBitsStable(tableLength, freeBits);
|
|
68
|
+
};
|
|
69
|
+
// Hot-path allocation: reconcile frees, optionally reuse an exact-fit freed
|
|
70
|
+
// region in place, otherwise compact survivors while looking for the first gap.
|
|
71
|
+
const findAndInsert = (task, size) => {
|
|
72
|
+
const sai = startAndIndex;
|
|
73
|
+
const sz = size64bit;
|
|
74
|
+
let tl = tableLength;
|
|
75
|
+
let insertAt = -1;
|
|
76
|
+
let insertStart = 0;
|
|
77
|
+
let prevEnd = 0;
|
|
78
|
+
let didCompactScan = false;
|
|
79
|
+
if (tl === 0 && usedBits === 0) {
|
|
80
|
+
sai[0] = 0;
|
|
81
|
+
sz[0] = size;
|
|
82
|
+
task[TaskIndex.Start] = 0;
|
|
83
|
+
task[TaskIndex.slotBuffer] =
|
|
84
|
+
((task[TaskIndex.slotBuffer] & SLOT_META_PACKED_MASK) | 0) >>> 0;
|
|
85
|
+
tableLength = 1;
|
|
86
|
+
usedBits = 1;
|
|
87
|
+
hostLast ^= 1;
|
|
88
|
+
return 0;
|
|
89
|
+
}
|
|
90
|
+
if (tl !== 0) {
|
|
91
|
+
const w = a_load(workerBits, 0) | 0;
|
|
92
|
+
let freeBits = (~(hostLast ^ w)) >>> 0;
|
|
93
|
+
if (freeBits !== 0)
|
|
94
|
+
freeBits &= usedBits;
|
|
95
|
+
if (freeBits === EMPTY) {
|
|
96
|
+
tableLength = 0;
|
|
97
|
+
usedBits = 0 | 0;
|
|
98
|
+
tl = 0;
|
|
99
|
+
}
|
|
100
|
+
else if (freeBits !== 0) {
|
|
101
|
+
for (let i = 0; i < tl; i++) {
|
|
102
|
+
const v = sai[i];
|
|
103
|
+
const reclaimedSlot = v & SLOT_MASK;
|
|
104
|
+
const reclaimedBit = 1 << reclaimedSlot;
|
|
105
|
+
if ((freeBits & reclaimedBit) === 0)
|
|
106
|
+
continue;
|
|
107
|
+
if ((sz[reclaimedSlot] >>> 0) !== (size >>> 0))
|
|
108
|
+
continue;
|
|
109
|
+
const availableBits = (~usedBits) >>> 0;
|
|
110
|
+
const freeBit = (availableBits & -availableBits) >>> 0;
|
|
111
|
+
if (freeBit === 0)
|
|
112
|
+
return -1;
|
|
113
|
+
const slotIndex = 31 - clz32(freeBit);
|
|
114
|
+
const start = v & START_MASK;
|
|
115
|
+
sai[i] = (start | slotIndex) >>> 0;
|
|
116
|
+
sz[slotIndex] = size;
|
|
117
|
+
task[TaskIndex.Start] = start;
|
|
118
|
+
task[TaskIndex.slotBuffer] =
|
|
119
|
+
((task[TaskIndex.slotBuffer] & SLOT_META_PACKED_MASK) |
|
|
120
|
+
slotIndex) >>> 0;
|
|
121
|
+
usedBits = (usedBits & ~reclaimedBit) | freeBit;
|
|
122
|
+
hostLast ^= freeBit;
|
|
123
|
+
return slotIndex;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (tl !== 0 && freeBits !== 0 && freeBits !== EMPTY) {
|
|
127
|
+
didCompactScan = true;
|
|
128
|
+
let write = 0;
|
|
129
|
+
for (let read = 0; read < tl; read++) {
|
|
130
|
+
const v = sai[read];
|
|
131
|
+
const slot = v & SLOT_MASK;
|
|
132
|
+
if ((freeBits & (1 << slot)) !== 0)
|
|
133
|
+
continue;
|
|
134
|
+
const curStart = v & START_MASK;
|
|
135
|
+
if (insertAt === -1 && ((curStart - prevEnd) >>> 0) >= (size >>> 0)) {
|
|
136
|
+
insertAt = write;
|
|
137
|
+
insertStart = prevEnd;
|
|
138
|
+
}
|
|
139
|
+
if (write !== read)
|
|
140
|
+
sai[write] = v;
|
|
141
|
+
write++;
|
|
142
|
+
prevEnd = (curStart + (sz[slot] >>> 0)) >>> 0;
|
|
143
|
+
}
|
|
144
|
+
for (let i = write; i < tl; i++)
|
|
145
|
+
sai[i] = EMPTY;
|
|
146
|
+
if (freeBits !== 0)
|
|
147
|
+
usedBits &= ~freeBits;
|
|
148
|
+
tableLength = tl = write;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (tl >= LockBound.slots)
|
|
152
|
+
return -1;
|
|
153
|
+
const availableBits = (~usedBits) >>> 0;
|
|
154
|
+
const freeBit = (availableBits & -availableBits) >>> 0;
|
|
155
|
+
if (freeBit === 0)
|
|
156
|
+
return -1;
|
|
157
|
+
const slotIndex = 31 - clz32(freeBit);
|
|
158
|
+
if (!didCompactScan && tl !== 0) {
|
|
159
|
+
const firstStart = sai[0] & START_MASK;
|
|
160
|
+
if (firstStart >= (size >>> 0)) {
|
|
161
|
+
for (let i = tl; i > 0; i--)
|
|
162
|
+
sai[i] = sai[i - 1];
|
|
163
|
+
sai[0] = slotIndex;
|
|
164
|
+
sz[slotIndex] = size;
|
|
165
|
+
task[TaskIndex.Start] = 0;
|
|
166
|
+
task[TaskIndex.slotBuffer] =
|
|
167
|
+
((task[TaskIndex.slotBuffer] & SLOT_META_PACKED_MASK) | slotIndex) >>>
|
|
168
|
+
0;
|
|
169
|
+
tableLength = tl + 1;
|
|
170
|
+
usedBits |= freeBit;
|
|
171
|
+
hostLast ^= freeBit;
|
|
172
|
+
return slotIndex;
|
|
173
|
+
}
|
|
174
|
+
for (let at = 0; at + 1 < tl; at++) {
|
|
175
|
+
const cur = sai[at];
|
|
176
|
+
const curStart = cur & START_MASK;
|
|
177
|
+
const curEnd = (curStart + (sz[cur & SLOT_MASK] >>> 0)) >>> 0;
|
|
178
|
+
const nextStart = sai[at + 1] & START_MASK;
|
|
179
|
+
if ((nextStart - curEnd) >>> 0 < (size >>> 0))
|
|
180
|
+
continue;
|
|
181
|
+
for (let i = tl; i > at + 1; i--)
|
|
182
|
+
sai[i] = sai[i - 1];
|
|
183
|
+
sai[at + 1] = (curEnd | slotIndex) >>> 0;
|
|
184
|
+
sz[slotIndex] = size;
|
|
185
|
+
task[TaskIndex.Start] = curEnd;
|
|
186
|
+
task[TaskIndex.slotBuffer] =
|
|
187
|
+
((task[TaskIndex.slotBuffer] & SLOT_META_PACKED_MASK) | slotIndex) >>>
|
|
188
|
+
0;
|
|
189
|
+
tableLength = tl + 1;
|
|
190
|
+
usedBits |= freeBit;
|
|
191
|
+
hostLast ^= freeBit;
|
|
192
|
+
return slotIndex;
|
|
193
|
+
}
|
|
194
|
+
const last = sai[tl - 1];
|
|
195
|
+
const lastStart = last & START_MASK;
|
|
196
|
+
const newStart = (lastStart + (sz[last & SLOT_MASK] >>> 0)) >>> 0;
|
|
197
|
+
sai[tl] = (newStart | slotIndex) >>> 0;
|
|
198
|
+
sz[slotIndex] = size;
|
|
199
|
+
task[TaskIndex.Start] = newStart;
|
|
200
|
+
task[TaskIndex.slotBuffer] =
|
|
201
|
+
((task[TaskIndex.slotBuffer] & SLOT_META_PACKED_MASK) | slotIndex) >>>
|
|
202
|
+
0;
|
|
203
|
+
tableLength = tl + 1;
|
|
204
|
+
usedBits |= freeBit;
|
|
205
|
+
hostLast ^= freeBit;
|
|
206
|
+
return slotIndex;
|
|
207
|
+
}
|
|
208
|
+
if (tl === 0) {
|
|
209
|
+
sai[0] = slotIndex;
|
|
210
|
+
sz[slotIndex] = size;
|
|
211
|
+
task[TaskIndex.Start] = 0;
|
|
212
|
+
task[TaskIndex.slotBuffer] =
|
|
213
|
+
((task[TaskIndex.slotBuffer] & SLOT_META_PACKED_MASK) | slotIndex) >>>
|
|
214
|
+
0;
|
|
215
|
+
tableLength = 1;
|
|
216
|
+
usedBits |= freeBit;
|
|
217
|
+
hostLast ^= freeBit;
|
|
218
|
+
return slotIndex;
|
|
219
|
+
}
|
|
220
|
+
if (insertAt !== -1) {
|
|
221
|
+
for (let i = tl; i > insertAt; i--)
|
|
222
|
+
sai[i] = sai[i - 1];
|
|
223
|
+
sai[insertAt] = (insertStart | slotIndex) >>> 0;
|
|
224
|
+
sz[slotIndex] = size;
|
|
225
|
+
task[TaskIndex.Start] = insertStart;
|
|
226
|
+
task[TaskIndex.slotBuffer] =
|
|
227
|
+
((task[TaskIndex.slotBuffer] & SLOT_META_PACKED_MASK) | slotIndex) >>>
|
|
228
|
+
0;
|
|
229
|
+
tableLength = tl + 1;
|
|
230
|
+
usedBits |= freeBit;
|
|
231
|
+
hostLast ^= freeBit;
|
|
232
|
+
return slotIndex;
|
|
233
|
+
}
|
|
234
|
+
sai[tl] = (prevEnd | slotIndex) >>> 0;
|
|
235
|
+
sz[slotIndex] = size;
|
|
236
|
+
task[TaskIndex.Start] = prevEnd;
|
|
237
|
+
task[TaskIndex.slotBuffer] =
|
|
238
|
+
((task[TaskIndex.slotBuffer] & SLOT_META_PACKED_MASK) | slotIndex) >>> 0;
|
|
239
|
+
tableLength = tl + 1;
|
|
240
|
+
usedBits |= freeBit;
|
|
241
|
+
hostLast ^= freeBit;
|
|
242
|
+
return slotIndex;
|
|
243
|
+
};
|
|
244
|
+
const allocTask = (task) => {
|
|
245
|
+
const payloadLen = task[TaskIndex.PayloadLen] | 0;
|
|
246
|
+
const size = (payloadLen + 63) & ~63;
|
|
247
|
+
const slotIndex = findAndInsert(task, size);
|
|
248
|
+
if (slotIndex === -1)
|
|
249
|
+
return -1;
|
|
250
|
+
if (useAtomicPublish)
|
|
251
|
+
a_store(hostBits, 0, hostLast);
|
|
252
|
+
else
|
|
253
|
+
hostBits[0] = hostLast;
|
|
254
|
+
return slotIndex;
|
|
255
|
+
};
|
|
256
|
+
const setSlotLength = (slotIndex, payloadLen) => {
|
|
257
|
+
slotIndex = slotIndex & TASK_SLOT_INDEX_MASK;
|
|
258
|
+
//const bit = 1 << slotIndex;
|
|
259
|
+
//if ((usedBits & bit) === 0) return false;
|
|
260
|
+
//const current = size64bit[slotIndex] >>> 0;
|
|
261
|
+
const aligned = ((payloadLen | 0) + 63) & ~63;
|
|
262
|
+
//if (aligned < 0) return false;
|
|
263
|
+
//if ((aligned >>> 0) > current) return false;
|
|
264
|
+
size64bit[slotIndex] = aligned >>> 0;
|
|
265
|
+
return true;
|
|
266
|
+
};
|
|
267
|
+
const free = (index) => {
|
|
268
|
+
index = index & TASK_SLOT_INDEX_MASK;
|
|
269
|
+
workerLast ^= 1 << index;
|
|
270
|
+
if (useAtomicPublish)
|
|
271
|
+
a_store(workerBits, 0, workerLast);
|
|
272
|
+
else
|
|
273
|
+
workerBits[0] = workerLast;
|
|
274
|
+
};
|
|
275
|
+
return {
|
|
276
|
+
allocTask,
|
|
277
|
+
setSlotLength,
|
|
278
|
+
lockSAB,
|
|
279
|
+
free,
|
|
280
|
+
hostBits,
|
|
281
|
+
workerBits,
|
|
282
|
+
updateTable,
|
|
283
|
+
startAndIndexToArray,
|
|
284
|
+
};
|
|
285
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type PayloadBufferOptions } from "./payload-config.js";
|
|
2
|
+
import { type SharedBuffer, type SharedBufferSource } from "../common/shared-buffer-region.js";
|
|
3
|
+
import type { SharedBufferTextCompat } from "../common/shared-buffer-text.js";
|
|
4
|
+
type BufferLike = Uint8Array & {
|
|
5
|
+
copy: (target: Uint8Array, targetStart?: number, sourceStart?: number, sourceEnd?: number) => number;
|
|
6
|
+
toString: (encoding?: string, start?: number, end?: number) => string;
|
|
7
|
+
};
|
|
8
|
+
export declare const createSharedDynamicBufferIO: ({ sab, payloadConfig, textCompat, }: {
|
|
9
|
+
sab?: SharedBufferSource;
|
|
10
|
+
payloadConfig?: PayloadBufferOptions;
|
|
11
|
+
textCompat?: SharedBufferTextCompat;
|
|
12
|
+
}) => {
|
|
13
|
+
readUtf8: (start: number, end: number) => string;
|
|
14
|
+
writeBinary: (src: Uint8Array, start?: number) => number;
|
|
15
|
+
writeBuffer: (src: Uint8Array, start?: number) => number;
|
|
16
|
+
writeArrayBuffer: (src: ArrayBuffer, start?: number) => number;
|
|
17
|
+
write8Binary: (src: Float64Array, start?: number) => number;
|
|
18
|
+
readBytesCopy: (start: number, end: number) => Uint8Array<ArrayBuffer>;
|
|
19
|
+
readBytesView: (start: number, end: number) => Uint8Array<SharedBuffer>;
|
|
20
|
+
readBytesBufferCopy: (start: number, end: number) => Uint8Array<ArrayBuffer> | BufferLike;
|
|
21
|
+
readBufferCopy: (start: number, end: number) => Uint8Array<ArrayBuffer> | BufferLike;
|
|
22
|
+
readBytesArrayBufferCopy: (start: number, end: number) => ArrayBuffer;
|
|
23
|
+
readArrayBufferCopy: (start: number, end: number) => ArrayBuffer;
|
|
24
|
+
read8BytesFloatCopy: (start: number, end: number) => Float64Array<ArrayBuffer>;
|
|
25
|
+
read8BytesFloatView: (start: number, end: number) => Float64Array<SharedBuffer>;
|
|
26
|
+
writeUtf8: (str: string, start: number, reservedBytes?: number) => number;
|
|
27
|
+
};
|
|
28
|
+
export declare const createSharedStaticBufferIO: ({ headersBuffer, slotStrideU32, textCompat, }: {
|
|
29
|
+
headersBuffer: SharedArrayBuffer | Uint32Array;
|
|
30
|
+
slotStrideU32?: number;
|
|
31
|
+
textCompat?: SharedBufferTextCompat;
|
|
32
|
+
}) => {
|
|
33
|
+
writeUtf8: (str: string, at: number) => number;
|
|
34
|
+
readUtf8: (start: number, end: number, at: number) => string;
|
|
35
|
+
writeBinary: (src: Uint8Array, at: number, start?: number) => number;
|
|
36
|
+
writeBuffer: (src: Uint8Array, at: number, start?: number) => number;
|
|
37
|
+
writeArrayBuffer: (src: ArrayBuffer, at: number, start?: number) => number;
|
|
38
|
+
writeExactUint8Array: (src: Uint8Array, at: number, start?: number) => number;
|
|
39
|
+
writeUint8Array: (src: Uint8Array, at: number, start?: number) => number;
|
|
40
|
+
write8Binary: (src: Float64Array, at: number, start?: number) => number;
|
|
41
|
+
readBytesCopy: (start: number, end: number, at: number) => Uint8Array<ArrayBuffer>;
|
|
42
|
+
readBytesView: (start: number, end: number, at: number) => Uint8Array<SharedArrayBuffer>;
|
|
43
|
+
readBytesBufferCopy: (start: number, end: number, at: number) => Uint8Array<ArrayBuffer> | BufferLike;
|
|
44
|
+
readBufferCopy: (start: number, end: number, at: number) => Uint8Array<ArrayBuffer> | BufferLike;
|
|
45
|
+
readUint8ArrayCopy: (start: number, end: number, at: number) => Uint8Array<ArrayBufferLike>;
|
|
46
|
+
readUint8ArrayBufferCopy: (start: number, end: number, at: number) => Uint8Array<ArrayBufferLike>;
|
|
47
|
+
readBytesArrayBufferCopy: (start: number, end: number, at: number) => ArrayBuffer;
|
|
48
|
+
readArrayBufferCopy: (start: number, end: number, at: number) => ArrayBuffer;
|
|
49
|
+
read8BytesFloatCopy: (start: number, end: number, at: number) => Float64Array<ArrayBuffer>;
|
|
50
|
+
read8BytesFloatView: (start: number, end: number, at: number) => Float64Array<SharedArrayBuffer>;
|
|
51
|
+
maxBytes: number;
|
|
52
|
+
};
|
|
53
|
+
export {};
|