@ai-ecoverse/slicc-kernel 1.98.4 → 1.99.1

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.
@@ -2364,6 +2364,15 @@ var init_live_vfs_fs = __esm({
2364
2364
  });
2365
2365
 
2366
2366
  // src/realm/emscripten-vfs-hook.ts
2367
+ function kernelDevDirs(bridge) {
2368
+ return KERNEL_DEV_DIRS.filter((dir) => {
2369
+ try {
2370
+ return bridge.stat(dir).isDirectory;
2371
+ } catch {
2372
+ return false;
2373
+ }
2374
+ });
2375
+ }
2367
2376
  function topLevelDirs(bridge, warn) {
2368
2377
  let names;
2369
2378
  try {
@@ -2402,7 +2411,12 @@ function linuxRmdir(Fs) {
2402
2411
  function mountVfsIntoEmscripten(Fs, deps) {
2403
2412
  const { bridge, warn } = deps;
2404
2413
  const dirs = topLevelDirs(bridge, warn);
2405
- const { plugin, mounted } = mountLiveVfsDirs(Fs, bridge, dirs ?? [], warn);
2414
+ const { plugin, mounted } = mountLiveVfsDirs(
2415
+ Fs,
2416
+ bridge,
2417
+ [...dirs ?? [], ...kernelDevDirs(bridge)],
2418
+ warn
2419
+ );
2406
2420
  if (dirs) liveRoot(Fs, bridge);
2407
2421
  if (bridge.owners && Fs.lookupPath) useLiveChown(Fs);
2408
2422
  if (bridge.links && Fs.lookupPath) readingLinks(Fs);
@@ -2420,18 +2434,23 @@ function mountVfsIntoEmscripten(Fs, deps) {
2420
2434
  invalidate: () => invalidateLiveVfs(Fs, plugin)
2421
2435
  };
2422
2436
  }
2423
- var MODULE_OWNED_DIRS, SYNTHETIC_DIRS;
2437
+ var MODULE_OWNED_DIRS, SYNTHETIC_DIRS, KERNEL_DEV_DIRS;
2424
2438
  var init_emscripten_vfs_hook = __esm({
2425
2439
  "src/realm/emscripten-vfs-hook.ts"() {
2426
2440
  "use strict";
2427
2441
  init_live_vfs_fs();
2428
2442
  MODULE_OWNED_DIRS = /* @__PURE__ */ new Set(["dev", "proc"]);
2429
2443
  SYNTHETIC_DIRS = ["/usr", "/bin"];
2444
+ KERNEL_DEV_DIRS = ["/dev/shm"];
2430
2445
  }
2431
2446
  });
2432
2447
 
2433
2448
  // src/fs/dev-removal.ts
2449
+ function inShm(path) {
2450
+ return path === SHM || path.startsWith(`${SHM}/`);
2451
+ }
2434
2452
  function inDevTree(path) {
2453
+ if (path.startsWith(`${SHM}/`)) return false;
2435
2454
  return path === "/dev" || path.startsWith("/dev/");
2436
2455
  }
2437
2456
  function devRemoval(path, cred) {
@@ -2439,9 +2458,11 @@ function devRemoval(path, cred) {
2439
2458
  if (cred && cred.euid !== 0) return "EACCES";
2440
2459
  return path === "/dev" ? "EBUSY" : "EPERM";
2441
2460
  }
2461
+ var SHM;
2442
2462
  var init_dev_removal = __esm({
2443
2463
  "src/fs/dev-removal.ts"() {
2444
2464
  "use strict";
2465
+ SHM = "/dev/shm";
2445
2466
  }
2446
2467
  });
2447
2468
 
@@ -2454,7 +2475,7 @@ var KERNEL_VERSION, OS_RELEASE;
2454
2475
  var init_version = __esm({
2455
2476
  "src/version.ts"() {
2456
2477
  "use strict";
2457
- KERNEL_VERSION = true ? "1.98.4" : "0.0.0-dev";
2478
+ KERNEL_VERSION = true ? "1.99.1" : "0.0.0-dev";
2458
2479
  OS_RELEASE = "6.0.0-slicc";
2459
2480
  }
2460
2481
  });
@@ -6644,6 +6665,57 @@ var init_wasi_files = __esm({
6644
6665
  }
6645
6666
  });
6646
6667
 
6668
+ // src/process/wasi/slicc-sem.ts
6669
+ function remainingMs(deadline, now) {
6670
+ if (deadline <= now) return 0;
6671
+ return Number((deadline - now + NS_PER_MS - 1n) / NS_PER_MS);
6672
+ }
6673
+ function semImports(host) {
6674
+ const { mem } = host;
6675
+ const call2 = (req) => host.o.kernel.call(req);
6676
+ const name2 = (ptr, len) => mem.string(ptr, len);
6677
+ return {
6678
+ sem_open: (np, nl, oflag, mode, value2, out) => {
6679
+ const handle = call2({
6680
+ op: "sem-open",
6681
+ name: name2(np, nl),
6682
+ create: (oflag & SEM_CREAT) !== 0,
6683
+ exclusive: (oflag & SEM_EXCL) !== 0,
6684
+ mode,
6685
+ value: value2
6686
+ });
6687
+ mem.view().setUint32(out, handle, true);
6688
+ },
6689
+ sem_close: (handle) => void call2({ op: "sem-close", handle }),
6690
+ sem_unlink: (np, nl) => void call2({ op: "sem-unlink", name: name2(np, nl) }),
6691
+ sem_post: (handle) => void call2({ op: "sem-post", handle }),
6692
+ sem_wait: (handle, how, clock, deadline) => {
6693
+ const kind = HOW[how];
6694
+ if (!kind) throw new WasiError("EINVAL");
6695
+ let timeoutMs2 = -1;
6696
+ if (kind === "timed") {
6697
+ if (deadline < 0n) throw new WasiError("EINVAL");
6698
+ if (clock !== CLOCK.REALTIME && clock !== CLOCK.MONOTONIC) throw new WasiError("EINVAL");
6699
+ timeoutMs2 = remainingMs(deadline, host.now(clock));
6700
+ }
6701
+ call2({ op: "sem-wait", handle, how: kind, timeoutMs: timeoutMs2 });
6702
+ },
6703
+ sem_getvalue: (handle, out) => void mem.view().setInt32(out, call2({ op: "sem-getvalue", handle }), true)
6704
+ };
6705
+ }
6706
+ var SEM_CREAT, SEM_EXCL, HOW, NS_PER_MS;
6707
+ var init_slicc_sem = __esm({
6708
+ "src/process/wasi/slicc-sem.ts"() {
6709
+ "use strict";
6710
+ init_wasi_abi();
6711
+ init_wasi_files();
6712
+ SEM_CREAT = 1;
6713
+ SEM_EXCL = 2;
6714
+ HOW = ["block", "try", "timed"];
6715
+ NS_PER_MS = 1000000n;
6716
+ }
6717
+ });
6718
+
6647
6719
  // src/kernel/pipe.ts
6648
6720
  var PIPE_CAPACITY;
6649
6721
  var init_pipe = __esm({
@@ -8099,7 +8171,7 @@ function filestatOf(path, s) {
8099
8171
  size: BigInt(s.size),
8100
8172
  ino: s.ino !== void 0 ? BigInt(s.ino) : pathInode(path),
8101
8173
  ...s.nlink !== void 0 ? { nlink: BigInt(s.nlink) } : {},
8102
- mtimeNs: BigInt(Math.round(s.mtimeMs ?? 0)) * NS_PER_MS
8174
+ mtimeNs: BigInt(Math.round(s.mtimeMs ?? 0)) * NS_PER_MS2
8103
8175
  };
8104
8176
  }
8105
8177
  function kernelFiletype(kind) {
@@ -8149,7 +8221,7 @@ function wrap(table) {
8149
8221
  }
8150
8222
  return out;
8151
8223
  }
8152
- var WasiExit, IDS, NS_PER_MS, AT_SYMLINK_NOFOLLOW2, AT_EACCESS2, ROOT_IDS, GONE, S_IFIFO, DEFAULT_UMASK, MONOTONIC_BASE, MAX_READ, SIGPIPE_EXIT, SIG_IGN, SEALED_MODE, WasiHost;
8224
+ var WasiExit, IDS, NS_PER_MS2, AT_SYMLINK_NOFOLLOW2, AT_EACCESS2, ROOT_IDS, GONE, S_IFIFO, DEFAULT_UMASK, MONOTONIC_BASE, MAX_READ, SIGPIPE_EXIT, SIG_IGN, SEALED_MODE, WasiHost;
8153
8225
  var init_wasi_host = __esm({
8154
8226
  "src/process/wasi/wasi-host.ts"() {
8155
8227
  "use strict";
@@ -8157,6 +8229,7 @@ var init_wasi_host = __esm({
8157
8229
  init_physical_path();
8158
8230
  init_cpu_clock();
8159
8231
  init_cred();
8232
+ init_slicc_sem();
8160
8233
  init_wasi_abi();
8161
8234
  init_wasi_fds();
8162
8235
  init_wasi_files();
@@ -8172,14 +8245,14 @@ var init_wasi_host = __esm({
8172
8245
  }
8173
8246
  };
8174
8247
  IDS = ["ruid", "euid", "suid", "rgid", "egid", "sgid"];
8175
- NS_PER_MS = 1000000n;
8248
+ NS_PER_MS2 = 1000000n;
8176
8249
  AT_SYMLINK_NOFOLLOW2 = 1;
8177
8250
  AT_EACCESS2 = 2;
8178
8251
  ROOT_IDS = Object.freeze({ uid: 0, gid: 0 });
8179
8252
  GONE = /* @__PURE__ */ new Set(["ENOENT", "ENOTDIR"]);
8180
8253
  S_IFIFO = 4096;
8181
8254
  DEFAULT_UMASK = 18;
8182
- MONOTONIC_BASE = BigInt(Math.round(performance.timeOrigin)) * NS_PER_MS;
8255
+ MONOTONIC_BASE = BigInt(Math.round(performance.timeOrigin)) * NS_PER_MS2;
8183
8256
  MAX_READ = 1024 * 1024;
8184
8257
  SIGPIPE_EXIT = 141;
8185
8258
  SIG_IGN = 1;
@@ -8377,6 +8450,7 @@ var init_wasi_host = __esm({
8377
8450
  });
8378
8451
  void this.o.kernel.call({ op: "proc-setcred", change });
8379
8452
  },
8453
+ ...semImports(this),
8380
8454
  groups_get: (buf, cap, count) => {
8381
8455
  const { groups } = this.o.kernel.call({ op: "proc-cred" });
8382
8456
  if (cap !== 0 && cap < groups.length) throw new WasiError("EINVAL");
@@ -8467,7 +8541,7 @@ var init_wasi_host = __esm({
8467
8541
  return this.cache;
8468
8542
  }
8469
8543
  now(id) {
8470
- if (id === CLOCK.REALTIME) return BigInt(Date.now()) * NS_PER_MS;
8544
+ if (id === CLOCK.REALTIME) return BigInt(Date.now()) * NS_PER_MS2;
8471
8545
  if (id === CLOCK.MONOTONIC) {
8472
8546
  return MONOTONIC_BASE + BigInt(Math.round(performance.now() * 1e6));
8473
8547
  }
@@ -8976,7 +9050,7 @@ var init_wasi_host = __esm({
8976
9050
  current ??= statOf(path);
8977
9051
  return current[field2] ?? current.mtimeMs ?? now;
8978
9052
  };
8979
- const pick = (set, setNow, value2, field2) => flags & setNow ? now : flags & set ? Number(value2 / NS_PER_MS) : kept(field2);
9053
+ const pick = (set, setNow, value2, field2) => flags & setNow ? now : flags & set ? Number(value2 / NS_PER_MS2) : kept(field2);
8980
9054
  (follow2 ? this.o.fs.utimes : this.o.fs.lutimes).call(
8981
9055
  this.o.fs,
8982
9056
  path,
@@ -10362,7 +10436,7 @@ var init_wasix_fork = __esm({
10362
10436
  function timeoutMs(ns) {
10363
10437
  const value2 = BigInt.asUintN(64, ns);
10364
10438
  if (value2 === FOREVER) return -1;
10365
- const ms = (value2 + NS_PER_MS2 - 1n) / NS_PER_MS2;
10439
+ const ms = (value2 + NS_PER_MS3 - 1n) / NS_PER_MS3;
10366
10440
  return ms > BigInt(MAX_TIMEOUT_MS) ? -1 : Number(ms);
10367
10441
  }
10368
10442
  function wasixEpollImports(host) {
@@ -10423,7 +10497,7 @@ function wasixEpollImports(host) {
10423
10497
  }
10424
10498
  };
10425
10499
  }
10426
- var EVENT_SIZE, DATA_OFFSET, DATA_SIZE, MAX_EVENTS, FOREVER, MAX_TIMEOUT_MS, NS_PER_MS2, EVENTFD_SEMAPHORE, EVENTFD_NONBLOCK, EVENTFD_MAX, OPS;
10500
+ var EVENT_SIZE, DATA_OFFSET, DATA_SIZE, MAX_EVENTS, FOREVER, MAX_TIMEOUT_MS, NS_PER_MS3, EVENTFD_SEMAPHORE, EVENTFD_NONBLOCK, EVENTFD_MAX, OPS;
10427
10501
  var init_wasix_epoll = __esm({
10428
10502
  "src/process/wasi/wasix-epoll.ts"() {
10429
10503
  "use strict";
@@ -10435,7 +10509,7 @@ var init_wasix_epoll = __esm({
10435
10509
  MAX_EVENTS = 4096;
10436
10510
  FOREVER = 0xffffffffffffffffn;
10437
10511
  MAX_TIMEOUT_MS = 2147483647;
10438
- NS_PER_MS2 = 1000000n;
10512
+ NS_PER_MS3 = 1000000n;
10439
10513
  EVENTFD_SEMAPHORE = 1;
10440
10514
  EVENTFD_NONBLOCK = 4;
10441
10515
  EVENTFD_MAX = 0xfffffffffffffffen;
@@ -13076,7 +13150,7 @@ var init_js_io = __esm({
13076
13150
 
13077
13151
  // src/process/js/js-dev.ts
13078
13152
  function inDev(abs) {
13079
- return abs.startsWith("/dev") && (abs.length === 4 || abs[4] === "/");
13153
+ return abs.startsWith("/dev") && (abs.length === 4 || abs[4] === "/") && !inShm(abs);
13080
13154
  }
13081
13155
  function missing(path) {
13082
13156
  throw new JsCallError("ENOENT", path);
@@ -13217,7 +13291,7 @@ function* devReaddir(abs) {
13217
13291
  if (node.kind !== "dir") throw new JsCallError("ENOTDIR", abs);
13218
13292
  const names = yield { op: "fd-tty-names" };
13219
13293
  const ttys = names.filter((n) => /^\/dev\/tty\d+$/.test(n)).map((n) => n.slice(5));
13220
- return [...DEVICES2, "clipboard", "sealed", "tty", "fd", "pts", ...STDIO3, ...ttys].sort();
13294
+ return [...DEVICES2, "clipboard", "sealed", "tty", "fd", "pts", "shm", ...STDIO3, ...ttys].sort();
13221
13295
  }
13222
13296
  function* aliasOf(fd, abs, o) {
13223
13297
  const info = yield* fdInfo(fd, abs);
@@ -13428,6 +13502,7 @@ var DEV_READ_MAX, DEVICES2, STDIO3, SELF_FD, S_IFMT2, DIR, LINK, CHAR, BORN, CHA
13428
13502
  var init_js_dev = __esm({
13429
13503
  "src/process/js/js-dev.ts"() {
13430
13504
  "use strict";
13505
+ init_dev_removal();
13431
13506
  init_sync_fs_wire();
13432
13507
  init_js_io();
13433
13508
  init_js_kernel();