aboutsummaryrefslogtreecommitdiff
path: root/lib/std/Thread.zig
AgeCommit message (Collapse)Author
2024-01-29std.Thread: fix off-by-one in PosixThreadImpl (#18711)Christian Flicker
by removing ZST special case
2023-12-30doc: possible typo at `std.Thread.spawn` commentLeonardo Gatti
2023-11-22rework std.atomicAndrew Kelley
* move std.atomic.Atomic to std.atomic.Value * fix incorrect argument order passed to testing.expectEqual * make the functions be a thin wrapper over the atomic builtins and stick to the naming conventions. * remove pointless functions loadUnchecked and storeUnchecked. Instead, name the field `raw` instead of `value` (which is redundant with the type name). * simplify the tests by not passing every possible combination. Many cases were iterating over every possible combinations but then not even using the for loop element value! * remove the redundant compile errors which are already implemented by the language itself. * remove dead x86 inline assembly. this should be implemented in the language if at all.
2023-10-31std/Thread: remove unnecessary `@ptrCast` (#17766)XXIV
2023-10-02Add illumos OS tagStephen Gregoratto
- Adds `illumos` to the `Target.Os.Tag` enum. A new function, `isSolarish` has been added that returns true if the tag is either Solaris or Illumos. This matches the naming convention found in Rust's `libc` crate[1]. - Add the tag wherever `.solaris` is being checked against. - Check for the C pre-processor macro `__illumos__` in CMake to set the proper target tuple. Illumos distros patch their compilers to have this in the "built-in" set (verified with `echo | cc -dM -E -`). Alternatively you could check the output of `uname -o`. Right now, both Solaris and Illumos import from `c/solaris.zig`. In the future it may be worth putting the shared ABI bits in a base file, and mixing that in with specific `c/solaris.zig`/`c/illumos.zig` files. [1]: https://github.com/rust-lang/libc/tree/6e02a329a2a27f6887ea86952f389ca11e06448c/src/unix/solarish
2023-07-31Merge pull request #16622 from jacobly0/cbe-asm-compatAndrew Kelley
CBE: fix regressions and get new targets passing behavior tests
2023-07-31Revert "std.Thread: refining stack size from platform minimum, changes more ↵Andrew Kelley
targetted towards platform like Linux/musl (#15791)" This reverts commit 41502c6aa53a3da31b276c23c4db74db7d04796b.
2023-07-31std: cleanup asm usageJacob Young
After fixing some issues with inline assembly in the C backend, the std cleanups have the side effect of making these functions compatible with the backend, allowing it to be used on linux without linking libc.
2023-07-26Fix counting in SingleThreadedRwLock's tryLockShared (#16560)Jim Price
Additionally we add RwLock to Thread.zig's list of tests
2023-06-26default to single-threaded for WebAssemblyLuuk de Gram
When targeting WebAssembly, we default to building a single-threaded build as threads are still experimental. The user however can enable a multi- threaded build by specifying '-fno-single-threaded'. It's a compile-error to enable this flag, but not also enable shared-memory.
2023-06-26std: implement `detach` for WASI-threadsLuuk de Gram
When a thread is detached from the main thread, we automatically cleanup any allocated memory. For this we first reset the stack-pointer to the original stack-pointer of the main-thread so we can safely clear the memory which also contains the thread's stack.
2023-06-26free allocated memory upon call `join`Luuk de Gram
When `join` detects a thread has completed, it will free the allocated memory of the thread. For this we must first copy the allocator. This is required as the allocated memory holds a reference to the original allocator. If we free the memory, we would end up with UB as the allocator would free itself.
2023-06-26std: implement `join` for WASI-threadsLuuk de Gram
We now reset the Thread ID to 0 and wake up the main thread listening for the thread to finish. We use inline assembly as we cannot use the stack to set the thread ID as it could possibly clobber any of the memory. Currently, we leak the memory that was allocated for the thread. We need to implement a way where we can clean up the memory without using the stack (as the stack is stored inside this same memory).
2023-06-26store allocator & remove global assemblyLuuk de Gram
We now store the original allocator that was used to allocate the memory required for the thread. This allocator can then be used in any cleanup functionality to ensure the memory is freed correctly. Secondly, we now use a function to set the stack pointer instead of generating a function using global assembly. This is a lot cleaner and more readable.
2023-06-26std: implement `Thread` `spawn` for WASILuuk de Gram
This implements a first version to spawn a WASI-thread. For a new thread to be created, we calculate the size required to store TLS, the new stack, and metadata. This size is then allocated using a user-provided allocator. After a new thread is spawn, the HOST will call into our bootstrap procedure. This bootstrap procedure will then initialize the TLS segment and set the newly spawned thread's TID. It will also set the stack pointer to the newly created stack to ensure we do not clobber the main thread's stack. When bootstrapping the thread is completed, we will call the user's function on this new thread.
2023-06-24all: migrate code to new cast builtin syntaxmlugg
Most of this migration was performed automatically with `zig fmt`. There were a few exceptions which I had to manually fix: * `@alignCast` and `@addrSpaceCast` cannot be automatically rewritten * `@truncate`'s fixup is incorrect for vectors * Test cases are not formatted, and their error locations change
2023-06-19all: zig fmt and rename "@XToY" to "@YFromX"Eric Joldasov
Signed-off-by: Eric Joldasov <bratishkaerik@getgoogleoff.me>
2023-06-17Merge pull request #16052 from mikdusan/bsd-getdentsAndrew Kelley
fix bad return types for BSDs getdents and debitrot openbsd
2023-06-17mem: rename align*Generic to mem.align*Motiejus Jakštys
Anecdote 1: The generic version is way more popular than the non-generic one in Zig codebase: git grep -w alignForward | wc -l 56 git grep -w alignForwardGeneric | wc -l 149 git grep -w alignBackward | wc -l 6 git grep -w alignBackwardGeneric | wc -l 15 Anecdote 2: In my project (turbonss) that does much arithmetic and alignment I exclusively use the Generic functions. Anecdote 3: we used only the Generic versions in the Macho Man's linker workshop.
2023-06-16migration: std.math.{min, min3, max, max3} -> `@min` & `@max`r00ster91
2023-06-15openbsd: fix std.c.getdents and debitrotMichael Dusan
- fix getdents return type usize → c_int - special-case process.zig to use sysctl instead of sysctlbyname - use struct/field pattern for sysctl HW_* constants
2023-05-25std.Thread: refining stack size from platform minimum, changes more ↵David CARLIER
targetted towards platform like Linux/musl (#15791)
2023-04-30std: fix a bunch of typosLinus Groh
The majority of these are in comments, some in doc comments which might affect the generated documentation, and a few in parameter names - nothing that should be breaking, however.
2023-04-28update codebase to use `@memset` and `@memcpy`Andrew Kelley
2023-04-21std: remove names from incorrectly named testsJacob Young
Tests that only reference decls for the purpose of analyzing more tests should be unnamed, otherwise trying to filter for just a referenced test can become impossible depending on the names.
2023-04-20Merge pull request #14696 from r00ster91/threadAndrew Kelley
std.Thread: use dead code
2023-04-12openbsd: fix thread name buffer sizeMichael Dusan
OpenBSD 7.3 changed its implementation of pthread_get_name_np/pthread_set_name_np to wrap new libc functions getthrname/setthrname and lowered the max buffer size from 32 to 24. This is not a backwards-compatible change because if we were to put in comptime version logic to use size 32 when target < 7.3 the binaries would be undefined when running on >= 7.3. It also could simply be that OpenBSD has a policy to not support older binaries running on newer releases? Regardless, the safest course is to simply use the smallest known buffer size. As an aside, this bug manifested as a "hung" std.Thread test because 7.3 pthread API never checks for error result when wrapping getthrname/setthrname. This is not a problem in std.Thread when we use the correct max buffer size because ERANGE/EINVAL become unreachable.
2023-03-15extract ThreadPool and WaitGroup from compiler to std libAndrew Kelley
2023-03-08std.os: add missing mmap errorsJan Philipp Hafer
Man page for posix lists EMFILE, man page for linux ENFILE. Also posix says "The mmap() function adds an extra reference to the file associated with the file descriptor fildes which is not removed by a subsequent close() on that file descriptor. This reference is removed when there are no more mappings to the file." It sounds counter-intuitive, that a process limit but no system limit can be exceeeded. As far as I understand, fildes is only used for file descriptor backed mmaps.
2023-02-26std.Thread: use pthread_getname_np on muslr00ster91
Starting with version 1.2.3, musl now supports pthread_getname_np: https://github.com/bminor/musl/blob/7a43f6fea9081bdd53d8a11cef9e9fab0348c53d/WHATSNEW#L2293-L2329
2023-02-24std.Thread: drop is_gnu checkr00ster91
I believe the reason we had that check in the first place was because for both `pthread_setname_np` and `pthread_getname_np` man says: ``` CONFORMING TO These functions are nonstandard GNU extensions; hence the suffix "_np" (nonportable) in the names. ``` However, this `is_gnu` check was never consistently applied; it was missing in `setName` in the Linux case. It is also missing on all other call sites for other platforms (macOS, iOS, et al.). Though, that could be because it may only apply to Linux. I think for a best-effort approach it is okay to drop this. It's probably less non-standard than man makes it out to be.
2023-02-24std.Thread.setName: use unused coder00ster91
I noticed a comment saying that the intent of a code's author was unclear. What happened is that the author forgot to put the check for whether the thread is the calling thread (`self.getHandle() == std.c.pthread_self()`) in the `if (use_pthreads)`. If the thread is the calling thread, we use `prctl` to set or get the thread's name and it does not take a thread id because it knows the id of the thread we're calling `getName` or `setName` from. I have found a source saying that using `pthread_setname_np` on either the calling thread or any other thread by thread id would work too (so we don't need to call `prctl`) but I was not sure if that is the case on all systems so we keep using `pthread_setname_np` if we have a specific thread that is not the thread we're calling from, and `prctl` otherwise.
2023-01-29std: restrict mem.span() and mem.len() to sentinel terminated pointersIsaac Freund
These functions are currently footgunny when working with pointers to arrays and slices. They just return the stated length of the array/slice without iterating and looking for the first sentinel, even if the array/slice is a sentinel terminated type. From looking at the quite small list of places in the standard library/compiler that this change breaks existing code, the new code looks to be more readable in all cases. The usage of std.mem.span/len was totally unneeded in most of the cases affected by this breaking change. We could remove these functions entirely in favor of other existing functions in std.mem such as std.mem.sliceTo(), but that would be a somewhat nasty breaking change as std.mem.span() is very widely used for converting sentinel terminated pointers to slices. It is however not at all widely used for anything else. Therefore I think it is better to break these few non-standard and potentially incorrect usages of these functions now and at some later time, if deemed worthwhile, finally remove these functions. If we wait for at least a full release cycle so that everyone adapts to this change first, updating for the removal could be a simple find and replace without needing to worry about the semantics.
2023-01-16std.Thread: make Id smaller where possibler00ster91
2022-12-13update usages of `@call`Veikka Tuominen
2022-11-04all: rename i386 to x86Ali Chraghi
2022-09-12remove pointless discardsAndrew Kelley
2022-08-30std.Thread: fix freeAndExit on x86_64-linux (#12693)biexelar
Previously, this function used incorrect registers for the munmap syscall, leading to detached threads not cleaning up. closes #12690 Co-authored-by: bxlr <biexelar@diroot.org>
2022-07-04std.Thread: fix mutable ref of temporaryAndrew Kelley
The previous code is a compile error in stage2 as well as the upcoming lang spec.
2022-05-27math: make `cast` return optional instead of an errorAli Chraghi
2022-05-17std.Thread: insert a missing `@alignCast`Andrew Kelley
stage1 has a missing compile error for this situation.
2022-05-13target: Rename sparcv9 -> sparc64Koakuma
Rename all references of sparcv9 to sparc64, to make Zig align more with other projects. Also, added new function to convert glibc arch name to Zig arch name, since it refers to the architecture as sparcv9. This is based on the suggestion by @kubkon in PR 11847. (https://github.com/ziglang/zig/pull/11487#pullrequestreview-963761757)
2022-04-26std.Thread: ResetEvent improvements (#11523)protty
* std: start removing redundant ResetEvents * src: fix other uses of std.Thread.ResetEvent * src: add builtin.sanitize_thread for tsan detection * atomic: add Atomic.fence for proper fencing with tsan * Thread: remove the other ResetEvent's and rewrite the current one * Thread: ResetEvent docs * zig fmt + WaitGroup.reset() fix * src: fix build issues for ResetEvent + tsan * Thread: ResetEvent tests * Thread: ResetEvent module doc * Atomic: replace llvm *p memory constraint with *m * panicking: handle spurious wakeups in futex.wait() when waiting for abort() * zig fmt
2022-04-23std.Thread: Mutex and Condition improvements (#11497)protty
* Thread: minor cleanups * Thread: rewrite Mutex * Thread: introduce Futex.Deadline * Thread: Condition rewrite + cleanup * Mutex: optimize lock fast path * Condition: more docs * Thread: more mutex + condition docs * Thread: remove broken Condition test * Thread: zig fmt * address review comments + fix Thread.DummyMutex in GPA * Atomic: disable bitRmw x86 inline asm for stage2 * GPA: typo mutex_init * Thread: remove noalias on stuff * Thread: comment typos + clarifications
2022-02-27std: rename `sched_yield` to `yield` and move it to `std.Thread`David John
2022-02-26fix typo on Thread's getHandle docsEndel Dreyer
2022-02-15Merge pull request #10003 from viriuwu/nt-thread-nameVeikka Tuominen
std.Thread.getName/setName: rework windows implementation
2022-02-15std.Thread(windows): use NT internals for name fnsviri
2022-02-08update RwLock to use static initialization (#10838)billzez
2022-01-29fs: Use `OpenMode` enum instead of read/write flags.Sage Hane