@volter/browser-wali 0.1.203 → 0.1.204

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.
@@ -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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"}
@@ -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;AA+BpD,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;IAYZ,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,UAAU;IAqBlB,OAAO,CAAC,QAAQ;CAmBjB"}
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"}
@@ -1,8 +1,10 @@
1
1
  import { WaliFileDescriptorTable } from "./filesystem.js";
2
- import { closeSharedPipe, createSharedPipe, pollSharedPipe, readSharedPipe, retainSharedPipe, writeSharedPipeSync, } from "./process-bridge.js";
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 & ~0x8_0800) !== 0)
30
+ if ((flags & ~(CLOEXEC | NONBLOCK)) !== 0)
29
31
  return -22n;
30
- if (!Number.isSafeInteger(pointer) || pointer < 0 || pointer + 8 > this.memory().buffer.byteLength)
32
+ if (!Number.isSafeInteger(pointer) || pointer <= 0 || pointer + 8 > this.memory().buffer.byteLength)
31
33
  return -14n;
32
34
  const pipe = createSharedPipe();
33
- const readerFd = this.descriptors.allocateSpecial(this.pipeEndpoint(pipe.reader));
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) => command === 3 ? 0x800n : [1, 2, 4].includes(command) ? 0n : -22n,
47
- duplicate: (minimum) => {
48
- retainSharedPipe(handle);
49
- return BigInt(this.descriptors.allocateSpecial(this.pipeEndpoint(handle), minimum));
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 < 0 || pointer + 8 > this.memory().buffer.byteLength)
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, references: 1,
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, references: 1,
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
- const leftFd = this.descriptors.allocateSpecial(this.endpoint(left));
70
- const rightFd = this.descriptors.allocateSpecial(this.endpoint(right));
71
- const view = new DataView(this.memory().buffer);
72
- view.setInt32(pointer, leftFd, true);
73
- view.setInt32(pointer + 4, rightFd, true);
74
- return 0n;
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) => command === 3 ? 0x802n : [1, 2, 4].includes(command) ? 0n : -22n,
82
- duplicate: (minimum) => {
83
- const fd = this.descriptors.allocateSpecial(this.endpoint(state), minimum);
84
- state.references += 1;
85
- return BigInt(fd);
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.references -= 1;
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":"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"}
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
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
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
- if (this.sharedRegistryCovers(address, end)) {
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