@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.
@@ -1362,7 +1362,11 @@ var init_physical_path = __esm({
1362
1362
  });
1363
1363
 
1364
1364
  // src/fs/dev-removal.ts
1365
+ function inShm(path) {
1366
+ return path === SHM || path.startsWith(`${SHM}/`);
1367
+ }
1365
1368
  function inDevTree(path) {
1369
+ if (path.startsWith(`${SHM}/`)) return false;
1366
1370
  return path === "/dev" || path.startsWith("/dev/");
1367
1371
  }
1368
1372
  function devRemoval(path, cred) {
@@ -1370,9 +1374,11 @@ function devRemoval(path, cred) {
1370
1374
  if (cred && cred.euid !== 0) return "EACCES";
1371
1375
  return path === "/dev" ? "EBUSY" : "EPERM";
1372
1376
  }
1377
+ var SHM;
1373
1378
  var init_dev_removal = __esm({
1374
1379
  "src/fs/dev-removal.ts"() {
1375
1380
  "use strict";
1381
+ SHM = "/dev/shm";
1376
1382
  }
1377
1383
  });
1378
1384
 
@@ -1478,6 +1484,57 @@ var init_cred = __esm({
1478
1484
  }
1479
1485
  });
1480
1486
 
1487
+ // src/process/wasi/slicc-sem.ts
1488
+ function remainingMs(deadline, now) {
1489
+ if (deadline <= now) return 0;
1490
+ return Number((deadline - now + NS_PER_MS - 1n) / NS_PER_MS);
1491
+ }
1492
+ function semImports(host) {
1493
+ const { mem } = host;
1494
+ const call2 = (req) => host.o.kernel.call(req);
1495
+ const name2 = (ptr, len) => mem.string(ptr, len);
1496
+ return {
1497
+ sem_open: (np, nl, oflag, mode, value2, out) => {
1498
+ const handle = call2({
1499
+ op: "sem-open",
1500
+ name: name2(np, nl),
1501
+ create: (oflag & SEM_CREAT) !== 0,
1502
+ exclusive: (oflag & SEM_EXCL) !== 0,
1503
+ mode,
1504
+ value: value2
1505
+ });
1506
+ mem.view().setUint32(out, handle, true);
1507
+ },
1508
+ sem_close: (handle) => void call2({ op: "sem-close", handle }),
1509
+ sem_unlink: (np, nl) => void call2({ op: "sem-unlink", name: name2(np, nl) }),
1510
+ sem_post: (handle) => void call2({ op: "sem-post", handle }),
1511
+ sem_wait: (handle, how, clock, deadline) => {
1512
+ const kind = HOW[how];
1513
+ if (!kind) throw new WasiError("EINVAL");
1514
+ let timeoutMs2 = -1;
1515
+ if (kind === "timed") {
1516
+ if (deadline < 0n) throw new WasiError("EINVAL");
1517
+ if (clock !== CLOCK.REALTIME && clock !== CLOCK.MONOTONIC) throw new WasiError("EINVAL");
1518
+ timeoutMs2 = remainingMs(deadline, host.now(clock));
1519
+ }
1520
+ call2({ op: "sem-wait", handle, how: kind, timeoutMs: timeoutMs2 });
1521
+ },
1522
+ sem_getvalue: (handle, out) => void mem.view().setInt32(out, call2({ op: "sem-getvalue", handle }), true)
1523
+ };
1524
+ }
1525
+ var SEM_CREAT, SEM_EXCL, HOW, NS_PER_MS;
1526
+ var init_slicc_sem = __esm({
1527
+ "src/process/wasi/slicc-sem.ts"() {
1528
+ "use strict";
1529
+ init_wasi_abi();
1530
+ init_wasi_files();
1531
+ SEM_CREAT = 1;
1532
+ SEM_EXCL = 2;
1533
+ HOW = ["block", "try", "timed"];
1534
+ NS_PER_MS = 1000000n;
1535
+ }
1536
+ });
1537
+
1481
1538
  // src/kernel/pipe.ts
1482
1539
  var PIPE_CAPACITY;
1483
1540
  var init_pipe = __esm({
@@ -3056,7 +3113,7 @@ function filestatOf(path, s) {
3056
3113
  size: BigInt(s.size),
3057
3114
  ino: s.ino !== void 0 ? BigInt(s.ino) : pathInode(path),
3058
3115
  ...s.nlink !== void 0 ? { nlink: BigInt(s.nlink) } : {},
3059
- mtimeNs: BigInt(Math.round(s.mtimeMs ?? 0)) * NS_PER_MS
3116
+ mtimeNs: BigInt(Math.round(s.mtimeMs ?? 0)) * NS_PER_MS2
3060
3117
  };
3061
3118
  }
3062
3119
  function kernelFiletype(kind) {
@@ -3106,7 +3163,7 @@ function wrap(table) {
3106
3163
  }
3107
3164
  return out;
3108
3165
  }
3109
- var WasiExit, IDS, NS_PER_MS, AT_SYMLINK_NOFOLLOW, AT_EACCESS, ROOT_IDS, GONE, S_IFIFO, DEFAULT_UMASK, MONOTONIC_BASE, MAX_READ, SIGPIPE_EXIT, SIG_IGN, SEALED_MODE, WasiHost;
3166
+ var WasiExit, IDS, NS_PER_MS2, AT_SYMLINK_NOFOLLOW, AT_EACCESS, ROOT_IDS, GONE, S_IFIFO, DEFAULT_UMASK, MONOTONIC_BASE, MAX_READ, SIGPIPE_EXIT, SIG_IGN, SEALED_MODE, WasiHost;
3110
3167
  var init_wasi_host = __esm({
3111
3168
  "src/process/wasi/wasi-host.ts"() {
3112
3169
  "use strict";
@@ -3114,6 +3171,7 @@ var init_wasi_host = __esm({
3114
3171
  init_physical_path();
3115
3172
  init_cpu_clock();
3116
3173
  init_cred();
3174
+ init_slicc_sem();
3117
3175
  init_wasi_abi();
3118
3176
  init_wasi_fds();
3119
3177
  init_wasi_files();
@@ -3129,14 +3187,14 @@ var init_wasi_host = __esm({
3129
3187
  }
3130
3188
  };
3131
3189
  IDS = ["ruid", "euid", "suid", "rgid", "egid", "sgid"];
3132
- NS_PER_MS = 1000000n;
3190
+ NS_PER_MS2 = 1000000n;
3133
3191
  AT_SYMLINK_NOFOLLOW = 1;
3134
3192
  AT_EACCESS = 2;
3135
3193
  ROOT_IDS = Object.freeze({ uid: 0, gid: 0 });
3136
3194
  GONE = /* @__PURE__ */ new Set(["ENOENT", "ENOTDIR"]);
3137
3195
  S_IFIFO = 4096;
3138
3196
  DEFAULT_UMASK = 18;
3139
- MONOTONIC_BASE = BigInt(Math.round(performance.timeOrigin)) * NS_PER_MS;
3197
+ MONOTONIC_BASE = BigInt(Math.round(performance.timeOrigin)) * NS_PER_MS2;
3140
3198
  MAX_READ = 1024 * 1024;
3141
3199
  SIGPIPE_EXIT = 141;
3142
3200
  SIG_IGN = 1;
@@ -3334,6 +3392,7 @@ var init_wasi_host = __esm({
3334
3392
  });
3335
3393
  void this.o.kernel.call({ op: "proc-setcred", change });
3336
3394
  },
3395
+ ...semImports(this),
3337
3396
  groups_get: (buf, cap, count) => {
3338
3397
  const { groups } = this.o.kernel.call({ op: "proc-cred" });
3339
3398
  if (cap !== 0 && cap < groups.length) throw new WasiError("EINVAL");
@@ -3424,7 +3483,7 @@ var init_wasi_host = __esm({
3424
3483
  return this.cache;
3425
3484
  }
3426
3485
  now(id) {
3427
- if (id === CLOCK.REALTIME) return BigInt(Date.now()) * NS_PER_MS;
3486
+ if (id === CLOCK.REALTIME) return BigInt(Date.now()) * NS_PER_MS2;
3428
3487
  if (id === CLOCK.MONOTONIC) {
3429
3488
  return MONOTONIC_BASE + BigInt(Math.round(performance.now() * 1e6));
3430
3489
  }
@@ -3933,7 +3992,7 @@ var init_wasi_host = __esm({
3933
3992
  current ??= statOf(path);
3934
3993
  return current[field2] ?? current.mtimeMs ?? now;
3935
3994
  };
3936
- const pick = (set, setNow, value2, field2) => flags & setNow ? now : flags & set ? Number(value2 / NS_PER_MS) : kept(field2);
3995
+ const pick = (set, setNow, value2, field2) => flags & setNow ? now : flags & set ? Number(value2 / NS_PER_MS2) : kept(field2);
3937
3996
  (follow2 ? this.o.fs.utimes : this.o.fs.lutimes).call(
3938
3997
  this.o.fs,
3939
3998
  path,
@@ -4591,7 +4650,7 @@ var KERNEL_VERSION, OS_RELEASE;
4591
4650
  var init_version = __esm({
4592
4651
  "src/version.ts"() {
4593
4652
  "use strict";
4594
- KERNEL_VERSION = true ? "1.98.4" : "0.0.0-dev";
4653
+ KERNEL_VERSION = true ? "1.99.1" : "0.0.0-dev";
4595
4654
  OS_RELEASE = "6.0.0-slicc";
4596
4655
  }
4597
4656
  });
@@ -5114,7 +5173,7 @@ var init_js_io = __esm({
5114
5173
 
5115
5174
  // src/process/js/js-dev.ts
5116
5175
  function inDev(abs) {
5117
- return abs.startsWith("/dev") && (abs.length === 4 || abs[4] === "/");
5176
+ return abs.startsWith("/dev") && (abs.length === 4 || abs[4] === "/") && !inShm(abs);
5118
5177
  }
5119
5178
  function missing(path) {
5120
5179
  throw new JsCallError("ENOENT", path);
@@ -5255,7 +5314,7 @@ function* devReaddir(abs) {
5255
5314
  if (node.kind !== "dir") throw new JsCallError("ENOTDIR", abs);
5256
5315
  const names = yield { op: "fd-tty-names" };
5257
5316
  const ttys = names.filter((n) => /^\/dev\/tty\d+$/.test(n)).map((n) => n.slice(5));
5258
- return [...DEVICES, "clipboard", "sealed", "tty", "fd", "pts", ...STDIO3, ...ttys].sort();
5317
+ return [...DEVICES, "clipboard", "sealed", "tty", "fd", "pts", "shm", ...STDIO3, ...ttys].sort();
5259
5318
  }
5260
5319
  function* aliasOf(fd, abs, o) {
5261
5320
  const info = yield* fdInfo(fd, abs);
@@ -5466,6 +5525,7 @@ var DEV_READ_MAX, DEVICES, STDIO3, SELF_FD, S_IFMT, DIR, LINK, CHAR, BORN, CHAR_
5466
5525
  var init_js_dev = __esm({
5467
5526
  "src/process/js/js-dev.ts"() {
5468
5527
  "use strict";
5528
+ init_dev_removal();
5469
5529
  init_sync_fs_wire();
5470
5530
  init_js_io();
5471
5531
  init_js_kernel();
@@ -10699,6 +10759,15 @@ var init_js_runtime = __esm({
10699
10759
  });
10700
10760
 
10701
10761
  // src/realm/emscripten-vfs-hook.ts
10762
+ function kernelDevDirs(bridge) {
10763
+ return KERNEL_DEV_DIRS.filter((dir) => {
10764
+ try {
10765
+ return bridge.stat(dir).isDirectory;
10766
+ } catch {
10767
+ return false;
10768
+ }
10769
+ });
10770
+ }
10702
10771
  function topLevelDirs(bridge, warn) {
10703
10772
  let names;
10704
10773
  try {
@@ -10737,7 +10806,12 @@ function linuxRmdir(Fs) {
10737
10806
  function mountVfsIntoEmscripten(Fs, deps) {
10738
10807
  const { bridge, warn } = deps;
10739
10808
  const dirs = topLevelDirs(bridge, warn);
10740
- const { plugin, mounted } = mountLiveVfsDirs(Fs, bridge, dirs ?? [], warn);
10809
+ const { plugin, mounted } = mountLiveVfsDirs(
10810
+ Fs,
10811
+ bridge,
10812
+ [...dirs ?? [], ...kernelDevDirs(bridge)],
10813
+ warn
10814
+ );
10741
10815
  if (dirs) liveRoot(Fs, bridge);
10742
10816
  if (bridge.owners && Fs.lookupPath) useLiveChown(Fs);
10743
10817
  if (bridge.links && Fs.lookupPath) readingLinks(Fs);
@@ -10755,13 +10829,14 @@ function mountVfsIntoEmscripten(Fs, deps) {
10755
10829
  invalidate: () => invalidateLiveVfs(Fs, plugin)
10756
10830
  };
10757
10831
  }
10758
- var MODULE_OWNED_DIRS, SYNTHETIC_DIRS2;
10832
+ var MODULE_OWNED_DIRS, SYNTHETIC_DIRS2, KERNEL_DEV_DIRS;
10759
10833
  var init_emscripten_vfs_hook = __esm({
10760
10834
  "src/realm/emscripten-vfs-hook.ts"() {
10761
10835
  "use strict";
10762
10836
  init_live_vfs_fs();
10763
10837
  MODULE_OWNED_DIRS = /* @__PURE__ */ new Set(["dev", "proc"]);
10764
10838
  SYNTHETIC_DIRS2 = ["/usr", "/bin"];
10839
+ KERNEL_DEV_DIRS = ["/dev/shm"];
10765
10840
  }
10766
10841
  });
10767
10842
 
@@ -13414,7 +13489,7 @@ var init_wasix_fork = __esm({
13414
13489
  function timeoutMs(ns) {
13415
13490
  const value2 = BigInt.asUintN(64, ns);
13416
13491
  if (value2 === FOREVER) return -1;
13417
- const ms = (value2 + NS_PER_MS2 - 1n) / NS_PER_MS2;
13492
+ const ms = (value2 + NS_PER_MS3 - 1n) / NS_PER_MS3;
13418
13493
  return ms > BigInt(MAX_TIMEOUT_MS) ? -1 : Number(ms);
13419
13494
  }
13420
13495
  function wasixEpollImports(host) {
@@ -13475,7 +13550,7 @@ function wasixEpollImports(host) {
13475
13550
  }
13476
13551
  };
13477
13552
  }
13478
- var EVENT_SIZE, DATA_OFFSET, DATA_SIZE, MAX_EVENTS, FOREVER, MAX_TIMEOUT_MS, NS_PER_MS2, EVENTFD_SEMAPHORE, EVENTFD_NONBLOCK, EVENTFD_MAX, OPS;
13553
+ var EVENT_SIZE, DATA_OFFSET, DATA_SIZE, MAX_EVENTS, FOREVER, MAX_TIMEOUT_MS, NS_PER_MS3, EVENTFD_SEMAPHORE, EVENTFD_NONBLOCK, EVENTFD_MAX, OPS;
13479
13554
  var init_wasix_epoll = __esm({
13480
13555
  "src/process/wasi/wasix-epoll.ts"() {
13481
13556
  "use strict";
@@ -13487,7 +13562,7 @@ var init_wasix_epoll = __esm({
13487
13562
  MAX_EVENTS = 4096;
13488
13563
  FOREVER = 0xffffffffffffffffn;
13489
13564
  MAX_TIMEOUT_MS = 2147483647;
13490
- NS_PER_MS2 = 1000000n;
13565
+ NS_PER_MS3 = 1000000n;
13491
13566
  EVENTFD_SEMAPHORE = 1;
13492
13567
  EVENTFD_NONBLOCK = 4;
13493
13568
  EVENTFD_MAX = 0xfffffffffffffffen;