aboutsummaryrefslogtreecommitdiff
path: root/nptl
AgeCommit message (Collapse)Author
2021-03-25Support for multiple versions in versioned_symbol, compat_symbolFlorian Weimer
This essentially folds compat_symbol_unique functionality into compat_symbol. This change eliminates the need for intermediate aliases for defining multiple symbol versions, for both compat_symbol and versioned_symbol. Some binutils versions do not suport multiple versions per symbol on some targets, so aliases are automatically introduced, similar to what compat_symbol_unique did. To reduce symbol table sizes, a configure check is added to avoid these aliases if they are not needed. The new mechanism works with data symbols as well as function symbols, due to the way an assembler-level redirect is used. It is not compatible with weak symbols for old binutils versions, which is why the definition of __malloc_initialize_hook had to be changed. This is not a loss of functionality because weak symbols do not matter to dynamic linking. The placeholder symbol needs repeating in nptl/libpthread-compat.c now that compat_symbol is used, but that seems more obvious than introducing yet another macro. A subtle difference was that compat_symbol_unique made the symbol global automatically. compat_symbol does not do this, so static had to be removed from the definition of __libpthread_version_placeholder. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2021-03-19nptl: Remove MULTI_PAGE_ALIASING [BZ #23554]H.J. Lu
MULTI_PAGE_ALIASING was introduced to mitigate an aliasing issue on Pentium 4. It is no longer needed for processors after Pentium 4.
2021-03-18signal: Add __libc_sigactionAdhemerval Zanella
The generic implementation basically handle the system agnostic logic (filtering out the invalid signals) while the __libc_sigaction is the function with implements the system and architecture bits. Checked on x86_64-linux-gnu and i686-linux-gnu.
2021-03-18nptl: Move system to libcAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Move fcntl from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove sendmsg from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove recvmsg from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove sigwait from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove tcdrain from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove pause from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove msync from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove fsync from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove sendto from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove recvfrom from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove recv from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove connect from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove accept from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove close from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove read from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove write from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-12nptl: Move fork into libcAdhemerval Zanella
This is part of the libpthread removal project: <https://sourceware.org/ml/libc-alpha/2019-10/msg00080.html> Checked on x86_64-linux-gnu.
2021-03-12posix: Consolidate register-atforkAdhemerval Zanella
Both htl and nptl uses a different data structure to implement atfork handlers. The nptl one was refactored by 27761a1042d to use a dynarray which simplifies the code. This patch moves the nptl one to be the generic implementation and replace Hurd linked one. Different than previous NPTL, Hurd also uses a global lock, so performance should be similar. Checked on x86_64-linux-gnu, i686-linux-gnu, and with a build for i686-gnu.
2021-03-12nptl: Move Linux pthread_kill to nptlAdhemerval Zanella
The nptl already expects a Linux syscall internally. Also __is_internal_signal is used and the DEBUGGING_P check is removed. Checked on x86_64-linux-gnu.
2021-03-05nptl: Fix __pthread_clockjoin_np64 __pthread_timedjoin_np64 hidden protoAdhemerval Zanella
They are both implemented in libpthread instead of libc.
2021-03-04[PATCH] pthread_once hangs when init routine throws an exception [BZ #18435]Jakub Jelinek
This is another attempt at making pthread_once handle throwing exceptions from the init routine callback. As the new testcases show, just switching to the cleanup attribute based cleanup does fix the tst-once5 test, but breaks the new tst-oncey3 test. That is because when throwing exceptions, only the unwind info registered cleanups (i.e. C++ destructors or cleanup attribute), when cancelling threads and there has been unwind info from the cancellation point up to whatever needs cleanup both unwind info registered cleanups and THREAD_SETMEM (self, cleanup, ...) registered cleanups are invoked, but once we hit some frame with no unwind info, only the THREAD_SETMEM (self, cleanup, ...) registered cleanups are invoked. So, to stay fully backwards compatible (allow init routines without unwind info which encounter cancellation points) and handle exception throwing we actually need to register the pthread_once cleanups in both unwind info and in the THREAD_SETMEM (self, cleanup, ...) way. If an exception is thrown, only the former will happen and we in that case need to also unregister the THREAD_SETMEM (self, cleanup, ...) registered handler, because otherwise after catching the exception the user code could call deeper into the stack some cancellation point, get cancelled and then a stale cleanup handler would clobber stack and probably crash. If a thread calling init routine is cancelled and unwind info ends before the pthread_once frame, it will be cleaned up through self->cleanup as before. And if unwind info is present, unwind_stop first calls the self->cleanup registered handler for the frame, then it will call the unwind info registered handler but that will already see __do_it == 0 and do nothing.
2021-03-01nptl: Use <unwind-link.h> for accessing the libgcc_s unwinderFlorian Weimer
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
2021-02-23nptl: Move elision implementations into libcFlorian Weimer
The elision interfaces are closely aligned between the targets that implement them, so declare them in the generic <lowlevellock.h> file. Empty .c stubs are provided, so that fewer makefile updates under sysdeps are needed. Also simplify initialization via __libc_early_init. The symbols __lll_clocklock_elision, __lll_lock_elision, __lll_trylock_elision, __lll_unlock_elision, __pthread_force_elision move into libc. For the time being, non-hidden references are used from libpthread to access them, but once that part of libpthread is moved into libc, hidden symbols will be used again. (Hidden references seem desirable to reduce the likelihood of transactions aborts.)
2021-02-22nptl: Move futex-internal into libcFlorian Weimer
This moves __futex_abstimed_wait64 and __futex_abstimed_wait_cancelable64 and exports these functions as GLIBC_PRIVATE. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2021-02-22nptl: Move lowlevellock into libc [BZ #15648]Florian Weimer
And export __lll_lock_wait and __lll_lock_wait_private as GLIBC_PRIVATE. This should eliminate the need for the previous riscv kludge.
2021-02-22nptl: Move futex-internal.c into main nptl directoryFlorian Weimer
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2021-02-22nptl: Reformat VersionsFlorian Weimer
One symbol per line, lexicographically ordered. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2021-02-22nptl: Split libpthread-routines into one routine per lineFlorian Weimer
And sort the lines lexicographically. This will make it easier to review patches which move symbols from libpthread to libc. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2021-02-08pthread: Refactor semaphore codeAdhemerval Zanella
The internal semaphore list code is moved to a specific file, sem_routine.c, and the internal usage is simplified to only two functions (one to insert a new semaphore and one to remove it from the internal list). There is no need to expose the internal locking, neither how the semaphore mapping is implemented. No functional or semantic change is expected, tested on x86_64-linux-gnu.
2021-02-08linux: Require /dev/shm as the shared memory file systemFlorian Weimer
Previously, glibc would pick an arbitrary tmpfs file system from /proc/mounts if /dev/shm was not available. This could lead to an unsuitable file system being picked for the backing storage for shm_open, sem_open, and related functions. This patch introduces a new function, __shm_get_name, which builds the file name under the appropriate (now hard-coded) directory. It is called from the various shm_* and sem_* function. Unlike the SHM_GET_NAME macro it replaces, the callers handle the return values and errno updates. shm-directory.c is moved directly into the posix subdirectory because it can be implemented directly using POSIX functionality. It resides in libc because it is needed by both librt and nptl/htl. In the sem_open implementation, tmpfname is initialized directly from a string constant. This happens to remove one alloca call. Checked on x86_64-linux-gnu.
2021-01-04nptl: Fix comment typo in pthread_cond_wait.cJangwoong Kim
2021-01-04nptl: Remove set*id, set*gid files which are not builtFlorian Weimer
2021-01-02Update copyright dates not handled by scripts/update-copyrights.Paul Eggert
I've updated copyright dates in glibc for 2021. This is the patch for the changes not generated by scripts/update-copyrights and subsequent build / regeneration of generated files. As well as the usual annual updates, mainly dates in --version output (minus csu/version.c which previously had to be handled manually but is now successfully updated by update-copyrights), there is a small change to the copyright notice in NEWS which should let NEWS get updated automatically next year. Please remember to include 2021 in the dates for any new files added in future (which means updating any existing uncommitted patches you have that add new files to use the new copyright dates in them).
2021-01-02Update copyright dates with scripts/update-copyrightsPaul Eggert
I used these shell commands: ../glibc/scripts/update-copyrights $PWD/../gnulib/build-aux/update-copyright (cd ../glibc && git commit -am"[this commit message]") and then ignored the output, which consisted lines saying "FOO: warning: copyright statement not found" for each of 6694 files FOO. I then removed trailing white space from benchtests/bench-pthread-locks.c and iconvdata/tst-iconv-big5-hkscs-to-2ucs4.c, to work around this diagnostic from Savannah: remote: *** pre-commit check failed ... remote: *** error: lines with trailing whitespace found remote: error: hook declined to update refs/heads/master
2020-12-16{nptl,htl}/semaphoreP.h: clean upSamuel Thibault
This removes "Contributed by", and uses a C99 flexible array instead of char name[0];
2020-12-16htl: Get sem_open/sem_close/sem_unlink support [BZ #25524]Samuel Thibault
This just moves the existing nptl implementation to reuse as it is in htl.
2020-12-16pthread: Move semaphore initialization for open to semaphoreP.hSamuel Thibault
This allows to easily reuse all of the sem_open/sem_close/sem_unlink implementations in the various ports.
2020-12-01nptl: Fix __futex_clocklock64 return error check [BZ #26964]Lucas A. M. Magalhaes
The earlier implementation of this, __lll_clocklock, calls lll_clockwait that doesn't return the futex syscall error codes. It always tries again if that fails. However in the current implementation, when the futex returns EAGAIN, __futex_clocklock64 will also return EGAIN, even if the futex is taken. This patch fixes the EAGAIN issue and also adds a check for EINTR. As futex syscall can return EINTR if the thread is interrupted by a signal. In this case I'm assuming the function should continue trying to lock as there is no mention to about it on POSIX. Also add a test for both scenarios. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2020-11-30y2038: Convert aio_suspend to support 64 bit timeLukasz Majewski
The aio_suspend function has been converted to support 64 bit time. This change uses (in aio_misc.h): - __futex_abstimed_wait64 (instead of futex_reltimed_wait) - __futex_abstimed_wait_cancellable64 (instead of futex_reltimed_wait_cancellable) from ./sysdeps/nptl/futex-helpers.h The aio_suspend() accepts relative timeout, which then is converted to absolute one. The i686-gnu port (HURD) do not define DONT_NEED_AIO_MISC_COND and as it doesn't (yet) support 64 bit time it uses not converted pthread_cond_timedwait(). The __aio_suspend() is supposed to be run on ports with __TIMESIZE !=64 and __WORDSIZE==32. It internally utilizes __aio_suspend_time64() and hence the conversion from 32 bit struct timespec to 64 bit one is required. For ports supporting 64 bit time the __aio_suspend_time64() will be used either via alias (to __aio_suspend when __TIMESIZE==64) or redirection (when -D_TIME_BITS=64 is passed). Build tests: ./src/scripts/build-many-glibcs.py glibcs Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2020-11-27nptl: Add EOVERFLOW checks for futex callsAdhemerval Zanella
Some futex-internal calls require additional check for EOVERFLOW (as indicated by [1] [2] [3]). For both mutex and rwlock code, EOVERFLOW is handle as ETIMEDOUT; since it indicate to the caller that the blocking operation could not be issued. For mutex it avoids a possible issue where PTHREAD_MUTEX_ROBUST_* might assume EOVERFLOW indicate futex has succeed, and for PTHREAD_MUTEX_PP_* it avoid a potential busy infinite loop. For rwlock and semaphores, it also avoids potential busy infinite loops. Checked on x86_64-linux-gnu and i686-linux-gnu, although EOVERFLOW won't be possible with current usage (since all timeouts on 32-bit architectures with 32-bit time_t support will be in the range of 32-bit time_t). [1] https://sourceware.org/pipermail/libc-alpha/2020-November/120079.html [2] https://sourceware.org/pipermail/libc-alpha/2020-November/120080.html [3] https://sourceware.org/pipermail/libc-alpha/2020-November/120127.html
2020-11-27nptl: Fix PTHREAD_PRIO_PROTECT timed lockAdhemerval Zanella
The 878fe624d4 changed lll_futex_timed_wait, which expects a relative timeout, with a __futex_abstimed_wait64, which expects an absolute timeout. However the code still passes a relative timeout. Also, the PTHREAD_PRIO_PROTECT support for clocks different than CLOCK_REALTIME was broken since the inclusion of pthread_mutex_clocklock (9d20e22e46) since lll_futex_timed_wait always use CLOCK_REALTIME. This patch fixes by removing the relative time calculation. It also adds some xtests that tests both thread and inter-process usage. Checked on x86_64-linux-gnu.
2020-11-25nptl: Return EINVAL for invalid clock for pthread_clockjoin_npAdhemerval Zanella
The align the GNU extension with the others one that accept specify which clock to wait for (such as pthread_mutex_clocklock). Check on x86_64-linux-gnu. Reviewed-by: Lukasz Majewski <lukma@denx.de>
2020-11-25nptl: Return EINVAL for pthread_mutex_clocklock/PI with CLOCK_MONOTONIC [BZ ↵Adhemerval Zanella
#26801] Linux futex FUTEX_LOCK_PI operation only supports CLOCK_REALTIME, so pthread_mutex_clocklock operation with priority aware mutexes may fail depending of the input timeout. Also, it is not possible to convert a CLOCK_MONOTONIC to a CLOCK_REALTIME due the possible wall clock time change which might invalid the requested timeout. Checked on x86_64-linux-gnu and i686-linux-gnu. Reviewed-by: Lukasz Majewski <lukma@denx.de>
2020-11-25nptl: Replace lll_futex_wake with futex-internal.hAdhemerval Zanella
The idea is to make NPTL implementation to use on the functions provided by futex-internal.h. Checked on x86_64-linux-gnu and i686-linux-gnu. Reviewed-by: Lukasz Majewski <lukma@denx.de>
2020-11-25nptl: Replace lll_futex_supported_clockid with futex-internal.hAdhemerval Zanella
The idea is to make NPTL implementation to use on the functions provided by futex-internal.h. Checked on x86_64-linux-gnu and i686-linux-gnu. Reviewed-by: Lukasz Majewski <lukma@denx.de>
2020-11-25nptl: Replace lll_futex_{timed_}wait by futex-internal.hAdhemerval Zanella
The idea is to make NPTL implementation to use on the functions provided by futex-internal.h. Checked on x86_64-linux-gnu and i686-linux-gnu. Reviewed-by: Lukasz Majewski <lukma@denx.de>