Skip to content

Commit a978db7

Browse files
leifericfclaude
andcommitted
Changelog: Note cooperative future-cancel + bounded (exit) drain under Unreleased
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 59f4125 commit a978db7

1 file changed

Lines changed: 2 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## Unreleased
44

5+
- Core: `future-cancel` now interrupts a future whose body is a long-running loop that stays in C -- a tail-recursive form (`dotimes`, `for`, `doseq`), a `reduce` or other seq aggregate, lazy realization (`count`, `doall`, `dorun`), or an int-range reduce. These previously reached no cooperative-cancel safepoint, so the future ran to completion regardless of `future-cancel`, monopolized the per-state lock (starving the calling thread), and could block state teardown's worker join. Each driver now polls the cancel/yield safepoint on a coarse cadence; single-threaded throughput is unaffected (the poll is a no-op when no future is active).
6+
- Core: `(exit code)` no longer hangs indefinitely when a worker future is stuck in an uninterruptible C loop. It cancels in-flight futures and waits a bounded grace for them to drain; a worker still running after the grace is abandoned and the process exits (the OS reclaims the thread). `mino_state_free` keeps its unbounded join, so embedder teardown never abandons a worker that could still touch live state.
57
- Build: The single-file amalgamation (`dist/mino.c`) hoists the `_POSIX_C_SOURCE` / `_DARWIN_C_SOURCE` feature-test macros to the top of the unified translation unit and strips the per-file copies, so the whole TU sees the POSIX/Darwin surface the sources request. Previously an earlier file pulled the system headers before `fs.c` / `proc.c` redefined the macros, which broke the amalgam compile on glibc with a `_POSIX_C_SOURCE` redefinition.
68
- Core: `sequence` with a transducer now realizes in O(1) stack per element. It emits each step's buffered outputs as a direct lazy cons-chain instead of `(concat items (step ...))`, so reducing, counting, or seq-walking a large transduced sequence (and `clojure.core.reducers/foldcat` over a reducer, which builds on it) no longer recurses on the C stack proportional to the element count -- which previously tripped the recursion guard under the larger stack frames of sanitizer builds.
79
- Core: clojure.core gains seventeen vars: `line-seq`, `seque`, `sync`, `xml-seq`, `read+string`, `test`, `Throwable->map`, `print-simple`, `->Eduction`, the `Inst` protocol with `inst-ms*`, the `char-escape-string` and `char-name-string` tables, `default-data-readers` (with 'inst and 'uuid readers), `*repl*` (default false), and the `unquote` / `unquote-splicing` placeholders.

0 commit comments

Comments
 (0)