mirror of
https://codeberg.org/ziglang/zig.git
synced 2026-04-27 19:09:47 +03:00
e57c557ad4
The most interesting thing here is the replacement of the pthread futex implementation with an implementation based on thread park/unpark APIs. Thread parking tends to be the primitive provided by systems which do not have a futex primitive, such as NetBSD, so this implementation is far more efficient than the pthread one. It is also useful on Windows, where `RtlWaitOnAddress` is itself a userland implementation based on thread park/unpark; we can implement it ourselves including support for features which Windows' implementation lacks, such as cancelation and waking a number of waiters with 1<n<infinity. Compared to the pthread implementation, this thread-parking-based one also supports full robust cancelation. Thread parking also turns out to be useful for implementing `sleep`, so is now used for that on Windows and NetBSD. This commit also introduces proper cancelation support for most Windows operations. The most notable omission right now is DNS lookups through `GetAddrInfoEx`, just because they're a little more work due to having a unique cancelation mechanism---but the machinery is all there, so I'll finish gluing it together soon. As of this commit, there are very few parts of `Io.Threaded` which do not support full robust cancelation. The only ones which actually really matter (because they could block for a prolonged period of time) are DNS lookups on Windows (as discussed above) and futex waits on WASM.