@ai-ecoverse/slicc-kernel 1.102.4 → 1.102.6

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.
@@ -4774,7 +4774,7 @@ var KERNEL_VERSION, OS_RELEASE;
4774
4774
  var init_version = __esm({
4775
4775
  "src/version.ts"() {
4776
4776
  "use strict";
4777
- KERNEL_VERSION = true ? "1.102.4" : "0.0.0-dev";
4777
+ KERNEL_VERSION = true ? "1.102.6" : "0.0.0-dev";
4778
4778
  OS_RELEASE = "6.0.0-slicc";
4779
4779
  }
4780
4780
  });
package/dist/node.js CHANGED
@@ -1550,6 +1550,7 @@ var KernelSocket = class _KernelSocket {
1550
1550
  backlog = 0;
1551
1551
  boundAt;
1552
1552
  changes = new Changes();
1553
+ room = new Changes();
1553
1554
  options = /* @__PURE__ */ new Map();
1554
1555
  constructor(net, domain) {
1555
1556
  this.net = net;
@@ -1634,7 +1635,10 @@ var KernelSocket = class _KernelSocket {
1634
1635
  for (; ; ) {
1635
1636
  if (this.state !== "listening") throw new KernelError("EINVAL");
1636
1637
  const next2 = this.queue.shift();
1637
- if (next2) return next2;
1638
+ if (next2) {
1639
+ this.room.wake();
1640
+ return next2;
1641
+ }
1638
1642
  if (nonblock) throw new KernelError("EAGAIN");
1639
1643
  await this.changes.wait(signal);
1640
1644
  }
@@ -1645,7 +1649,13 @@ var KernelSocket = class _KernelSocket {
1645
1649
  this.changes.wake();
1646
1650
  return true;
1647
1651
  }
1648
- connect(addr, viaUplink = true, cred, stamp) {
1652
+ get full() {
1653
+ return this.state === "listening" && this.queue.length >= this.backlog;
1654
+ }
1655
+ waitRoom(signal) {
1656
+ return this.room.wait(signal);
1657
+ }
1658
+ connect(addr, viaUplink = true, cred, stamp, waits = true) {
1649
1659
  if (this.state === "connected") throw new KernelError("EISCONN");
1650
1660
  if (this.state === "connecting") throw new KernelError("EALREADY");
1651
1661
  if (this.state !== "open") throw new KernelError("EINVAL");
@@ -1660,6 +1670,11 @@ var KernelSocket = class _KernelSocket {
1660
1670
  this.boundAt = this.local;
1661
1671
  } else this.local = { family: "unix", path: "" };
1662
1672
  }
1673
+ if (waits && target.full) return this.queued(addr, target, cred, stamp);
1674
+ this.join(addr, target, cred, stamp);
1675
+ return void 0;
1676
+ }
1677
+ join(addr, target, cred, stamp) {
1663
1678
  const server = new _KernelSocket(this.net, this.domain);
1664
1679
  server.local = addr.family === "inet" ? { ...addr, host: canonicalHost(addr.host) } : addr;
1665
1680
  server.peer = this.local;
@@ -1673,7 +1688,34 @@ var KernelSocket = class _KernelSocket {
1673
1688
  server.close();
1674
1689
  throw new KernelError("ECONNREFUSED");
1675
1690
  }
1676
- return void 0;
1691
+ }
1692
+ async queued(addr, target, cred, stamp) {
1693
+ this.state = "connecting";
1694
+ const abort = new AbortController();
1695
+ this.dialing = abort;
1696
+ const timer = setTimeout(
1697
+ () => abort.abort(new KernelError("ETIMEDOUT")),
1698
+ this.net.backlogWaitMs
1699
+ );
1700
+ try {
1701
+ while (target.full) await target.waitRoom(abort.signal);
1702
+ if (abort.signal.aborted) throw abort.signal.reason;
1703
+ this.state = "open";
1704
+ this.join(addr, target, cred, stamp);
1705
+ this.dialing = void 0;
1706
+ } catch (e) {
1707
+ const reason = abort.signal.aborted ? abort.signal.reason : e;
1708
+ const error = reason instanceof KernelError ? reason : new KernelError("ECONNREFUSED");
1709
+ if (this.dialing === abort) {
1710
+ this.dialing = void 0;
1711
+ this.failed = error.code;
1712
+ if (this.state === "connecting") this.state = "open";
1713
+ this.changes.wake();
1714
+ }
1715
+ throw error;
1716
+ } finally {
1717
+ clearTimeout(timer);
1718
+ }
1677
1719
  }
1678
1720
  dial(addr, route) {
1679
1721
  this.state = "connecting";
@@ -1774,6 +1816,7 @@ var KernelSocket = class _KernelSocket {
1774
1816
  this.dialing = void 0;
1775
1817
  if (was === "listening") {
1776
1818
  for (const pending of this.queue.splice(0)) pending.close();
1819
+ this.room.wake();
1777
1820
  }
1778
1821
  if (this.link) {
1779
1822
  if (!this.readShut) this.link.rx.closeRead();
@@ -1871,9 +1914,10 @@ var LoopbackNet = class {
1871
1914
  socket.listen(backlog);
1872
1915
  return socket;
1873
1916
  }
1917
+ backlogWaitMs = DIAL_TIMEOUT_MS;
1874
1918
  connect(addr) {
1875
1919
  const socket = this.socket(addr.family);
1876
- void socket.connect(addr, false);
1920
+ void socket.connect(addr, false, void 0, void 0, false);
1877
1921
  return socket;
1878
1922
  }
1879
1923
  bind(socket, addr, kernel = false) {
@@ -11133,7 +11177,7 @@ var PATH_OPS = new Set(SYNC_FS_OPS);
11133
11177
  var EARLY_WHOLE_FILE = 64 * 1024;
11134
11178
 
11135
11179
  // src/version.ts
11136
- var KERNEL_VERSION = true ? "1.102.4" : "0.0.0-dev";
11180
+ var KERNEL_VERSION = true ? "1.102.6" : "0.0.0-dev";
11137
11181
  var OS_RELEASE = "6.0.0-slicc";
11138
11182
  function procVersion() {
11139
11183
  return `Linux version ${OS_RELEASE} (slicc-kernel ${KERNEL_VERSION}) #1 SMP PREEMPT_DYNAMIC
@@ -12388,7 +12432,8 @@ var KernelLoopback = class {
12388
12432
  { family: "inet", host: "127.0.0.1", port },
12389
12433
  false,
12390
12434
  this.cred(),
12391
- this.stamp ? await this.stamp() : void 0
12435
+ this.stamp ? await this.stamp() : void 0,
12436
+ false
12392
12437
  );
12393
12438
  } catch (err) {
12394
12439
  socket.close();
@@ -15608,8 +15653,15 @@ var WasmProcess = class {
15608
15653
  const bit = sigbit(sig);
15609
15654
  if (this.ignores(bit)) return "ignore";
15610
15655
  if (((this.options.blockedBits?.() ?? 0) & bit) !== 0) {
15611
- this.options.onPending?.(sig);
15612
- return "deliver";
15656
+ const tid = this.options.unblockedThread?.(sig);
15657
+ if (tid === void 0) {
15658
+ this.options.onPending?.(sig);
15659
+ return "deliver";
15660
+ }
15661
+ if (this.caught & bit) {
15662
+ this.options.threadKill?.(tid, sig);
15663
+ return "deliver";
15664
+ }
15613
15665
  }
15614
15666
  if (!(this.caught & bit)) {
15615
15667
  const action = defaultAction(sig);
@@ -16852,6 +16904,12 @@ function killThread(thread, caught, sig) {
16852
16904
  blocked2.abort();
16853
16905
  return true;
16854
16906
  }
16907
+ function unblockedThread(threads, sig) {
16908
+ for (const [tid, thread] of threads) {
16909
+ if ((Atomics.load(thread.header, SAB_I_BLOCKED) & sigbit(sig)) === 0) return tid;
16910
+ }
16911
+ return void 0;
16912
+ }
16855
16913
  function unblocked(header4) {
16856
16914
  return Atomics.load(header4, SAB_I_SIGNALS) & ~Atomics.load(header4, SAB_I_BLOCKED);
16857
16915
  }
@@ -17002,6 +17060,7 @@ function processOptions(opts, header4, hooks, created3) {
17002
17060
  hasPending: () => unblocked(header4) !== 0 || Atomics.load(header4, SAB_I_TIMERS) !== 0,
17003
17061
  raise: hooks.raise,
17004
17062
  threadKill: hooks.threadKill,
17063
+ unblockedThread: hooks.unblockedThread,
17005
17064
  ...hooks.exitNow ? { exitNow: hooks.exitNow } : {},
17006
17065
  ...hooks.exitSignal ? { exitSignal: hooks.exitSignal } : {},
17007
17066
  ...opts.program.abi === "wasi" || opts.program.abi === "js" ? { pendingBits: () => Atomics.load(header4, SAB_I_SIGNALS) } : {},
@@ -17042,6 +17101,7 @@ function spawnWasmProcess(opts) {
17042
17101
  {
17043
17102
  raise: (sig) => signal(sig),
17044
17103
  threadKill: (tid, sig) => killThread(threadSignals.get(tid), process2.signalMasks().caught, sig),
17104
+ unblockedThread: (sig) => unblockedThread(threadSignals, sig),
17045
17105
  ...opts.program.abi === "js" ? {
17046
17106
  exitNow: (code) => exitNow(code),
17047
17107
  exitSignal: (sig) => queueMicrotask(() => finish(128 + sig, sig))