@ai-ecoverse/slicc-kernel 1.102.1 → 1.102.3

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.
package/dist/node.js CHANGED
@@ -11129,7 +11129,7 @@ var PATH_OPS = new Set(SYNC_FS_OPS);
11129
11129
  var EARLY_WHOLE_FILE = 64 * 1024;
11130
11130
 
11131
11131
  // src/version.ts
11132
- var KERNEL_VERSION = true ? "1.102.1" : "0.0.0-dev";
11132
+ var KERNEL_VERSION = true ? "1.102.3" : "0.0.0-dev";
11133
11133
  var OS_RELEASE = "6.0.0-slicc";
11134
11134
  function procVersion() {
11135
11135
  return `Linux version ${OS_RELEASE} (slicc-kernel ${KERNEL_VERSION}) #1 SMP PREEMPT_DYNAMIC
@@ -11643,6 +11643,41 @@ var EventFd = class _EventFd {
11643
11643
  }
11644
11644
  };
11645
11645
 
11646
+ // src/kernel/timer.ts
11647
+ var TIMER_MAX_MS = 2147483647;
11648
+ function timerAt(deadline, fire) {
11649
+ let timer;
11650
+ const arm = () => {
11651
+ const left = deadline - performance.now();
11652
+ if (left > 0) {
11653
+ timer = setTimeout(arm, Math.min(left, TIMER_MAX_MS));
11654
+ return;
11655
+ }
11656
+ timer = void 0;
11657
+ fire();
11658
+ };
11659
+ timer = setTimeout(arm, Math.min(Math.max(0, deadline - performance.now()), TIMER_MAX_MS));
11660
+ return () => clearTimeout(timer);
11661
+ }
11662
+ function timerAfter(ms, fire) {
11663
+ return timerAt(performance.now() + ms, fire);
11664
+ }
11665
+ function repeating(first, every, fire) {
11666
+ let next2 = performance.now() + first;
11667
+ let cancel = () => {
11668
+ };
11669
+ const tick = () => {
11670
+ fire();
11671
+ if (every <= 0) return;
11672
+ next2 += every;
11673
+ const now = performance.now();
11674
+ if (next2 <= now) next2 += (Math.floor((now - next2) / every) + 1) * every;
11675
+ cancel = timerAt(next2, tick);
11676
+ };
11677
+ cancel = timerAt(next2, tick);
11678
+ return () => cancel();
11679
+ }
11680
+
11646
11681
  // src/kernel/epoll.ts
11647
11682
  var EPOLL = {
11648
11683
  IN: 1,
@@ -11694,11 +11729,11 @@ function lookup(fds, fd) {
11694
11729
  }
11695
11730
  function pause(ms, signal) {
11696
11731
  return new Promise((resolve2) => {
11697
- const timer = setTimeout(resolve2, ms);
11732
+ const cancel = timerAfter(ms, resolve2);
11698
11733
  signal.addEventListener(
11699
11734
  "abort",
11700
11735
  () => {
11701
- clearTimeout(timer);
11736
+ cancel();
11702
11737
  resolve2();
11703
11738
  },
11704
11739
  { once: true }
@@ -11764,17 +11799,14 @@ var EpollFile = class _EpollFile {
11764
11799
  const round = new AbortController();
11765
11800
  const woken = this.changes.wait(AbortSignal.any([round.signal, signal]));
11766
11801
  woken.catch(() => void 0);
11767
- let timer;
11768
- const expiry = deadline === Number.POSITIVE_INFINITY ? [] : [
11769
- new Promise(
11770
- (resolve2) => timer = setTimeout(resolve2, deadline - performance.now())
11771
- )
11772
- ];
11802
+ let cancel = () => {
11803
+ };
11804
+ const expiry = deadline === Number.POSITIVE_INFINITY ? [] : [new Promise((resolve2) => cancel = timerAt(deadline, resolve2))];
11773
11805
  try {
11774
11806
  await Promise.race([woken, ...expiry]);
11775
11807
  } finally {
11776
11808
  round.abort();
11777
- clearTimeout(timer);
11809
+ cancel();
11778
11810
  }
11779
11811
  }
11780
11812
  }
@@ -12119,9 +12151,10 @@ var AsyncOps = class {
12119
12151
  }
12120
12152
  sleep(timeoutMs, signal) {
12121
12153
  return new Promise((resolve2, reject) => {
12122
- let timer;
12154
+ let cancel = () => {
12155
+ };
12123
12156
  const cleanup = () => {
12124
- clearTimeout(timer);
12157
+ cancel();
12125
12158
  this.waiters.delete(wake);
12126
12159
  signal.removeEventListener("abort", abort);
12127
12160
  };
@@ -12136,10 +12169,10 @@ var AsyncOps = class {
12136
12169
  this.waiters.add(wake);
12137
12170
  signal.addEventListener("abort", abort, { once: true });
12138
12171
  if (timeoutMs !== void 0) {
12139
- timer = setTimeout(() => {
12172
+ cancel = timerAfter(timeoutMs, () => {
12140
12173
  cleanup();
12141
12174
  resolve2(false);
12142
- }, timeoutMs);
12175
+ });
12143
12176
  }
12144
12177
  });
12145
12178
  }
@@ -14190,14 +14223,14 @@ async function runChild(req, deps) {
14190
14223
  return frame2(outcome2, new Uint8Array(0), new Uint8Array(0));
14191
14224
  }
14192
14225
  if (failure !== void 0) kill();
14193
- const timer = req.timeoutMs !== void 0 && req.timeoutMs > 0 ? setTimeout(() => stop("ETIMEDOUT"), req.timeoutMs) : void 0;
14226
+ const cancel = req.timeoutMs !== void 0 && req.timeoutMs > 0 ? timerAfter(req.timeoutMs, () => stop("ETIMEDOUT")) : void 0;
14194
14227
  let status;
14195
14228
  try {
14196
14229
  status = await reaped(deps, pid);
14197
14230
  const open = controls.filter((c) => c.opened);
14198
14231
  await Promise.race([Promise.all(open.map((c) => c.eof)), decided.promise]);
14199
14232
  } finally {
14200
- clearTimeout(timer);
14233
+ cancel?.();
14201
14234
  for (const control of controls) control.shut = true;
14202
14235
  }
14203
14236
  const out = deps.children.captured(pid, 1);
@@ -14253,27 +14286,23 @@ async function waitReady(fds, read, write, deadline, interrupted3) {
14253
14286
  const file = fds.get(fd).file;
14254
14287
  return file.changed === void 0 ? [] : [file.changed(round.signal).catch(() => void 0)];
14255
14288
  });
14256
- let timer;
14257
- const expiry = deadline === Number.POSITIVE_INFINITY ? [] : [
14258
- new Promise(
14259
- (resolve2) => timer = setTimeout(resolve2, deadline - performance.now())
14260
- )
14261
- ];
14289
+ let cancel = () => {
14290
+ };
14291
+ const expiry = deadline === Number.POSITIVE_INFINITY ? [] : [new Promise((resolve2) => cancel = timerAt(deadline, resolve2))];
14262
14292
  try {
14263
14293
  await Promise.race([...changes, ...expiry, interrupted3]);
14264
14294
  } finally {
14265
14295
  round.abort();
14266
- clearTimeout(timer);
14296
+ cancel();
14267
14297
  }
14268
14298
  }
14269
14299
  }
14270
14300
 
14271
14301
  // src/kernel/sem.ts
14272
14302
  var SEM_VALUE_MAX = 2147483647;
14273
- var SEM_NAMES_MAX = 4096;
14274
- var SEM_HANDLES_MAX = 256;
14303
+ var SEM_NAMES_MAX = 65536;
14304
+ var SEM_HANDLES_MAX = 65536;
14275
14305
  var NAME_MAX = 251;
14276
- var TIMER_MAX_MS = 2147483647;
14277
14306
  var SEM_OPS = [
14278
14307
  "sem-open",
14279
14308
  "sem-close",
@@ -14310,11 +14339,12 @@ var Semaphore = class {
14310
14339
  if (signal.aborted) return Promise.reject(new KernelError("EINTR"));
14311
14340
  return new Promise((resolve2, reject) => {
14312
14341
  const deadline = timeoutMs < 0 ? Number.POSITIVE_INFINITY : performance.now() + timeoutMs;
14313
- let timer;
14342
+ let cancel = () => {
14343
+ };
14314
14344
  const leave = () => {
14315
14345
  const at = this.waiters.indexOf(waiter);
14316
14346
  if (at >= 0) this.waiters.splice(at, 1);
14317
- clearTimeout(timer);
14347
+ cancel();
14318
14348
  signal.removeEventListener("abort", abort);
14319
14349
  };
14320
14350
  const waiter = {
@@ -14328,18 +14358,13 @@ var Semaphore = class {
14328
14358
  reject(new KernelError("EINTR"));
14329
14359
  };
14330
14360
  const expire = () => {
14331
- const left = deadline - performance.now();
14332
- if (left > 0) {
14333
- timer = setTimeout(expire, Math.min(left, TIMER_MAX_MS));
14334
- return;
14335
- }
14336
14361
  leave();
14337
14362
  resolve2(false);
14338
14363
  };
14339
14364
  this.waiters.push(waiter);
14340
14365
  signal.addEventListener("abort", abort, { once: true });
14341
14366
  if (deadline !== Number.POSITIVE_INFINITY) {
14342
- timer = setTimeout(expire, Math.min(timeoutMs, TIMER_MAX_MS));
14367
+ cancel = timerAt(deadline, expire);
14343
14368
  }
14344
14369
  });
14345
14370
  }
@@ -14374,6 +14399,10 @@ var SemTable = class {
14374
14399
  var SemHandles = class _SemHandles {
14375
14400
  byHandle = /* @__PURE__ */ new Map();
14376
14401
  next = 1;
14402
+ limit;
14403
+ constructor(limit = SEM_HANDLES_MAX) {
14404
+ this.limit = limit;
14405
+ }
14377
14406
  add(sem) {
14378
14407
  for (const [handle2, entry] of this.byHandle) {
14379
14408
  if (entry.sem === sem) {
@@ -14381,7 +14410,7 @@ var SemHandles = class _SemHandles {
14381
14410
  return handle2;
14382
14411
  }
14383
14412
  }
14384
- if (this.byHandle.size >= SEM_HANDLES_MAX) throw new KernelError("EMFILE");
14413
+ if (this.byHandle.size >= this.limit) throw new KernelError("EMFILE");
14385
14414
  const handle = this.next++;
14386
14415
  this.byHandle.set(handle, { sem, opens: 1 });
14387
14416
  return handle;
@@ -14397,7 +14426,7 @@ var SemHandles = class _SemHandles {
14397
14426
  if (--entry.opens === 0) this.byHandle.delete(handle);
14398
14427
  }
14399
14428
  fork() {
14400
- const child = new _SemHandles();
14429
+ const child = new _SemHandles(this.limit);
14401
14430
  child.next = this.next;
14402
14431
  for (const [handle, entry] of this.byHandle) child.byHandle.set(handle, { ...entry });
14403
14432
  return child;
@@ -16684,17 +16713,12 @@ var WasmProcess = class {
16684
16713
  (req, cancelled) => this.syscall(req, cancelled),
16685
16714
  () => this.options.onAsync?.()
16686
16715
  );
16687
- alarmEvery;
16688
16716
  setAlarm(sig, first, every, timer) {
16689
16717
  if (!isSignal(sig)) throw new KernelError("EINVAL");
16690
16718
  this.clearAlarm();
16691
16719
  if (first <= 0) return;
16692
16720
  const fire = timer === void 0 ? () => this.options.raise?.(sig) : () => this.timerExpired(timer);
16693
- this.alarm = setTimeout(() => {
16694
- this.alarm = void 0;
16695
- fire();
16696
- if (every > 0) this.alarmEvery = setInterval(fire, every);
16697
- }, first);
16721
+ this.alarm = repeating(first, every, fire);
16698
16722
  }
16699
16723
  timerExpired(which) {
16700
16724
  this.options.onTimer?.(which);
@@ -16703,10 +16727,8 @@ var WasmProcess = class {
16703
16727
  blocked2.abort();
16704
16728
  }
16705
16729
  clearAlarm() {
16706
- clearTimeout(this.alarm);
16707
- clearInterval(this.alarmEvery);
16730
+ this.alarm?.();
16708
16731
  this.alarm = void 0;
16709
- this.alarmEvery = void 0;
16710
16732
  }
16711
16733
  async exit() {
16712
16734
  if (this.exited) return;