Real Thread/yield + Thread/interrupted (jolt-l2gc)
Thread/yield was a no-op and Thread/interrupted always returned false. Now: - yield calls libc sched_yield (resolved once via the process symbols), so a spin loop relinquishes the CPU. Falls back to a zero-length park if the symbol can't be resolved. - each OS thread carries an interrupt flag (a box, thread-local). currentThread returns a handle wrapping the calling thread's flag, so .interrupt from another thread sets the target's flag. .isInterrupted reads without clearing; the static Thread/interrupted reads and clears — JVM semantics. Consolidates the Thread surface: currentThread + the instance methods live in io.ss (where the handle and its classloader are built), the flag box + yield + the interrupted static in host-static.ss. Unit cases cover yield, the read/clear split, and a cross-thread interrupt over a future.
This commit is contained in:
parent
87aec859b8
commit
980ec73933
4 changed files with 59 additions and 14 deletions
|
|
@ -56,6 +56,7 @@
|
|||
(hashtable-clear! ns-alias-table)
|
||||
(hashtable-clear! ns-refer-table)
|
||||
(hashtable-clear! ns-refer-all-table)
|
||||
(clear-thread-interrupt!) ; a case that set the runner thread's interrupt flag mustn't leak
|
||||
(when zj-ghier (jolt-invoke (var-deref "clojure.core" "reset!")
|
||||
(var-cell-root zj-ghier) (jolt-invoke (var-deref "clojure.core" "make-hierarchy"))))
|
||||
(set-chez-ns! "user"))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue