@ai-ecoverse/slicc-kernel 1.66.1 → 1.67.0

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.
@@ -101,6 +101,127 @@ var init_lockdown = __esm({
101
101
  }
102
102
  });
103
103
 
104
+ // src/realm/sync-sab-wire.ts
105
+ function loadU53(header, lo, hi) {
106
+ return (Atomics.load(header, lo) >>> 0) + Atomics.load(header, hi) * U32;
107
+ }
108
+ function publishMemory(sab, bytes) {
109
+ if (bytes > 0)
110
+ Atomics.store(new Int32Array(sab, 0, SAB_HEADER_I32), SAB_I_MEMORY, Math.ceil(bytes / 65536));
111
+ }
112
+ function decodeSabResult(status2, payload) {
113
+ switch (status2) {
114
+ case SAB_STATUS_BYTES:
115
+ return { ok: true, kind: "bytes", bytes: payload };
116
+ case SAB_STATUS_VOID:
117
+ return { ok: true, kind: "void" };
118
+ case SAB_STATUS_JSON: {
119
+ try {
120
+ return { ok: true, kind: "json", json: JSON.parse(decoder.decode(payload)) };
121
+ } catch {
122
+ return { ok: false, errno: "EIO", message: "sync-sab: malformed json payload" };
123
+ }
124
+ }
125
+ case SAB_STATUS_ERRNO: {
126
+ try {
127
+ const parsed = JSON.parse(decoder.decode(payload));
128
+ const errno2 = typeof parsed.errno === "string" && /^E[A-Z]+$|^EAI_[A-Z]+$/.test(parsed.errno) ? parsed.errno : "EIO";
129
+ return { ok: false, errno: errno2, message: String(parsed.message ?? errno2) };
130
+ } catch {
131
+ return { ok: false, errno: "EIO", message: "sync-sab: malformed errno payload" };
132
+ }
133
+ }
134
+ default:
135
+ return { ok: false, errno: "EIO", message: `sync-sab: unknown status ${status2}` };
136
+ }
137
+ }
138
+ function sabViews(sab) {
139
+ if (sab.byteLength < SAB_MIN_BYTES) {
140
+ throw new Error(`sync-sab: buffer too small (${sab.byteLength} < ${SAB_MIN_BYTES})`);
141
+ }
142
+ return {
143
+ header: new Int32Array(sab, 0, SAB_HEADER_I32),
144
+ window: new Uint8Array(sab, SAB_HEADER_BYTES)
145
+ };
146
+ }
147
+ var SAB_HEADER_I32, SAB_CLOCK_OFFSET, SAB_CLOCK_I64, SAB_HEADER_BYTES, SAB_I_STATE, SAB_I_SEQ, SAB_I_STATUS, SAB_I_TOTAL, SAB_I_CHUNK, SAB_I_OFFSET, SAB_I_REQ, SAB_I_PUB, SAB_I_SIGNALS, SAB_I_TIMERS, SAB_I_MEMORY, SAB_I_TOTAL_HI, SAB_I_OFFSET_HI, SAB_I_KILLED, SAB_I_ASYNC, SAB_I_STOP, U32, SAB_STATE_IDLE, SAB_STATE_PENDING, SAB_STATE_READY, SAB_STATUS_BYTES, SAB_STATUS_JSON, SAB_STATUS_VOID, SAB_STATUS_ERRNO, SAB_DEFAULT_WINDOW_BYTES, SAB_MIN_BYTES, SYNC_SAB_REQ_MSG, SYNC_SAB_NEXT_MSG, encoder, decoder;
148
+ var init_sync_sab_wire = __esm({
149
+ "src/realm/sync-sab-wire.ts"() {
150
+ "use strict";
151
+ SAB_HEADER_I32 = 16;
152
+ SAB_CLOCK_OFFSET = SAB_HEADER_I32 * 4;
153
+ SAB_CLOCK_I64 = 3;
154
+ SAB_HEADER_BYTES = SAB_CLOCK_OFFSET + SAB_CLOCK_I64 * 8;
155
+ SAB_I_STATE = 0;
156
+ SAB_I_SEQ = 1;
157
+ SAB_I_STATUS = 2;
158
+ SAB_I_TOTAL = 3;
159
+ SAB_I_CHUNK = 4;
160
+ SAB_I_OFFSET = 5;
161
+ SAB_I_REQ = 6;
162
+ SAB_I_PUB = 7;
163
+ SAB_I_SIGNALS = 8;
164
+ SAB_I_TIMERS = 9;
165
+ SAB_I_MEMORY = 10;
166
+ SAB_I_TOTAL_HI = 11;
167
+ SAB_I_OFFSET_HI = 12;
168
+ SAB_I_KILLED = 13;
169
+ SAB_I_ASYNC = 14;
170
+ SAB_I_STOP = 15;
171
+ U32 = 2 ** 32;
172
+ SAB_STATE_IDLE = 0;
173
+ SAB_STATE_PENDING = 1;
174
+ SAB_STATE_READY = 2;
175
+ SAB_STATUS_BYTES = 1;
176
+ SAB_STATUS_JSON = 2;
177
+ SAB_STATUS_VOID = 3;
178
+ SAB_STATUS_ERRNO = 4;
179
+ SAB_DEFAULT_WINDOW_BYTES = 1024 * 1024;
180
+ SAB_MIN_BYTES = SAB_HEADER_BYTES + 4096;
181
+ SYNC_SAB_REQ_MSG = "sync-sab-req";
182
+ SYNC_SAB_NEXT_MSG = "sync-sab-next";
183
+ encoder = new TextEncoder();
184
+ decoder = new TextDecoder();
185
+ }
186
+ });
187
+
188
+ // src/kernel/cpu-clock.ts
189
+ function epochMicros() {
190
+ return Math.floor((performance.timeOrigin + performance.now()) * 1e3);
191
+ }
192
+ function slots(sab) {
193
+ return new BigInt64Array(sab, LOCAL, SAB_CLOCK_I64);
194
+ }
195
+ function useLocalClock(sab) {
196
+ local = sab && sab.byteLength >= LOCAL + SAB_CLOCK_I64 * 8 ? slots(sab) : void 0;
197
+ if (!local) return;
198
+ const wait2 = (typed, index3, value2, timeout) => localWait(() => rawWait(typed, index3, value2, timeout));
199
+ Atomics.wait = wait2;
200
+ }
201
+ function localWait(wait2) {
202
+ const clock = local;
203
+ if (!clock) return wait2();
204
+ const start2 = BigInt(epochMicros());
205
+ const idle = Atomics.load(clock, IDLE);
206
+ Atomics.store(clock, IDLE, idle - start2);
207
+ try {
208
+ return wait2();
209
+ } finally {
210
+ const end = BigInt(epochMicros());
211
+ Atomics.store(clock, IDLE, idle + (end > start2 ? end - start2 : 0n));
212
+ }
213
+ }
214
+ var LOCAL, IDLE, local, rawWait;
215
+ var init_cpu_clock = __esm({
216
+ "src/kernel/cpu-clock.ts"() {
217
+ "use strict";
218
+ init_sync_sab_wire();
219
+ LOCAL = SAB_CLOCK_OFFSET;
220
+ IDLE = 1;
221
+ rawWait = Atomics.wait.bind(Atomics);
222
+ }
223
+ });
224
+
104
225
  // src/kernel/protocol.ts
105
226
  var WASM_PROCESS_INIT, WASM_PROCESS_EXIT, WASM_PROCESS_ERROR, WASM_THREAD_SPAWN, WASM_THREAD_INIT, WASM_THREAD_EXIT, WASM_MAX_THREADS, WASM_DEFAULT_THREADS;
106
227
  var init_protocol = __esm({
@@ -1625,93 +1746,11 @@ var init_emscripten_vfs_hook = __esm({
1625
1746
  }
1626
1747
  });
1627
1748
 
1628
- // src/realm/sync-sab-wire.ts
1629
- function loadU53(header, lo, hi) {
1630
- return (Atomics.load(header, lo) >>> 0) + Atomics.load(header, hi) * U32;
1631
- }
1632
- function publishMemory(sab, bytes) {
1633
- if (bytes > 0)
1634
- Atomics.store(new Int32Array(sab, 0, SAB_HEADER_I32), SAB_I_MEMORY, Math.ceil(bytes / 65536));
1635
- }
1636
- function decodeSabResult(status2, payload) {
1637
- switch (status2) {
1638
- case SAB_STATUS_BYTES:
1639
- return { ok: true, kind: "bytes", bytes: payload };
1640
- case SAB_STATUS_VOID:
1641
- return { ok: true, kind: "void" };
1642
- case SAB_STATUS_JSON: {
1643
- try {
1644
- return { ok: true, kind: "json", json: JSON.parse(decoder.decode(payload)) };
1645
- } catch {
1646
- return { ok: false, errno: "EIO", message: "sync-sab: malformed json payload" };
1647
- }
1648
- }
1649
- case SAB_STATUS_ERRNO: {
1650
- try {
1651
- const parsed = JSON.parse(decoder.decode(payload));
1652
- const errno2 = typeof parsed.errno === "string" && /^E[A-Z]+$|^EAI_[A-Z]+$/.test(parsed.errno) ? parsed.errno : "EIO";
1653
- return { ok: false, errno: errno2, message: String(parsed.message ?? errno2) };
1654
- } catch {
1655
- return { ok: false, errno: "EIO", message: "sync-sab: malformed errno payload" };
1656
- }
1657
- }
1658
- default:
1659
- return { ok: false, errno: "EIO", message: `sync-sab: unknown status ${status2}` };
1660
- }
1661
- }
1662
- function sabViews(sab) {
1663
- if (sab.byteLength < SAB_MIN_BYTES) {
1664
- throw new Error(`sync-sab: buffer too small (${sab.byteLength} < ${SAB_MIN_BYTES})`);
1665
- }
1666
- return {
1667
- header: new Int32Array(sab, 0, SAB_HEADER_I32),
1668
- window: new Uint8Array(sab, SAB_HEADER_BYTES)
1669
- };
1670
- }
1671
- var SAB_HEADER_I32, SAB_HEADER_BYTES, SAB_I_STATE, SAB_I_SEQ, SAB_I_STATUS, SAB_I_TOTAL, SAB_I_CHUNK, SAB_I_OFFSET, SAB_I_REQ, SAB_I_PUB, SAB_I_SIGNALS, SAB_I_TIMERS, SAB_I_MEMORY, SAB_I_TOTAL_HI, SAB_I_OFFSET_HI, SAB_I_KILLED, SAB_I_ASYNC, SAB_I_STOP, U32, SAB_STATE_IDLE, SAB_STATE_PENDING, SAB_STATE_READY, SAB_STATUS_BYTES, SAB_STATUS_JSON, SAB_STATUS_VOID, SAB_STATUS_ERRNO, SAB_DEFAULT_WINDOW_BYTES, SAB_MIN_BYTES, SYNC_SAB_REQ_MSG, SYNC_SAB_NEXT_MSG, encoder, decoder;
1672
- var init_sync_sab_wire = __esm({
1673
- "src/realm/sync-sab-wire.ts"() {
1674
- "use strict";
1675
- SAB_HEADER_I32 = 16;
1676
- SAB_HEADER_BYTES = SAB_HEADER_I32 * 4;
1677
- SAB_I_STATE = 0;
1678
- SAB_I_SEQ = 1;
1679
- SAB_I_STATUS = 2;
1680
- SAB_I_TOTAL = 3;
1681
- SAB_I_CHUNK = 4;
1682
- SAB_I_OFFSET = 5;
1683
- SAB_I_REQ = 6;
1684
- SAB_I_PUB = 7;
1685
- SAB_I_SIGNALS = 8;
1686
- SAB_I_TIMERS = 9;
1687
- SAB_I_MEMORY = 10;
1688
- SAB_I_TOTAL_HI = 11;
1689
- SAB_I_OFFSET_HI = 12;
1690
- SAB_I_KILLED = 13;
1691
- SAB_I_ASYNC = 14;
1692
- SAB_I_STOP = 15;
1693
- U32 = 2 ** 32;
1694
- SAB_STATE_IDLE = 0;
1695
- SAB_STATE_PENDING = 1;
1696
- SAB_STATE_READY = 2;
1697
- SAB_STATUS_BYTES = 1;
1698
- SAB_STATUS_JSON = 2;
1699
- SAB_STATUS_VOID = 3;
1700
- SAB_STATUS_ERRNO = 4;
1701
- SAB_DEFAULT_WINDOW_BYTES = 1024 * 1024;
1702
- SAB_MIN_BYTES = SAB_HEADER_BYTES + 4096;
1703
- SYNC_SAB_REQ_MSG = "sync-sab-req";
1704
- SYNC_SAB_NEXT_MSG = "sync-sab-next";
1705
- encoder = new TextEncoder();
1706
- decoder = new TextDecoder();
1707
- }
1708
- });
1709
-
1710
1749
  // src/realm/sync-sab-bridge.ts
1711
1750
  function createSyncSabTransport(sab, port2, deps = {}) {
1712
1751
  const views = sabViews(sab);
1713
1752
  const { header, window } = views;
1714
- const wait2 = deps.wait ?? ((a, i, v, t) => Atomics.wait(a, i, v, t));
1753
+ const wait2 = deps.wait ?? ((a, i, v, t) => rawWait(a, i, v, t));
1715
1754
  const now = deps.now ?? (() => performance.now());
1716
1755
  let seq = 0;
1717
1756
  function awaitReady(id, deadline, label) {
@@ -1915,6 +1954,7 @@ function createSyncFsSabBridge(transport, opts = {}) {
1915
1954
  var init_sync_sab_bridge = __esm({
1916
1955
  "src/realm/sync-sab-bridge.ts"() {
1917
1956
  "use strict";
1957
+ init_cpu_clock();
1918
1958
  init_sync_fs_wire();
1919
1959
  init_sync_sab_wire();
1920
1960
  }
@@ -3153,13 +3193,13 @@ function describeInherited(Fs, sys, streams, livePath, actions = []) {
3153
3193
  if (from) table.set(target, { stream: from.stream, cloexec: false });
3154
3194
  else table.delete(target);
3155
3195
  }
3156
- const slots2 = /* @__PURE__ */ new Map();
3196
+ const slots3 = /* @__PURE__ */ new Map();
3157
3197
  for (const [fd, { stream, cloexec }] of table) {
3158
- if (fd > 2 && !cloexec) slots2.set(fd, stream);
3198
+ if (fd > 2 && !cloexec) slots3.set(fd, stream);
3159
3199
  }
3160
3200
  const promote = vfsPromoter(Fs, sys, streams, livePath);
3161
3201
  const out = [];
3162
- for (const [fd, stream] of slots2) {
3202
+ for (const [fd, stream] of slots3) {
3163
3203
  promote(stream);
3164
3204
  const slot = inheritedSlot(fd, stream);
3165
3205
  if (slot) out.push(slot);
@@ -3358,12 +3398,12 @@ function anySelect(Fs, transport, read2, write2, timeoutMs) {
3358
3398
  const kernelRead = read2.filter((fd) => !own(fd));
3359
3399
  const kernelWrite = write2.filter((fd) => !own(fd));
3360
3400
  for (; ; ) {
3361
- const local = ownReady(Fs, read2.filter(own), write2.filter(own));
3362
- const pending = local.read.length > 0 || local.write.length > 0;
3401
+ const local2 = ownReady(Fs, read2.filter(own), write2.filter(own));
3402
+ const pending = local2.read.length > 0 || local2.write.length > 0;
3363
3403
  const slice = pending ? 0 : Math.min(SELECT_SLICE_MS, Math.max(0, deadline - Date.now()));
3364
3404
  const got = kernelSelect(Fs, transport, kernelRead, kernelWrite, slice);
3365
3405
  if (typeof got === "number") return got;
3366
- const ready = { read: [...local.read, ...got.read], write: [...local.write, ...got.write] };
3406
+ const ready = { read: [...local2.read, ...got.read], write: [...local2.write, ...got.write] };
3367
3407
  if (ready.read.length > 0 || ready.write.length > 0 || Date.now() >= deadline) {
3368
3408
  return ready;
3369
3409
  }
@@ -3902,8 +3942,8 @@ function pidStat(info, boot) {
3902
3942
  0,
3903
3943
  0,
3904
3944
  0,
3905
- 0,
3906
- 0,
3945
+ ticks(info.utime ?? 0),
3946
+ ticks(info.stime ?? 0),
3907
3947
  0,
3908
3948
  0,
3909
3949
  20,
@@ -3996,19 +4036,23 @@ function systemFile(name2, listing, now, memory) {
3996
4036
  if (name2 === "meminfo") {
3997
4037
  return memoryInfo(
3998
4038
  memory,
3999
- listing.processes.reduce((sum, p) => sum + p.memory, 0)
4039
+ listing.processes.reduce((sum2, p) => sum2 + p.memory, 0)
4000
4040
  );
4001
4041
  }
4002
4042
  const live = listing.processes.filter((p) => p.state !== "Z");
4003
4043
  if (name2 === "loadavg") {
4004
4044
  const last = Math.max(0, ...listing.processes.map((p) => p.pid));
4005
- return `0.00 0.00 0.00 1/${live.length} ${last}
4045
+ const [one, five, fifteen] = (listing.load ?? [0, 0, 0]).map((n) => n.toFixed(2));
4046
+ return `${one} ${five} ${fifteen} 1/${live.length} ${last}
4006
4047
  `;
4007
4048
  }
4008
- const idle = ticks(now - listing.boot);
4049
+ const sum = (key) => listing.cpu?.[key] ?? listing.processes.reduce((n, p) => n + (p[key] ?? 0), 0);
4050
+ const user = ticks(sum("utime"));
4051
+ const system = ticks(sum("stime"));
4052
+ const idle = listing.cpu ? ticks(listing.cpu.idle) : Math.max(0, ticks(now - listing.boot) - user - system);
4009
4053
  return [
4010
- `cpu 0 0 0 ${idle} 0 0 0 0 0 0`,
4011
- `cpu0 0 0 0 ${idle} 0 0 0 0 0 0`,
4054
+ `cpu ${user} 0 ${system} ${idle} 0 0 0 0 0 0`,
4055
+ `cpu0 ${user} 0 ${system} ${idle} 0 0 0 0 0 0`,
4012
4056
  "intr 0",
4013
4057
  "ctxt 0",
4014
4058
  `btime ${Math.floor(listing.boot / 1e3)}`,
@@ -7307,8 +7351,8 @@ var init_wasix_process = __esm({
7307
7351
  ];
7308
7352
  return { stdio, inherit, cwd, opened };
7309
7353
  }
7310
- applyFdOp(op, slots2, cwd) {
7311
- const { map, nulls, opened } = slots2;
7354
+ applyFdOp(op, slots3, cwd) {
7355
+ const { map, nulls, opened } = slots3;
7312
7356
  const { fds } = this.host;
7313
7357
  const point = (fd, kfd) => {
7314
7358
  if (kfd === void 0) {
@@ -10909,7 +10953,7 @@ function childOps(kernel, io, defaults) {
10909
10953
  const mine = [];
10910
10954
  const theirs = [];
10911
10955
  try {
10912
- const stdio = await slots(kernel, o, mine, theirs);
10956
+ const stdio = await slots2(kernel, o, mine, theirs);
10913
10957
  const pid = await kernel.json({
10914
10958
  op: "proc-spawn",
10915
10959
  file,
@@ -10938,7 +10982,7 @@ async function preflight(kernel, hows) {
10938
10982
  await kernel.json({ op: "fd-info", fd: how === "inherit" ? n : how });
10939
10983
  }
10940
10984
  }
10941
- async function slots(kernel, o, mine, theirs) {
10985
+ async function slots2(kernel, o, mine, theirs) {
10942
10986
  const hows = STDIO2.map((name2) => o[name2] ?? "inherit");
10943
10987
  await preflight(kernel, hows);
10944
10988
  const stdio = [];
@@ -11488,7 +11532,7 @@ function port(n) {
11488
11532
  function netOps(kernel, io) {
11489
11533
  const name2 = async (fd, peer) => addressOf(await kernel.json({ op: "sock-name", fd, peer }));
11490
11534
  const connection = async (fd) => {
11491
- const [local, remote] = [await name2(fd, false), await name2(fd, true)];
11535
+ const [local2, remote] = [await name2(fd, false), await name2(fd, true)];
11492
11536
  const stop = new AbortController();
11493
11537
  let closed;
11494
11538
  const close = () => {
@@ -11513,7 +11557,7 @@ function netOps(kernel, io) {
11513
11557
  close: async () => void await shut(SHUT_WR),
11514
11558
  abort: () => close()
11515
11559
  });
11516
- return { fd, local, remote, readable: readable2, writable: writable2, close };
11560
+ return { fd, local: local2, remote, readable: readable2, writable: writable2, close };
11517
11561
  };
11518
11562
  const resolve = async (host, signal) => {
11519
11563
  if (IPV4.test(host)) return host;
@@ -12630,6 +12674,7 @@ var init_js_runtime = __esm({
12630
12674
  init_lockdown();
12631
12675
 
12632
12676
  // src/process/process-entry.ts
12677
+ init_cpu_clock();
12633
12678
  init_protocol();
12634
12679
  init_process_runtime();
12635
12680
  var loadWasi = () => Promise.resolve().then(() => (init_wasi_runtime(), wasi_runtime_exports));
@@ -12667,6 +12712,8 @@ function processEntry(port2, run = runWasmProcess, wasi = loadWasi, js = loadJs,
12667
12712
  const type = data?.type;
12668
12713
  if (type !== WASM_THREAD_INIT && type !== WASM_PROCESS_INIT) return;
12669
12714
  const refusal2 = sealOnce();
12715
+ const init = data;
12716
+ if (type === WASM_THREAD_INIT || init?.program?.abi !== "js") useLocalClock(init?.sab);
12670
12717
  if (type === WASM_THREAD_INIT) {
12671
12718
  if (refusal2) return failed5(refusal2.error);
12672
12719
  wasi().then((m) => m.runWasiThread(data, port2)).catch(failed5);