summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibPthread
AgeCommit message (Collapse)Author
2022-03-18Userland: Change static const variables to static constexprLenny Maiorani
`static const` variables can be computed and initialized at run-time during initialization or the first time a function is called. Change them to `static constexpr` to ensure they are computed at compile-time. This allows some removal of `strlen` because the length of the `StringView` can be used which is pre-computed at compile-time.
2022-03-16LibPthread: Define SEM_FAILED in semaphore.hLinus Groh
This makes the _multiprocessing module from the Python port build. :^)
2022-03-11Revert "LibPthread: Partially implement pthread_cleanup_(push pop)"Ali Mohammad Pur
This reverts commit 5d51e26caff61516d6fcf612c2e9ba72a82b699f. The threadlocal Vector was somehow misaligned, causing UBSAN to be sad about calling a misaligned method (either the dtor or .is_empty()) on it. For now, let's revert this and avoid the CI flake. Fixes #12957.
2022-03-08LibPthread: Partially implement pthread_cleanup_(push pop)Ali Mohammad Pur
These are also supposed to run on cancellation, but we don't support cancellation.
2022-02-12LibPthread: Add PTHREAD_CANCELEDAli Mohammad Pur
This is just the expected return value of pthread_join() when it fails.
2022-01-11AK+LibC+LibPthread: Introduce NoAllocationGuardkleines Filmröllchen
NoAllocationGuard is an RAII stack guard that prevents allocations while it exists. This is done through a thread-local global flag which causes malloc to crash on a VERIFY if it is false. The guard allows for recursion. The intended use case for this class is in real-time audio code. In such code, allocations are really bad, and this is an easy way of dynamically enforcing the no-allocations rule while giving the user good feedback if it is violated. Before real-time audio code is executed, e.g. in LibDSP, a NoAllocationGuard is instantiated. This is not done with this commit, as currently some code in LibDSP may still incorrectly allocate in real- time situations. Other use cases for the Kernel have also been added, so this commit builds on the previous to add the support both in Userland and in the Kernel.
2022-01-09LibPthread: Validate the clock argument in pthread_condattr_setclockBrian Gianforcaro
2022-01-09LibPthread: Implement pthread_condattr_getclockBrian Gianforcaro
I noticed this was missing while adding spec comments a bit ago. It's small and easy enough to implement, might as well make us more POSIX compliant.
2022-01-07LibPthread: Remove bad spec link for pthread_{get/set}name_np APIsBrian Gianforcaro
I had somehow incorrectly added this link in a previous check-in. Reported-by: Nico Weber <thakis@chromium.org>
2022-01-07LibPthread: Add POSIX spec link for pthread_sigmask APIBrian Gianforcaro
2022-01-07LibPthread: Add POSIX spec links for pthread_once APIBrian Gianforcaro
2022-01-07LibPthread: Add POSIX spec links for pthread_cond APIBrian Gianforcaro
2022-01-07LibPthread: Add POSIX spec links for semaphore APIsBrian Gianforcaro
2021-12-21LibPthread: Add POSIX spec comments to our implementationsBrian Gianforcaro
2021-11-24LibPthread: Initialize conditions with realtime clockJelle Raaijmakers
All the way back in commit 1670ee5aba09, the default clock for condition variables was set to `CLOCK_MONOTONIC`, because there was no other clock available. However, if a condition variable is initialized without any additional attributes by an application, they sometimes assume that the absolute time that is passed to e.g. `pthread_cond_timedwait` is actually based on a realtime clock, as can be seen here in SDL2: https://github.com/SerenityPorts/SDL/blob/6f419bdf5f56be236c070a9d364e0d238b868565/src/thread/pthread/SDL_syscond.c#L99 Additionally, the glibc implementation defaults to a realtime clock: https://github.com/bminor/glibc/blob/aac54dcd378209bbdddbcec749561b1d8f167d11/nptl/pthread_cond_init.c#L42 ...so we probably should do so as well :^)
2021-09-28LibPthread: Correct nonsensical loop exit condition in RWLock unlockAli Mohammad Pur
The loop should terminate after the exchange happens, we shouldn't repeat the operation until the count hits zero. Fixes #10241.
2021-09-28LibPthread: Calculate the correct lock value in RWLock {rd,un}lockAli Mohammad Pur
The previous version was putting the old count in the control bits, which is all kinds of wrong.
2021-08-17Kernel+Userland: Remove global futexesAndreas Kling
We only ever use private futexes, so it doesn't make sense to carry around all the complexity required for global (cross-process) futexes.
2021-07-09LibPthread+Kernel: Add pthread_kill() and the thread_kill syscallAli Mohammad Pur
2021-07-07LibC+LibPthread: Use FUTEX_PRIVATE_FLAG in more placesSergey Bugaev
Performance go brrrrr
2021-07-06LibPthread: Fix some assertionsSergey Bugaev
2021-07-06LibPthread: Fix orderingSergey Bugaev
It would be enough to use relaxed ordering here if it weren't for the mutex, which we also need to store and retrieve. To ensure the pthread_cond_broadcast() call sees the store, use release and acquire as appropriate. Thankfully, both of these are on the slow paths.
2021-07-05LibC+LibPthread: Add PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NPAndreas Kling
This is a common but non-standard way of initializing a pthread_mutex_t in recursive mode.
2021-07-05LibPthread: Reimplement semaphoresSergey Bugaev
This implementation does not use locking or condition variables internally; it's purely based on atomics and futexes. Notably, concurrent sem_wait() and sem_post() calls can run *completely in parallel* without slowing each other down, as long as there are empty slots for them all to succeed without blocking. Additionally, sem_wait() never executes an atomic operation with release ordering, and sem_post() never executes an atomic operation with acquire ordering (unless you count the syscall). This means the compiler and the hardware are free to reorder code *into* the critical section.
2021-07-05LibPthread: Reimplement condition variablesSergey Bugaev
This implementation features a fast path for pthread_cond_signal() and pthread_cond_broadcast() for the case there's no thread waiting, and does not exhibit the "thundering herd" issue in pthread_cond_broadcast(). Fixes https://github.com/SerenityOS/serenity/issues/8432
2021-07-05LibC: Add futex_wait() and futex_wake() helpersSergey Bugaev
These are convinient wrappers over the most used futex operations. futex_wait() also does some smarts for timeout and clock handling. Use the new futex_wait() instead of a similar private helper in LibPthread.
2021-07-04Toolchain+Userland: Enable TLS for x86_64Gunnar Beutner
This is not technically a toolchain change, but it does require rebuilding the toolchain for x86_64 (and just that).
2021-07-01Kernel+LibPthread: Add support for usermode threads on x86_64Gunnar Beutner
2021-07-01Kernel+LibPthread: Remove m_ prefix for public membersGunnar Beutner
2021-06-30Kernel: Disable __thread and TLS on x86_64 for nowGunnar Beutner
They're not yet properly supported.
2021-06-30LibPthread: Remove redundant return statementGunnar Beutner
The pthread_exit() function doesn't return and is marked as such.
2021-06-24Userland: Add more TODO()s for arch-specific codeGunnar Beutner
This enables building more of the userspace applications for x86_64.
2021-06-01LibPthread: Correct error check in `sem_post` and `sem_wait`Jelle Raaijmakers
2021-05-29Kernel: Make sure we free the thread stack on thread exitGunnar Beutner
This adds two new arguments to the thread_exit system call which let a thread unmap an arbitrary VM range on thread exit. LibPthread uses this functionality to unmap the thread stack. Fixes #7267.
2021-05-29LibPthread: Make some variables staticGunnar Beutner
2021-05-21Revert "Userland: static vs non-static constexpr variables"Linus Groh
This reverts commit 800ea8ea969835297dc7e7da345a45b9dc5e751a. Booting the system no longer worked after these changes.
2021-05-21Userland: static vs non-static constexpr variablesLenny Maiorani
Problem: - `static` variables consume memory and sometimes are less optimizable. - `static const` variables can be `constexpr`, usually. - `static` function-local variables require an initialization check every time the function is run. Solution: - If a global `static` variable is only used in a single function then move it into the function and make it non-`static` and `constexpr`. - Make all global `static` variables `constexpr` instead of `const`. - Change function-local `static const[expr]` variables to be just `constexpr`.
2021-05-17Everywhere: Fix a bunch of typosLinus Groh
2021-05-14LibC: Do not include errno.h inside unistd.hJean-Baptiste Boric
POSIX does not mandate this, therefore let's not do it.
2021-05-10LibC: Partially implement pthread_setcancel{state,type}()Gunnar Beutner
With those partially implemented I can start to clone the SerenityOS git repository via HTTPS. The download still fails half-way through because SSL_read returns an error for reasons I haven't investigated yet.
2021-05-08LibPthread: Add implementation for pthread_mutexattr_gettypeGunnar Beutner
2021-05-02LibPthread: Implement pthread_spinlock_t API.Brian Gianforcaro
This change implements the pthread user space spinlock API. The stress-ng Port requires a functioning version to work correctly. To facilitate the requirements of the posix specification for the API we implement the spinlock so that the owning tid is the value stored in the spinlock. This gives us the proper ownership semantics needed to implement the proper error handling.
2021-04-27LibPthread: Use realtime clock for futex_wait()Jelle Raaijmakers
If we get an absolute time passed to one of the pthread_*wait methods, this is not an absolute monotonic time but rather an absolute wall time. This means that we also need to pass FUTEX_CLOCK_REALTIME to the futex syscall to ensure we're not using the monotonic clock.
2021-04-25LibC: Move the __pthread_mutex_trylock function to LibCGunnar Beutner
Let's move this to LibC because the dynamic loader depends on this function.
2021-04-22Everything: Move to SPDX license identifiers in all files.Brian Gianforcaro
SPDX License Identifiers are a more compact / standardized way of representing file license information. See: https://spdx.dev/resources/use/#identifiers This was done with the `ambr` search and replace tool. ambr --no-parent-ignore --key-from-file --rep-from-file key.txt rep.txt *
2021-04-21LibPthread: Add non functional pthread_attr_[set|get]scope stubsBrian Gianforcaro
Standard: https://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_attr_getscope.html Needed for https://fio.readthedocs.io
2021-04-20LibPthread: Add stubs for pthread_spin_* functionsGunnar Beutner
The stress-ng port depends on these now that it detects we have thread support.
2021-04-20LibC+LibPthread: Implement function forwarding for libpthreadGunnar Beutner
GCC will insert various calls to pthread functions when compiling C++ code with static initializers, even when the user doesn't link their program against libpthread explicitly. This is used to make static initializers thread-safe, e.g. when building a library that does not itself use thread functionality and thus does not link against libpthread - but is intended to be used with other code that does use libpthread explicitly. This makes these symbols available in libc.
2021-04-19Pthread: Add stubs for pthread_cleanup_{push,pop}Gunnar Beutner
The stubs are necessary to make the xz port properly detect pthread support. The two functions are only used in the configure script and nowhere else.
2021-04-18LibC+LibPthread: Make sure TLS keys are destroyed after everything elseGunnar Beutner
This ensures that __thread variables can be used when global destructors are being invoked.