@volter/browser-wali 0.1.203 → 0.1.205
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/dist/futex-queue.d.ts +16 -0
- package/dist/futex-queue.d.ts.map +1 -0
- package/dist/futex-queue.js +171 -0
- package/dist/futex-queue.js.map +1 -0
- package/dist/local-sockets.d.ts +2 -0
- package/dist/local-sockets.d.ts.map +1 -1
- package/dist/local-sockets.js +64 -32
- package/dist/local-sockets.js.map +1 -1
- package/dist/memory.d.ts +3 -0
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +63 -10
- package/dist/memory.js.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +4 -1
- package/dist/runtime.js.map +1 -1
- package/dist/system.d.ts +4 -70
- package/dist/system.d.ts.map +1 -1
- package/dist/system.js +8 -152
- package/dist/system.js.map +1 -1
- package/dist/thread-lifecycle.d.ts +2 -1
- package/dist/thread-lifecycle.d.ts.map +1 -1
- package/dist/thread-lifecycle.js +5 -2
- package/dist/thread-lifecycle.js.map +1 -1
- package/dist/thread-worker.js +9 -41
- package/dist/thread-worker.js.map +1 -1
- package/dist/threads.d.ts +1 -0
- package/dist/threads.d.ts.map +1 -1
- package/dist/threads.js +1 -0
- package/dist/threads.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** One reusable row per admitted thread, including the root; no per-wait SAB. */
|
|
2
|
+
export declare function createWaliFutexQueue(threads: number): SharedArrayBuffer;
|
|
3
|
+
export declare class WaliFutexQueue {
|
|
4
|
+
private readonly words;
|
|
5
|
+
private readonly base;
|
|
6
|
+
constructor(state: SharedArrayBuffer, thread?: number);
|
|
7
|
+
call(memory: WebAssembly.Memory, address: number, operation: number, value: number, timeout: number, address2: number, value3: number, checkFailure: () => void): bigint;
|
|
8
|
+
wake(address: number, count: number, mask?: number): bigint;
|
|
9
|
+
private requeue;
|
|
10
|
+
/** Timeout/signal removal races with WAKE under the same lock. */
|
|
11
|
+
private finish;
|
|
12
|
+
private wakeSlot;
|
|
13
|
+
private lock;
|
|
14
|
+
private unlock;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=futex-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"futex-queue.d.ts","sourceRoot":"","sources":["../src/futex-queue.ts"],"names":[],"mappings":"AAiBA,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAGvE;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBAElB,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAI;IAOhD,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAChF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,IAAI,GAAG,MAAM;IAkDtF,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,SAAY,GAAG,MAAM;IAkB9D,OAAO,CAAC,OAAO;IAkBf,kEAAkE;IAClE,OAAO,CAAC,MAAM;IASd,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,IAAI;IAGZ,OAAO,CAAC,MAAM;CACf"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// Linux futex wait/wake/requeue rules at the syscall seam, read against
|
|
2
|
+
// v6.12 kernel/futex/{waitwake,requeue}.c; no Linux code copied.
|
|
3
|
+
// Emscripten's private futex ABI has no Linux requeue/bitset queue to take.
|
|
4
|
+
// Keys here are addresses within ONE process's shared wasm memory. PI and
|
|
5
|
+
// keys shared between separate process memories remain unsupported.
|
|
6
|
+
import { waliFutexArgumentError, waliFutexCommand } from "./futex-arguments.js";
|
|
7
|
+
import { hostWait } from "./host-idle.js";
|
|
8
|
+
import { monotonicMilliseconds, realtimeMilliseconds } from "./monotonic-clock.js";
|
|
9
|
+
import { waliSignalWaitState } from "./signal-interruption.js";
|
|
10
|
+
import { waliActivityGuard } from "./wait-state.js";
|
|
11
|
+
const HEADER = 1;
|
|
12
|
+
const WORDS_PER_WAITER = 3;
|
|
13
|
+
const STATE = 0, ADDRESS = 1, MASK = 2;
|
|
14
|
+
const IDLE = 0, WAITING = 1, WOKEN = 2;
|
|
15
|
+
const MATCH_ANY = -1;
|
|
16
|
+
/** One reusable row per admitted thread, including the root; no per-wait SAB. */
|
|
17
|
+
export function createWaliFutexQueue(threads) {
|
|
18
|
+
if (!Number.isSafeInteger(threads) || threads < 1)
|
|
19
|
+
throw new Error("Invalid WALI futex thread count.");
|
|
20
|
+
return new SharedArrayBuffer((HEADER + threads * WORDS_PER_WAITER) * Int32Array.BYTES_PER_ELEMENT);
|
|
21
|
+
}
|
|
22
|
+
export class WaliFutexQueue {
|
|
23
|
+
words;
|
|
24
|
+
base;
|
|
25
|
+
constructor(state, thread = 0) {
|
|
26
|
+
this.words = new Int32Array(state);
|
|
27
|
+
this.base = HEADER + thread * WORDS_PER_WAITER;
|
|
28
|
+
if (!Number.isSafeInteger(thread) || thread < 0 || this.base + WORDS_PER_WAITER > this.words.length
|
|
29
|
+
|| (this.words.length - HEADER) % WORDS_PER_WAITER !== 0)
|
|
30
|
+
throw new Error("Invalid WALI futex queue slot.");
|
|
31
|
+
}
|
|
32
|
+
call(memory, address, operation, value, timeout, address2, value3, checkFailure) {
|
|
33
|
+
const error = waliFutexArgumentError(memory, address, operation, timeout, address2, value3);
|
|
34
|
+
if (error !== undefined)
|
|
35
|
+
return error;
|
|
36
|
+
const command = waliFutexCommand(operation);
|
|
37
|
+
if (command === 1 || command === 10)
|
|
38
|
+
return this.wake(address, value, command === 10 ? value3 : MATCH_ANY);
|
|
39
|
+
if (command === 3 || command === 4)
|
|
40
|
+
return this.requeue(memory, address, address2, value, timeout, command === 4 ? value3 : undefined);
|
|
41
|
+
if (command !== 0 && command !== 9)
|
|
42
|
+
return -38n;
|
|
43
|
+
let deadline = Infinity;
|
|
44
|
+
if (timeout !== 0) {
|
|
45
|
+
const view = new DataView(memory.buffer);
|
|
46
|
+
const milliseconds = Number(view.getBigInt64(timeout, true)) * 1_000
|
|
47
|
+
+ Number(view.getBigInt64(timeout + 8, true)) / 1_000_000;
|
|
48
|
+
const remaining = command === 9
|
|
49
|
+
? milliseconds - ((operation & 0x100) ? realtimeMilliseconds() : monotonicMilliseconds())
|
|
50
|
+
: milliseconds;
|
|
51
|
+
deadline = performance.now() + Math.max(0, remaining);
|
|
52
|
+
}
|
|
53
|
+
this.lock();
|
|
54
|
+
try {
|
|
55
|
+
// Comparison and enrollment share the wake lock, closing lost-wakeup
|
|
56
|
+
// races even if the guest stores the new futex value before WAKE.
|
|
57
|
+
if (Atomics.load(new Int32Array(memory.buffer), address / 4) !== (value | 0))
|
|
58
|
+
return -11n;
|
|
59
|
+
if (this.words[this.base + STATE] !== IDLE)
|
|
60
|
+
throw new Error("WALI thread already has a futex waiter.");
|
|
61
|
+
this.words[this.base + ADDRESS] = address | 0;
|
|
62
|
+
this.words[this.base + MASK] = command === 9 ? value3 | 0 : MATCH_ANY;
|
|
63
|
+
Atomics.store(this.words, this.base + STATE, WAITING);
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
this.unlock();
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
for (;;) {
|
|
70
|
+
checkFailure();
|
|
71
|
+
if (Atomics.load(this.words, this.base + STATE) === WOKEN)
|
|
72
|
+
return 0n;
|
|
73
|
+
const signal = waliSignalWaitState();
|
|
74
|
+
if (signal.pending)
|
|
75
|
+
return this.finish(-4n);
|
|
76
|
+
const remaining = deadline - performance.now();
|
|
77
|
+
if (remaining <= 0)
|
|
78
|
+
return this.finish(-110n);
|
|
79
|
+
// Keep the root's existing fatal-thread check cadence. Host filesystem
|
|
80
|
+
// requests still pump while parked; their wakes do not complete WAIT.
|
|
81
|
+
hostWait(this.words, this.base + STATE, WAITING, Math.min(100, remaining), undefined, { resource: `futex address ${Atomics.load(this.words, this.base + ADDRESS) >>> 0}`,
|
|
82
|
+
deadline: Number.isFinite(deadline) ? Date.now() + remaining : null,
|
|
83
|
+
guards: [...waliActivityGuard(), ...signal.guards] });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
this.lock();
|
|
88
|
+
try {
|
|
89
|
+
Atomics.store(this.words, this.base + STATE, IDLE);
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
this.unlock();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
wake(address, count, mask = MATCH_ANY) {
|
|
97
|
+
if ((mask >>> 0) === 0)
|
|
98
|
+
return -22n;
|
|
99
|
+
// The legacy Linux syscall wakes one matching waiter even for nr_wake
|
|
100
|
+
// <= 0 (waitwake.c increments before comparing). STRICT futex2 differs.
|
|
101
|
+
count = Math.max(1, count | 0);
|
|
102
|
+
this.lock();
|
|
103
|
+
try {
|
|
104
|
+
let woken = 0;
|
|
105
|
+
for (let base = HEADER; base < this.words.length && woken < count; base += WORDS_PER_WAITER) {
|
|
106
|
+
if (this.words[base + STATE] !== WAITING || (this.words[base + ADDRESS] >>> 0) !== address
|
|
107
|
+
|| (this.words[base + MASK] & mask) === 0)
|
|
108
|
+
continue;
|
|
109
|
+
this.wakeSlot(base);
|
|
110
|
+
woken++;
|
|
111
|
+
}
|
|
112
|
+
return BigInt(woken);
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
this.unlock();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
requeue(memory, address, target, count, move, compare) {
|
|
119
|
+
count |= 0;
|
|
120
|
+
move |= 0;
|
|
121
|
+
if (count < 0 || move < 0)
|
|
122
|
+
return -22n;
|
|
123
|
+
this.lock();
|
|
124
|
+
try {
|
|
125
|
+
if (compare !== undefined && Atomics.load(new Int32Array(memory.buffer), address / 4) !== (compare | 0))
|
|
126
|
+
return -11n;
|
|
127
|
+
let woken = 0, moved = 0;
|
|
128
|
+
for (let base = HEADER; base < this.words.length; base += WORDS_PER_WAITER) {
|
|
129
|
+
if (this.words[base + STATE] !== WAITING || (this.words[base + ADDRESS] >>> 0) !== address)
|
|
130
|
+
continue;
|
|
131
|
+
if (woken < count) {
|
|
132
|
+
this.wakeSlot(base);
|
|
133
|
+
woken++;
|
|
134
|
+
}
|
|
135
|
+
else if (moved < move) {
|
|
136
|
+
this.words[base + ADDRESS] = target | 0;
|
|
137
|
+
moved++;
|
|
138
|
+
}
|
|
139
|
+
else
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
return BigInt(woken + moved);
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
this.unlock();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/** Timeout/signal removal races with WAKE under the same lock. */
|
|
149
|
+
finish(error) {
|
|
150
|
+
this.lock();
|
|
151
|
+
try {
|
|
152
|
+
if (this.words[this.base + STATE] === WOKEN)
|
|
153
|
+
return 0n;
|
|
154
|
+
Atomics.store(this.words, this.base + STATE, IDLE);
|
|
155
|
+
return error;
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
this.unlock();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
wakeSlot(base) {
|
|
162
|
+
Atomics.store(this.words, base + STATE, WOKEN);
|
|
163
|
+
Atomics.notify(this.words, base + STATE, 1);
|
|
164
|
+
}
|
|
165
|
+
lock() {
|
|
166
|
+
while (Atomics.compareExchange(this.words, 0, 0, 1) !== 0)
|
|
167
|
+
Atomics.wait(this.words, 0, 1);
|
|
168
|
+
}
|
|
169
|
+
unlock() { Atomics.store(this.words, 0, 0); Atomics.notify(this.words, 0, 1); }
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=futex-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"futex-queue.js","sourceRoot":"","sources":["../src/futex-queue.ts"],"names":[],"mappings":"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"}
|
package/dist/local-sockets.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export declare class WaliLocalSocketHost {
|
|
|
8
8
|
private pipe;
|
|
9
9
|
private pipeEndpoint;
|
|
10
10
|
private socketpair;
|
|
11
|
+
/** Linux pair creation: no descriptor or endpoint survives a failed allocation. */
|
|
12
|
+
private installPair;
|
|
11
13
|
private endpoint;
|
|
12
14
|
}
|
|
13
15
|
//# sourceMappingURL=local-sockets.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-sockets.d.ts","sourceRoot":"","sources":["../src/local-sockets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAA8B,MAAM,iBAAiB,CAAC;AACtF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"local-sockets.d.ts","sourceRoot":"","sources":["../src/local-sockets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAA8B,MAAM,iBAAiB,CAAC;AACtF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAiCpD,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBADX,MAAM,EAAE,MAAM,WAAW,CAAC,MAAM,EAChC,WAAW,EAAE,uBAAuB;IAGvD,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAU5C,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,UAAU;IAiBlB,mFAAmF;IACnF,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,QAAQ;CAkBjB"}
|
package/dist/local-sockets.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { WaliFileDescriptorTable } from "./filesystem.js";
|
|
2
|
-
import { closeSharedPipe, createSharedPipe, pollSharedPipe, readSharedPipe,
|
|
2
|
+
import { closeSharedPipe, createSharedPipe, pollSharedPipe, readSharedPipe, readSharedPipeSync, writeSharedPipeSync, } from "./process-bridge.js";
|
|
3
3
|
const AF_UNIX = 1;
|
|
4
4
|
const SOCK_TYPE_MASK = 0xf;
|
|
5
5
|
const SOCK_STREAM = 1;
|
|
6
|
+
const NONBLOCK = 0x800;
|
|
7
|
+
const CLOEXEC = 0x80000;
|
|
6
8
|
const EAFNOSUPPORT = 97n;
|
|
7
9
|
const EPROTONOSUPPORT = 93n;
|
|
8
10
|
const EAGAIN = 11n;
|
|
@@ -25,70 +27,100 @@ export class WaliLocalSocketHost {
|
|
|
25
27
|
};
|
|
26
28
|
}
|
|
27
29
|
pipe(pointer, flags) {
|
|
28
|
-
if ((flags & ~
|
|
30
|
+
if ((flags & ~(CLOEXEC | NONBLOCK)) !== 0)
|
|
29
31
|
return -22n;
|
|
30
|
-
if (!Number.isSafeInteger(pointer) || pointer
|
|
32
|
+
if (!Number.isSafeInteger(pointer) || pointer <= 0 || pointer + 8 > this.memory().buffer.byteLength)
|
|
31
33
|
return -14n;
|
|
32
34
|
const pipe = createSharedPipe();
|
|
33
|
-
|
|
34
|
-
const writerFd = this.descriptors.allocateSpecial(this.pipeEndpoint(pipe.writer));
|
|
35
|
-
const view = new DataView(this.memory().buffer);
|
|
36
|
-
view.setInt32(pointer, readerFd, true);
|
|
37
|
-
view.setInt32(pointer + 4, writerFd, true);
|
|
38
|
-
return 0n;
|
|
35
|
+
return this.installPair(pointer, flags, this.pipeEndpoint(pipe.reader, flags), this.pipeEndpoint(pipe.writer, flags));
|
|
39
36
|
}
|
|
40
|
-
pipeEndpoint(handle) {
|
|
37
|
+
pipeEndpoint(handle, flags) {
|
|
38
|
+
let nonblocking = Boolean(flags & NONBLOCK);
|
|
41
39
|
return {
|
|
42
40
|
browserProcessPipe: handle,
|
|
43
|
-
read: (length) => readSharedPipe(handle, length),
|
|
44
|
-
write: (value) => writeSharedPipeSync(handle, value),
|
|
41
|
+
read: (length) => (nonblocking ? readSharedPipe : readSharedPipeSync)(handle, length),
|
|
42
|
+
write: (value) => writeSharedPipeSync(handle, value, nonblocking),
|
|
45
43
|
poll: (events) => pollSharedPipe(handle, events),
|
|
46
|
-
fcntl: (command
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
44
|
+
fcntl: (command, argument) => {
|
|
45
|
+
if (command === 3)
|
|
46
|
+
return BigInt((handle.role === "writer" ? 1 : 0) | (nonblocking ? NONBLOCK : 0));
|
|
47
|
+
if (command === 4) {
|
|
48
|
+
nonblocking = Boolean(argument & NONBLOCK);
|
|
49
|
+
return 0n;
|
|
50
|
+
}
|
|
51
|
+
return [1, 2].includes(command) ? 0n : -22n;
|
|
50
52
|
},
|
|
51
53
|
close: () => closeSharedPipe(handle),
|
|
52
54
|
};
|
|
53
55
|
}
|
|
54
56
|
socketpair(domain, type, protocol, pointer) {
|
|
57
|
+
if ((type & ~(SOCK_TYPE_MASK | NONBLOCK | CLOEXEC)) !== 0)
|
|
58
|
+
return -22n;
|
|
55
59
|
if (domain !== AF_UNIX)
|
|
56
60
|
return -EAFNOSUPPORT;
|
|
57
61
|
if ((type & SOCK_TYPE_MASK) !== SOCK_STREAM || protocol !== 0)
|
|
58
62
|
return -EPROTONOSUPPORT;
|
|
59
|
-
if (!Number.isSafeInteger(pointer) || pointer
|
|
63
|
+
if (!Number.isSafeInteger(pointer) || pointer <= 0 || pointer + 8 > this.memory().buffer.byteLength)
|
|
60
64
|
return -14n;
|
|
61
65
|
const left = {
|
|
62
|
-
chunks: [], byteLength: 0, closed: false, peerClosed: false,
|
|
66
|
+
chunks: [], byteLength: 0, closed: false, peerClosed: false, nonblocking: Boolean(type & NONBLOCK),
|
|
63
67
|
};
|
|
64
68
|
const right = {
|
|
65
|
-
chunks: [], byteLength: 0, closed: false, peerClosed: false,
|
|
69
|
+
chunks: [], byteLength: 0, closed: false, peerClosed: false, nonblocking: Boolean(type & NONBLOCK),
|
|
66
70
|
};
|
|
67
71
|
left.peer = right;
|
|
68
72
|
right.peer = left;
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
return this.installPair(pointer, type, this.endpoint(left), this.endpoint(right));
|
|
74
|
+
}
|
|
75
|
+
/** Linux pair creation: no descriptor or endpoint survives a failed allocation. */
|
|
76
|
+
installPair(pointer, flags, left, right) {
|
|
77
|
+
let leftFd, rightFd;
|
|
78
|
+
try {
|
|
79
|
+
leftFd = this.descriptors.allocateSpecial(left);
|
|
80
|
+
rightFd = this.descriptors.allocateSpecial(right);
|
|
81
|
+
if (flags & CLOEXEC) {
|
|
82
|
+
this.descriptors.descriptors.entries[leftFd].flags = 1;
|
|
83
|
+
this.descriptors.descriptors.entries[rightFd].flags = 1;
|
|
84
|
+
}
|
|
85
|
+
const view = new DataView(this.memory().buffer);
|
|
86
|
+
view.setInt32(pointer, leftFd, true);
|
|
87
|
+
view.setInt32(pointer + 4, rightFd, true);
|
|
88
|
+
return 0n;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
if (leftFd === undefined)
|
|
92
|
+
left.close?.();
|
|
93
|
+
else
|
|
94
|
+
this.descriptors.descriptors.close(leftFd);
|
|
95
|
+
if (rightFd === undefined)
|
|
96
|
+
right.close?.();
|
|
97
|
+
else
|
|
98
|
+
this.descriptors.descriptors.close(rightFd);
|
|
99
|
+
if (error instanceof Error && error.message === "EMFILE")
|
|
100
|
+
return -24n;
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
75
103
|
}
|
|
76
104
|
endpoint(state) {
|
|
77
105
|
return {
|
|
78
106
|
read: (length) => readSocket(state, length),
|
|
79
107
|
write: (value) => writeSocket(state, value),
|
|
80
108
|
poll: (events) => pollSocket(state, events),
|
|
81
|
-
fcntl: (command
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
109
|
+
fcntl: (command, argument) => {
|
|
110
|
+
if (command === 3)
|
|
111
|
+
return BigInt(2 | (state.nonblocking ? NONBLOCK : 0));
|
|
112
|
+
if (command === 4) {
|
|
113
|
+
state.nonblocking = Boolean(argument & NONBLOCK);
|
|
114
|
+
return 0n;
|
|
115
|
+
}
|
|
116
|
+
return [1, 2].includes(command) ? 0n : -22n;
|
|
86
117
|
},
|
|
87
118
|
close: () => {
|
|
88
|
-
state.
|
|
89
|
-
if (state.references > 0 || state.closed)
|
|
119
|
+
if (state.closed)
|
|
90
120
|
return;
|
|
91
121
|
state.closed = true;
|
|
122
|
+
state.chunks = [];
|
|
123
|
+
state.byteLength = 0;
|
|
92
124
|
if (state.peer)
|
|
93
125
|
state.peer.peerClosed = true;
|
|
94
126
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-sockets.js","sourceRoot":"","sources":["../src/local-sockets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAA8B,MAAM,iBAAiB,CAAC;AAEtF,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,
|
|
1
|
+
{"version":3,"file":"local-sockets.js","sourceRoot":"","sources":["../src/local-sockets.ts"],"names":[],"mappings":"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"}
|
package/dist/memory.d.ts
CHANGED
|
@@ -41,6 +41,9 @@ export declare class WaliMemoryManager {
|
|
|
41
41
|
private mmap;
|
|
42
42
|
private mprotect;
|
|
43
43
|
private munmap;
|
|
44
|
+
private unmapSpanningRange;
|
|
45
|
+
private releaseUnknownRange;
|
|
46
|
+
private removeMappingRange;
|
|
44
47
|
/**
|
|
45
48
|
* Zero a range about to be handed out, and only the part of it that has
|
|
46
49
|
* been handed out before. Memory the wasm module grows into is already
|
package/dist/memory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAgEpD,UAAU,aAAa;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA0CD,MAAM,WAAW,kBAAkB;IAAG,QAAQ,EAAE,aAAa,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAA;CAAE;AAE/F,wBAAgB,4BAA4B,IAAI,iBAAiB,CAGhE;AAED,wBAAgB,0BAA0B,IAAI,iBAAiB,CAE9D;AAED,qBAAa,iBAAiB;IAM1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAEzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IAEjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB,mFAAmF;IACnF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAb/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAa;IAC5C,OAAO,CAAC,oBAAoB,CAAS;gBAGlB,MAAM,EAAE,MAAM,WAAW,CAAC,MAAM,EAChC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,EACjG,gBAAgB,CAAC,EAAE,iBAAiB,EACnB,OAAO,CAAC,GAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,aAAA,EAC5C,eAAe,CAAC,GAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,KAAK,OAAO,aAAA,EAC9F,kBAAkB,CAAC,EAAE,iBAAiB,EACrB,MAAM,CAAC,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,aAAA;IACnD,mFAAmF;IAClE,WAAW,CAAC,GAAE,MAAM,MAAM,aAAA;IAc7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IAExD,gBAAgB,IAAI,iBAAiB;IAKrC,YAAY,IAAI,kBAAkB;IAKlC,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAK/C,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAgB5C,OAAO,CAAC,GAAG;IAoBX,OAAO,CAAC,IAAI;IAmEZ,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
|
package/dist/memory.js
CHANGED
|
@@ -303,12 +303,7 @@ export class WaliMemoryManager {
|
|
|
303
303
|
// than released under it. Retaining every unknown range instead leaked the
|
|
304
304
|
// address space of every cross-thread free until the 4 GiB ceiling.
|
|
305
305
|
if (!mapping) {
|
|
306
|
-
|
|
307
|
-
this.noteRetainedMunmap(end - address);
|
|
308
|
-
return 0n;
|
|
309
|
-
}
|
|
310
|
-
this.release(address, end);
|
|
311
|
-
return 0n;
|
|
306
|
+
return this.unmapSpanningRange(address, end);
|
|
312
307
|
}
|
|
313
308
|
if (mapping.registrySlot !== undefined) {
|
|
314
309
|
if (address !== mapping.start || end !== mapping.end)
|
|
@@ -325,6 +320,68 @@ export class WaliMemoryManager {
|
|
|
325
320
|
}
|
|
326
321
|
if (mapping.shared && !this.flushMapping(mapping, address, end))
|
|
327
322
|
return -EIO;
|
|
323
|
+
this.removeMappingRange(mapping, address, end);
|
|
324
|
+
// No zeroing here: the next mmap of these bytes zeroes them (`zeroForHandout`),
|
|
325
|
+
// and zeroing on both sides doubled the cost of every large free.
|
|
326
|
+
this.release(address, end);
|
|
327
|
+
return 0n;
|
|
328
|
+
}
|
|
329
|
+
unmapSpanningRange(address, end) {
|
|
330
|
+
const overlaps = [...this.mappings]
|
|
331
|
+
.filter(mapping => mapping.start < end && mapping.end > address)
|
|
332
|
+
.sort((left, right) => left.start - right.start);
|
|
333
|
+
// Keep partial registry mappings' existing refusal. Validate the whole
|
|
334
|
+
// request before changing records, even when earlier pieces are ordinary
|
|
335
|
+
// anonymous maps. Registry-backed aliases cannot yet be split safely.
|
|
336
|
+
for (const mapping of overlaps) {
|
|
337
|
+
if (mapping.registrySlot !== undefined
|
|
338
|
+
&& (address > mapping.start || end < mapping.end))
|
|
339
|
+
return -EINVAL;
|
|
340
|
+
}
|
|
341
|
+
for (const mapping of overlaps) {
|
|
342
|
+
if (mapping.shared && (mapping.registrySlot !== undefined || mapping.references === 1)
|
|
343
|
+
&& !this.flushMapping(mapping, Math.max(address, mapping.start), Math.min(end, mapping.end)))
|
|
344
|
+
return -EIO;
|
|
345
|
+
}
|
|
346
|
+
const retained = [];
|
|
347
|
+
for (const mapping of overlaps) {
|
|
348
|
+
const start = Math.max(address, mapping.start);
|
|
349
|
+
const stop = Math.min(end, mapping.end);
|
|
350
|
+
if (mapping.registrySlot !== undefined) {
|
|
351
|
+
this.releaseSharedMapping(mapping.registrySlot);
|
|
352
|
+
this.mappings.remove(mapping);
|
|
353
|
+
// The registry caches this address for future claims, even after its
|
|
354
|
+
// last reference closes; it must not enter the anonymous free list.
|
|
355
|
+
retained.push({ start, end: stop });
|
|
356
|
+
}
|
|
357
|
+
else if (mapping.shared && mapping.references > 1) {
|
|
358
|
+
mapping.references -= 1;
|
|
359
|
+
retained.push({ start, end: stop });
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
this.removeMappingRange(mapping, start, stop);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// Remove all local records before making any pages reusable. Gaps in the
|
|
366
|
+
// request are harmless, but a live shared alias keeps its pages reserved.
|
|
367
|
+
// Coalescing retained intersections also protects overlapping records.
|
|
368
|
+
let cursor = address;
|
|
369
|
+
for (const range of retained) {
|
|
370
|
+
if (range.start > cursor)
|
|
371
|
+
this.releaseUnknownRange(cursor, range.start);
|
|
372
|
+
cursor = Math.max(cursor, range.end);
|
|
373
|
+
}
|
|
374
|
+
if (cursor < end)
|
|
375
|
+
this.releaseUnknownRange(cursor, end);
|
|
376
|
+
return 0n;
|
|
377
|
+
}
|
|
378
|
+
releaseUnknownRange(start, end) {
|
|
379
|
+
if (this.sharedRegistryCovers(start, end))
|
|
380
|
+
this.noteRetainedMunmap(end - start);
|
|
381
|
+
else
|
|
382
|
+
this.release(start, end);
|
|
383
|
+
}
|
|
384
|
+
removeMappingRange(mapping, address, end) {
|
|
328
385
|
// A partial unmap keeps the remainder on record, so a later unmap of the
|
|
329
386
|
// rest is still this thread's own mapping and not an unknown range.
|
|
330
387
|
if (address === mapping.start && end === mapping.end) {
|
|
@@ -341,10 +398,6 @@ export class WaliMemoryManager {
|
|
|
341
398
|
this.mappings.add({ ...mapping, start: end, fileOffset: mapping.fileOffset + (end - mapping.start) });
|
|
342
399
|
mapping.end = address;
|
|
343
400
|
}
|
|
344
|
-
// No zeroing here: the next mmap of these bytes zeroes them (`zeroForHandout`),
|
|
345
|
-
// and zeroing on both sides doubled the cost of every large free.
|
|
346
|
-
this.release(address, end);
|
|
347
|
-
return 0n;
|
|
348
401
|
}
|
|
349
402
|
/**
|
|
350
403
|
* Zero a range about to be handed out, and only the part of it that has
|