knitting 0.1.55 → 0.1.60
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/README.md +254 -40
- package/knitting.d.ts +7 -797
- package/knitting.js +6 -9780
- package/map.md +31 -15
- package/package.json +20 -6
- package/process-shared-buffer.d.ts +1 -0
- package/process-shared-buffer.js +1 -0
- package/scripts/build-compiled-worker.ts +276 -0
- package/scripts/compiled-worker/porffor.d.ts +5 -0
- package/scripts/compiled-worker/runtime.ts +529 -0
- package/scripts/compiled-worker/task-shim.ts +32 -0
- package/shared-memory.d.ts +1 -155
- package/shared-memory.js +1 -1342
- package/src/api.d.ts +92 -0
- package/src/api.js +798 -0
- package/src/common/envelope.d.ts +17 -0
- package/src/common/envelope.js +22 -0
- package/src/common/module-url.d.ts +2 -0
- package/src/common/module-url.js +52 -0
- package/src/common/node-compat.d.ts +22 -0
- package/src/common/node-compat.js +24 -0
- package/src/common/path-canonical.d.ts +6 -0
- package/src/common/path-canonical.js +55 -0
- package/src/common/runtime.d.ts +16 -0
- package/src/common/runtime.js +105 -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 +5 -0
- package/src/common/task-source.js +100 -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 +42 -0
- package/src/common/worker-runtime.js +70 -0
- package/src/connections/buffer-reference-native.d.ts +56 -0
- package/src/connections/buffer-reference-native.js +241 -0
- package/src/connections/buffer-reference.d.ts +99 -0
- package/src/connections/buffer-reference.js +575 -0
- package/src/connections/bun.d.ts +22 -0
- package/src/connections/bun.js +225 -0
- package/src/connections/deno.d.ts +24 -0
- package/src/connections/deno.js +226 -0
- package/src/connections/external-array-buffer.d.ts +2 -0
- package/src/connections/external-array-buffer.js +33 -0
- package/src/connections/file-descriptor.d.ts +39 -0
- package/src/connections/file-descriptor.js +161 -0
- package/src/connections/index.d.ts +4 -0
- package/src/connections/index.js +4 -0
- package/src/connections/node-addons.d.ts +16 -0
- package/src/connections/node-addons.js +92 -0
- package/src/connections/node-buffer-pointer.d.ts +20 -0
- package/src/connections/node-buffer-pointer.js +16 -0
- package/src/connections/node-ffi-api.d.ts +19 -0
- package/src/connections/node-ffi-api.js +28 -0
- package/src/connections/node-ffi.d.ts +27 -0
- package/src/connections/node-ffi.js +262 -0
- package/src/connections/node.d.ts +30 -0
- package/src/connections/node.js +62 -0
- package/src/connections/numeric-array.d.ts +5 -0
- package/src/connections/numeric-array.js +17 -0
- package/src/connections/package-assets.d.ts +2 -0
- package/src/connections/package-assets.js +55 -0
- package/src/connections/posix.d.ts +74 -0
- package/src/connections/posix.js +178 -0
- package/src/connections/process-shared-buffer.d.ts +76 -0
- package/src/connections/process-shared-buffer.js +245 -0
- package/src/connections/shared-array-buffer-payload.d.ts +36 -0
- package/src/connections/shared-array-buffer-payload.js +235 -0
- package/src/connections/types.d.ts +54 -0
- package/src/connections/types.js +37 -0
- package/src/connections/windows.d.ts +37 -0
- package/src/connections/windows.js +245 -0
- package/src/debug/env-diff.d.ts +26 -0
- package/src/debug/env-diff.js +49 -0
- package/src/debug/gate.d.ts +18 -0
- package/src/debug/gate.js +69 -0
- package/src/debug/handle.d.ts +23 -0
- package/src/debug/handle.js +48 -0
- package/src/error.d.ts +14 -0
- package/src/error.js +50 -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 +23 -0
- package/src/ipc/transport/shared-memory.js +35 -0
- package/src/memory/byte-carpet.d.ts +73 -0
- package/src/memory/byte-carpet.js +157 -0
- package/src/memory/lock.d.ts +213 -0
- package/src/memory/lock.js +760 -0
- package/src/memory/payload-config.d.ts +31 -0
- package/src/memory/payload-config.js +67 -0
- package/src/memory/payloadCodec.d.ts +55 -0
- package/src/memory/payloadCodec.js +1473 -0
- package/src/memory/regionRegistry.d.ts +17 -0
- package/src/memory/regionRegistry.js +285 -0
- package/src/memory/shared-buffer-io.d.ts +55 -0
- package/src/memory/shared-buffer-io.js +403 -0
- package/src/permission/compatibility.d.ts +28 -0
- package/src/permission/compatibility.js +239 -0
- package/src/permission/index.d.ts +4 -0
- package/src/permission/index.js +3 -0
- package/src/permission/protocol.d.ts +167 -0
- package/src/permission/protocol.js +690 -0
- package/src/runtime/balancer.d.ts +19 -0
- package/src/runtime/balancer.js +149 -0
- package/src/runtime/compiled-artifact.d.ts +21 -0
- package/src/runtime/compiled-artifact.js +260 -0
- package/src/runtime/compiled-builder.d.ts +8 -0
- package/src/runtime/compiled-builder.js +42 -0
- package/src/runtime/compiled-worker.d.ts +27 -0
- package/src/runtime/compiled-worker.js +562 -0
- package/src/runtime/dispatcher.d.ts +40 -0
- package/src/runtime/dispatcher.js +142 -0
- package/src/runtime/inline-executor.d.ts +10 -0
- package/src/runtime/inline-executor.js +294 -0
- package/src/runtime/pool.d.ts +44 -0
- package/src/runtime/pool.js +472 -0
- package/src/runtime/process-worker.d.ts +92 -0
- package/src/runtime/process-worker.js +713 -0
- package/src/runtime/tx-queue.d.ts +28 -0
- package/src/runtime/tx-queue.js +158 -0
- package/src/shared/abortSignal.d.ts +23 -0
- package/src/shared/abortSignal.js +134 -0
- package/src/types.d.ts +399 -0
- package/src/types.js +2 -0
- package/src/utils/http.d.ts +29 -0
- package/src/utils/http.js +100 -0
- package/src/worker/bootstrap.d.ts +5 -0
- package/src/worker/bootstrap.js +78 -0
- package/src/worker/composable-runners.d.ts +12 -0
- package/src/worker/composable-runners.js +98 -0
- package/src/worker/loop.d.ts +3 -0
- package/src/worker/loop.js +395 -0
- package/src/worker/process-worker-bootstrap.d.ts +8 -0
- package/src/worker/process-worker-bootstrap.js +160 -0
- package/src/worker/rx-queue.d.ts +25 -0
- package/src/worker/rx-queue.js +173 -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 +28 -0
- package/src/worker/task-loader.js +76 -0
- package/src/worker/timers.d.ts +18 -0
- package/src/worker/timers.js +118 -0
- package/unsafe.d.ts +1 -71
- package/unsafe.js +1 -878
- package/utils.d.ts +1 -31
- package/utils.js +1 -116
|
@@ -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,55 @@
|
|
|
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
|
+
writeU32Words: (words: ArrayLike<number>, count: number, at: number) => number;
|
|
41
|
+
readU32Words: (out: Uint32Array, count: number, at: number) => Uint32Array;
|
|
42
|
+
write8Binary: (src: Float64Array, at: number, start?: number) => number;
|
|
43
|
+
readBytesCopy: (start: number, end: number, at: number) => Uint8Array<ArrayBuffer>;
|
|
44
|
+
readBytesView: (start: number, end: number, at: number) => Uint8Array<SharedArrayBuffer>;
|
|
45
|
+
readBytesBufferCopy: (start: number, end: number, at: number) => Uint8Array<ArrayBuffer> | BufferLike;
|
|
46
|
+
readBufferCopy: (start: number, end: number, at: number) => Uint8Array<ArrayBuffer> | BufferLike;
|
|
47
|
+
readUint8ArrayCopy: (start: number, end: number, at: number) => Uint8Array<ArrayBufferLike>;
|
|
48
|
+
readUint8ArrayBufferCopy: (start: number, end: number, at: number) => Uint8Array<ArrayBufferLike>;
|
|
49
|
+
readBytesArrayBufferCopy: (start: number, end: number, at: number) => ArrayBuffer;
|
|
50
|
+
readArrayBufferCopy: (start: number, end: number, at: number) => ArrayBuffer;
|
|
51
|
+
read8BytesFloatCopy: (start: number, end: number, at: number) => Float64Array<ArrayBuffer>;
|
|
52
|
+
read8BytesFloatView: (start: number, end: number, at: number) => Float64Array<SharedArrayBuffer>;
|
|
53
|
+
maxBytes: number;
|
|
54
|
+
};
|
|
55
|
+
export {};
|