The macro pthread_cleanup_push_defer_np in pthread.h has a misaligned
line continuation marker. This marker was previously aligned, but
recent changes have moved it out of alignment. This change realigns
the marker. This also reduces the diff against the hppa version of
pthread.h where the marker is aligned.
[BZ #14652]
When a thread waiting in pthread_cond_wait with a PI mutex is
cancelled after it has returned successfully from the futex syscall
but just before async cancellation is disabled, it enters its
cancellation handler with the mutex held and simply calling a
mutex_lock again will result in a deadlock. Hence, it is necessary to
see if the thread owns the lock and try to lock it only if it doesn't.
[BZ #14568]
* sysdeps/sparc/tls.h (DB_THREAD_SELF_INCLUDE): Delete.
(DB_THREAD_SELF): Use constants for the register offsets. Correct
the case of a 64-bit debugger with a 32-bit inferior.
[BZ #14417]
A futex call with FUTEX_WAIT_REQUEUE_PI returns with the mutex locked
on success. If such a successful thread is pipped to the cond_lock by
another spuriously woken waiter, it could be sent back to wait on the
futex with the mutex lock held, thus causing a deadlock. So it is
necessary that the thread relinquishes the mutex before going back to
sleep.
[BZ #14477]
Add an additional entry in the exception table to jump to
__condvar_w_cleanup2 instead of __condvar_w_cleanup for PI mutexes
when %ebx contains the address of the futex instead of the condition
variable.
Ref gcc.gnu.org/bugzilla/show_bug.cgi?id=52839#c10
Release barriers are needed to ensure that any memory written by
init_routine is seen by other threads before *once_control changes.
In the case of clear_once_control we need to flush any partially
written state.
In some cases, the compiler would optimize out the call to
allocate_and_test and thus result in a false positive for the test
case. Another problem was the fact that the compiler could in some
cases generate additional shifting of the stack pointer, resulting in
alloca moving the stack pointer beyond what is allowed by the
rlimit. Hence, accessing the stackaddr returned by pthread_getattr_np
is safer than relying on the alloca'd result.
Another problem is when RLIMIT may be very large, which may result in
violation of other resource limits. Hence we cap the max stack size to
8M for this test.
When rlimit is small enough to be used as the stacksize to be returned
in pthread_getattr_np, cases where a stack is made executable due to a
DSO load get stack size that is larger than what the kernel
allows. This is because in such a case the stack size does not account
for the pages that have auxv and program arguments.
Additionally, the stacksize for the process derived from this should
be truncated to align to page size to avoid going beyond rlimit.
When a stack is marked executable due to loading a DSO that requires
an executable stack, the logic tends to leave out a portion of stack
after the first frame, thus causing a difference in the value returned
by pthread_getattr_np before and after the stack is marked
executable. It ought to be possible to fix this by marking the rest of
the stack as executable too, but in the interest of marking as less of
the stack as executable as possible, the path this fix takes is to
make pthread_getattr_np also look at the first frame as the underflow
end of the stack and compute size and stack top accordingly.
The above happens only for the main process stack. NPTL thread stacks
are not affected by this change.
There is nothing in the POSIX specification to disallow a
single-threaded program from cancelling itself, so we forcibly enable
multiple_threads to allow the next available cancellation point in the
thread to run.
Also added additional tests to cover various cancellation scenarios.
nptl/
* sysdeps/sparc/sparc64/pthread_spin_unlock.S: Fix thinko, we
always have to return 0, especially for the pthread_spin_init
alias.
* sysdeps/sparc/sparc32/pthread_spin_lock.S: Add missing trailing
newline.
* sysdeps/sparc/sparc32/sparcv9/pthread_spin_lock.S: Likewise.
* sysdeps/sparc/sparc64/pthread_spin_lock.S: Likewise.
* tst-cond16.c (do_test): Use a thread stack size which is either
PTHREAD_STACK_MIN or the page size, whichever is larger.
* tst-cond18.c (do_test): Likewise.
nptl/
[BZ #13844]
* sysdeps/unix/sysv/linux/libc-lowlevellock.c: Include using <..>
instead of "...".
* sysdeps/unix/sysv/linux/sparc/sparc32/libc-lowlevellock.c:
Delete, not needed.
/
* sysdeps/unix/sysv/linux/sparc/sparc64/get_clockfreq.c
(set_obp_int): New function.
(get_obp_int): New function.
(__get_clockfreq_via_dev_openprom): Likewise.
* sysdeps/unix/sysv/linux/sparc/sysdep.h (INTERNAL_SYSCALL_ERROR_P): Avoid
unused variable warnings on 'val' and use builtin_expect.
(INLINE_SYSCALL): Don't wrap INTERNAL_SYSCALL_ERROR_P with builtin_expect.
(INLINE_CLONE_SYSCALL): Likewise.
nptl/
* sysdeps/unix/sysv/linux/sparc/sem_post.c (__new_sem_post): Use
atomic_increment and remove unused local variable.
(__old_sem_post): Likewise.
/
* sysdeps/sparc/Makefile: Add -fPIC when building crt{i,n}.S
* sysdeps/sparc/crti.S: New file.
* sysdeps/sparc/crtn.S: New file.
* sysdeps/sparc/sparc32/Makefile: Remove initfini handling.
* sysdeps/sparc/sparc64/Makefile: Likewise.
nptl/
* sysdeps/sparc/Makefile: Add -fPIC when building pt-crti.S and crtn.S
At least the Linux kernel provides field where the kernel originally
stores the command which is executed by the thread. The value can
subsequently be overwritten. The added functions allow to do that for
threads, providing and abstraction around the syscalls or /proc file
system accesses needed.
If a signal arrived during a symbol lookup and the signal handler also
required a symbol lookup, the end of the lookup in the signal handler reset
the flag whether restoring AVX/SSE registers is needed. Resetting means
in this case that the tail part of the outer lookup code will try to
restore the registers and this can fail miserably. We now restore to the
previous value which makes nesting calls possible.
The syscall wrappers had to save and restore the syscall parameter
values and return value when calling the functions to enable/disable
cancellation were called. Not anymore. The called functions are
special and don't modify any unexpected registers.
SSE registers are used for passing parameters and must be preserved
in runtime relocations. This is inside ld.so enforced through the
tests in tst-xmmymm.sh. But the malloc routines used after startup
come from libc.so and can be arbitrarily complex. It's overkill
to save the SSE registers all the time because of that. These calls
are rare. Instead we save them on demand. The new infrastructure
put in place in this patch makes this possible and efficient.
It just happens that __pthread_enable_asynccancel doesn't modify the $rdi
register. But this isn't guaranteed. Hence we reload the register after
the calls.
The kernel from 2.3.31 on supports the rt_tgsigqueueinfo syscall.
Use it to implement the non-standard extension which, like
sigqueue, can pass additional data to the receiving thread.
Due to a pasto the fallocate64 interface, introduced in glibc 2.10,
isn't exported for 32-bit Linux platforms. It is too late for this
now so exported them for glibc 2.11.
Because we are not shutting down the other threads first another
thread might work on a query before the process shuts down. In this
case the now uninitialized libselinux and libaudit might be used.
Just don't free the resources. It's not necessary anyway because
the process is about to terminate.
The bits tested to decide when to delay the return when switching
off async cancel mode were wrong. Fix that. Also close a race
condition in pthread_cancel where the bit indicating the cancellation
is unconditionally set even if the cancel type might have changed.
When disabling async cancellation we cannot return from the function
call if the thread is canceled. This happens when the cancel bits
have been set before async cancel is disabled but the signal hasn't
been sent/received yet. Delay for as long as necessary since
otherwise the signal might be received in an unsafe context.
2009-01-07 Ulrich Drepper <drepper@redhat.com>
* (in_flight_stack): New variable.
(stack_list_del): New function. Use instead of list_del.
(stack_list_add): New function. Use instead of list_add when adding to
stack_cache and stack_used lists.
(__reclaim_stacks): Complete operations on stack_cache and stack_used lists
when the fork call interrupted another thread.
* wcsmbs/wchar.h: mbsnrtowcs, open_wmemstream, wcpcpy, wcpncpy,
wcscasecmp, wcsdup, wcsncasecmp, wcsnlen, wcsnrtombs,
wcscasecmp_l, wcsncasecmp_l, wcscoll_l, and wcsxfrm_l.
* sysdeps/mach/hurd/bits/posix_opt.h: Reset value of macros from
200112L to 200809L.
* sysdeps/unix/sysv/linux/bits/posix_opt.h: Likewise.
* posix/getconf.c (vars): Add _SC_THREAD_ROBUST_PRIO_INHERIT and
_SC_THREAD_ROBUST_PRIO_PROTECT entries.
* bits/confname.h: Add _SC_THREAD_ROBUST_PRIO_INHERIT and
_SC_THREAD_ROBUST_PRIO_PROTECT.
* posix/unistd.h: fexecve is in POSIX 2008.
* time/time.h: strftime_l is in POSIX 2008.
* io/sys/stat.h: futimens is in POSIX 2008.
* string/strings.h: strcasecmp_l and strncasecmp_l are in POSIX 2008.
* string/string.h: stpcpy, stpncpy, strndup, strnlen, strsignal,
strcoll_l, strerror_l, and strxfrm_l are in POSIX 2008.
* stdlib/stdlib.h: mkdtemp is in POSIX 2008.
(__free_stack_cache): Removed. Change callers to call __free_stacks.
* init.c (nptl_freeres): New function.
(pthread_functions): Initialize ptr_freeres to nptl_freeres.
* pthreadP.h: Don't declare __free_stack_cache. Declare __free_stacks.
* sysdeps/pthread/unwind-forcedunwind.c (libgcc_s_handle): New
variable.
(pthread_cancel_init): Depend in libgcc_s_handle for decision to
load DSO. Assign last.
(__unwind_freeres): New function.
* allocatestack.c (__reclaim_stacks): Reset in_flight_stack later
for better debugging. No need to use stack_list_add here.
only passing five parameters to FUTEX_WAIT_BITSET call.
* sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S
(__lll_timedlock_wait): Use FUTEX_WAIT_BITSET|FUTEX_CLOCK_READTIME
instead of computing relative timeout.
fast path here, for robust/PI/PP mutexes call
__pthread_mutex_lock_full. Don't use switch, instead use a series
of ifs according to their probability.
(__pthread_mutex_lock_full): New function.
* pthread_mutex_unlock.c: Include assert.h.
(__pthread_mutex_unlock_usercnt): Handle only the
fast path here, for robust/PI/PP mutexes call
__pthread_mutex_unlock_full. Don't use switch, instead use a series
of ifs according to their probability.
(__pthread_mutex_unlock_full): New function.
* sysdeps/unix/sysv/linux/pthread_mutex_cond_lock.c
(__pthread_mutex_lock_full): Define.
2008-11-24 Arkadiusz Miśkiewicz <arekm@maven.pl>
* sysdeps/i386/dl-tlsdesc.S (_dl_tlsdesc_dynamic): Use LOAD_PIC_REG
instead of doing things manually.
2008-11-26 Chris Steel <chris.steel.lnx@googlemail.com>
* posix/regex_internal.h (build_wcs_upper_buffer):
Return type is reg_error_t.
ESRCH return value.
(_nss_dns_gethostbyname4_r): Likewise.
* resolv/res_init.c (__res_vinit): Initialize nscount to zero.
* sysdeps/posix/getaddrinfo.c (gaih_inet): In case we use
gethostbyname4_r, we don't have a separate IPv6 status, so copy
the no_data variable.
2008-11-01 Ulrich Drepper <drepper@redhat.com>
[BZ #6955]
* pthread_mutex_lock.c: Add support for private PI mutexes.
* pthread_mutex_timedlock.c: Likewise.
* pthread_mutex_trylock.c: Likewise.
* pthread_mutex_unlock.c: Likewise.
Patch mostly by Ben Jackson <ben@ben.com>.
__libc_clntudp_bufcreate_internal.
* include/sys/socket.h: Declare __have_sock_cloexec.
* socket/Makefile (aux): Add have_sock_cloexec.
* socket/have_sock_cloexec.c: New file.
* sunrpc/clnt_udp.h (clntudp_bufcreate): Now a wrapper around
__libc_clntudp_bufcreate.
(__libc_clntudp_bufcreate): Former implementation of clntudp_bufcreate
which takes an additional parameter. Create socket with non-blocking
mode and close-on-exec flag set, if wanted.
* sunrpc/Versions: Export __libc_clntudp_bufcreate@GLIBC_PRIVATE.
* nis/ypclnt.c (yp_bind_client_create): Use __libc_clntpudp_bufcreate
instead of clntudp_create. The socket has already the close-on-exec
flag set if SOCK_CLOEXEC is defined.
(__old_sem_wait): Fix argument to lll_futex_wait().
2008-04-14 David S. Miller <davem@davemloft.net>
* sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c
(__old_sem_wait): Fix argument to lll_futex_wait().
2008-04-09 Ulrich Drepper <drepper@redhat.com>
* stdlib/tst-makecontext.c: Change parameter to cf to negative
value to check for correct sign extension.
[BZ #5436]
* sysdeps/unix/sysv/linux/x86_64/makecontext.c (__makecontext):
Copy 64-bit parameter values even though this is not required in
the standard.
* sysdeps/unix/sysv/linux/x86_64/vfork.S (__vfork): Record return
PC save.
<linux/limits.h> has defined it.
* sysdeps/unix/sysv/linux/sys/param.h: Define NCARGS to the legacy
ARG_MAX value and prevent ARG_MAX from being defined by the kernel
headers.
* sysdeps/unix/sysv/linux/sysconf.c: Define legacy_ARG_MAX and use
it instead of ARG_MAX.
of ASSEMBLER. nptl/
* sysdeps/unix/sysv/linux/ia64/dl-sysdep.h: Use __ASSEMBLER__ instead
of ASSEMBLER.
* sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/i386/dl-sysdep.h: Likewise.
2008-03-18 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/dl-sysdep.h: Use __ASSEMBLER__ instead
of ASSEMBLER.
* sysdeps/unix/sysv/linux/lowlevellock.c (__lll_timedlock_wait):
If we time out, try one last time to lock the futex to avoid
losing a wakeup signal.
* sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Likewise.
* sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: Likewise.
2007-10-23 Andreas Jaeger <aj@suse.de>
[BZ #5208]
* sysdeps/unix/sysv/linux/readahead.c (__readahead): Use
__LONG_LONG_PAIR to handle little endian byte order.
Suggested by abhishekrai@google.com
routine instead of an alias to __new_sem_post.
2007-10-17 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/i386/i486/sem_post.S (__old_sem_post): New
routine instead of an alias to __new_sem_post.
2007-10-16 Ulrich Drepper <drepper@redhat.com>
* time/tzfile.c (__tzfile_read): Take extra memory requested by caller
into account when copying TZ string.
(__lll_robust_timedlock): Pass private as last argument to
__lll_robust_timedlock_wait.
(__lll_unlock): Fix a pasto.
2007-08-16 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/alpha/lowlevellock.h
(__lll_robust_timedlock): Pass private as last argument to
__lll_robust_timedlock_wait.
(__lll_unlock): Fix a pasto.
FE_UNDERFLOW on Niagara CPUs.
* sysdeps/sparc/fpu/feholdexcpt.c (feholdexcept): Clear all
exceptions.
* sysdeps/unix/sysv/linux/sparc/internaltypes.h (sparc_new_sem,
sparc_old_sem): New structs.
* sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c
(__sem_wait_cleanup): New function.
(__new_sem_wait): Use sparc_new_sem structure. Bump and afterwards
decrease nwaiters. Register __sem_wait_cleanup as cleanup handler.
Pass isem->private ^ FUTEX_PRIVATE_FLAG as last argument to
lll_futex_wait.
(__old_sem_wait): New function.
* sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_wait.c: Include
nptl/sysdeps/unix/sysv/linux/sparc version.
* sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_timedwait.c:
Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_post.c: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/sem_trywait.c
(__new_sem_trywait): Use sparc_old_sem structure.
* sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c
(sem_timedwait): Use sparc_new_sem structure. Bump and afterwards
decrease nwaiters. Register __sem_wait_cleanup as cleanup handler.
Pass isem->private ^ FUTEX_PRIVATE_FLAG as last argument to
lll_futex_timed_wait.
* sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c (__new_sem_post):
Use sparc_new_sem structure. Only wake if nwaiters > 0. Pass
isem->private ^ FUTEX_PRIVATE_FLAG as last argument to
lll_futex_wake.
(__old_sem_post): New function.
* sysdeps/unix/sysv/linux/sparc/sem_wait.c: New file.
* sysdeps/unix/sysv/linux/sparc/sem_init.c: New file.
* sysdeps/unix/sysv/linux/sparc/sem_timedwait.c: New file.
* sysdeps/unix/sysv/linux/sparc/sem_post.c: New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_init.c: Remove.
* sysdeps/unix/sysv/linux/sparc/sparc32/sem_init.c: Remove.
2007-08-15 Jakub Jelinek <jakub@redhat.com>
* sysdeps/sparc/fpu/fraiseexcpt.c (__feraiseexcept): Fix raising
FE_UNDERFLOW on Niagara CPUs.
* sysdeps/sparc/fpu/feholdexcpt.c (feholdexcept): Clear all
exceptions.
(__pthread_cond_broadcast): Pass LLL_PRIVATE to lll_* and or
FUTEX_PRIVATE_FLAG into SYS_futex op if cv is process private.
Don't use FUTEX_CMP_REQUEUE if dep_mutex is not process private.
* sysdeps/unix/sysv/linux/shpthread_cond_signal.S
(__pthread_cond_signal): Pass LLL_PRIVATE to lll_* and or
FUTEX_PRIVATE_FLAG into SYS_futex op if cv is process private.
Use FUTEX_WAKE_OP.
* sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Include
kernel-features.h and tcb-offsets.h.
(__pthread_cond_wait, __condvar_w_cleanup): Pass LLL_PRIVATE to
lll_* and or FUTEX_PRIVATE_FLAG into SYS_futex op if cv is
process private.
* sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Include
tcb-offsets.h.
(__pthread_cond_timedwait, __condvar_tw_cleanup): Pass LLL_PRIVATE
to lll_* and or FUTEX_PRIVATE_FLAG into SYS_futex op if cv is
process private.
* sysdeps/unix/sysv/linux/sh/pthread_once.S: Use #ifdef
__ASSUME_PRIVATE_FUTEX instead of #if __ASSUME_PRIVATE_FUTEX.
* sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: Likewise.
* sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S: Likewise.
* sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S: Likewise.
* sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S: Likewise.
* sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S: Likewise.
need to check GLRO(dl_hwcap) & HWCAP_SPARC_FLUSH on sparcv9.
(sparc_fixup_plt): Add do_flush argument instead of figuring whether
flush should be used or not inside of the function.
(elf_machine_fixup_plt, elf_machine_rela): Adjust caller.
* sysdeps/unix/sysv/linux/sparc/sparc32/clone.S (__clone,
__thread_start): Use HIDDEN_JUMPTARGET.
* sysdeps/unix/sysv/linux/sparc/sparc64/clone.S (__clone,
__thread_start): Likewise.
* sysdeps/unix/sysv/linux/sparc/sysdep.h (JUMPTARGET): Define.
nptl/
* sysdeps/unix/sysv/linux/lowlevellock.c: Comment fix.
* sysdeps/unix/sysv/linux/sparc/sparc32/lowlevellock.c
(__lll_timedwait_tid): Pass LLL_SHARED as 4th argument to
lll_futex_timed_wait.
* sysdeps/sparc/sparc32/dl-machine.h (elf_machine_runtime_setup): No
need to check GLRO(dl_hwcap) & HWCAP_SPARC_FLUSH on sparcv9.
(sparc_fixup_plt): Add do_flush argument instead of figuring whether
flush should be used or not inside of the function.
(elf_machine_fixup_plt, elf_machine_rela): Adjust caller.
* sysdeps/unix/sysv/linux/sparc/sparc32/clone.S (__clone,
__thread_start): Use HIDDEN_JUMPTARGET.
* sysdeps/unix/sysv/linux/sparc/sparc64/clone.S (__clone,
__thread_start): Likewise.
* sysdeps/unix/sysv/linux/sparc/sysdep.h (JUMPTARGET): Define.
Add libc_hidden_proto.
(STRTOF): Add libc_hidden_proto.
(___new_strtold_l, ___new_wcstold_l): New weak aliases.
(strtold_l, wcstold_l): Use them as second argument for
long_double_symbol. nptl/
* sysdeps/unix/sysv/linux/alpha/lowlevellock.h (__lll_unlock,
__lll_robust_unlock): Rewrite as macros instead of inline functions.
* sysdeps/unix/sysv/linux/s390/lowlevellock.h (__lll_unlock,
__lll_robust_unlock, __lll_wait_tid): Likewise.
2007-08-14 Jakub Jelinek <jakub@redhat.com>
* sysdeps/ieee754/ldbl-64-128/strtold_l.c (__STRTOF): Declare.
Add libc_hidden_proto.
(STRTOF): Add libc_hidden_proto.
(___new_strtold_l, ___new_wcstold_l): New weak aliases.
(strtold_l, wcstold_l): Use them as second argument for
long_double_symbol.
__ASSUME_PPOLL, __ASSUME_ATFCTS, __ASSUME_SET_ROBUST_LIST,
__ASSUME_UTIMENSAT, __ASSUME_FALLOCATE): Update per-arch conditions
when each feature was introduced.
* sysdeps/unix/sysv/linux/dl-vdso.c: Don't include dl-hash.h.
* sysdeps/unix/sysv/linux/dl-vdso.h: Don't include dl-hash.h if NDEBUG.
(CHECK_HASH): New macro.
(PREPARE_VERSION): Use it.
* sysdeps/unix/sysv/linux/pselect.c (__generic_pselect): Only provide
prototype if not __ASSUME_PSELECT.
* sysdeps/unix/sysv/linux/ppoll.c (__generic_ppoll): Only provide
prototype if not __ASSUME_PPOLL.
* sysdeps/unix/sysv/linux/dl-osinfo.h (ROUND): #undef after use.
* sysdeps/unix/clock_settime.c (freq, __pthread_clock_settime,
hp_timing_settime): Don't define or declare if HANDLED_CPUTIME
is defined.
(_libc_vdso_platform_setup): If vDSO is not available point
__vdso_gettimeofday to the vsyscall.
* sysdeps/unix/sysv/linux/x86_64/gettimeofday.S [SHARED]: Use
__vdso_gettimeofday instead of vsyscall.