Problem
Every primitive in packages/threading busy-waits on spinLoopHint, and CondVar is not a condition variable: signaled is a plain bool with no atomics, broadcast wakes at most one waiter, a signal with no waiter is remembered, and the timeout is a guessed spin count. Recursive mutexes are silently ignored. Only one test uses more than one thread. packages/memory's ThreadSafe allocator is built on this spin mutex. The runtime already has real Futex.zig/Mutex.zig/Condition.zig under packages/runtime/src/threading/.
Evidence (origin/main @ d4b219507)
packages/threading/src/condvar.zig:1-57packages/threading/src/mutex.zig:1-24packages/threading/src/rwlock.zig:32-51packages/threading/src/semaphore.zig:26packages/threading/src/barrier.zig:2packages/memory/src/memory.zig:10
Scope
- Build all primitives on a shared futex layer (reuse the runtime's, or
std.Ioprimitives). - Implement recursive mutexes or reject the flag.
- Real timeouts based on the monotonic clock.
Acceptance criteria
- Stress tests with ≥8 threads for lock, condvar wait/signal/broadcast, rwlock and semaphore pass under ThreadSanitizer.
- Blocked waiters consume no CPU (measured).
Links
Part of #814.