diff options
Diffstat (limited to 'nptl')
567 files changed, 0 insertions, 70034 deletions
diff --git a/nptl/Banner b/nptl/Banner deleted file mode 100644 index 7c1487e7b6..0000000000 --- a/nptl/Banner +++ /dev/null @@ -1 +0,0 @@ -Native POSIX Threads Library by Ulrich Drepper et al diff --git a/nptl/ChangeLog.old b/nptl/ChangeLog.old deleted file mode 100644 index e022a1927a..0000000000 --- a/nptl/ChangeLog.old +++ /dev/null @@ -1,13230 +0,0 @@ -This file describes changes to the nptl/ subdirectory prior to 2014-03-03. -Later nptl/ changes go into the top-level ChangeLog file, not here. - - - -2014-02-28 Roland McGrath <roland@hack.frob.com> - - * Makefile (generated-dirs): Use += rather than =. - -2014-02-26 Joseph Myers <joseph@codesourcery.com> - - * Makefile: Include Makeconfig immediately after defining subdir. - -2014-02-21 Joseph Myers <joseph@codesourcery.com> - - * Makefile ($(objpfx)tst-stack3-mem): Use $(evaluate-test). - ($(objpfx)tst-tls6.out): Likewise. - ($(objpfx)tst-cleanup0.out): Likewise. - ($(objpfx)tst-cleanup0-cmp.out): Likewise. - ($(objpfx)tst-cancel-wrappers.out): Likewise. - ($(objpfx)tst-oddstacklimit.out): Likewise. - -2014-02-14 Joseph Myers <joseph@codesourcery.com> - - * Makefile ($(objpfx)tst-cleanup0.out): Do not run cmp. - [$(run-built-tests) = yes] (tests): Depend on - $(objpfx)tst-cleanup0-cmp.out. - ($(objpfx)tst-cleanup0-cmp.out): New rule. - -2014-02-10 OndÅ™ej BÃlka <neleai@seznam.cz> - - * allocatestack.c (queue_stack, allocate_stack, - __deallocate_stack, __reclaim_stacks): Use glibc_likely instead - __builtin_expect. - * cancellation.c (__pthread_enable_asynccancel, - __pthread_disable_asynccancel): Likewise. - * cleanup_defer.c (__pthread_register_cancel_defer, - __pthread_unregister_cancel_restore): Likewise. - * cleanup_defer_compat.c (_pthread_cleanup_push_defer, - _pthread_cleanup_pop_restore): Likewise. - * cond-perf.c (main): Likewise. - * nptl-init.c (sigcancel_handler, sighandler_setxid): Likewise. - * perf.c (get_clockfreq): Likewise. - * pthread_barrier_destroy.c (pthread_barrier_destroy): Likewise. - * pthread_barrier_init.c (pthread_barrier_init): Likewise. - * pthread_cond_timedwait.c (__pthread_cond_timedwait): Likewise. - * pthread_cond_wait.c (__pthread_cond_wait): Likewise. - * pthread_create.c (__free_tcb, start_thread, __pthread_create_2_1): - Likewise. - * pthread_getattr_np.c (pthread_getattr_np): Likewise. - * pthread_getspecific.c (__pthread_getspecific): Likewise. - * pthread_join.c (pthread_join): Likewise. - * pthread_key_delete.c (pthread_key_delete): Likewise. - * pthread_mutex_init.c (__pthread_mutex_init): Likewise. - * pthread_mutex_lock.c (__pthread_mutex_lock, - __pthread_mutex_lock_full): Likewise. - * pthread_mutex_timedlock.c (pthread_mutex_timedlock): Likewise. - * pthread_mutex_trylock.c (__pthread_mutex_trylock): Likewise. - * pthread_mutex_unlock.c (__pthread_mutex_unlock_usercnt): Likewise. - * pthread_rwlock_rdlock.c (__pthread_rwlock_rdlock): Likewise. - * pthread_rwlock_timedrdlock.c (pthread_rwlock_timedrdlock): Likewise. - * pthread_rwlock_timedwrlock.c (pthread_rwlock_timedwrlock): Likewise. - * pthread_rwlock_tryrdlock.c (__pthread_rwlock_tryrdlock): Likewise. - * pthread_setcancelstate.c (__pthread_setcancelstate): Likewise. - * pthread_setcanceltype.c (__pthread_setcanceltype): Likewise. - * pthread_setschedprio.c (pthread_setschedprio): Likewise. - * pthread_setspecific.c (__pthread_setspecific): Likewise. - * sem_init.c (__new_sem_init): Likewise. - * sem_open.c (__where_is_shmfs): Likewise. - * sigaction.c: Likewise. - * sockperf.c (get_clockfreq): Likewise. - * sysdeps/pthread/createthread.c (do_clone, create_thread): Likewise. - * sysdeps/pthread/setxid.h: Likewise. - * sysdeps/pthread/timer_create.c (timer_create): Likewise. - * sysdeps/pthread/unwind-forcedunwind.c (pthread_cancel_init, - __unwind_freeres, _Unwind_Resume, __gcc_personality_v0, - _Unwind_ForcedUnwind): Likewise. - * sysdeps/unix/sysv/linux/getpid.c (__getpid): Likewise. - * sysdeps/unix/sysv/linux/lowlevelrobustlock.c - (__lll_robust_lock_wait, __lll_robust_timedlock_wait): Likewise. - * sysdeps/unix/sysv/linux/mq_notify.c (mq_notify): Likewise. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/pthread_kill.c (__pthread_kill): Likewise. - * sysdeps/unix/sysv/linux/pthread_setaffinity.c - (__pthread_setaffinity_new): Likewise. - * sysdeps/unix/sysv/linux/pthread_sigqueue.c (pthread_sigqueue): - Likewise. - * sysdeps/unix/sysv/linux/pt-raise.c (raise): Likewise. - * sysdeps/unix/sysv/linux/raise.c (raise): Likewise. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h (__lll_robust_trylock, - __lll_robust_lock, __lll_cond_lock, __lll_robust_timedlock): Likewise. - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h (__lll_lock, - __lll_cond_lock, __lll_timedlock, __lll_robust_timedlock): Likewise. - * sysdeps/unix/sysv/linux/sparc/pthread_barrier_destroy.c - (pthread_barrier_destroy): Likewise. - * sysdeps/unix/sysv/linux/sparc/pthread_barrier_init.c - (pthread_barrier_init): Likewise. - * sysdeps/unix/sysv/linux/sparc/sem_init.c (__new_sem_init): Likewise. - * sysdeps/unix/sysv/linux/x86_64/timer_create.c (__timer_create_old): - Likewise. - * unwind.c (unwind_stop): Likewise. - -2014-02-08 Mike Frysinger <vapier@gentoo.org> - - * sem_open.c (__where_is_shmfs): Compare f.f_type to RAMFS_MAGIC too. - -2014-02-05 Carlos O'Donell <carlos@redhat.com> - - * sysdeps/unix/sysv/linux/tst-setgetname.c (do_test): Skip the - test if !__ASSUME_PROC_PID_TASK_COMM and get_self_comm returns - ENOENT. - -2014-01-23 Stefan Liebler <stli@linux.vnet.ibm.com> - - * tst-tls7.c: Adjust testcase timeout - -2014-01-18 H.J. Lu <hongjiu.lu@intel.com> - - [BZ #14782] - * tst-cancel-wrappers.sh: Remove system. - -2014-01-11 Paul Pluzhnikov <ppluzhnikov@google.com> - - * tst-tls7.c (action): New function. - (do_test): Call it. - * tst-tls7mod.c (action): Move sem_post to caller. - -2011-12-12 Adhemerval Zanella <azanella@linux.vnet.ibm.com> - - * sysdeps/powerpc/tls.h (struct tcbhead_t): Add DSO and TAR fields. - * nptl/sysdeps/powerpc/tcb-offsets.sym: Likewise. - -2013-12-09 Carlos O'Donell <carlos@redhat.com> - - * sysdeps/unix/sysv/linux/tst-setgetname.c: New file. - * sysdeps/unix/sysv/linux/Makefile (tests): Add tst-setgetname. - -2013-12-09 Andreas Schwab <schwab@suse.de> - - [BZ #15843] - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Remove wrong cfi_adjust_cfa_offset - before __condvar_tw_cleanup2 label. - -2013-12-04 Ulrich Weigand <Ulrich.Weigand@de.ibm.com> - - * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h - (CANCEL_FRAMESIZE, CANCEL_PARM_SAVE): New macros to save parameters - into our own stack frame instead of the caller's. - (PSEUDO): Use them. Use symbolic stack frame offsets. - (DOCARGS_1, UNDOCARGS_1): Use CANCEL_PARM_SAVE. - (DOCARGS_2, UNDOCARGS_2): Likewise. - (DOCARGS_3, UNDOCARGS_3): Likewise. - (DOCARGS_4, UNDOCARGS_4): Likewise. - (DOCARGS_5, UNDOCARGS_5): Likewise. - (DOCARGS_6, UNDOCARGS_6): Likewise. - -2013-11-26 OndÅ™ej BÃlka <neleai@seznam.cz> - - * sysdeps/i386/tls.h: Use __glibc_reserved instead __unused. - * sysdeps/x86_64/tls.h: Likewise. - -2013-11-25 Paul Pluzhnikov <ppluzhnikov@google.com> - - [BZ #11214] - * Makefile (tst-getpid2-ENV): New variable. - -2013-11-20 Paul Pluzhnikov <ppluzhnikov@google.com> - - * Makefile (tst-cleanup2, tst-cleanupx2): Add -fno-builtin - -2013-10-30 Mike Frysinger <vapier@gentoo.org> - - * sysdeps/pthread/configure.in: Moved to ... - * sysdeps/pthread/configure.ac: ... here. - * sysdeps/x86_64/configure.in: Moved to ... - * sysdeps/x86_64/configure.ac: ... here. - * sysdeps/pthread/configure: Regenerated. - * sysdeps/x86_64/configure: Likewise. - -2013-10-04 Maciej W. Rozycki <macro@codesourcery.com> - - * tst-mutex8.c (check_type) [ENABLE_PI]: Handle ENOTSUP failure - from pthread_mutex_init. - -2013-10-01 Siddhesh Poyarekar <siddhesh@redhat.com> - - [BZ #15988] - * pthread_cond_broadcast.c (__pthread_cond_broadcast) - [lll_futex_cmp_requeue_pi && __ASSUME_REQUEUE_PI]: Use - USE_REQUEUE_PI. - * pthread_cond_signal.c (__pthread_cond_signal) - [lll_futex_cmd_requeue_pi && __ASSUME_REQUEUE_PI]: Likewise. - -2013-09-27 Siddhesh Poyarekar <siddhesh@redhat.com> - - * sysdeps/pthread/bits/libc-lock.h [_LIBC && (!NOT_IN_libc || - IS_IN_libpthread)] (__libc_lock_fini_recursive): Use the mutex - member of the argument. - (__libc_lock_trylock_recursive): Likewise. - (__libc_lock_unlock_recursive): Likewise. - -2013-09-04 Joseph Myers <joseph@codesourcery.com> - - * sysdeps/unix/sysv/linux/x86_64/cancellation.S - [SHARED && DO_VERSIONING && !NO_HIDDEN]: Change conditional to - [SHARED && !NO_HIDDEN]. - -2013-09-03 Siddhesh Poyarekar <siddhesh@redhat.com> - - [BZ #15921] - * tst-cleanup2.c (do_test): New volatile variable RET to - return success. - -2013-08-30 OndÅ™ej BÃlka <neleai@seznam.cz> - - * sysdeps/pthread/pthread.h: Fix typos. - * sysdeps/unix/sysv/linux/internaltypes.h: Likewise. - * tst-cancel4.c: Likewise. - -2013-08-21 OndÅ™ej BÃlka <neleai@seznam.cz> - - * pthread_getschedparam.c: Fix typos. - * sysdeps/unix/sysv/linux/register-atfork.c: Likewise. - -2013-07-23 David S. Miller <davem@davemloft.net> - - * tst-cancel4.c (WRITE_BUFFER_SIZE): Adjust comment. - -2013-07-22 David S. Miller <davem@davemloft.net> - - * tst-cancel4.c (WRITE_BUFFER_SIZE): Increase to 16384. - -2013-07-19 Dominik Vogt <vogt@de.ibm.com> - - * pthread_mutex_lock.c: Fix whitespace. - * pthread_mutex_trylock.c: Likewise. - * sysdeps/unix/sysv/linux/x86/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/x86/elision-conf.c: Likewise. - * sysdeps/unix/sysv/linux/x86/elision-conf.h: Likewise. - * sysdeps/unix/sysv/linux/x86/elision-lock.c: Likewise. - * sysdeps/unix/sysv/linux/x86/elision-timed.c: Likewise. - * sysdeps/unix/sysv/linux/x86/elision-trylock.c: Likewise. - * sysdeps/unix/sysv/linux/x86/force-elision.h: Likewise. - * sysdeps/unix/sysv/linux/x86/hle.h: Likewise. - * sysdeps/unix/sysv/linux/x86/pthread_mutex_cond_lock.c: Likewise. - * sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c: Likewise. - * sysdeps/unix/sysv/linux/x86/pthread_mutex_timedlock.c: Likewise. - * sysdeps/unix/sysv/linux/x86/pthread_mutex_trylock.c: Likewise. - - * sysdeps/unix/sysv/linux/x86/elision-conf.c: - Remove __rwlock_rtm_enabled and __rwlock_rtm_read_retries. - (elision_init): Don't set __rwlock_rtm_enabled. - * sysdeps/unix/sysv/linux/x86/elision-conf.h: - Remove __rwlock_rtm_enabled. - -2013-07-03 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/x86/init-arch.c: New file. - * sysdeps/unix/sysv/linux/x86/init-arch.h: Likewise. - -2013-07-02 Andi Kleen <ak@linux.intel.com> - - * sysdeps/unix/sysv/linux/x86/elision-conf.c (elision_init): - Check ENABLE_LOCK_ELISION. - -2013-07-02 Andi Kleen <ak@linux.intel.com> - - * pthread_mutexattr_settype.c (__pthread_mutexattr_settype): - Disable elision for PTHREAD_MUTEX_DEFAULT. - -2013-07-02 Andi Kleen <ak@linux.intel.com> - Hongjiu Lu <hongjiu.lu@intel.com> - - * pthread_mutex_lock.c - (__pthread_mutex_lock): Add lock elision support. - * pthread_mutex_timedlock.c (pthread_mutex_timedlock): Likewise. - * pthread_mutex_trylock.c (__pthread_mutex_trylock): Likewise. - * pthread_mutex_unlock.c (__pthread_mutex_unlock_usercnt): Likewise. - * sysdeps/unix/sysv/linux/pthread_mutex_cond_lock.c: Likewise. - * sysdeps/unix/sysv/linux/x86/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/x86/Makefile: New file. - * sysdeps/unix/sysv/linux/x86/force-elision.h: New file - * sysdeps/unix/sysv/linux/x86/pthread_mutex_cond_lock.c: Likewise. - * sysdeps/unix/sysv/linux/x86/pthread_mutex_lock.c: Likewise. - * sysdeps/unix/sysv/linux/x86/pthread_mutex_timedlock.c: Likewise. - * sysdeps/unix/sysv/linux/x86/pthread_mutex_trylock.c: Likewise. - * sysdeps/unix/sysv/linux/x86/pthread_mutex_unlock.c: Likewise. - -2013-07-02 Andi Kleen <ak@linux.intel.com> - - * tst-mutex5.c: Include config.h. - (do_test): Add checks for ENABLE_LOCK_ELISION. - * tst-mutex8.c: Include config.h - (tf): Add checks for ENABLE_LOCK_ELISION. - (check_type): Likewise. - -2013-07-02 Andi Kleen <ak@linux.intel.com> - - * pthreadP.h: Add elision types. - (PTHREAD_MUTEX_TYPE_ELISION): Add. - * sysdeps/pthread/pthread.h: Add elision initializers. - (PTHREAD_MUTEX_ELISION_NP, PTHREAD_MUTEX_NO_ELISION_NP, - PTHREAD_MUTEX_PSHARED_NP): Add new flags. - (__PTHREAD_SPINS): Add. - -2013-07-02 Andi Kleen <ak@linux.intel.com> - Hongjiu Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h (__lll_timedwait_tid, - lll_timedlock_elision, __lll_lock_elision, __lll_unlock_elision, - __lll_trylock_elision, lll_lock_elision, lll_unlock_elision, - lll_trylock_elision): Add. - * sysdeps/unix/sysv/linux/x86/Makefile: Imply x86. - * sysdeps/unix/sysv/linux/x86/elision-conf.c: New file. - * sysdeps/unix/sysv/linux/x86/elision-conf.h: New file. - * sysdeps/unix/sysv/linux/x86/elision-lock.c: New file. - * sysdeps/unix/sysv/linux/x86/elision-timed.c: New file. - * sysdeps/unix/sysv/linux/x86/elision-trylock.c: New file. - * sysdeps/unix/sysv/linux/x86/elision-unlock.c: New file. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h (__lll_timedwait_tid, - lll_timedlock_elision, __lll_lock_elision, __lll_unlock_elision, - __lll_trylock_elision, lll_lock_elision, lll_unlock_elision, - lll_trylock_elision): Add. - * nptl/sysdeps/unix/sysv/linux/x86/hle.h: New file. - * elision-conf.h: New file. - -2013-06-24 Vladimir Nikulichev <v.nikulichev@gmail.com> - - [BZ #12310] - * pthread_exit.c: Add reference to pthread_create. - -2013-06-22 Joseph Myers <joseph@codesourcery.com> - - * pthread_getattr_default_np.c: Include <string.h>. - -2013-06-15 Siddhesh Poyarekar <siddhesh@redhat.com> - - * Versions (libpthread): Add GLIBC_2.18. - (GLIBC_2.18): Add pthread_setattr_default_np and - pthread_getattr_default_np. - * allocatestack.c (allocate_stack): Synchronize read from - __default_pthread_attr. - (__reclaim_stacks): Initialize __default_pthread_attr_lock. - * nptl-init.c (__pthread_initialize_minimal_internal): - Synchronize write to __default_pthread_attr. - * pthreadP.h (__default_pthread_attr_lock): Declare. - * pthread_attr_getstacksize (__pthread_attr_getstacksize): - Synchronize read from __default_pthread_attr. - * pthread_create.c (__pthread_create_2_1): Make a local copy of - __default_pthread_attr. Check value of flags in IATTR even if - input ATTR is NULL. - * pthread_getattr_default_np.c: New file. - * pthread_setattr_default_np.c: New file. - * sysdeps/pthread/pthread.h [__USE_GNU] - (pthread_getattr_default_np, pthread_setattr_default_np): - Declare. - * tst-default-attr.c: New test case. - * Makefile (libpthread-routines): Add - pthread_setattr_default_np and pthread_getattr_default_np. - (tests): Add tst-default-attr. - * vars.c (__default_pthread_attr_lock): Declare and initialize. - -2013-06-13 Siddhesh Poyarekar <siddhesh@redhat.com> - Carlos O'Donell <carlos@redhat.com> - - [BZ #15618] - * tst-pthread-attr-affinity: New test case. - * Makefile (tests): Add it. - * sysdeps/unix/sysv/linux/pthread_attr_getaffinity.c - (__pthread_attr_getaffinity_new): Copy minimum of source and - destination sizes to avoid a buffer overrun. - -2013-06-10 Carlos O'Donell <carlos@redhat.com> - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h - (lll_futex_wake): Return syscall error. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h - (lll_futex_wake): Return syscall error. - -2013-08-06 OndÅ™ej BÃlka <neleai@seznam.cz> - - * sysdeps/pthread/allocalim.h: (__libc_use_alloca): Fix warning. - -2013-06-06 OndÅ™ej BÃlka <neleai@seznam.cz> - - * tst-cond22.c: Fix leading whitespaces. - * tst-umask1.c: Likewise. - -2013-06-06 Joseph Myers <joseph@codesourcery.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S: Remove - trailing whitespace. - * sysdeps/unix/sysv/linux/powerpc/pt-longjmp.c: Likewise. - * sysdeps/unix/sysv/linux/sh/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_once.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S: Likewise. - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h: Likewise. - * tst-mutexpp10.c: Likewise. - * tst-stackguard1.c: Likewise. - -2013-05-31 Joseph Myers <joseph@codesourcery.com> - - * Makefile ($(objpfx)libpthread.so): Remove dependencies on libc - and ld.so. - -2013-05-16 Ryan S. Arnold <rsa@linux.vnet.ibm.com> - - * pthread_create.c: Add missing #include <stdint.h> due to uint64_t or - uint32_t usage. - * sysdeps/pthread/createthread.c: Likewise. - -2013-05-14 Andreas Jaeger <aj@suse.de> - - [BZ #10686] - * sysdeps/x86_64/tls.h (struct tcbhead_t): Add __private_ss field. - * sysdeps/i386/tls.h (struct tcbhead_t): Likewise. - -2013-05-09 Andi Kleen <ak@linux.intel.com> - - * tst-mutex8.c (do_test): Check for ENABLE_PI. - -2013-04-22 Siddhesh Poyarekar <siddhesh@redhat.com> - - * pthreadP.h (check_sched_policy_attr): New inline function. - (check_sched_priority_attr): Likewise. - (check_stacksize_attr): Likewise. - (__kernel_cpumask_size, __determine_cpumask_size): Declare - extern. - (check_cpuset_attr): New inline function. - * pthread_attr_setschedparam (__pthread_attr_setschedparam): - Use check_sched_priority_attr. - * pthread_attr_setschedpolicy.c - (__pthread_attr_setschedpolicy): Use check_sched_policy_attr. - * pthread_attr_setstack.c (__pthread_attr_setstack): Use - check_stacksize_attr. - * pthread_attr_setstacksize.c (__pthread_attr_setstacksize): - Likewise. - * sysdeps/unix/sysv/linux/pthread_attr_setaffinity.c - (__pthread_attr_setaffinity_new): Use check_cpuset_attr. - -2013-04-11 Andreas Schwab <schwab@suse.de> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__pthread_cond_timedwait): If possible use FUTEX_WAIT_BITSET to - directly use absolute timeout. - -2013-04-07 Carlos O'Donell <carlos@redhat.com> - - * sysdeps/unix/sysv/linux/sem_post.c: Include atomic.h. - -2013-04-04 Siddhesh Poyarekar <siddhesh@redhat.com> - - [BZ #15337] - * sysdeps/unix/sysv/linux/x86_64/cancellation.S - [IS_IN_libpthread] - [SHARED && defined DO_VERSIONING && !defined NO_HIDDEN]: Mark - __pthread_unwind hidden. - -2013-03-28 Roland McGrath <roland@hack.frob.com> - - * pthread_create.c (start_thread) [!SHARED]: - Call __call_tls_dtors only if it's not NULL. - -2013-03-19 Siddhesh Poyarekar <siddhesh@redhat.com> - - * allocatestack.c (allocate_stack): Use __default_pthread_attr - instead of __default_stacksize. - * nptl-init.c (__pthread_initialize_minimal_internal): - Likewise. Initialize guardsize. - * pthreadP.h (__default_pthread_attr): Declare. - * pthread_attr_getstacksize.c (__pthread_attr_getstacksize): - Use __default_pthread_attr instead of __default_stacksize. - * pthread_create.c (default_attr): Remove. - (__pthread_create_2_1): Use __default_pthread_attr instead of - default_attr. - * vars.c (__default_stacksize): Remove. - (__default_pthread_attr): New static variable to store - default thread attributes. - -2013-03-18 Siddhesh Poyarekar <siddhesh@redhat.com> - - * pthread_barrier_init.c (default_attr): Rename to - default_barrierattr. - (pthread_barrier_init): Adjust for the rename. - * pthread_mutex_init.c (default_attr): Rename to - default_mutexattr. - (__pthread_mutex_init): Adjust for the rename. - * pthread_rwlock_init.c (default_attr): Rebane to - default_rwlockattr. - (__pthread_rwlock_init): Adjust for the rename. - -2013-03-12 Carlos O'Donell <carlos@redhat.com> - - * sysdeps/unix/sysv/linux/lowlevellock.c: Include <atomic.h>. - -2013-03-04 Roland McGrath <roland@hack.frob.com> - - * sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h: - Change multiple inclusion guard to _LINUX_I686_DL_SYSDEP_H. - Use #include_next. - (HAVE_DL_DISCOVER_OSVERSION): Remove definition, now redundant. - (RTLD_PRIVATE_ERRNO): Likewise. - (NEED_DL_SYSINFO, DL_SYSINFO_DEFAULT, DL_SYSINFO_IMPLEMENTATION): - Move macros and associated declaration to ... - * sysdeps/unix/sysv/linux/i386/dl-sysdep.h: ... here. - Change multiple include guard to _LINUX_I386_DL_SYSDEP_H. - Use #include_next. - -2013-03-01 Carlos O'Donell <carlos@redhat.com> - - * Makefile (tests): Revert last change. - (tst-pthread-stack-env-ENV): Likewise. - * nptl-init.c (set_default_stacksize): Likewise. - (__pthread_initialize_minimal_internal): Likewise. - * tst-pthread-stack-env.c: Likewise. - -2013-03-01 Siddhesh Poyarekar <siddhesh@redhat.com> - - * tst-oddstacklimit.c: Include stdlib.h. - - * Makefile (tests): Add tst-pthread-stack-env. - (tst-pthread-stack-env-ENV): Set environment for test. - * nptl-init.c (set_default_stacksize): New function. - (__pthread_initialize_minimal_internal): Accept ARGC, ARGV and - ENVP. Initialize __ENVIRON and set __DEFAULT_STACKSIZE. - * tst-pthread-stack-env.c: New test case. - -2013-02-21 David S. Miller <davem@davemloft.net> - - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h - (FUTEX_WAIT_REQUEUE_PI): Define. - (FUTEX_CMP_REQUEUE_PI): Likewise. - (lll_futex_wait_requeue_pi): Likewise. - (lll_futex_timed_wait_requeue_pi): Likewise. - (lll_futex_cmp_requeue_pi): Likewise. - -2013-02-21 Carlos O'Donell <carlos@redhat.com> - - * sysdeps/unix/sysv/linux/fork.c: Fix comment typo. - -2013-02-18 Siddhesh Poyarekar <siddhesh@redhat.com> - - * sysdeps/pthread/tst-timer.c: Include stdlib.h for declaration - of exit. - * tst-barrier4.c: Likewise. - * tst-robust7.c: Likewise. - - [BZ #14920] - * pthreadP.h (USE_REQUEUE_PI): New macro to check if mutex is - PI-aware. - * pthread_cond_broadcast.c (__pthread_cond_broadcast): Use - PI-aware futex operations if available and mutex is PI-aware. - * pthread_cond_signal.c (__pthread_cond_signal): Likewise. - * nptl/pthread_cond_timedwait.c (__pthread_cond_timedwait): - Likewise. - * pthread_cond_wait.c (__condvar_cleanup): Adjust lock if - cancellation occurred just after futex returned successfully - from a PI operation with the mutex held. - (__pthread_cond_wait): Use PI-aware futex operations if - available and mutex is PI-aware. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h - (FUTEX_WAIT_REQUEUE_PI): Define. - (FUTEX_CMP_REQUEUE_PI): Likewise. - (lll_futex_wait_requeue_pi): Likewise. - (lll_futex_timed_wait_requeue_pi): Likewise. - (lll_futex_cmp_requeue_pi): Likewise. - * nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h - (FUTEX_WAIT_REQUEUE_PI): Define. - (FUTEX_CMP_REQUEUE_PI): Likewise. - (lll_futex_wait_requeue_pi): Likewise. - (lll_futex_timed_wait_requeue_pi): Likewise. - (lll_futex_cmp_requeue_pi): Likewise. - * sysdeps/unix/sysv/linux/kernel-features.h: Define - __ASSUME_REQUEUE_PI for Linux version higher than 2.6.31. - -2013-02-04 Andreas Schwab <schwab@suse.de> - - [BZ #14142] - * tst-cancel14.c: Include <sys/time.h>. - * tst-cancel15.c: Likewise. - * tst-mutex9.c: Include <stdint.h>, <stdlib.h> and <sys/time.h>. - * tst-stackguard1.c: Include <tls.h> - -2013-01-16 Andreas Schwab <schwab@suse.de> - - [BZ #14327] - * sem_open.c (sem_open): Use __mktemp instead of mktemp. - -2013-01-11 Carlos O'Donell <codonell@redhat.com> - - * allocatestack.c (allocate_stack): Add comment. Remove assert - on attr. - -2013-01-11 H.J. Lu <hongjiu.lu@intel.com> - - * Makefile (tst-cancel7-ARGS: Replace $(host-built-program-cmd) - with $(host-test-program-cmd). - (tst-exec4-ARGS): Likewise. - (tst-stackguard1-ARGS): Likewise. - ($(objpfx)tst-tls6.out): Don't pass $(elf-objpfx) to tst-tls6.sh. - Replace $(rtld-installed-name) with $(test-via-rtld-prefix). - * tst-tls6.sh (elf_objpfx): Removed. - (rtld_installed_name): Renamed to ... - (test_via_rtld_prefix): This. - (tst_tls5): Prepend ${test_via_rtld_prefix}. - -2013-01-02 Joseph Myers <joseph@codesourcery.com> - - * All files with FSF copyright notices: Update copyright dates - using scripts/update-copyrights. - -2013-01-01 Joseph Myers <joseph@codesourcery.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S: Reformat - copyright notice. - -2012-12-28 Andi Kleen <ak@linux.intel.com> - - * pthread_rwlock_tryrdlock.c (__pthread_rwlock_tryrdlock): Convert - to prototype. - * pthread_rwlock_trywrlock.c (__pthread_rwlock_trywrlock): - Likewise. - -2012-12-27 David S. Miller <davem@davemloft.net> - - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h - (lll_futex_timed_wait_bitset): New macro. - -2012-12-27 Siddhesh Poyarekar <siddhesh@redhat.com> - - * sysdeps/unix/sysv/linux/s390/lowlevellock.h (SYS_futex): - Remove definition. - (lll_futex_timed_wait): Replace assembly code with - INTERNAL_SYSCALL. - (lll_futex_timed_wait_bitset): Likewise. - (lll_futex_wake): Likewise. - (lll_futex_requeue): Likewise. - (lll_futex_wake_unlock): Likewise. - -2012-12-08 Siddhesh Poyarekar <siddhesh@redhat.com> - - * sysdeps/unix/sysv/linux/s390/jmp-unwind.c (_longjmp_unwind): - Declare LOCAL_VAR as char. - -2012-12-04 Joseph Myers <joseph@codesourcery.com> - - * sysdeps/unix/sysv/linux/powerpc/sem_post.c (__old_sem_post): - Cast result of atomic_increment_val to (void) instead of storing - in otherwise-unused variable. - -2012-12-03 Allan McRae <allan@archlinux.org> - - * Makefile (LDFLAGS-tst-cond24, LDFLAGS-tst-cond25): Remove. - -2012-11-26 H.J. Lu <hongjiu.lu@intel.com> - - * unwind.c (__pthread_unwind): Pass address of unwind_cleanup - to THREAD_SETMEM. - * sysdeps/i386/tls.h: Include <libc-internal.h>. - (THREAD_SETMEM): Use cast_to_integer before casting to uint64_t. - (THREAD_SETMEM_NC): Likewise. - * sysdeps/x86_64/tls.h: Include <libc-internal.h>. - (THREAD_SETMEM): Use cast_to_integer before casting to uint64_t. - (THREAD_SETMEM_NC): Likewise. - -2012-11-21 Joseph Myers <joseph@codesourcery.com> - - * sysdeps/unix/sysv/linux/sem_post.c (__old_sem_post): Cast result - of atomic_increment_val to (void) instead of storing in - otherwise-unused variable. - - * pthread_cond_timedwait.c (__pthread_cond_timedwait) - [__NR_clock_gettime]: Cast result of INTERNAL_VSYSCALL to void - instead of storing in otherwise-unused variable. - -2012-11-14 Marcus Shawcroft <marcus.shawcroft@linaro.org> - - * Makefile (CFLAGS-open.c, CFLAGS-open64.c, CFLAGS-pause.c) - (CFLAGS-recv.c, CFLAGS-send.c): Define. - -2012-11-06 Chris Metcalf <cmetcalf@tilera.com> - - * tst-sem14.c (TIMEOUT): Set timeout to 10 seconds. - * tst-cond24.c (TIMEOUT): Increase from 10 to 20 seconds. - -2012-11-05 Siddhesh Poyarekar <siddhesh@redhat.com> - - * pthread_cond_timedwait.c (__pthread_cond_timedwait): Time out - if absolute timeout is negative. - [__ASSUME_FUTEX_CLOCK_REALTIME && - lll_futex_timed_wait_bitset]: Use lll_futex_timed_wait_bitset. - * pthread_rwlock_timedrdlock.c (pthread_rwlock_timedrdlock): - Likewise. - * pthread_rwlock_timedwrlock.c (pthread_rwlock_timedwrlock): - Likewise. - * sysdeps/unix/sysv/linux/lowlevelrobustlock.c - (__lll_robust_timedlock_wait): Likewise. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h - (lll_futex_timed_wait_bitset): New macro. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h - (lll_futex_timed_wait_bitset): Likewise. - -2012-11-03 David S. Miller <davem@davemloft.net> - - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h (BUSY_WAIT_NOP): - Add missing spaces. - (__cpu_relax): Likewise. - -2012-11-02 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/x86_64/tls.h: Don't include <xmmintrin.h>. - (__128bits): New struct typedef. - (tcbhead_t): Replace __m128 with __128bits. - -2012-10-30 Aurelien Jarno <aurelien@aurel32.net> - Joseph Myers <joseph@codesourcery.com> - - * Makefile (tst-cancel7-ARGS): Use exec in --command argument. - -2012-10-28 David S. Miller <davem@davemloft.net> - - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h (BUSY_WAIT_NOP): - Define when we have v9 instructions available. - * sysdeps/unix/sysv/linux/sparc/sparc64/cpu_relax.S: New file. - * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/cpu_relax.S: New - file. - * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/Makefile: New - file. - * sysdeps/unix/sysv/linux/sparc/sparc64/Makefile: Add cpu_relax - to libpthread-routines. - -2012-10-25 Roland McGrath <roland@hack.frob.com> - - * tst-cond-except.c (TEST_FUNCTION): New macro. - -2012-10-25 Joseph Myers <joseph@codesourcery.com> - - * Makefile ($(objpfx)tst-tls6.out): Use $(BASH) not $(SHELL) to - run tst-tls6.sh. - * tst-tls6.sh: Use /bin/bash not /bin/sh. - -2012-10-25 Roland McGrath <roland@hack.frob.com> - - * tst-basic2.c (do_test): Return RESULT, not always zero. - - * tst-cond25.c: Include <stdint.h> - (waiter): Add casts to uintptr_t between casting integer<->pointer. - (timed_waiter): Likewise. - (do_test_wait): Likewise. - * tst-cond-except.c (thr): Likewise. - (do_test): Use prototype definition. - -2012-10-24 Joseph Myers <joseph@codesourcery.com> - Jim Blandy <jimb@codesourcery.com> - - * Makefile ($(objpfx)tst-tls6.out): Pass $(test-wrapper-env) to - tst-tls6.sh. - * tst-tls6.sh (test_wrapper_env): New variable. Use it to run - programs with LD_PRELOAD set. - -2012-10-24 Roland McGrath <roland@hack.frob.com> - - * Makefile ($(objpfx)tst-cond11, $(objpfx)tst-cond19): Targets removed. - ($(objpfx)tst-sem5, $(objpfx)tst-cancel18): Likewise. - ((objpfx)tst-cancelx18, $(objpfx)tst-clock2): Likewise. - ($(objpfx)tst-rwlock14): Likewise. - -2012-10-24 Joseph Myers <joseph@codesourcery.com> - - * Makefile (tests): Remove tst-oddstacklimit. - (test-srcs): New variable. - (tst-oddstacklimit-ENV): Remove. - [$(run-built-tests) = yes] (tests): Depend on - $(objpfx)tst-oddstacklimit.out. - [$(run-built-tests) = yes] ($(objpfx)tst-oddstacklimit.out): New - target. - * tst-oddstacklimit.c: Do not include "tst-basic1.c". Use - setrlimit before executing tst-basic1 test passed to --command. - -2012-10-23 Joseph Myers <joseph@codesourcery.com> - - * Makefile [$(cross-compiling) = no]: Change condition to - [$(run-built-tests) = yes]. - -2012-10-23 Jim Blandy <jimb@codesourcery.com> - Joseph Myers <joseph@codesourcery.com> - - * Makefile (tst-cancel7-ARGS): Use $(host-built-program-cmd). - (tst-exec4-ARGS): Likewise. - (tst-stackguard1-ARGS): Likewise. - -2012-10-21 Jim Blandy <jimb@codesourcery.com> - Joseph Myers <joseph@codesourcery.com> - - * Makefile ($(objpfx)tst-cancel-wrappers.out): Pass $(NM) to - tst-cancel-wrappers.sh. - * tst-cancel-wrappers.sh: Use nm program given as first argument, - not hardcoded "nm". - -2012-10-17 Siddhesh Poyarekar <siddhesh@redhat.com> - - * tst-cond25.c (do_test_wait): Don't check for return value from - pthread_cancel. - -2012-10-16 Siddhesh Poyarekar <siddhesh@redhat.com> - - [BZ #14652] - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__condvar_tw_cleanup): Adjust the mutex data structure if it - was locked by FUTEX_WAIT_REQUEUE_PI. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait - (__condvar_w_cleanup): Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S - (__condvar_cleanup2): Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S - (__condvar_cleanup1): Likewise. - -2012-10-10 Carlos O'Donell <carlos@systemhalted.org> - - * sysdeps/pthread/pthread.h [!(defined __GNUC__ && - defined __EXCEPTIONS) && defined __USE_GNU] - (pthread_cleanup_push_defer_np): Fix formatting. - -2012-10-10 Siddhesh Poyarekar <siddhesh@redhat.com> - - [BZ #14652] - * Makefile (tests): New test case tst-cond25. - (LDFLAGS-tst-cond25): Link tst-cond25 against librt. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__condvar_tw_cleanup): Lock mutex only if we don't already - own it. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S - (__condvar_w_cleanup): Likewise. - * sysdeps/unix/sysv/linux/pthread-pi-defines.sym: Add TID_MASK. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S - (__condvar_cleanup2): Lock mutex only if we don't already - own it. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S - (__condvar_cleanup1): Likewise. - * tst-cond25.c: New test case. - -2012-10-09 Roland McGrath <roland@hack.frob.com> - - * sysdeps/pthread/configure: Regenerated. - * sysdeps/x86_64/configure: Regenerated. - -2012-10-05 David S. Miller <davem@davemloft.net> - - [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. - -2012-10-05 H.J. Lu <hongjiu.lu@intel.com> - - [BZ #14557] - * Makefile (tests-static): Add tst-cancel24-static, - tst-cond8-static tst-mutex8-static, tst-mutexpi8-static, - tst-sem11-static and tst-sem12-static. - (tests): Likewise. - (LDLIBS-tst-cancel24-static): New macro. - * tst-cancel24-static.cc: New file. - * tst-cond8-static.c: Likewise. - * tst-mutex8-static.c: Likewise. - * tst-mutexpi8-static.c: Likewise. - * tst-sem11-static.c: Likewise. - * tst-sem12-static.c: Likewise. - -2012-10-05 Siddhesh Poyarekar <siddhesh@redhat.com> - - [BZ #14417] - * Makefile (tests): New test case tst-cond24. - (LDFLAGS-tst-cond24): Link tst-cond24 against librt. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Unlock mutex before going back to - wait in PI case. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S - (__pthread_cond_wait): Likewise. Revert handling of EAGAIN - return from futex_wait. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Unlock mutex before going back to - wait in PI case. Set requeue_pi flag only if wait returned 0. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S - (__pthread_cond_wait): Likewise. Revert handling of EAGAIN - return from futex_wait. - * tst-cond24.c: New test case. - -2012-10-04 Roland McGrath <roland@hack.frob.com> - - * pthread_create.c (start_thread): Use __madvise, not madvise. - -2012-10-02 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/i386/tls.h: Update copyright years. - -2012-10-02 Siddhesh Poyarekar <siddhesh@redhat.com> - - * pthread_create.c (start_thread): Fix clone flag name in - comment to CLONE_CHILD_CLEARTID. - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/sh/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Likewise. - -2012-10-01 Siddhesh Poyarekar <siddhesh@redhat.com> - - [BZ #14477] - * Makefile (tests): Add tst-cond-except. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Mark instructions where %ebx is - incremented in PI case. - (.gcc_except_table): Add entry to jump to __condvar_tw_cleanup2 - for the marked PI case instructions. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S - (__pthread_cond_wait): Mark instructions where %ebx is - incremented in PI case. - (.gcc_except_table): Add entry to jump to __condvar_w_cleanup2 - for the marked PI case instructions. - * tst-cond-except.c: New test case. - -2012-09-24 Dmitry V. Levin <ldv@altlinux.org> - - * tst-tls6.sh: Add "set -e". - * Makefile: Do not specify -e option when running testsuite - shell scripts. - - * tst-tls6.sh: Add copyright header. - -2012-09-24 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/x86_64/tls.h (THREAD_SETMEM): Add "()" when casting - to uint64_t for 64-bit store. - (THREAD_SETMEM_NC): Likewise. - -2012-09-19 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/i386/tls.h (THREAD_SETMEM): Cast to uint64_t for - 64-bit store. - (THREAD_SETMEM_NC): Likewise. - -2012-09-14 Jeff Law <law@redhat.com> - - [BZ #14583] - * sysdeps/pthread/pthread.h: Fix prototype of __sigsetjmp. - -2012-09-13 H.J. Lu <hongjiu.lu@intel.com> - - [BZ #14576] - * sysdeps/pthread/bits/libc-lockP.h (__rtld_lock_init_recursive): - Removed. - -2012-09-07 H.J. Lu <hongjiu.lu@intel.com> - - * Makefile (LDFLAGS-tst-cancel24): Renamed to ... - (LDLIBS-tst-cancel24): This. - -2012-09-06 H.J. Lu <hongjiu.lu@intel.com> - - [BZ #14545] - * Makefile (tests-static): Add tst-cancel21-static. - (tests): Likewise. - * tst-cancel21-static.c: New file. - -2012-09-01 Joseph Myers <joseph@codesourcery.com> - - * sysdeps/unix/sysv/linux/pthread_getcpuclockid.c - [!__ASSUME_POSIX_CPU_TIMERS]: Remove conditional code. - [__NR_clock_getres]: Make code unconditional. - (pthread_getcpuclockid): Remove code left unreachable by removal - of conditionals. - -2012-08-31 Joseph Myers <joseph@codesourcery.com> - - [BZ #14532] - * sysdeps/unix/sysv/linux/sem_post.c (__new_sem_post): Use - atomic_compare_and_exchange_bool_rel. - * tst-sem14.c: New file. - * Makefile (tests): Add tst-sem14. - -2012-08-15 Roland McGrath <roland@hack.frob.com> - - * Makefile (CFLAGS-flockfile.c): Use $(libio-mtsafe) instead - of -D_IO_MTSAFE_IO. - (CFLAGS-ftrylockfile.c, CFLAGS-funlockfile.c): Likewise. - * sysdeps/unix/sysv/linux/Makefile (CFLAGS-fork.c): Likewise. - -2012-08-16 Joseph Myers <joseph@codesourcery.com> - - * pthread_cond_timedwait.c (__pthread_cond_timedwait) - [!__ASSUME_POSIX_TIMERS]: Remove conditional code. - * pthread_condattr_setclock.c (pthread_condattr_setclock) - [!__ASSUME_POSIX_TIMERS]: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__pthread_cond_timedwait) [!__ASSUME_POSIX_TIMERS]: Likewise. - * sysdeps/unix/sysv/linux/pthread_getcpuclockid.c - [!__ASSUME_POSIX_TIMERS]: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S - (__pthread_cond_timedwait) [!__ASSUME_POSIX_TIMERS]: Likewise. - * sysdeps/unix/sysv/linux/timer_create.c [__NR_timer_create]: Make - code unconditional. - [!__NR-timer_create]: Remove conditional code. - (timer_create) [!__ASSUME_POSIX_TIMERS]: Likewise. - * sysdeps/unix/sysv/linux/timer_delete.c [__NR_timer_delete]: Make - code unconditional. - [!__NR_timer_delete]: Remove conditional code. - (timer_delete) [!__ASSUME_POSIX_TIMERS]: Likewise. - * sysdeps/unix/sysv/linux/timer_getoverr.c - [__NR_timer_getoverrun]: Make code unconditional. - [!__NR_timer_getoverrun]: Remove conditional code. - (timer_getoverrun) [!__ASSUME_POSIX_TIMERS]: Likewise. - * sysdeps/unix/sysv/linux/timer_gettime.c [__NR_timer_gettime]: - Make code unconditional. - [!__NR_timer_gettime]: Remove conditional code. - (timer_gettime) [!__ASSUME_POSIX_TIMERS]: Likewise. - * sysdeps/unix/sysv/linux/timer_routines.c [__NR_timer_create]: - Make code unconditional. - [!__ASSUME_POSIX_TIMERS]: Remove conditional code. - * sysdeps/unix/sysv/linux/timer_settime.c [__NR_timer_settime]: - Make code unconditional. - [!__NR_timer_settime]: Remove conditional code. - (timer_settime) [!__ASSUME_POSIX_TIMERS]: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S - (__pthread_cond_timedwait) [!__ASSUME_POSIX_TIMERS]: Remove - conditional code. - -2012-08-15 Tom de Vries <vries@codesourcery.com> - Maxim Kuvyrkov <maxim@codesourcery.com> - - * sysdeps/pthread/bits/libc-lockP.h (__libc_lock_lock) - (__libc_lock_trylock): Allow pre-existing definitions. - -2012-08-15 Maxim Kuvyrkov <maxim@codesourcery.com> - - * pthread_spin_lock.c: New file. - * pthread_spin_trylock.c: New file. - -2012-08-08 Joseph Myers <joseph@codesourcery.com> - - * allocatestack.c (setxid_signal_thread) [__ASSUME_TGKILL]: Make - code unconditional. - (setxid_signal_thread) [!__ASSUME_TGKILL]: Remove conditional code. - * pthread_cancel.c (pthread_cancel) [__ASSUME_TGKILL]: Make code - unconditional. - (pthread_cancel) [!__ASSUME_TGKILL]: Remove conditional code. - * sysdeps/pthread/createthread.c (do_clone) [__ASSUME_TGKILL]: - Make code unconditional. - (do_clone) [!__ASSUME_TGKILL]: Remove conditional code. - * sysdeps/unix/sysv/linux/pt-raise.c (raise) [__ASSUME_TGKILL || - __NR_tgkill]: Make code unconditional. - (raise) [__ASSUME_TGKILL]: Likewise. - (raise) [!__ASSUME_TGKILL]: Remove conditional code. - * sysdeps/unix/sysv/linux/pthread_kill.c (__pthread_kill) - [__ASSUME_TGKILL]: Make code unconditional. - (__pthread_kill) [!__ASSUME_TGKILL]: Remove conditional code. - * sysdeps/unix/sysv/linux/raise.c (raise) [__ASSUME_TGKILL || - __NR_tgkill]: Make code unconditional. - (raise) [__ASSUME_TGKILL]: Likewise. - (raise) [!__ASSUME_TGKILL]: Remove conditional code. - -2012-08-07 Joseph Myers <joseph@codesourcery.com> - - * sysdeps/pthread/createthread.c (create_thread) - [!__ASSUME_NO_CLONE_DETACHED]: Remove conditional code. - -2012-08-03 Joseph Myers <joseph@codesourcery.com> - - * nptl-init.c (sigcancel_handler) [__ASSUME_CORRECT_SI_PID]: Make - code unconditional. - (sighandler_setxid) [__ASSUME_CORRECT_SI_PID]: Likewise. - -2012-07-28 Siddhesh Poyarekar <siddhesh@redhat.com> - - * tst-pthread-getattr.c (MAX_STACK_SIZE): New macro. - (pagesize): New static variable. - (allocate_and_test): Return MEM. Rename parameter to TARGET. - (check_stack_top): New local variables MEM and PAGEMASK. Cap - stack size to MAX_STACK_SIZE. Call allocate_and_test for - halfway up the stack top page. Verify that the top page was - written into. - (do_test): Get pagesize using sysconf. - -2012-07-25 Andreas Schwab <schwab@linux-m68k.org> - - * sysdeps/unix/sysv/linux/i386/pt-vfork.S: Remove pseudo_end - label. - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (PSEUDO): Likewise. - * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h (PSEUDO): - Likewise. - -2012-07-25 Siddhesh Poyarekar <siddhesh@redhat.com> - - * tst-pthread-getattr.c: Revert last change. - -2012-07-20 Siddhesh Poyarekar <siddhesh@redhat.com> - - * tst-pthread-getattr.c (MAX_STACK_SIZE): New max cap for stack - size. - (_MIN): New macro. - (allocate_and_test): Return STACKADDR. Access STACKADDR instead - of MEM to test. - (check_stack_top): Read valued written into STACKADDR in - allocate_and_test. Cap stack size to MAX_STACK_SIZE. - -2012-07-19 Siddhesh Poyarekar <siddhesh@redhat.com> - - * nptl-init.c (sighandler_setxid): Fix the comment that - describes it. - -2012-06-23 Thomas Schwinge <thomas@codesourcery.com> - - * sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S - (__lll_robust_timedlock_wait): Simplify CFI directives. - -2012-06-20 Siddhesh Poyarekar <siddhesh@redhat.com> - - [BZ #12416] - * Makefile (tests): Add test case. - * pthread_getattr_np.c (pthread_getattr_np): Deduct pages below - the __libc_stack_end page from stacksize. Truncate stacksize to - make it page aligned when it is computed from RLIMIT_STACK. - * tst-pthread-getattr.c: New test case. Verify that stackaddr is - accessible. - -2012-06-07 Carlos Sánchez de La Lama <csanchezdll@gmail.com> - - [BZ #14205] - * sysdeps/sparc/sparc32/pthread_spin_lock.S: Do not use v9 - branches. - -2012-06-04 Siddhesh Poyarekar <siddhesh@redhat.com> - Jakub Jelinek <jakub@redhat.com> - - [BZ #14188] - * sysdeps/pthread/pthread.h - [!(defined __GNUC__ && defined __EXCEPTIONS)] - (pthread_cleanup_push, pthread_cleanup_push_defer_np): Use - __libc_unlikely instead of __builtin_expect. - -2012-05-30 H.J. Lu <hongjiu.lu@intel.com> - - [BZ #14117] - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h: Removed. - * sysdeps/unix/sysv/linux/i386/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/i386/Implies: New file. - * sysdeps/unix/sysv/linux/x86_64/Implies: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Renamed - to ... - * sysdeps/unix/sysv/linux/x86/bits/pthreadtypes.h: This. - * sysdeps/unix/sysv/linux/x86_64/bits/semaphore.h: Renamed - to ... - * sysdeps/unix/sysv/linux/x86/bits/semaphore.h: This. - -2012-05-30 Andreas Schwab <schwab@linux-m68k.org> - - [BZ #14132] - * nptl-init.c (pthread_functions): Remove use of INTUSE and - _internal aliases. - (__pthread_initialize_minimal_internal): Likewise. - * sem_open.c: Likewise. - * sem_unlink.c: Likewise. - * pthreadP.h: Replace _internal aliases by hidden_proto - declarations. - * pthread_getspecific.c: Replace _internal alias by hidden_def. - * pthread_key_create.c: Likewise. - * pthread_mutex_destroy.c: Likewise. - * pthread_mutex_init.c: Likewise. - * pthread_mutex_lock.c: Likewise. - * pthread_mutex_unlock.c: Likewise. - * pthread_once.c: Likewise. - * pthread_rwlock_rdlock.c: Likewise. - * pthread_rwlock_unlock.c: Likewise. - * pthread_rwlock_wrlock.c: Likewise. - * pthread_setspecific.c: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/pthread_once.S: Likewise. - * sysdeps/unix/sysv/linux/powerpc/pthread_once.c: Likewise. - * sysdeps/unix/sysv/linux/s390/pthread_once.c: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_once.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S: Likewise. - * sysdeps/unix/sysv/linux/sparc/pthread_once.c: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_once.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S: - Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S: - Likewise. - -2012-05-27 Chung-Lin Tang <cltang@codesourcery.com> - - * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (PSEUDO, LOAD_ARGS_1) - (LOAD_ARGS_2 ,LOAD_ARGS_3 ,LOAD_ARGS_4): Add CFI restores. - - * sysdeps/unix/sysv/linux/sh/lowlevellock.S (__lll_lock_wait_private) - (__lll_lock_wait, __lll_timedlock_wait, __lll_timedwait_tid): Add CFI - directives. - * sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S - (__lll_robust_lock_wait, __lll_robust_timedlock_wait): Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S - (pthread_barrier_wait): Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S - (__pthread_cond_broadcast): Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S - (__pthread_cond_signal): Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S (__pthread_cond_wait): - Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S - (__pthread_rwlock_rdlock): Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S - (pthread_rwlock_timedrdlock): Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S - (pthread_rwlock_timedwrlock): Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S - (__pthread_rwlock_unlock): Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S - (__pthread_rwlock_wrlock): Likewise. - * sysdeps/unix/sysv/linux/sh/sem_post.S (__new_sem_post): Likewise. - * sysdeps/unix/sysv/linux/sh/sem_timedwait.S (sem_timedwait): Likewise. - * sysdeps/unix/sysv/linux/sh/sem_trywait.S (__new_sem_trywait): - Likewise. - * sysdeps/unix/sysv/linux/sh/sem_wait.S (__new_sem_wait): Likewise. - -2012-05-26 Siddhesh Poyarekar <siddhesh@redhat.com> - - [BZ #12416] - * nptl/pthread_getattr_np.c (pthread_getattr_np): Use - __libc_stack_end rounded to the end of containing page as the - real stack end. - -2012-05-25 Rayson Ho <rho@redhat.com> - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Low-level SystemTap - probes for i386. - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: Likewise. - -2012-05-25 Rayson Ho <rho@redhat.com> - Roland McGrath <roland@hack.frob.com> - - * DESIGN-systemtap-probes.txt: New file. - * pthread_cond_broadcast.c: SystemTap probes. - * pthread_cond_init.c: Likewise. - * pthread_cond_signal.c: Likewise. - * pthread_cond_wait.c: Likewise. - * pthread_cond_destroy.c: Likewise. - * pthread_create.c: Likewise. - * pthread_join.c: Likewise. - * pthread_mutex_destroy.c: Likewise. - * pthread_mutex_init.c: Likewise. - * pthread_mutex_lock.c: Likewise. - * pthread_mutex_timedlock.c: Likewise. - * pthread_mutex_unlock.c: Likewise. - * pthread_rwlock_destroy.c: Likewise. - * pthread_rwlock_rdlock.c: Likewise. - * pthread_rwlock_unlock.c: Likewise. - * pthread_rwlock_wrlock.c: Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S: Likewise. - -2012-05-24 Roland McGrath <roland@hack.frob.com> - - * pthread_create.c (start_thread): Define pthread_start LIBC_PROBE. - -2012-05-17 Andreas Jaeger <aj@suse.de> - - * sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h - (HAVE_DL_DISCOVER_OSVERSION): Don't declare _dl_discover_osversion - only for older kernels. - -2012-05-15 Joseph Myers <joseph@codesourcery.com> - - * pthreadP.h [!__NR_set_robust_list] (__NR_set_robust_list): Do - not define. - -2012-05-15 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h (lll_lock): Load - futex pointer into RDI_LP. Use RSP_LP to operate on stack. - (lll_robust_lock): Likewise. - (lll_cond_lock): Likewise. - (lll_robust_cond_lock): Likewise. - (lll_timedlock): Likewise. - (lll_robust_timedlock): Likewise. - (lll_unlock): Likewise. - (lll_robust_unlock): Likewise. - -2012-05-15 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S: Use - LP_OP(cmp) and RCX_LP on dep_mutex pointer. - -2012-05-15 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Use LP_OP(op) - on NWAITERS. - (__gcc_personality_v0): Replace 8-byte data alignment with - LP_SIZE alignment and .quad with ASM_ADDR. - -2012-05-15 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: Use LP_OP(op) - on NWAITERS. - (__gcc_personality_v0): Replace 8-byte data alignment with - LP_SIZE alignment and .quad with ASM_ADDR. - -2012-05-15 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/x86_64/sem_post.S: Use LP_OP(cmp) on - NWAITERS, which is unsigned long int. - -2012-05-15 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_once.S - (__gcc_personality_v0): Replace 8-byte data alignment with - LP_SIZE alignment and .quad with ASM_ADDR. - -2012-05-15 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Use - LP_OP(cmp), RSI_LP and R8_LP on dep_mutex pointer. Load - __vdso_clock_gettime pointer into RAX_LP. - (__gcc_personality_v0): Replace 8-byte data alignment with - LP_SIZE alignment and .quad with ASM_ADDR. - -2012-05-15 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Use - LP_OP(cmp), RSI_LP and R8_LP on dep_mutex pointer. Load - __vdso_clock_gettime pointer into RAX_LP. - (__gcc_personality_v0): Replace 8-byte data alignment with - LP_SIZE alignment and .quad with ASM_ADDR. - -2012-05-15 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S: Use - LP_OP(cmp) and R8_LP on dep_mutex pointer. - -2012-05-15 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/x86_64/cancellation.S: Use LP_OP(mov) - to update pointer in memory. Load pointer into RDI_LP. - -2012-05-15 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h - (LLL_STUB_UNWIND_INFO_START): Align label to LP_SIZE instead - of 8. - (LLL_STUB_UNWIND_INFO_END): Likewise. - (lll_timedlock): Load timeout pointer into RDX_LP. - (lll_robust_timedlock): Likewise. - -2012-05-15 Siddhesh Poyarekar <siddhesh@redhat.com> - Jakub Jelinek <jakub@redhat.com> - - [BZ #13613] - * Makefile (tests): Add test cases. - * descr.h (struct pthread): Add a comment describing multiple_threads. - * pthreadP.h (__pthread_multiple_threads): Expand comment to include - single-process case. - * pthread_cancel.c (pthread_cancel): Enable multiple_threads - before setting cancelstate of the thread. - * sysdeps/unix/sysv/linux/libc_multiple_threads.c - (__libc_multiple_threads): Add explanatory comment. - * tst-cancel-self-cancelstate.c: New test case. - * tst-cancel-self-canceltype.c: Likewise. - * tst-cancel-self-cleanup.c: Supporting file for test cases. - * tst-cancel-self-testcancel.c: New test case. - * tst-cancel-self.c: Likewise. - * vars.c: Expand comment to include single-process case. - -2012-05-14 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/x86_64/tls.h: Don't include <bits/wordsize.h>. - (tcbhead_t): Remove __x86_64__ check. Align rtld_savespace_sse - to 32 bytes. - -2012-05-14 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/pthread/pthread.h (__PTHREAD_RWLOCK_INT_FLAGS_SHARED): - New. - (PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP): Check - __PTHREAD_RWLOCK_INT_FLAGS_SHARED instead of __WORDSIZE. - -2012-05-14 H.J. Lu <hongjiu.lu@intel.com> - - * shlib-versions: Move x86_64-.*-linux.* entry to ... - * sysdeps/x86_64/64/shlib-versions: Here. New file. - * sysdeps/x86_64/x32/shlib-versions: New file. - -2012-05-14 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Define x32 - __SIZEOF_PTHREAD_XXX_T. - (__pthread_internal_list): Check __x86_64__ instead of __WORDSIZE. - (pthread_mutex_t): Likewise. - (pthread_rwlock_t): Likewise. - (__PTHREAD_RWLOCK_INT_FLAGS_SHARED): New. Defined if __x86_64__ - is defined. - -2012-05-11 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/x86_64/x32/tls.h: New file. - -2012-05-11 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/x86_64/tls.h (THREAD_SETMEM): Use uint64_t on 64-bit - integer. - (THREAD_SETMEM_NC): Likewise. - -2012-05-11 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/x86_64/tls.h (THREAD_SELF): Replace movq/%q0 with - mov/%0. - -2012-05-11 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h - (__cleanup_fct_attribute): Check __x86_64__ instead of - __WORDSIZE. - -2012-05-11 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/pthread/pthread.h (PTHREAD_MUTEX_INITIALIZER): Check - __PTHREAD_MUTEX_HAVE_PREV instead of __WORDSIZE. - (PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP): Likewise. - (PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP): Likewise. - (PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP): Likewise. - -2012-05-11 H.J. Lu <hongjiu.lu@intel.com> - - * pthread_create.c (start_thread): Check __PTHREAD_MUTEX_HAVE_PREV - instead of __WORDSIZE. - -2012-05-10 Thomas Schwinge <thomas@schwinge.name> - - [BZ #3748] - * sysdeps/pthread/bits/libc-lockP.h (__libc_once_get): New macro. - -2012-05-09 Chung-Lin Tang <cltang@codesourcery.com> - - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Use CFI directives. - * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S - (__pthread_cond_wait): Likewise. - * sysdeps/unix/sysv/linux/sh/sem_timedwait.S (sem_timedwait): Likewise. - * sysdeps/unix/sysv/linux/sh/sem_wait.S (__new_sem_wait): Likewise. - -2012-05-03 David S. Miller <davem@davemloft.net> - - * 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. - -2012-05-02 David S. Miller <davem@davemloft.net> - - * sysdeps/sparc/sparc64/pthread_spin_lock.S: New. - * sysdeps/sparc/sparc64/pthread_spin_lock.c: Delete. - * sysdeps/sparc/sparc64/pthread_spin_unlock.S: New. - * sysdeps/sparc/sparc64/pthread_spin_unlock.c: Delete. - * sysdeps/sparc/sparc64/pthread_spin_trylock.S: New. - * sysdeps/sparc/sparc64/pthread_spin_trylock.c: Delete. - * sysdeps/sparc/sparc64/pthread_spin_init.c: New. - * sysdeps/sparc/sparc32/pthread_spin_lock.S: New. - * sysdeps/sparc/sparc32/pthread_spin_lock.c: Delete. - * sysdeps/sparc/sparc32/pthread_spin_trylock.S: New. - * sysdeps/sparc/sparc32/pthread_spin_trylock.c: Delete. - * sysdeps/sparc/sparc32/sparcv9/pthread_spin_lock.S: New. - * sysdeps/sparc/sparc32/sparcv9/pthread_spin_lock.c: Delete. - * sysdeps/sparc/sparc32/sparcv9/pthread_spin_trylock.S: New. - * sysdeps/sparc/sparc32/sparcv9/pthread_spin_trylock.c: Delete. - * sysdeps/sparc/sparc32/sparcv9/pthread_spin_unlock.S: New. - * sysdeps/sparc/sparc32/sparcv9/pthread_spin_unlock.c: Delete. - * sysdeps/sparc/sparc32/sparcv9/pthread_spin_init.c: New. - -2012-05-02 Allan McRae <allan@archlinux.org> - - * Makefile: (LDFLAGS-tst-tls5): Use $(no-as-needed). - (LDFLAGS-tst-cancel24): Likewise. - -2012-05-02 Paul Pluzhnikov <ppluzhnikov@google.com> - - * sysdeps/i386/pthread_spin_lock.S: New. - * sysdeps/i386/pthread_spin_lock.c: Delete. - * sysdeps/x86_64/pthread_spin_lock.S: New. - * sysdeps/x86_64/pthread_spin_lock.c: Delete. - -2012-04-28 Andreas Schwab <schwab@linux-m68k.org> - - * Makefile ($(objpfx)tst-stack3-mem, $(objpfx)tst-tls6.out): Don't - run when cross-compiling. - -2012-04-26 Siddhesh Poyarekar <siddhesh@redhat.com> - - * sysdeps/pthread/unwind-forcedunwind.c: Include gnu/lib-names.h - instead of libgcc_s.h. - -2012-04-20 Paul Pluzhnikov <ppluzhnikov@google.com> - - * sysdeps/x86_64/tls.h (TLS_GET_FS, TLS_SET_FS): Delete. - -2012-03-27 David S. Miller <davem@davemloft.net> - - * 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. - -2012-03-19 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/x86_64/pthreaddef.h (CURRENT_STACK_FRAME): Use - register char * __asm__("rsp") to get stack frame. - -2012-03-19 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h (SYS_futex): Use - __NR_futex directly. - -2012-03-19 H.J. Lu <hongjiu.lu@intel.com> - - * unwind.c (unwind_stop): Cast _Unwind_GetCFA return to - _Unwind_Ptr first. - -2012-03-16 David S. Miller <davem@davemloft.net> - - [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. - -2012-03-15 David S. Miller <davem@davemloft.net> - - [BZ #13844] - * sysdeps/unix/sysv/linux/sparc/sparc32/libc-lowlevellock.c: New file. - -2012-03-09 Paul Eggert <eggert@cs.ucla.edu> - - [BZ #13673] - * pt-crti.S: Replace FSF snail mail address with URL. - -2012-03-09 Joseph Myers <joseph@codesourcery.com> - - * sysdeps/pthread/pthread.h (__need_clockid_t, __need_timespec): - Do not define before including <time.h>. - -2012-03-08 David S. Miller <davem@davemloft.net> - - * sysdeps/unix/sysv/linux/sparc/sem_post.c: Update copyright year. - -2012-03-08 Thomas Schwinge <thomas@codesourcery.com> - - * sysdeps/unix/sysv/linux/sh/lowlevellock.S (__lll_timedlock_wait): - Check for timestamp before the Epoch. - - * sysdeps/unix/sysv/linux/sh/sem_timedwait.S (sem_timedwait): Fix - updating nwaiters. - - * tst-sem13.c (do_test): Add another test case. - * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S (sem_timedwait): - Fix updating nwaiters. - -2012-03-07 Joseph Myers <joseph@codesourcery.com> - - [BZ #10545] - * sysdeps/pthread/configure.in (libc_cv_forced_unwind): Change - link test to a compile test. - (libc_cv_c_cleanup): Likewise. Declare puts rather than including - <stdio.h>. - * sysdeps/pthread/configure: Regenerated. - -2012-03-07 Ulrich Drepper <drepper@gmail.com> - - * Makefile (distribute): Remove variable. - -2012-01-23 Thomas Schwinge <thomas@codesourcery.com> - - * sysdeps/unix/sysv/linux/sem_timedwait.c (sem_timedwait): Get rid of - superfluous assignment. - * sysdeps/unix/sysv/linux/sparc/sem_timedwait.c (sem_timedwait): - Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c - (sem_timedwait): Likewise. - -2012-03-06 Ulrich Drepper <drepper@gmail.com> - - * sysdeps/pthread/bits/libc-lock.h: Move information not needed in - installed headers to... - * sysdeps/pthread/bits/libc-lockP.h: ...here. New file. - -2012-03-06 David S. Miller <davem@davemloft.net> - - * sysdeps/unix/sysv/linux/sparc/sem_post.c (__new_sem_post): Use - atomic_increment and remove unused local variable. - (__old_sem_post): Likewise. - -2012-02-27 David S. Miller <davem@davemloft.net> - - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h: Don't refer to - non-existing __pthread_attr. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Likewise. - -2012-02-26 Ulrich Drepper <drepper@gmail.com> - - * sysdeps/pthread/pthread.h: Define __need_clockid_t for __USE_XOPEN2K. - - * sysdeps/pthread/pthread.h: Define __need_timespec before including - <time.h>. - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h: Name pthread_attr_t - union. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Likewise. - -2012-02-21 Joseph Myers <joseph@codesourcery.com> - - [BZ #13695] - * Makefile (generated): Remove crti.S, crtn.S, defs.h and - pt-initfini.s. - [crti.S not in sysdirs] (omit-deps): Do not append. - [crti.S not in sysdirs] (CFLAGS-pt-initfini.s): Remove variable. - [crti.S not in sysdirs] (pt-initfini.c): Remove vpath directive. - [crti.S not in sysdirs] ($(objpfx)crti.S): Remove rule. - [crti.S not in sysdirs] ($(objpfx)crtn.S): Likewise. - [crti.S not in sysdirs] ($(objpfx)defs.h): Likewise. - [crti.S not in sysdirs] ($(objpfx)crti.o): Likewise. - [crti.S not in sysdirs] ($(objpfx)crtn.o): Likewise. - [crti.S in sysdirs] (extra-objs): Append unconditionally. - [crti.S in sysdirs] ($(objpfx)crti.o): Define rule - unconditionally. - * sysdeps/pthread/pt-initfini.c: Remove file. - -2012-02-16 Richard Henderson <rth@twiddle.net> - - * sysdeps/unix/sysv/linux/s390/s390-32/pt-initfini.c: Remove file. - * sysdeps/unix/sysv/linux/s390/s390-64/pt-initfini.c: Remove file. - -2012-02-15 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/pt-initfini.c: Remove file. - -2012-02-16 David S. Miller <davem@davemloft.net> - - * sysdeps/sparc/Makefile: Add -fPIC when building pt-crti.S and crtn.S - -2012-02-15 Marek Polacek <polacek@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/Makefile: Remove file. - -2012-02-09 Paul Eggert <eggert@cs.ucla.edu> - - Replace FSF snail mail address with URLs, as per GNU coding standards. - -2012-02-08 Andreas Schwab <schwab@linux-m68k.org> - - * Makefile (extra-objs) [crti.S in sysdirs]: Add pt-crti.o. - -2012-02-08 Joseph Myers <joseph@codesourcery.com> - - Support crti.S and crtn.S provided directly by architectures. - * Makefile [crti.S in sysdirs] (omit-deps): Do not append. - [crti.S in sysdirs] (CFLAGS-pt-initfini.s): Do not define variable. - [crti.S in sysdirs] ($(objpfx)pt-initfini.s): Disable rule. - [crti.S in sysdirs] ($(objpfx)crti.S): Likewise. - [crti.S in sysdirs] ($(objpfx)crtn.S): Likewise. - [crti.S in sysdirs] ($(objpfx)defs.h): Likewise. - [crti.S in sysdirs] ($(objpfx)crti.o): Likewise. - [crti.S in sysdirs] ($(objpfx)crtn.o): Likewise. - [crti.S in sysdirs] (pt-initfini.c): Remove vpath directive. - [crti.S in sysdirs] ($(objpfx)crti.o): New rule. - * pt-crti.S: New file. - * sysdeps/unix/sysv/linux/i386/Makefile: Remove file. - -2012-02-03 Joseph Myers <joseph@codesourcery.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Use - macros for PIC register setup. - * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_wait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/pthread_once.S: Likewise. - -2012-01-11 Marek Polacek <polacek@redhat.com> - - * forward.c (FORWARD_NORETURN): Define macro. - (__pthread_unwind): Use FORWARD_NORETURN macro to avoid warning. - (__pthread_exit): Likewise. - -2012-01-10 Ulrich Drepper <drepper@gmail.com> - - * sysdeps/pthread/pthread.h: Add const attribute to pthread_equal. - - * pthreadP.h: Add noreturn to __pthread_exit. - * sysdeps/pthread/pthread-functions.h: Likewise for ptr___pthread_exit. - -2011-12-30 Adhemerval Zanella <azanella@linux.vnet.ibm.com> - - * sysdeps/unix/sysv/linux/aio_misc.h (__aio_create_helper_thread): - Call pthread_attr_setstacksize() with result of - __pthread_get_minstack() to account for application TLS usage. - -2012-01-08 Marek Polacek <polacek@redhat.com> - - * sysdeps/unix/sysv/linux/mq_notify.c: Include <nptl/pthreadP.h>. - -2012-01-07 Ulrich Drepper <drepper@gmail.com> - - [BZ #13553] - * pthreadP.h: Use const instead of __const. - * semaphore.h: Likewise. - * sysdeps/pthread/bits/libc-lock.h: Likewise. - * sysdeps/pthread/bits/sigthread.h: Likewise. - * sysdeps/pthread/pthread.h: Likewise. - - * Makefile: Remove elf=yes test, only ELF is supported. - - * shlib-versions: Remove entries for ports architectures. - - In case anyone cares, the IA-64 architecture could move to ports. - * sysdeps/ia64/*: Removed. - * sysdeps/unix/sysv/linux/ia64/*: Removed. - -2011-12-22 Ulrich Drepper <drepper@gmail.com> - - * sysdeps/pthread/gai_misc.h (__gai_create_helper_thread): Use - __pthread_get_minstack. - * sysdeps/unix/sysv/linux/mq_notify.c (init_mq_netlink): Likewise. - - [BZ #13088] - * sysdeps/unix/sysv/linux/timer_routines.c: Get minimum stack size - through __pthread_get_minstack. - * nptl-init.c (__pthread_initialize_minimal_internal): Get page size - directly from _rtld_global_ro. - (__pthread_get_minstack): New function. - * pthreadP.h: Declare __pthread_get_minstack. - * Versions (libpthread) [GLIBC_PRIVATE]: Add __pthread_get_minstack. - -2011-12-21 Ulrich Drepper <drepper@gmail.com> - - [BZ #13515] - * sysdeps/unix/sysv/linux/pthread_getname.c (pthread_getname_np): - Correct reading name from file. - -2011-12-14 Carlos O'Donell <carlos@systemhalted.org> - - * allocatestack.c (allocate_stack): Return errno on failure. - -2011-12-14 Jeff Law <law@redhat.com> - - [BZ #5245] - * pthread_create.c (__pthread_create_2_1): Translate ENOMEM to EAGAIN. - -2011-11-28 Andreas Schwab <schwab@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Handle - EAGAIN from FUTEX_WAIT_REQUEUE_PI. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - -2011-11-15 Ulrich Drepper <drepper@gmail.com> - - * pthread_getattr_np.c (pthread_getattr_np): Set FD_CLOEXEC for - /proc/self/maps. - -2011-10-29 Ulrich Drepper <drepper@gmail.com> - - [BZ #13358] - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Initialize %r15 correctly also for code - path for kernels with FUTEX_CLOCK_REALTIME. - Debugged by H.J. Lu <hjl.tools@gmail.com>. - -2011-10-27 Andreas Schwab <schwab@redhat.com> - - [BZ #13344] - * sysdeps/pthread/pthread.h: Use __THREADNL instead of __THREAD - for memory synchronization functions. - * semaphore.h: Likewise. - -2011-10-24 Ulrich Drepper <drepper@gmail.com> - - * tst-cancel7.c: Avoid warning. - * tst-mutex6.c: Likewise. - * tst-mutex9.c: Likewise. - * tst-mutexpi6.c: Likewise. - -2011-10-23 Ulrich Drepper <drepper@gmail.com> - - * sysdeps/i386/tls.h: Remove #include <list.h>. - -2011-10-15 Ulrich Drepper <drepper@gmail.com> - - * pthread_create.c (start_thread): Call __ctype_init. - -2011-09-15 Andreas Schwab <schwab@redhat.com> - - * sysdeps/pthread/list.h: Define only list_t if __need_list_t is - defined. - (list_add): Add atomic_write_barrier. - * descr.h: Define __need_list_t before including <list.h>. - * nptl-init.c: Include <list.h> - * allocatestack.c: Likewise. - -2011-09-11 Ulrich Drepper <drepper@gmail.com> - - * sysdeps/i386/tls.h: Remove HAVE_TLS_SUPPORT test. - * sysdeps/ia64/tls.h: Likewise. - * sysdeps/powerpc/tls.h: Likewise. - * sysdeps/s390/tls.h: Likewise. - * sysdeps/sh/tls.h: Likewise. - * sysdeps/sparc/tls.h: Likewise. - * sysdeps/x86_64/tls.h: Likewise. - -2011-09-10 Ulrich Drepper <drepper@gmail.com> - - * sysdeps/pthread/malloc-machine.h: Define MUTEX_INITIALIZER. - - * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Don't handle - !USE___THREAD. - * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_wait.S: Likewise. - * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/sh/sem_post.S: Likewise. - * sysdeps/unix/sysv/linux/sh/sem_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/sh/sem_trywait.S: Likewise. - * sysdeps/unix/sysv/linux/sh/sem_wait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_post.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_trywait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Likewise. - - * tst-tls1.c: Support for __thread is now mandatory. - * tst-tls2.c: Likewise. - * tst-tls3.c: Likewise. - * tst-tls3mod.c: Likewise. - * tst-tls4.c: Likewise. - * tst-tls4moda.c: Likewise. - * tst-tls4modb.c: Likewise. - * tst-tls5.h: Likewise. - -2011-09-08 Ulrich Drepper <drepper@gmail.com> - - [BZ #12403] - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S - (pthread_rwlock_timedwrlock): Use correct macro in test. - Patch by H.J. Lu <hongjiu.lu@intel.com>. - -2011-09-06 Ulrich Drepper <drepper@gmail.com> - - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S (sem_timedwait): Don't - use gettimeofday vsyscall, just call gettimeofday. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - Simplify __vdso_clock_gettime use. - -2011-09-05 David S. Miller <davem@davemloft.net> - - * sysdeps/unix/sysv/linux/sem_timedwait.c (do_futex_timed_wait): - New function. - (sem_timedwait): Call it to force an exception region around - the async cancel enable and the futex operation. - * sysdeps/unix/sysv/linux/sparc/sem_timedwait.c: Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c: Likewise. - * sysdeps/unix/sysv/linux/sem_wait.c (do_futex_wait): New function. - (__new_sem_wait): Call it to force an exception region around - the async cancel enable and the futex operation. - * sysdeps/unix/sysv/linux/sparc/sem_wait.c: Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c: Likewise. - -2011-08-31 Andreas Schwab <schwab@redhat.com> - - * allocatestack.c (setxid_mark_thread): Ensure that the exiting - thread is woken up. - -2011-08-20 David S. Miller <davem@davemloft.net> - - * Makefile (tst-cleanup0.out): Fix typo in output redirection. - -2011-08-14 Roland McGrath <roland@hack.frob.com> - - * sysdeps/i386/pthreaddef.h (TCB_ALIGNMENT): Set to 64, optimal on Atom. - * sysdeps/x86_64/pthreaddef.h (TCB_ALIGNMENT): Likewise. - -2011-08-08 Andreas Schwab <schwab@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/cancellation.S: Maintain aligned - stack. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - -2011-07-22 Ulrich Drepper <drepper@gmail.com> - - * sysdeps/pthread/unwind-forcedunwind.c (_Unwind_Resume): Add read - barrier. - (__gcc_personality_v0): Likewise. - (_Unwind_ForcedUnwind): Likewise. - (_Unwind_GetCFA): Likewise. - -2011-07-14 Roland McGrath <roland@hack.frob.com> - - * allocatestack.c (__reclaim_stacks): Use uintptr_t cast rather than - UINTMAX_C. - -2011-06-30 Ulrich Drepper <drepper@gmail.com> - - * nptl-init.c (__nptl_set_robust): New function. - (pthread_functions): Add reference. - * npthreadP.h: Declare __nptl_set_robust. - * sysdeps/pthread/pthread-functions.h (pthread_functions): Add - ptr_set_robust member. - * sysdeps/unix/sysv/linux/fork.c: Call set_robust_list syscall in - child if threads are used. - -2011-06-14 Andreas Jaeger <aj@suse.de> - - * pthread_rwlock_init.c: Include <string.h> for memset declaration. - -2011-05-11 Ulrich Drepper <drepper@gmail.com> - - [BZ #386] - * allocatestack.c (allocate_stack): Convert ENOMEM error to EAGAIN. - -2011-04-10 Ulrich Drepper <drepper@gmail.com> - - [BZ #12650] - * allocatestack.c (get_cached_stack): Deallocate DTV entries before - clearing memory. - Patch partly by Robert Rex <robert.rex@exasol.com>. - -2011-01-19 Roland McGrath <roland@redhat.com> - - * pthread_cond_wait.c (__pthread_cond_wait): Fix comment typo. - * pthread_cond_timedwait.c (__pthread_cond_timedwait): Likewise. - * pthread_rwlock_rdlock.c (__pthread_rwlock_rdlock): Likewise. - * pthread_rwlock_wrlock.c (__pthread_rwlock_wrlock): Likewise. - * pthread_rwlock_timedrdlock.c (pthread_rwlock_timedrdlock): Likewise. - * pthread_rwlock_timedwrlock.c (pthread_rwlock_timedwrlock): Likewise. - -2011-01-16 Andreas Schwab <schwab@linux-m68k.org> - - * Makefile (test-extras): Add tst-cleanup4aux. - -2011-01-14 Ulrich Drepper <drepper@gmail.com> - - [BZ #10563] - * sysdeps/pthread/setxid.h (__SETXID_1): Add cast to assignment. - (__SETXID_2): Likewise. - (__SETXID_3): Likewise. - -2011-01-13 Ulrich Drepper <drepper@gmail.com> - - [BZ #10484] - * Versions [libc] (GLIBC_PRIVATE): Export __libc_alloca_cutoff. - * alloca_cutoff.c: Add libc_hidden_def. - -2010-10-13 H.J. Lu <hongjiu.lu@intel.com> - - [BZ #12113] - * sysdeps/x86_64/pthreaddef.h (TCB_ALIGNMENT): Changed to 32. - * sysdeps/x86_64/tls.h (TLS_TCB_ALIGN): Defined with alignment - of "struct pthread". - -2010-09-21 Andreas Schwab <schwab@redhat.com> - - * sysdeps/pthread/pthread.h (pthread_cleanup_push) - [!__EXCEPTIONS]: Mangle local variable not_first_call. - (pthread_cleanup_push_defer_np): Likewise. - -2010-09-03 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/allocalim.h (__libc_use_alloca): Expect blocks are - small. - -2010-08-10 Dinakar Guniguntala <dino@in.ibm.com> - Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S: If - FUTEX_WAKE_OP fails make sure to call FUTEX_WAKE instead. - -2010-08-12 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/i386/Makefile: New file. - -2010-05-01 Alan Modra <amodra@gmail.com> - - * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h - (PSEUDO): Use correct cr save. Don't use wrong parm save area - to save temps. Correct cfi for possible later frame manipulation. - (DOCARGS_1, UNDOCARGS_1): Use the correct parm save area. - (DOCARGS_2, UNDOCARGS_2, DOCARGS_3, UNDOCARGS_3): Likewise. - (DOCARGS_4, UNDOCARGS_4, DOCARGS_5, UNDOCARGS_5): Likewise. - (DOCARGS_6, UNDOCARGS_6): Likewise. - (CENABLE, CDISABLE): Add nops for non-shared calls. - -2010-07-06 Andreas Schwab <schwab@redhat.com> - - * sysdeps/unix/sysv/linux/pthread_getname.c (pthread_getname_np): - Fix type mismatch. - -2010-07-03 Ulrich Drepper <drepper@redhat.com> - - * tst-abstime.c (do_test): Some more cleanups - -2010-07-02 Ulrich Drepper <drepper@redhat.com> - - * tst-abstime.c: Correct testing and add test for sem_timedwait. - -2010-07-01 Andreas Schwab <schwab@redhat.com> - Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-abstime. - * tst-abstime.c: New file. - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S - (__lll_timedlock_wait): Check for timestamp before the Epoch. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S - (__lll_timedlock_wait): Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S - (__lll_robust_timedlock_wait): Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S - (pthread_rwlock_timedrdlock): Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S - (pthread_rwlock_timedwrlock): Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S (sem_timedwait): - Likewise. - -2010-07-01 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tst-_res1): Add tst-_res1mod1 to dependency list. - -2010-06-01 Takashi Yoshii <takashi.yoshii.zj@renesas.com> - - * sysdeps/unix/sysv/linux/sh/lowlevellock.S: Fix incorrect - location of ifndef __ASSUME_FUTEX_CLOCK_REALTIME. - -2010-04-09 Ulrich Drepper <drepper@redhat.com> - - [BZ #11390] - * sysdeps/unix/sysv/linux/pthread_getname.c: New file. - * sysdeps/unix/sysv/linux/pthread_setname.c: New file. - * nptl/sysdeps/pthread/pthread.h: Declare pthread_getname and - pthread_setname. - * Makefile (libpthread-routines): Add pthread_getname and - pthread_setname. - * Versions: Export pthread_getname and pthread_setname for GLIBC_2.12. - -2010-04-05 Thomas Schwinge <thomas@schwinge.name> - - * sysdeps/pthread/unwind-resume.c: Moved to main tree sysdeps/gnu/. - * sysdeps/pthread/rt-unwind-resume.c: Likewise. - * sysdeps/pthread/Makefile: Remove csu section and rt section's - unwind-resume bits, now in main tree sysdeps/gnu/Makefile instead. - -2010-03-23 Luis Machado <luisgpm@br.ibm.com> - - * pthread_cond_timedwait.c: Add check for - HAVE_CLOCK_GETTIME_VSYSCALL to use VDSO whenever possible. - (pthread_cond_timedwait): Use INTERNAL_VSYSCALL instead of - INTERNAL_SYSCALL. - -2010-03-09 Ulrich Drepper <drepper@redhat.com> - - * pthread_create.c (__pthread_create_2_1): If priorities are incorrect - and the call fails wake eventually waiting setxid threads. Don't free - stack here if we try starting a thread. - * sysdeps/pthread/createthread.c (do_clone): Only wake setxid waiter - if the clone call failed. - -2010-03-08 Andreas Schwab <schwab@redhat.com> - - * pthread_create.c (__pthread_create_2_1): Don't set setxid_futex. - * allocatestack.c (get_cached_stack): Set setxid_futex. - (allocate_stack): Likewise. - -2010-03-05 Andreas Schwab <schwab@redhat.com> - Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (setxid_mark_thread): Delay handling of thread if - it is creating a thread or it is just being created. - * pthread_create.c (start_thread): Wake setxid thread if it is - waiting. - (__pthread_create_2_1): Initialize setxid_futex. - * sysdeps/pthread/createthread.c (do_clone): Wake setxid thread if it - is waiting. - -2010-01-15 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: - Fix unwind info. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise. - -2010-01-15 Michal Schmidt <mschmidt@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: - Fix pthread_cond_timedwait with requeue-PI. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: - Fix pthread_cond_wait with requeue-PI. - -2010-01-14 Ulrich Drepper <drepper@redhat.com> - - * Versions: Add pthread_mutex_consistent, pthread_mutexattr_getrobust, - and pthread_mutexattr_setrobust for GLIBC_2.12. - * pthread_mutex_consistent.c: Define alias pthread_mutex_consistent. - * pthread_mutexattr_getrobust.c: Define alias - pthread_mutexattr_getrobust. - * pthread_mutexattr_setrobust.c: Define alias - pthread_mutexattr_setrobust. - -2010-01-12 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread.h: Cleanup. Fix up for XPG7. - -2010-01-08 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread.h: Fix pthread_mutex_consistent declaration. - -2009-12-18 Thomas Schwinge <thomas@codesourcery.com> - - * sysdeps/unix/sysv/linux/s390/s390-32/pt-initfini.c (_init): Don't - call __gmon_start__. - * sysdeps/unix/sysv/linux/s390/s390-64/pt-initfini.c (_init): Likewise. - -2009-12-17 Ulrich Drepper <drepper@redhat.com> - - * pthread_rwlock_init.c (__pthread_rwlock_init): Simplify code by - using memset. - -2009-12-01 Dinakar Guniguntala <dino@in.ibm.com> - - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.h: Define - FUTEX_WAIT_REQUEUE_PI and FUTEX_CMP_REQUEUE_PI. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: If mutex - is a non robust PI mutex, then use FUTEX_CMP_REQUEUE_PI. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: If mutex - is a non robust PI mutex, then use FUTEX_WAIT_REQUEUE_PI. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise. - -2009-12-12 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S (sem_timedwait): - Don't update nwaiters after invalid timeout is recognized. - -2009-11-27 Thomas Schwinge <thomas@codesourcery.com> - - * sysdeps/unix/sysv/linux/sh/pt-initfini.c (_init): Don't call - __gmon_start__. - -2009-11-27 Andreas Schwab <schwab@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/cancellation.S: Reload - THREAD_SELF->cancelhandling after returning from futex call. - -2009-11-24 Ulrich Drepper <drepper@redhat.com> - - * tst-sem13.c: New file. - * Makefile (tests): Add tst-sem13. - -2009-11-22 Roland McGrath <roland@redhat.com> - - * sysdeps/unix/sysv/linux/i386/dl-sysdep.h: # include "i686/dl-sysdep.h" - instead of recapitulating its contents. - -2009-11-18 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: Minor - optimizations and cleanups. - -2009-11-18 Dinakar Guniguntala <dino@in.ibm.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: - Remove redundant code. Fix cfi offsets. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S: - Fix cfi offsets. - -2009-11-17 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Minimally - reduce size of unwind info. - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Convert to use - cfi directives. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - Based on a patch by Dinakar Guniguntala <dino@in.ibm.com>. - -2009-11-03 Andreas Schwab <schwab@linux-m68k.org> - - [BZ #4457] - * sysdeps/pthread/unwind-resume.c: Include <libgcc_s.h> and use - LIBGCC_S_SO. - * sysdeps/pthread/unwind-forcedunwind.c: Likewise. - -2009-10-30 Ulrich Drepper <drepper@redhat.com> - - * tst-sem11.c (main): Rewrite to avoid aliasing problems. - - [BZ #3270] - * allocatestack.c (__nptl_setxid): Perform the operation in multiple - steps to avoid races with creation and terminations. - * nptl-init.c (sighandler_setxid): Adjust. - Patch by Daniel Jacobowitz. - -2009-09-07 Andreas Schwab <schwab@redhat.com> - - * sysdeps/pthread/bits/libc-lock.h (BP_SYM): Remove space before paren. - -2009-09-02 Suzuki K P <suzuki@in.ibm.com> - Joseph Myers <joseph@codesourcery.com> - - [BZ #7094] - * sysdeps/unix/sysv/linux/timer_create.c (timer_create): - Initialize the sigev_notify field for newly created timer to make sure - the timer gets deleted from the active timer's list upon timer_delete. - -2009-08-27 Andrew Stubbs <ams@codesourcery.com> - - * sysdeps/unix/sysv/linux/sh/lowlevellock.S (__lll_timedlock_wait): - Correct a logic error. - -2009-08-25 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/x86_64/tls.h (RTLD_ENABLE_FOREIGN_CALL): Store old value - of the field in local variables. - (RTLD_FINALIZE_FOREIGN_CALL): Restore rtld_must_xmm_save from local - variable and don't unconditionally clear it. - -2009-08-24 Ulrich Drepper <drepper@redhat.com> - - * pthread_create.c (start_thread): Hint to the kernel that memory for - the stack can be reused. We do not mark all the memory. The part - still in use and some reserve are kept. - -2009-08-23 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/bits/posix_opt.h: Clean up namespace. - -2009-08-11 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S: Add CFI - directives. - -2009-08-10 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S: Add CFI - directives. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S: Likewise. - -2009-08-10 Andreas Schwab <schwab@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S - (__pthread_cond_signal): Don't clobber register used for syscall - number. - -2009-08-08 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S (sem_timedwait): - Optimize code path used when FUTEX_CLOCK_REALTIME is supported. - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S - (__pthread_cond_wait): Optimize by avoiding use of callee-safe - register. - -2009-08-07 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Little optimizations - enabled by the special *_asynccancel functions. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - - * sysdeps/unix/sysv/linux/x86_64/cancellation.S: Include lowlevellock.h. - -2009-08-04 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/cancellation.S: New file. - * sysdeps/unix/sysv/linux/x86_64/libc-cancellation.S: New file. - * sysdeps/unix/sysv/linux/x86_64/librt-cancellation.S: New file. - * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h (PSEUDO): Optimize - since we can assume the special __*_{en,dis}able_asynccancel - functions. - (PUSHARGS_*, POPARGS_*, SAVESTK_*, RESTSTK_*): Removed. - * sysdeps/x86_64/tcb-offsets.sym: Add cancellation-related bits - and PTHREAD_CANCELED. - -2009-07-31 Ulrich Drepper <drepper@redhat.com> - - * descr.h: Better definition of *_BITMASK macros for cancellation. - -2009-07-29 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/x86_64/tls.h (TLS_TCB_ALIGN): Define explicitly to 32. - - * sysdeps/x86_64/tls.h (tcbhead_t): Add room for SSE registers the - dynamic linker might have to save. - Define RTLD_CHECK_FOREIGN_CALL, RTLD_ENABLE_FOREIGN_CALL, - RTLD_PREPARE_FOREIGN_CALL, and RTLD_FINALIZE_FOREIGN_CALL. Pretty - printing. - - * sysdeps/x86_64/tcb-offsets.sym: Add RTLD_SAVESPACE_SSE. - -2009-07-28 Ulrich Drepper <drepper@redhat.com> - - * pthread_mutex_lock.c [NO_INCR] (__pthread_mutex_cond_lock_adjust): - New function. - * pthreadP.h: Declare __pthread_mutex_cond_lock_adjust. - * sysdeps/unix/sysv/linux/pthread-pi-defines.sym: Add ROBUST_BIT. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S: Don't use - requeue_pi for robust mutexes. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - Don't only skip __pthread_mutex_cond_lock. Call instead - __pthread_mutex_cond_lock_adjust. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - - * pthread_mutex_unlock.c (__pthread_mutex_unlock_full): Minor - optimization of PI mutex handling. - -2009-07-27 Ulrich Drepper <drepper@redhat.com> - - [BZ #10418] - * pthread_mutex_unlock.c (__pthread_mutex_unlock_full): Use _rel - instead of of _acq variants of cmpxchg. - -2009-07-23 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/x86_64/configure.in: New file. - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Fix error - path when not using absolute timeout futex. - -2009-07-20 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Minor - optimizations of last changes. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - -2009-07-19 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Define - FUTEX_WAIT_REQUEUE_PI and FUTEX_CMP_REQUEUE_PI. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S: If mutex - is a PI mutex, then use FUTEX_CMP_REQUEUE_PI. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: If mutex - is a PI mutex, then use FUTEX_WAIT_REQUEUE_PI. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Make more robust. - -2009-07-18 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S - (__lll_robust_timedlock_wait): If possible use FUTEX_WAIT_BITSET to - directly use absolute timeout. - - * tst-sem5.c (do_test): Add test for premature timeout. - * Makefile: Linu tst-sem5 with librt. - - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S - (pthread_rwlock_timedwrlock): If possible use FUTEX_WAIT_BITSET to - directly use absolute timeout. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S - (pthread_rwlock_timedrdlock): Likewise. - - * tst-cond11.c (run_test): Add test to check that the timeout is - long enough. - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S - (__pthread_cond_timedwait): If possible use FUTEX_WAIT_BITSET to - directly use absolute timeout. - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S - (__pthread_cond_wait): Convert to using exception handler instead of - registered unwind buffer. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Likewise. - -2009-07-17 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S (sem_timedwait): - If possible use FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME to directly - use absolute timeout. - - * sysdeps/unix/sysv/linux/x86_64/sem_wait.S (sem_wait): Optimize - handling of uncontested semaphore. - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S - (__condvar_cleanup): Rewrite to use cfi directives instead of - hand-coded unwind tables. - * sysdeps/unix/sysv/linux/x86_64/pthread_once.S (__pthread_once): - Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_wait.S (sem_wait): Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S (sem_timedwait): - Likewise. - -2009-06-12 Ulrich Drepper <drepper@redhat.com> - - * Makefile (libpthread-routines): Add pthread_sigqueue. - * Versions: Add pthread_sigqueue for GLIBC_2.11. - * sysdeps/pthread/bits/sigthread.h: Declare pthread_sigqueue. - * sysdeps/unix/sysv/linux/pthread_sigqueue.c: New file. - -2009-06-11 Ulrich Drepper <drepper@redhat.com> - - [BZ #10262] - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S - (LOAD_FUTEX_WAIT_ABS): Fix futex parameter in case private futexes - cannot be assumed. - Patch by Bryan Kadzban <bz-glibc@kdzbn.homelinux.net>. - -2009-05-16 Ulrich Drepper <drepper@redhat.com> - - * libc-cancellation.c: Move __libc_cleanup_routine to... - * libc-cleanup.c: ...here. New file. - * Makefile (routines): Add libc-cleanup. - - * cancellation.c (__pthread_disable_asynccancel): Remove unnecessary - test. - * libc-cancellation.c: Use <nptl/cancellation.c: to define the code. - * sysdeps/pthread/librt-cancellation.c: Likewise. - - [BZ #9924] - * nptl-init.c: Renamed from init.c. - * Makefile: Change all occurences of init.c to nptl-init.c. - -2009-05-15 Ulrich Drepper <drepper@redhat.com> - - * cancellation.c (__pthread_disable_asynccancel): Correct the bits - to test when deciding on the delay. - * libc-cancellation.c (__libc_disable_asynccancel): Likewise. - * pthread_cancel.c: Close race between deciding on sending a signal - and setting the CANCELING_BIT bit. - - * cancellation.c (__pthread_disable_asynccancel): Don't return if - thread is canceled. - * libc-cancellation.c (__libc_disable_asynccancel): Likewise. - -2009-04-27 Ulrich Drepper <drepper@redhat.com> - - * cancellation.c (__pthread_disable_asynccancel): Use THREAD_ATOMIC_AND - is available. - * libc-cancellation.c (__libc_disable_asynccancel): Likewise. - * sysdeps/x86_64/tls.h: Define THREAD_ATOMIC_AND. - * sysdeps/i386/tls.h: Likewise. - (tcbhead_t): Add __private_tm member. - -2009-04-26 Ulrich Drepper <drepper@redhat.com> - - * sem_open.c (sem_open): Rewrite initialization of initsem to - avoid warnings. - - * sysdeps/unix/sysv/linux/libc_pthread_init.c (__libc_pthread_init): - Avoid warning by using may_alias attribute on ptrhack. - -2009-04-22 Ulrich Drepper <drepper@redhat.com> - - [BZ #10090] - * pthread_attr_setschedparam.c (__pthread_attr_setschedparam): - Check policy and priority for validity. - Patch mostly by Zhang Xiliang <zhangxiliang@cn.fujitsu.com>. - -2009-03-15 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Change to use cfi directives instead of - hand-coded unwind sections. - -2009-03-10 Ulrich Drepper <drepper@redhat.com> - - * init.c (nptl_freeres): Compile only for SHARED. - -2009-03-09 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h: Define - FUTEX_WAIT_BITSET, FUTEX_WAKE_BITSET, FUTEX_CLOCK_REALTIME and - FUTEX_BITSET_MATCH_ANY. - -2009-02-27 Roland McGrath <roland@redhat.com> - - * init.c (__nptl_initial_report_events): Mark __attribute_used__. - * pthread_create.c (__nptl_threads_events, __nptl_last_event): Likewise. - -2009-02-26 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define - _POSIX_THREAD_ROBUST_PRIO_INHERIT and - _POSIX_THREAD_ROBUST_PRIO_PROTECT. Reset value of macros from - 200112L to 200809L. - -2009-02-25 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread.h: The robust mutex functions are in - POSIX 2008. - -2009-02-24 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/bits/posix_opt.h (_BITS_POSIX_OPT_H): - Unify name of include protector macro. - -2009-02-14 SUGIOKA Toshinobu <sugioka@itonet.co.jp> - - * sysdeps/unix/sysv/linux/sh/lowlevellock.S: Define - LOAD_FUTEX_WAIT_ABS even if (FUTEX_WAIT == 0). - -2009-01-29 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/unwind-forcedunwind.c: Encrypt all function - pointer variables. - - * allocatestack.c (__free_stacks): Renamed from free_stacks. - (__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. - -2009-01-14 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/lowlevellock.S - (__lll_timedlock_wait): Use FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME - instead of computing relative timeout. - * sysdeps/unix/sysv/linux/sh/lowlevellock.h: Define - FUTEX_CLOCK_REALTIME and FUTEX_BITSET_MATCH_ANY. - -2009-01-25 Ulrich Drepper <drepper@redhat.com> - - * pthread_mutex_lock.c (__pthread_mutex_lock): Remove unused label out. - -2009-01-08 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/list.h (list_add): Initialize new element first. - (list_add_tail): Removed. - -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. - -2009-01-04 Ulrich Drepper <drepper@redhat.com> - - * init.c (__pthread_initialize_minimal_internal): Optimize test - FUTEX_CLOCK_REALTIME a bit. - -2009-01-03 Ulrich Drepper <drepper@redhat.com> - - * init.c (__pthread_initialize_minimal_internal): Cheat a bit by - 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_REALTIME - instead of computing relative timeout. - -2009-01-02 Ulrich Drepper <drepper@redhat.com> - - * init.c (__pthread_initialize_minimal_internal): Check for - FUTEX_CLOCK_REALTIME flag. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S (__lll_timedlock_wait): - Use FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME instead of computing - relative timeout. - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Define - FUTEX_CLOCK_REALTIME and FUTEX_BITSET_MATCH_ANY. - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h: Likewise. - -2008-12-09 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread.h (pthread_cleanup_pop): Use { } as empty - loop body instead of ; to avoid gcc warnings. - (pthread_cleanup_pop_restore_np): Likewise. - Patch by Caolán McNamara <caolanm@redhat.com>. - -2008-12-09 Jakub Jelinek <jakub@redhat.com> - - * pthread_mutex_lock.c (__pthread_mutex_lock): Handle only the - 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-12-08 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/x86_64/tls.h (tcbhead_t): Add fields reserved for TM - implementation. Add necessary padding and. - * descr.h (struct pthread): Increase padding for tcbhead_t to 24 - words. - -2008-12-04 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/lowlevellock.h: Define FUTEX_WAIT_BITSET - and FUTEX_WAKE_BITSET. - -2008-12-02 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Define FUTEX_WAIT_BITSET - and FUTEX_WAKE_BITSET. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Likewise. - -2008-11-25 Roland McGrath <roland@redhat.com> - - * sysdeps/alpha, sysdeps/unix/sysv/linux/alpha: - Subdirectories moved to ports repository as - sysdeps/.../nptl subdirectories. - -2008-11-12 Jakub Jelinek <jakub@redhat.com> - - [BZ #7008] - * pthread_condattr_setclock.c (pthread_condattr_setclock): Fix masking - of old value. - * pthread_cond_init.c (__pthread_cond_init): Fix - cond->__data.__nwaiters initialization. - * Makefile (tests): Add tst-cond23. - * tst-cond23.c: New test. - -2008-11-07 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/malloc-machine.h (MALLOC): Adjust __libc_tsd_define - arguments. - (tsd_setspecific, tsd_getspecific): Adjust __libc_tsd_{set,get} - arguments. - -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>. - -2008-10-31 Ulrich Drepper <drepper@redhat.com> - - [BZ #6843] - * sysdeps/pthread/gai_misc.h (__gai_create_helper_thread): - Increase stack size for helper thread. - -2008-10-06 Martin Schwidefsky <schwidefsky@de.ibm.com> - - * sysdeps/s390/tls.h (THREAD_SET_STACK_GUARD): Add empty inline - assembly with a clobber list for access registers a0 and a1. - -2008-09-11 Martin Schwidefsky <schwidefsky@de.ibm.com> - - * sysdeps/unix/sysv/linux/fork.c (__libc_fork): Add memory barrier - to force runp->refcntr to be read from memory. - -2008-09-08 Richard Guenther <rguenther@suse.de> - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h (lll_lock, - lll_robust_lock, lll_cond_lock, lll_robust_cond_lock, - lll_timedlock, lll_robust_timedlock, lll_unlock, - lll_robust_unlock): Promote private to int. - -2008-08-15 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/x86_64/pthreaddef.h: Remove ARCH_MAP_FLAGS and - ARCH_RETRY_MMAP definitions. - * allocatestack.c: Remove definition of ARCH_MAP_FLAGS. - Define MAP_STACK when not defined. - (allocate_stack): Use MAP_STACK instead of ARCH_MAP_FLAGS. Remove - handling of ARCH_RETRY_MMAP. - -2008-07-30 Ulrich Drepper <drepper@redhat.com> - - * tst-align2.c (f): Print message that f is reached. - -2008-04-28 Hiroki Kaminaga <kaminaga@sm.sony.co.jp> - - [BZ #6740] - * sysdeps/powerpc/tcb-offsets.sym (PRIVATE_FUTEX_OFFSET): Guard symbol - definition with #ifndef __ASSUME_PRIVATE_FUTEX. - -2008-07-25 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/mq_notify.c (init_mq_netlink): Use - SOCK_CLOEXEC if possible. - -2008-05-29 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-rwlock2a. - * tst-rwlock2.c: Use TYPE macro to decide what rwlock type to use. - * tst-rwlock2a.c: New file. - -2008-06-12 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread.h: Remove inadvertant checkin. - -2008-05-17 Samuel Thibault <samuel.thibault@ens-lyon.org> - - * sysdeps/pthread/pthread.h: Fix typo in comment. - -2008-05-28 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/createthread.c (do_clone): Pass accurate length - of CPU set to the kernel. - -2008-05-23 Paul Pluzhnikov <ppluzhnikov@google.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S: Add - cfi directives. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Likewise. - -2008-05-22 Paul Pluzhnikov <ppluzhnikov@google.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: Add - cfi directives. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S: - Likewise. - -2008-05-26 Ulrich Drepper <drepper@redhat.com> - - * tst-typesizes.c: Explicitly check __SIZEOF_PTHREAD_* constants. - -2008-05-20 Jakub Jelinek <jakub@redhat.com> - - David S. Miller <davem@davemloft.net> - - * sysdeps/unix/sysv/linux/sparc/sparc64/Makefile: New file. - -2008-05-10 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Access - __pshared correctly. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: - Likewise. - Reported by Clemens Kolbitsch <clemens.kol@gmx.at>. - -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(). - -2007-11-26 Daniel Jacobowitz <dan@codesourcery.com> - - * pthread_create.c: Require pthread_mutex_trylock and - pthread_key_delete for libgcc. - -2008-04-08 Jakub Jelinek <jakub@redhat.com> - - [BZ #6020] - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h - (lll_futex_wake_unlock): Add private argument to the pre-v9 macro. - Patch by Sunil Amitkumar Janki <devel.sjanki@gmail.com>. - -2008-03-27 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/bits/local_lim.h: Undefine ARG_MAX if - <linux/limits.h> has defined it. - * sysdeps/unix/sysv/linux/alpha/bits/local_lim.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/bits/local_lim.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/bits/local_lim.h: Likewise. - -2008-03-18 Jakub Jelinek <jakub@redhat.com> - - * 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-14 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/dl-sysdep.h: Define - HAVE_DL_DISCOVER_OSVERSION. - * sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/dl-sysdep.h: Likewise. - -2008-03-07 Ulrich Drepper <drepper@redhat.com> - - [BZ #5778] - * sysdeps/unix/sysv/linux/bits/posix_opt.h: Change - _POSIX_CHOWN_RESTRICTED value to zero. - -2008-01-31 Roland McGrath <roland@redhat.com> - - * Makefile (omit-deps): Variable removed. - -2008-01-30 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/sem_post.S (sem_post): Avoid - unnecessary addr32 prefix. - -2008-01-29 Roland McGrath <roland@redhat.com> - - * Makeconfig (ptw-CPPFLAGS, sysd-rules-patterns): New variables. - -2008-01-22 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/sem_post.S: Don't overflow value field. - -2008-01-21 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h (XADD): Use - a scratch register. - * sysdeps/unix/sysv/linux/sh/lowlevellock.S - (__lll_lock_wait_private): Fix typo. - * sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S - (pthread_barrier_wait): Likewise. Adjust XADD use. - * sysdeps/unix/sysv/linux/sh/sem_post.S (__new_sem_post): - Adjust XADD use. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S - (pthread_rwlock_timedrdlock): Return correct return value. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S - (pthread_rwlock_timedwrlock): Likewise. - -2008-01-15 Ulrich Drepper <drepper@redhat.com> - - * tst-eintr2.c (do_test): make sure that if mutex_lock in main - thread returns the program exits with an error code. - -2008-01-10 Ulrich Drepper <drepper@redhat.com> - - * pthread-errnos.sym: Add EOVERFLOW. - * sysdeps/unix/sysv/linux/structsem.sym: Add SEM_VALUE_MAX. - * sysdeps/unix/sysv/linux/sem_post.c: Don't overflow value field. - * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_post.S: Likewise. - -2007-12-14 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/x86_64/pthreaddef.h (ARCH_RETRY_MMAP): Take additional - parameter. Passed it as permission to mmap. - * allocatestack.c (allocate_stack): Pass prot as second parameter - to ARCH_RETRY_MMAP. - -2007-12-12 Ulrich Drepper <drepper@redhat.com> - - * tst-basic7.c: Allocate memory for the stack. - - [BZ #5465] - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S [!SHARED] - (__pthread_cond_timedwait): Don't use VDSO. - Patch by Michal Januszewski. - -2007-12-07 Ulrich Drepper <drepper@redhat.com> - - [BZ #5455] - * sysdeps/pthread/pthread.h [!__EXCEPTIONS] (pthread_cleanup_pop): - Allow label before pthread_cleanup_pop. - (pthread_cleanup_pop_restore_np): Likewise. - -2007-12-04 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/lowlevellock.S (__lll_timedlock_wait): - Store 2 before returning ETIMEDOUT. - -2007-11-23 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S (__lll_timedlock_wait): - Store 2 before returning ETIMEDOUT. - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Likewise - * sysdeps/unix/sysv/linux/lowlevellock.c: Likewise. - (__lll_lock_wait_private): Optimize. - (__lll_lock_wait): Likewise. - -2007-11-20 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/pthread.h (pthread_cleanup_push, - pthread_cleanup_push_defer_np): Add extra (void *) cast to shut up - g++ 4.1 and 4.2 -Wstrict-aliasing warnings. - -2007-11-08 Ulrich Drepper <drepper@redhat.com> - - [BZ #5240] - * 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. - - [BZ #5245] - * sysdeps/pthread/createthread.c (do_clone): Translate clone error - if necessary. - -2007-11-07 Ulrich Drepper <drepper@redhat.com> - - [BZ #5245] - * allocatestack.c (allocate_stack): Change ENOMEM error in case - mmap failed to EAGAIN. - * Makefile (tests): Add tst-basic7. - * tst-basic7.c: New file. - -2007-11-05 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/register-atfork.c (__register_atfork): - Use __linkin_atfork. - -2007-11-03 Mike Frysinger <vapier@gentoo.org> - - * sysdeps/unix/sysv/linux/sh/lowlevellock.S (LOAD_FUTEX_WAIT): Add - missing line continuations. - * sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S (LOAD_FUTEX_WAIT, - LOAD_FUTEX_WAKE): Likewise. Also add missing 3rd parameter. - -2007-10-28 Ulrich Drepper <drepper@redhat.com> - - [BZ #5220] - * sysdeps/unix/sysv/linux/kernel-posix-timers.h: Declare - __active_timer_sigev_thread and __active_timer_sigev_thread_lock. - (struct timer): Add next element. - * sysdeps/unix/sysv/linux/timer_create.c: For SIGEV_THREAD timers, - enqueue timer structure into __active_timer_sigev_thread list. - * sysdeps/unix/sysv/linux/timer_delete.c: For SIGEV_THREAD timers, - remove timer struct from __active_timer_sigev_thread. - * sysdeps/unix/sysv/linux/timer_routines.c (timer_helper_thread): - Before using timer structure make sure it is still on the - __active_timer_sigev_thread list. Keep lock until done. - Define __active_timer_sigev_thread and - __active_timer_sigev_thread_lock. - -2007-10-27 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/malloc-machine.h: Define ATFORK_MEM. - Redefine thread_atfork for use of ATFORK_MEM. - * sysdeps/unix/sysv/linux/fork.h: Define __linkin_atfork. - * sysdeps/unix/sysv/linux/register-atfork.c (__linkin_atfork): New - function. - * sysdeps/unix/sysv/linux/unregister-atfork.c (__unregister_atfork): - Use atomic operation when removing first element of list. - -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-15 Jakub Jelinek <jakub@redhat.com> - - * init.c (__pthread_initialize_minimal): Initialize word to appease - valgrind. - -2007-10-10 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/bits/libc-lock.h (__libc_rwlock_init): Inside of - libc.so just clear NAME. - (__libc_rwlock_fini): Nop inside of libc.so. - * tst-initializers1.c (main): Test if PTHREAD_RWLOCK_INITIALIZER is - all zeros. - -2007-09-02 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S - (__pthread_cond_wait): Fix unlocking of internal lock after mutex - unlocking failed. - Patch by Luca Barbieri <luca.barbieri@gmail.com>. - -2007-08-21 Ulrich Drepper <drepper@redhat.com> - - [BZ #4938] - * allocatestack.c (__reclaim_stacks): Clear the TSD in the - reclaimed stack if necessary. - * Makefile (tests): Add tst-tsd6. - * tst-tsd6.c: New file. - -2007-08-21 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/alpha/lowlevellock.h (lll_robust_dead): - Add private argument. - -2007-08-20 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Use clock_gettime from VDSO if possible. - -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. - -2007-08-15 Jakub Jelinek <jakub@redhat.com> - - * 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-14 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S - (__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. - -2007-08-14 Jakub Jelinek <jakub@redhat.com> - - * 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/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-13 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h (__lll_private_flag): - Fix a pasto. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S - (__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/i386/i486/pthread_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. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Include - kernel-features.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. Switch DW_CFA_advance_loc1 and some - DW_CFA_advance_loc .eh_frame opcodes to DW_CFA_advance_loc4. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__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. Switch DW_CFA_advance_loc{1,2} and some - DW_CFA_advance_loc .eh_frame opcodes to DW_CFA_advance_loc4. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Use - #ifdef __ASSUME_PRIVATE_FUTEX instead of #if __ASSUME_PRIVATE_FUTEX. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S - (__pthread_cond_broadcast): Compare %r8 instead of - dep_mutex-cond_*(%rdi) with $-1. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S - (__pthread_cond_signal): Xor FUTEX_WAKE_OP with FUTEX_WAKE instead - of oring. - -2007-08-13 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i786/Implies: New file. - -2007-08-13 Jakub Jelinek <jakub@redhat.com> - - * allocatestack.c: Include kernel-features.h. - * pthread_create.c: Likewise. - * pthread_mutex_init.c: Likewise. - * init.c: Likewise. - * pthread_cond_timedwait.c: Likewise. - * sysdeps/unix/sysv/linux/alpha/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Likewise. - -2007-08-12 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h - [__WORDSIZE=32] (pthread_rwlock_t): Split __flags element into four - byte elements. One of them is the new __shared element. - [__WORDSIZE=64] (pthread_rwlock_t): Renamed __pad1 element to __shared, - adjust names of other padding elements. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h - [__WORDSIZE=32] (pthread_rwlock_t): Split __flags element into four - byte elements. One of them is the new __shared element. - [__WORDSIZE=64] (pthread_rwlock_t): Renamed __pad1 element to __shared, - adjust names of other padding elements. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h (pthread_rwlock_t): - Renamed __pad1 element to __shared, adjust names of other padding - elements. - * sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h - (pthread_rwlock_t): Likewise. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h (__lll_lock): Fix a - typo. - -2007-08-09 Anton Blanchard <anton@samba.org> - - * sysdeps/unix/sysv/linux/powerpc/pthread_spin_unlock.c: New file. - -2007-08-12 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Include - <kernel-features.h>. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - -2007-08-11 Ulrich Drepper <drepper@redhat.com> - - * pthreadP.h (PTHREAD_ROBUST_MUTEX_PSHARED): Define. - * pthread_mutex_lock.c: Use it instead of PTHREAD_MUTEX_PSHARED when - dealing with robust mutexes. - * pthread_mutex_timedlock.c: Likewise. - * pthread_mutex_trylock.c: Likewise. - * pthread_mutex_unlock.c: Likewise. - * sysdeps/unix/sysv/linux/pthread_mutex_cond_lock.c: Likewise. - -2007-08-06 Jakub Jelinek <jakub@redhat.com> - - * pthreadP.h (PTHREAD_MUTEX_PSHARED_BIT): Define. - (PTHREAD_MUTEX_TYPE): Mask __kind with 127. - (PTHREAD_MUTEX_PSHARED): Define. - * pthread_mutex_init.c (__pthread_mutex_init): Set - PTHREAD_MUTEX_PSHARED_BIT for pshared or robust - mutexes. - * pthread_mutex_lock.c (LLL_MUTEX_LOCK): Take mutex as argument - instead of its __data.__lock field, pass PTHREAD_MUTEX_PSHARED - as second argument to lll_lock. - (LLL_MUTEX_TRYLOCK): Take mutex as argument - instead of its __data.__lock field. - (LLL_ROBUST_MUTEX_LOCK): Take mutex as argument instead of its - __data.__lock field, pass PTHREAD_MUTEX_PSHARED as second argument - to lll_robust_lock. - (__pthread_mutex_lock): Update LLL_MUTEX_LOCK, LLL_MUTEX_TRYLOCK, - LLL_ROBUST_MUTEX_LOCK users, use PTHREAD_MUTEX_TYPE (mutex) - instead of mutex->__data.__kind directly, pass - PTHREAD_MUTEX_PSHARED (mutex) to lll_unlock and lll_futex_wait. - * pthread_mutex_trylock.c (__pthread_mutex_trylock): Use - PTHREAD_MUTEX_TYPE (mutex) instead of mutex->__data.__kind - directly, pass PTHREAD_MUTEX_PSHARED (mutex) to lll_unlock. - (pthread_mutex_timedlock): Pass PTHREAD_MUTEX_PSHARED (mutex) - to lll_timedlock, lll_robust_timedlock, lll_unlock and - lll_futex_timed_wait. Use PTHREAD_MUTEX_TYPE (mutex) instead - of mutex->__data.__kind directly. - * pthread_mutex_timedlock.c (pthread_mutex_timedlock): Pass - PTHREAD_MUTEX_PSHARED (mutex) to lll_timedlock, - lll_robust_timedlock, lll_unlock and lll_futex_timed_wait. Use - PTHREAD_MUTEX_TYPE (mutex) instead of mutex->__data.__kind directly. - * pthread_mutex_unlock.c (__pthread_mutex_unlock_usercnt): Pass - PTHREAD_MUTEX_PSHARED (mutex) to lll_unlock, lll_robust_unlock - and lll_futex_wake. - * pthread_mutex_setprioceiling.c (pthread_mutex_setprioceiling): Pass - PTHREAD_MUTEX_PSHARED (mutex) to lll_futex_wait and lll_futex_wake. - Use PTHREAD_MUTEX_TYPE (mutex) instead of mutex->__data.__kind - directly. - * sysdeps/unix/sysv/linux/pthread_mutex_cond_lock.c (LLL_MUTEX_LOCK): - Take mutex as argument instead of its __data.__lock field, pass - PTHREAD_MUTEX_PSHARED as second argument to lll_cond_lock. - (LLL_MUTEX_TRYLOCK): Take mutex as argument instead of its - __data.__lock field. - (LLL_ROBUST_MUTEX_LOCK): Take mutex as argument instead of its - __data.__lock field, pass PTHREAD_MUTEX_PSHARED as second argument - to lll_robust_cond_lock. - * pthread_cond_broadcast.c (__pthread_cond_broadcast): Add pshared - variable, pass it to lll_lock, lll_unlock, lll_futex_requeue and - lll_futex_wake. Don't use lll_futex_requeue if dependent mutex - has PTHREAD_MUTEX_PSHARED_BIT bit set in its __data.__kind. - * pthread_cond_destroy.c (__pthread_cond_destroy): Add pshared - variable, pass it to lll_lock, lll_unlock, lll_futex_wake and - lll_futex_wait. - * pthread_cond_signal.c (__pthread_cond_signal): Add pshared - variable, pass it to lll_lock, lll_unlock, lll_futex_wake_unlock and - lll_futex_wake. - * pthread_cond_timedwait.c (__pthread_cond_wait): Add - pshared variable, pass it to lll_lock, lll_unlock, - lll_futex_timedwait and lll_futex_wake. - * pthread_cond_wait.c (__condvar_cleanup, __pthread_cond_wait): Add - pshared variable, pass it to lll_lock, lll_unlock, lll_futex_wait - and lll_futex_wake. - * sysdeps/unix/sysv/linux/alpha/lowlevellock.h (lll_futex_requeue, - lll_futex_wake_unlock): Add private argument, use __lll_private_flag - macro. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h (lll_futex_requeue, - lll_futex_wake_unlock): Likewise. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h (lll_futex_requeue): - Likewise. - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h (lll_futex_requeue, - lll_futex_wake_unlock): Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h (lll_futex_requeue): - Likewise. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h (lll_futex_requeue, - lll_futex_wake_unlock): Likewise. - (lll_futex_wake): Fix a typo. - * sysdeps/unix/sysv/linux/pthread-pi-defines.sym (PS_BIT): Add. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S - (__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/x86_64/pthread_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. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: - (__condvar_cleanup, __pthread_cond_wait): Likewise. - -2007-08-05 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h (PSEUDO): - Don't use CGOTSETUP and CGOTRESTORE macros. - (CGOTSETUP, CGOTRESTORE): Remove. - <IS_IN_rtld> (CENABLE, CDISABLE): Don't use JUMPTARGET, branch to - @local symbol. - -2007-08-01 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/libc-lowlevellock.S: Remove - definitions for private futexes. - * sysdeps/unix/sysv/linux/sh/lowlevellock.S: Include - kernel-features.h and lowlevellock.h. Use private futexes if - they are available. - (__lll_lock_wait_private, __lll_unlock_wake_private): New. - (__lll_mutex_lock_wait): Rename to - (__lll_lock_wait): ... this. Don't compile in for libc.so. - (__lll_mutex_timedlock_wait): Rename to ... - (__lll_timedlock_wait): ... this. Use __NR_gettimeofday. - Don't compile in for libc.so. - (__lll_mutex_unlock_wake): Rename to ... - (__lll_unlock_wake): ... this. Don't compile in for libc.so. - (__lll_timedwait_tid): Use __NR_gettimeofday. - * sysdeps/unix/sysv/linux/sh/lowlevellock.h: Allow including - the header from assembler. Renamed all lll_mutex_* resp. - lll_robust_mutex_* macros to lll_* resp. lll_robust_*. - Renamed all LLL_MUTEX_LOCK_* macros to LLL_LOCK_*. - (FUTEX_CMP_REQUEUE, FUTEX_WAKE_OP, FUTEX_OP_CLEAR_WAKE_IF_GT_ONE): - Define. - (__lll_lock_wait_private): Add prototype. - (__lll_lock_wait, __lll_timedlock_wait, __lll_robust_lock_wait, - __lll_robust_timedlock_wait, __lll_unlock_wake_private, - __lll_unlock_wake): Likewise. - (lll_lock): Add private argument. Call __lll_lock_wait_private - if private is constant LLL_PRIVATE. - (lll_robust_lock, lll_cond_lock, lll_robust_cond_lock, - lll_timedlock, lll_robust_timedlock): Add private argument. - (lll_unlock): Add private argument. Call __lll_unlock_wake_private - if private is constant LLL_PRIVATE. - (lll_robust_unlock, lll_robust_dead): Add private argument. - (lll_lock_t): Remove. - (__lll_cond_wait, __lll_cond_timedwait, __lll_cond_wake, - __lll_cond_broadcast, lll_cond_wait, lll_cond_timedwait, - lll_cond_wake, lll_cond_broadcast): Remove. - * sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S: Include - kernel-features.h and lowlevellock.h. - (SYS_gettimeofday, SYS_futex, FUTEX_WAIT, FUTEX_WAKE): Remove. - (LOAD_FUTEX_WAIT): Define. - (__lll_robust_mutex_lock_wait): Rename to ... - (__lll_robust_lock_wait): ... this. Add private argument. - Use LOAD_FUTEX_WAIT macro. - (__lll_robust_mutex_timedlock_wait): Rename to ... - (__lll_robust_timedlock_wait): ... this. Add private argument. - Use __NR_gettimeofday. Use LOAD_FUTEX_WAIT macro. - * sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S: Include - lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE): Remove. - (pthread_barrier_wait): Use __lll_{lock,unlock}_* instead of - __lll_mutex_{lock,unlock}_*. - * sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S: Include - lowlevellock.h and pthread-errnos.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_REQUEUE, - FUTEX_CMP_REQUEUE, EINVAL): Remove. - (__pthread_cond_broadcast): Use __lll_{lock,unlock}_* instead of - __lll_mutex_{lock,unlock}_*. - * sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S: Include - lowlevellock.h and pthread-errnos.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_REQUEUE, EINVAL): Remove. - (__pthread_cond_signal): Use __lll_{lock,unlock}_* instead of - __lll_mutex_{lock,unlock}_*. - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Include - lowlevellock.h. - (SYS_futex, SYS_gettimeofday, FUTEX_WAIT, FUTEX_WAKE): Remove. - (__pthread_cond_timedwait): Use __lll_{lock,unlock}_* instead of - __lll_mutex_{lock,unlock}_*. Use __NR_gettimeofday. - (__condvar_tw_cleanup): Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Include - lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE): Remove. - (__pthread_cond_wait): Use __lll_{lock,unlock}_* instead of - __lll_mutex_{lock,unlock}_*. - ( __condvar_w_cleanup): Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_once.S: Include lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_PRIVATE_FLAG): Remove. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: Include - lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_PRIVATE_FLAG): Remove. - (__pthread_rwlock_rdlock): Use __lll_{lock,unlock}_* instead of - __lll_mutex_{lock,unlock}_*. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S: Include - lowlevellock.h. - (SYS_gettimeofday, SYS_futex, FUTEX_WAIT, FUTEX_WAKE, - FUTEX_PRIVATE_FLAG): Remove. - (pthread_rwlock_timedrdlock): Use __lll_{lock,unlock}_* instead of - __lll_mutex_{lock,unlock}_*. Use __NR_gettimeofday. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S: Include - lowlevellock.h. - (SYS_gettimeofday, SYS_futex, FUTEX_WAIT, FUTEX_WAKE, - FUTEX_PRIVATE_FLAG): Remove. - (pthread_rwlock_timedwrlock): Use __lll_{lock,unlock}_* instead of - __lll_mutex_{lock,unlock}_*. Use __NR_gettimeofday. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S: Include - lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_PRIVATE_FLAG): Remove. - (__pthread_rwlock_unlock): Use __lll_{lock,unlock}_* instead of - __lll_mutex_{lock,unlock}_*. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S: Include - lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_PRIVATE_FLAG): Remove. - (__pthread_rwlock_wrlock): Use __lll_{lock,unlock}_* instead of - __lll_mutex_{lock,unlock}_*. - * sysdeps/unix/sysv/linux/sh/sem_post.S: Include lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_PRIVATE_FLAG): Remove. - (__new_sem_post): Use standard initial exec code sequences. - * sysdeps/unix/sysv/linux/sh/sem_timedwait.S: Include - lowlevellock.h. - (SYS_gettimeofday, SYS_futex, FUTEX_WAIT, FUTEX_WAKE, - FUTEX_PRIVATE_FLAG): Remove. - (sem_timedwait): Use __NR_gettimeofday. Use standard initial - exec code sequences. - * sysdeps/unix/sysv/linux/sh/sem_trywait.S: Include lowlevellock.h. - (__new_sem_trywait): Use standard initial exec code sequences. - * sysdeps/unix/sysv/linux/sh/sem_wait.S: Include lowlevellock.h. - (__new_sem_wait): Use standard initial exec code sequences. - -2007-07-31 Anton Blanchard <anton@samba.org> - - * sysdeps/unix/sysv/linux/powerpc/sem_post.c (__new_sem_post): - Use __asm __volatile (__lll_acq_instr ::: "memory") instead of - atomic_full_barrier. - -2007-07-31 Jakub Jelinek <jakub@redhat.com> - - * allocatestack.c (stack_cache_lock): Change type to int. - (get_cached_stack, allocate_stack, __deallocate_stack, - __make_stacks_executable, __find_thread_by_id, __nptl_setxid, - __pthread_init_static_tls, __wait_lookup_done): Add LLL_PRIVATE - as second argument to lll_lock and lll_unlock macros on - stack_cache_lock. - * pthread_create.c (__find_in_stack_list): Likewise. - (start_thread): Similarly with pd->lock. Use lll_robust_dead - macro instead of lll_robust_mutex_dead, pass LLL_SHARED to it - as second argument. - * descr.h (struct pthread): Change lock and setxid_futex field - type to int. - * old_pthread_cond_broadcast.c (__pthread_cond_broadcast_2_0): Use - LLL_LOCK_INITIALIZER instead of LLL_MUTEX_LOCK_INITIALIZER. - * old_pthread_cond_signal.c (__pthread_cond_signal_2_0): Likewise. - * old_pthread_cond_timedwait.c (__pthread_cond_timedwait_2_0): - Likewise. - * old_pthread_cond_wait.c (__pthread_cond_wait_2_0): Likewise. - * pthread_cond_init.c (__pthread_cond_init): Likewise. - * pthreadP.h (__attr_list_lock): Change type to int. - * pthread_attr_init.c (__attr_list_lock): Likewise. - * pthread_barrier_destroy.c (pthread_barrier_destroy): Pass - ibarrier->private ^ FUTEX_PRIVATE_FLAG as second argument to - lll_{,un}lock. - * pthread_barrier_wait.c (pthread_barrier_wait): Likewise and - also for lll_futex_{wake,wait}. - * pthread_barrier_init.c (pthread_barrier_init): Make iattr - a pointer to const. - * pthread_cond_broadcast.c (__pthread_cond_broadcast): Pass - LLL_SHARED as second argument to lll_{,un}lock. - * pthread_cond_destroy.c (__pthread_cond_destroy): Likewise. - * pthread_cond_signal.c (__pthread_cond_singal): Likewise. - * pthread_cond_timedwait.c (__pthread_cond_timedwait): Likewise. - * pthread_cond_wait.c (__condvar_cleanup, __pthread_cond_wait): - Likewise. - * pthread_getattr_np.c (pthread_getattr_np): Add LLL_PRIVATE - as second argument to lll_{,un}lock macros on pd->lock. - * pthread_getschedparam.c (__pthread_getschedparam): Likewise. - * pthread_setschedparam.c (__pthread_setschedparam): Likewise. - * pthread_setschedprio.c (pthread_setschedprio): Likewise. - * tpp.c (__pthread_tpp_change_priority, __pthread_current_priority): - Likewise. - * sysdeps/pthread/createthread.c (do_clone, create_thread): - Likewise. - * pthread_once.c (once_lock): Change type to int. - (__pthread_once): Pass LLL_PRIVATE as second argument to - lll_{,un}lock macros on once_lock. - * pthread_rwlock_rdlock.c (__pthread_rwlock_rdlock): Use - lll_{,un}lock macros instead of lll_mutex_{,un}lock, pass - rwlock->__data.__shared as second argument to them and similarly - for lll_futex_w*. - * pthread_rwlock_timedrdlock.c (pthread_rwlock_timedrdlock): - Likewise. - * pthread_rwlock_timedwrlock.c (pthread_rwlock_timedwrlock): - Likewise. - * pthread_rwlock_tryrdlock.c (__pthread_rwlock_tryrdlock): Likewise. - * pthread_rwlock_trywrlock.c (__pthread_rwlock_trywrlock): Likewise. - * pthread_rwlock_unlock.c (__pthread_rwlock_unlock): Likewise. - * pthread_rwlock_wrlock.c (__pthread_rwlock_wrlock): Likewise. - * sem_close.c (sem_close): Pass LLL_PRIVATE as second argument - to lll_{,un}lock macros on __sem_mappings_lock. - * sem_open.c (check_add_mapping): Likewise. - (__sem_mappings_lock): Change type to int. - * semaphoreP.h (__sem_mappings_lock): Likewise. - * pthread_mutex_lock.c (LLL_MUTEX_LOCK, LLL_MUTEX_TRYLOCK, - LLL_ROBUST_MUTEX_LOCK): Use lll_{,try,robust_}lock macros - instead of lll_*mutex_*, pass LLL_SHARED as last - argument. - (__pthread_mutex_lock): Use lll_unlock instead of lll_mutex_unlock, - pass LLL_SHARED as last argument. - * sysdeps/unix/sysv/linux/pthread_mutex_cond_lock.c (LLL_MUTEX_LOCK, - LLL_MUTEX_TRYLOCK, LLL_ROBUST_MUTEX_LOCK): Use - lll_{cond_,cond_try,robust_cond}lock macros instead of lll_*mutex_*, - pass LLL_SHARED as last argument. - * pthread_mutex_timedlock.c (pthread_mutex_timedlock): Use - lll_{timed,try,robust_timed,un}lock instead of lll_*mutex*, pass - LLL_SHARED as last argument. - * pthread_mutex_trylock.c (__pthread_mutex_trylock): Similarly. - * pthread_mutex_unlock.c (__pthread_mutex_unlock_usercnt): - Similarly. - * sysdeps/pthread/bits/libc-lock.h (__libc_lock_lock, - __libc_lock_lock_recursive, __libc_lock_unlock, - __libc_lock_unlock_recursive): Pass LLL_PRIVATE as second - argument to lll_{,un}lock. - * sysdeps/pthread/bits/stdio-lock.h (_IO_lock_lock, - _IO_lock_unlock): Likewise. - * sysdeps/unix/sysv/linux/fork.c (__libc_fork): Don't use - compound literal. - * sysdeps/unix/sysv/linux/unregister-atfork.c (__unregister_atfork): - Pass LLL_PRIVATE as second argument to lll_{,un}lock macros on - __fork_lock. - * sysdeps/unix/sysv/linux/register-atfork.c (__register_atfork, - free_mem): Likewise. - (__fork_lock): Change type to int. - * sysdeps/unix/sysv/linux/fork.h (__fork_lock): Likewise. - * sysdeps/unix/sysv/linux/sem_post.c (__new_sem_post): Pass - isem->private ^ FUTEX_PRIVATE_FLAG as second argument to - lll_futex_wake. - * sysdeps/unix/sysv/linux/sem_timedwait.c (sem_timedwait): Likewise. - * sysdeps/unix/sysv/linux/sem_wait.c (__new_sem_wait): Likewise. - * sysdeps/unix/sysv/linux/lowlevellock.c (__lll_lock_wait_private): - New function. - (__lll_lock_wait, __lll_timedlock_wait): Add private argument and - pass it through to lll_futex_*wait, only compile in when - IS_IN_libpthread. - * sysdeps/unix/sysv/linux/lowlevelrobustlock.c - (__lll_robust_lock_wait, __lll_robust_timedlock_wait): Add private - argument and pass it through to lll_futex_*wait. - * sysdeps/unix/sysv/linux/alpha/lowlevellock.h: Renamed all - lll_mutex_* resp. lll_robust_mutex_* macros to lll_* resp. - lll_robust_*. Renamed all __lll_mutex_* resp. __lll_robust_mutex_* - inline functions to __lll_* resp. __lll_robust_*. - (LLL_MUTEX_LOCK_INITIALIZER): Remove. - (lll_mutex_dead): Add private argument. - (__lll_lock_wait_private): New prototype. - (__lll_lock_wait, __lll_robust_lock_wait, __lll_lock_timedwait, - __lll_robust_lock_timedwait): Add private argument to prototypes. - (__lll_lock): Add private argument, if it is constant LLL_PRIVATE, - call __lll_lock_wait_private, otherwise pass private to - __lll_lock_wait. - (__lll_robust_lock, __lll_cond_lock, __lll_timedlock, - __lll_robust_timedlock): Add private argument, pass it to - __lll_*wait functions. - (__lll_unlock): Add private argument, if it is constant LLL_PRIVATE, - call __lll_unlock_wake_private, otherwise pass private to - __lll_unlock_wake. - (__lll_robust_unlock): Add private argument, pass it to - __lll_robust_unlock_wake. - (lll_lock, lll_robust_lock, lll_cond_lock, lll_timedlock, - lll_robust_timedlock, lll_unlock, lll_robust_unlock): Add private - argument, pass it through to __lll_* inline function. - (__lll_mutex_unlock_force, lll_mutex_unlock_force): Remove. - (lll_lock_t): Remove. - (__lll_cond_wait, __lll_cond_timedwait, __lll_cond_wake, - __lll_cond_broadcast, lll_cond_wait, lll_cond_timedwait, - lll_cond_wake, lll_cond_broadcast): Remove. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Allow including - the header from assembler. Renamed all lll_mutex_* resp. - lll_robust_mutex_* macros to lll_* resp. lll_robust_*. - (LOCK, FUTEX_CMP_REQUEUE, FUTEX_WAKE_OP, - FUTEX_OP_CLEAR_WAKE_IF_GT_ONE): Define. - (LLL_MUTEX_LOCK_INITIALIZER, LLL_MUTEX_LOCK_INITIALIZER_LOCKED, - LLL_MUTEX_LOCK_INITIALIZER_WAITERS): Remove. - (__lll_mutex_lock_wait, __lll_mutex_timedlock_wait, - __lll_mutex_unlock_wake, __lll_lock_wait, __lll_unlock_wake): - Remove prototype. - (__lll_trylock_asm, __lll_lock_asm_start, __lll_unlock_asm): Define. - (lll_robust_trylock, lll_cond_trylock): Use LLL_LOCK_INITIALIZER* - rather than LLL_MUTEX_LOCK_INITIALIZER* macros. - (lll_trylock): Likewise, use __lll_trylock_asm, pass - MULTIPLE_THREADS_OFFSET as another asm operand. - (lll_lock): Add private argument, use __lll_lock_asm_start, pass - MULTIPLE_THREADS_OFFSET as last asm operand, call - __lll_lock_wait_private if private is constant LLL_PRIVATE, - otherwise pass private as another argument to __lll_lock_wait. - (lll_robust_lock, lll_cond_lock, lll_robust_cond_lock, - lll_timedlock, lll_robust_timedlock): Add private argument, pass - private as another argument to __lll_*lock_wait call. - (lll_unlock): Add private argument, use __lll_unlock_asm, pass - MULTIPLE_THREADS_OFFSET as another asm operand, call - __lll_unlock_wake_private if private is constant LLL_PRIVATE, - otherwise pass private as another argument to __lll_unlock_wake. - (lll_robust_unlock): Add private argument, pass private as another - argument to __lll_unlock_wake. - (lll_robust_dead): Add private argument, use __lll_private_flag - macro. - (lll_islocked): Use LLL_LOCK_INITIALIZER instead of - LLL_MUTEX_LOCK_INITIALIZER. - (lll_lock_t): Remove. - (LLL_LOCK_INITIALIZER_WAITERS): Define. - (__lll_cond_wait, __lll_cond_timedwait, __lll_cond_wake, - __lll_cond_broadcast, lll_cond_wait, lll_cond_timedwait, - lll_cond_wake, lll_cond_broadcast): Remove. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S: Revert - 2007-05-2{3,9} changes. - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Include - kernel-features.h and lowlevellock.h. - (LOAD_PRIVATE_FUTEX_WAIT): Define. - (LOAD_FUTEX_WAIT): Rewritten. - (LOCK, SYS_gettimeofday, SYS_futex, FUTEX_WAIT, FUTEX_WAKE): Don't - define. - (__lll_lock_wait_private, __lll_unlock_wake_private): New functions. - (__lll_mutex_lock_wait): Rename to ... - (__lll_lock_wait): ... this. Take futex addr from %edx instead of - %ecx, %ecx is now private argument. Don't compile in for libc.so. - (__lll_mutex_timedlock_wait): Rename to ... - (__lll_timedlock_wait): ... this. Use __NR_gettimeofday. %esi - contains private argument. Don't compile in for libc.so. - (__lll_mutex_unlock_wake): Rename to ... - (__lll_unlock_wake): ... this. %ecx contains private argument. - Don't compile in for libc.so. - (__lll_timedwait_tid): Use __NR_gettimeofday. - * sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S: Include - kernel-features.h and lowlevellock.h. - (LOAD_FUTEX_WAIT): Define. - (LOCK, SYS_gettimeofday, SYS_futex, FUTEX_WAIT, FUTEX_WAKE): Don't - define. - (__lll_robust_mutex_lock_wait): Rename to ... - (__lll_robust_lock_wait): ... this. Futex addr is now in %edx - argument, %ecx argument contains private. Use LOAD_FUTEX_WAIT - macro. - (__lll_robust_mutex_timedlock_wait): Rename to ... - (__lll_robust_timedlock_wait): ... this. Use __NR_gettimeofday. - %esi argument contains private, use LOAD_FUTEX_WAIT macro. - * sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S: Include - lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, LOCK): Don't define. - (pthread_barrier_wait): Rename __lll_mutex_* to __lll_*, pass - PRIVATE(%ebx) ^ LLL_SHARED as private argument in %ecx to - __lll_lock_wait and __lll_unlock_wake, pass MUTEX(%ebx) address - to __lll_lock_wait in %edx. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: - Include lowlevellock.h and pthread-errnos.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_REQUEUE, - FUTEX_CMP_REQUEUE, EINVAL, LOCK): Don't define. - (__pthread_cond_broadcast): Rename __lll_mutex_* to __lll_*, pass - cond_lock address in %edx rather than %ecx to __lll_lock_wait, - pass LLL_SHARED in %ecx to both __lll_lock_wait and - __lll_unlock_wake. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S: - Include lowlevellock.h and pthread-errnos.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_WAKE_OP, - FUTEX_OP_CLEAR_WAKE_IF_GT_ONE, EINVAL, LOCK): Don't define. - (__pthread_cond_signal): Rename __lll_mutex_* to __lll_*, pass - cond_lock address in %edx rather than %ecx to __lll_lock_wait, - pass LLL_SHARED in %ecx to both __lll_lock_wait and - __lll_unlock_wake. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: - Include lowlevellock.h. - (SYS_futex, SYS_gettimeofday, FUTEX_WAIT, FUTEX_WAKE, LOCK): - Don't define. - (__pthread_cond_timedwait): Rename __lll_mutex_* to __lll_*, pass - cond_lock address in %edx rather than %ecx to __lll_lock_wait, - pass LLL_SHARED in %ecx to both __lll_lock_wait and - __lll_unlock_wake. Use __NR_gettimeofday. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: - Include lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, LOCK): Don't define. - (__pthread_cond_wait, __condvar_w_cleanup): Rename __lll_mutex_* - to __lll_*, pass cond_lock address in %edx rather than %ecx to - __lll_lock_wait, pass LLL_SHARED in %ecx to both __lll_lock_wait - and __lll_unlock_wake. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: - Include lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, LOCK): Don't define. - (__pthread_rwlock_rdlock): Rename __lll_mutex_* to __lll_*, pass - MUTEX(%ebx) address in %edx rather than %ecx to - __lll_lock_wait, pass PSHARED(%ebx) in %ecx to both __lll_lock_wait - and __lll_unlock_wake. Move return value from %ecx to %edx - register. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: - Include lowlevellock.h. - (SYS_futex, SYS_gettimeofday, FUTEX_WAIT, FUTEX_WAKE, LOCK): - Don't define. - (__pthread_rwlock_wrlock): Rename __lll_mutex_* to __lll_*, pass - MUTEX(%ebp) address in %edx rather than %ecx to - __lll_lock_wait, pass PSHARED(%ebp) in %ecx to both __lll_lock_wait - and __lll_unlock_wake. Move return value from %ecx to %edx - register. Use __NR_gettimeofday. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S: - Include lowlevellock.h. - (SYS_futex, SYS_gettimeofday, FUTEX_WAIT, FUTEX_WAKE, LOCK): - Don't define. - (__pthread_rwlock_wrlock): Rename __lll_mutex_* to __lll_*, pass - MUTEX(%ebp) address in %edx rather than %ecx to - __lll_lock_wait, pass PSHARED(%ebp) in %ecx to both __lll_lock_wait - and __lll_unlock_wake. Move return value from %ecx to %edx - register. Use __NR_gettimeofday. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S: - Include lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, LOCK): Don't define. - (__pthread_rwlock_unlock): Rename __lll_mutex_* to __lll_*, pass - MUTEX(%edi) address in %edx rather than %ecx to - __lll_lock_wait, pass PSHARED(%edi) in %ecx to both __lll_lock_wait - and __lll_unlock_wake. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: - Include lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, LOCK): Don't define. - (__pthread_rwlock_wrlock): Rename __lll_mutex_* to __lll_*, pass - MUTEX(%ebx) address in %edx rather than %ecx to - __lll_lock_wait, pass PSHARED(%ebx) in %ecx to both __lll_lock_wait - and __lll_unlock_wake. Move return value from %ecx to %edx - register. - * sysdeps/unix/sysv/linux/i386/pthread_once.S: Include - lowlevellock.h. - (LOCK, SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_PRIVATE_FLAG): Don't - define. - * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Include lowlevellock.h. - (LOCK, SYS_futex, FUTEX_WAKE): Don't define. - * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S: Include - lowlevellock.h. - (LOCK, SYS_futex, SYS_gettimeofday, FUTEX_WAIT): Don't define. - (sem_timedwait): Use __NR_gettimeofday. - * sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S: Include - lowlevellock.h. - (LOCK): Don't define. - * sysdeps/unix/sysv/linux/i386/i486/sem_wait.S: Include - lowlevellock.h. - (LOCK, SYS_futex, FUTEX_WAIT): Don't define. - * sysdeps/unix/sysv/linux/powerpc/sem_post.c: Wake only when there - are waiters. - * sysdeps/unix/sysv/linux/x86_64/libc-lowlevellock.S: Revert - 2007-05-2{3,9} changes. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: Include - kernel-features.h and lowlevellock.h. - (LOAD_PRIVATE_FUTEX_WAIT): Define. - (LOAD_FUTEX_WAIT): Rewritten. - (LOCK, SYS_futex, FUTEX_WAIT, FUTEX_WAKE): Don't define. - (__lll_lock_wait_private, __lll_unlock_wake_private): New functions. - (__lll_mutex_lock_wait): Rename to ... - (__lll_lock_wait): ... this. %esi is now private argument. - Don't compile in for libc.so. - (__lll_mutex_timedlock_wait): Rename to ... - (__lll_timedlock_wait): ... this. %esi contains private argument. - Don't compile in for libc.so. - (__lll_mutex_unlock_wake): Rename to ... - (__lll_unlock_wake): ... this. %esi contains private argument. - Don't compile in for libc.so. - * sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S: Include - kernel-features.h and lowlevellock.h. - (LOAD_FUTEX_WAIT): Define. - (LOCK, SYS_futex, FUTEX_WAIT, FUTEX_WAKE): Don't define. - (__lll_robust_mutex_lock_wait): Rename to ... - (__lll_robust_lock_wait): ... this. %esi argument contains private. - Use LOAD_FUTEX_WAIT macro. - (__lll_robust_mutex_timedlock_wait): Rename to ... - (__lll_robust_timedlock_wait): ... this. %esi argument contains - private, use LOAD_FUTEX_WAIT macro. - * sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S: Include - lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, LOCK): Don't define. - (pthread_barrier_wait): Rename __lll_mutex_* to __lll_*, pass - PRIVATE(%rdi) ^ LLL_SHARED as private argument in %esi to - __lll_lock_wait and __lll_unlock_wake. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S: - Include lowlevellock.h and pthread-errnos.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_REQUEUE, - FUTEX_CMP_REQUEUE, EINVAL, LOCK): Don't define. - (__pthread_cond_broadcast): Rename __lll_mutex_* to __lll_*, - pass LLL_SHARED in %esi to both __lll_lock_wait and - __lll_unlock_wake. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S: - Include lowlevellock.h and pthread-errnos.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_WAKE_OP, - FUTEX_OP_CLEAR_WAKE_IF_GT_ONE, EINVAL, LOCK): Don't define. - (__pthread_cond_signal): Rename __lll_mutex_* to __lll_*, - pass LLL_SHARED in %esi to both __lll_lock_wait and - __lll_unlock_wake. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: - Include lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, LOCK): Don't define. - (__pthread_cond_timedwait): Rename __lll_mutex_* to __lll_*, - pass LLL_SHARED in %esi to both __lll_lock_wait and - __lll_unlock_wake. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: - Include lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, LOCK): Don't define. - (__pthread_cond_wait, __condvar_cleanup): Rename __lll_mutex_* - to __lll_*, pass LLL_SHARED in %esi to both __lll_lock_wait - and __lll_unlock_wake. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S: - Include lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_PRIVATE_FLAG, LOCK): - Don't define. - (__pthread_rwlock_rdlock): Rename __lll_mutex_* to __lll_*, - pass PSHARED(%rdi) in %esi to both __lll_lock_wait - and __lll_unlock_wake. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S: - Include lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_PRIVATE_FLAG, LOCK): - Don't define. - (__pthread_rwlock_wrlock): Rename __lll_mutex_* to __lll_*, - pass PSHARED(%rdi) in %esi to both __lll_lock_wait - and __lll_unlock_wake. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S: - Include lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_PRIVATE_FLAG, LOCK): - Don't define. - (__pthread_rwlock_wrlock): Rename __lll_mutex_* to __lll_*, - pass PSHARED(%rdi) in %esi to both __lll_lock_wait - and __lll_unlock_wake. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S: - Include lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_PRIVATE_FLAG, LOCK): - Don't define. - (__pthread_rwlock_unlock): Rename __lll_mutex_* to __lll_*, - pass PSHARED(%rdi) in %esi to both __lll_lock_wait - and __lll_unlock_wake. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S: - Include lowlevellock.h. - (SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_PRIVATE_FLAG, LOCK): - Don't define. - (__pthread_rwlock_wrlock): Rename __lll_mutex_* to __lll_*, - pass PSHARED(%rdi) in %ecx to both __lll_lock_wait - and __lll_unlock_wake. - * sysdeps/unix/sysv/linux/x86_64/pthread_once.S: Include - lowlevellock.h. - (LOCK, SYS_futex, FUTEX_WAIT, FUTEX_WAKE, FUTEX_PRIVATE_FLAG): Don't - define. - * sysdeps/unix/sysv/linux/x86_64/sem_post.S: Include lowlevellock.h. - (LOCK, SYS_futex, FUTEX_WAKE): Don't define. - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: Include - lowlevellock.h. - (LOCK, SYS_futex, FUTEX_WAIT): Don't define. - * sysdeps/unix/sysv/linux/x86_64/sem_trywait.S: Include - lowlevellock.h. - (LOCK): Don't define. - * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Include - lowlevellock.h. - (LOCK, SYS_futex, FUTEX_WAIT): Don't define. - * sysdeps/unix/sysv/linux/sparc/internaltypes.h: New file. - * sysdeps/unix/sysv/linux/sparc/pthread_barrier_destroy.c: New file. - * sysdeps/unix/sysv/linux/sparc/pthread_barrier_init.c: New file. - * sysdeps/unix/sysv/linux/sparc/pthread_barrier_wait.c: New file. - * sysdeps/unix/sysv/linux/sparc/sparc32/lowlevellock.c - (__lll_lock_wait_private): New function. - (__lll_lock_wait, __lll_timedlock_wait): Add private argument, pass - it to lll_futex_*wait. Don't compile in for libc.so. - * sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_init.c: - Remove. - * sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_wait.c - (struct sparc_pthread_barrier): Remove. - (pthread_barrier_wait): Use union sparc_pthread_barrier instead of - struct sparc_pthread_barrier. Pass - ibarrier->s.pshared ? LLL_SHARED : LLL_PRIVATE to lll_{,un}lock - and lll_futex_wait macros. - * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/pthread_barrier_init.c: - Remove. - * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/pthread_barrier_wait.c: - Include sparc pthread_barrier_wait.c instead of generic one. - -2007-07-30 Jakub Jelinek <jakub@redhat.com> - - * tst-rwlock14.c (do_test): Avoid warnings on 32-bit arches. - - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S - (pthread_rwlock_timedrdlock): Copy futex retval to %esi rather than - %ecx. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S - (pthread_rwlock_timedwrlock): Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S - (__pthread_rwlock_unlock): Fix MUTEX != 0 args to __lll_*. - -2007-07-31 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/sparc/tls.h (tcbhead_t): Add private_futex field. - -2007-07-26 Jakub Jelinek <jakub@redhat.com> - - * tst-locale2.c (useless): Add return statement. - -2007-07-24 Jakub Jelinek <jakub@redhat.com> - - * allocatestack.c (__nptl_setxid, __wait_lookup_done): Replace - lll_private_futex_* (*) with lll_futex_* (*, LLL_PRIVATE). - * pthread_create.c (start_thread): Likewise. - * init.c (sighandler_setxid): Likewise. - * sysdeps/alpha/tls.h (THREAD_GSCOPE_RESET_FLAG): Likewise. - * sysdeps/ia64/tls.h (THREAD_GSCOPE_RESET_FLAG): Likewise. - * sysdeps/i386/tls.h (THREAD_GSCOPE_RESET_FLAG): Likewise. - * sysdeps/s390/tls.h (THREAD_GSCOPE_RESET_FLAG): Likewise. - * sysdeps/powerpc/tls.h (THREAD_GSCOPE_RESET_FLAG): Likewise. - * sysdeps/x86_64/tls.h (THREAD_GSCOPE_RESET_FLAG): Likewise. - * sysdeps/sparc/tls.h (THREAD_GSCOPE_RESET_FLAG): Likewise. - * sysdeps/sh/tls.h (THREAD_GSCOPE_RESET_FLAG): Likewise. - * sysdeps/pthread/aio_misc.h (AIO_MISC_NOTIFY, AIO_MISC_WAIT): - Likewise. - * sysdeps/pthread/gai_misc.h (GAI_MISC_NOTIFY, GAI_MISC_WAIT): - Likewise. - * sysdeps/unix/sysv/linux/unregister-atfork.c (__unregister_atfork): - Likewise. - * sysdeps/unix/sysv/linux/rtld-lowlevel.h (__rtld_waitzero, - __rtld_notify): Likewise. - * sysdeps/unix/sysv/linux/fork.c (__libc_fork): Likewise. - * sysdeps/unix/sysv/linux/powerpc/pthread_once.c (clear_once_control, - __pthread_once): Likewise. - * sysdeps/unix/sysv/linux/alpha/pthread_once.c (clear_once_control, - __pthread_once): Add LLL_PRIVATE as last argument to lll_futex_*. - * sysdeps/unix/sysv/linux/alpha/lowlevellock.h (FUTEX_PRIVATE_FLAG, - LLL_PRIVATE, LLL_SHARED, __lll_private_flag): Define. - (lll_futex_wait): Add private argument, define as wrapper around - lll_futex_timed_wait. - (lll_futex_timed_wait, lll_futex_wake): Add private argument, - use __lll_private_flag macro. - (lll_robust_mutex_dead, __lll_mutex_unlock, __lll_robust_mutex_unlock, - __lll_mutex_unlock_force): Pass LLL_SHARED as last arg to lll_futex_*. - * sysdeps/unix/sysv/linux/ia64/pthread_once.c (clear_once_control, - __pthread_once): Add LLL_PRIVATE as last argument to lll_futex_*. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h (FUTEX_PRIVATE_FLAG, - LLL_PRIVATE, LLL_SHARED, __lll_private_flag): Define. - (lll_futex_wait): Add private argument, define as wrapper around - lll_futex_timed_wait. - (lll_futex_timed_wait, lll_futex_wake): Add private argument, - use __lll_private_flag macro. - (__lll_mutex_unlock, __lll_robust_mutex_unlock, lll_wait_tid, - __lll_mutex_unlock_force): Pass LLL_SHARED as last arg to lll_futex_*. - * sysdeps/unix/sysv/linux/i386/lowlevellock.h (__lll_private_flag): - Define. - (lll_futex_timed_wait, lll_futex_wake): Use it. - (lll_private_futex_wait, lll_private_futex_timed_wait, - lll_private_futex_wake): Removed. - * sysdeps/unix/sysv/linux/s390/pthread_once.c (clear_once_control, - __pthread_once): Add LLL_PRIVATE as last argument to lll_futex_*. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h (FUTEX_PRIVATE_FLAG, - LLL_PRIVATE, LLL_SHARED, __lll_private_flag): Define. - (lll_futex_wait): Add private argument, define as wrapper around - lll_futex_timed_wait. - (lll_futex_timed_wait, lll_futex_wake): Add private argument, - use __lll_private_flag macro. - (lll_robust_mutex_dead, __lll_mutex_unlock, __lll_robust_mutex_unlock, - lll_wait_tid, __lll_mutex_unlock_force): Pass LLL_SHARED as last arg - to lll_futex_*. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h - (lll_private_futex_wait, lll_private_futex_timed_wait, - lll_private_futex_wake): Removed. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h (__lll_private_flag): - Fix !__ASSUME_PRIVATE_FUTEX non-constant private case. - (lll_private_futex_wait, lll_private_futex_timed_wait, - lll_private_futex_wake): Removed. - * sysdeps/unix/sysv/linux/sparc/pthread_once.c (clear_once_control, - __pthread_once): Add LLL_PRIVATE as last argument to lll_futex_*. - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h (FUTEX_PRIVATE_FLAG, - LLL_PRIVATE, LLL_SHARED, __lll_private_flag): Define. - (lll_futex_wait): Add private argument, define as wrapper around - lll_futex_timed_wait. - (lll_futex_timed_wait, lll_futex_wake): Add private argument, - use __lll_private_flag macro. - (lll_robust_mutex_dead, __lll_mutex_unlock, __lll_robust_mutex_unlock, - lll_wait_tid, __lll_mutex_unlock_force): Pass LLL_SHARED as last arg - to lll_futex_*. - * sysdeps/unix/sysv/linux/sh/lowlevellock.h (__lll_private_flag): - Define. - (lll_futex_timed_wait, lll_futex_wake): Use it. - (lll_private_futex_wait, lll_private_futex_timed_wait, - lll_private_futex_wake): Removed. - -2007-07-27 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/sparc/tls.h (tcbhead_t): Move gscope_flag to the end - of the structure for sparc32. - -2007-07-26 Aurelien Jarno <aurelien@aurel32.net> - - * sysdeps/sparc/tls.h (tcbhead_t): Add gscope_flag. - -2007-07-23 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S: Fix - code used when private futexes are assumed. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S: - Likewise. - -2007-07-23 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h - (__lll_private_flag): Define. - (lll_futex_wait): Define as a wrapper around lll_futex_timed_wait. - (lll_futex_timed_wait, lll_futex_wake, lll_futex_wake_unlock): Use - __lll_private_flag. - (lll_private_futex_wait, lll_private_futex_timedwait, - lll_private_futex_wake): Define as wrapper around non-_private - macros. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h - (__lll_private_flag): Define. - (lll_futex_timed_wait, lll_futex_wake): Use __lll_private_flag. - (lll_private_futex_wait, lll_private_futex_timedwait, - lll_private_futex_wake): Define as wrapper around non-_private - macros. - -2007-07-10 Steven Munroe <sjmunroe@us.ibm.com> - - * pthread_rwlock_rdlock.c (__pthread_rwlock_rdlock): Add LLL_SHARED - parameter to lll_futex_wait call. - * pthread_rwlock_wrlock.c (__pthread_rwlock_wrlock): Likewise. - - * sysdeps/unix/sysv/linux/powerpc/pthread_once.c (__pthread_once): - Replace lll_futex_wait with lll_private_futex_wait. - * sysdeps/unix/sysv/linux/powerpc/sem_post.c (__new_sem_post): - Add LLL_SHARED parameter to lll_futex_wake(). - - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Define LLL_PRIVATE - LLL_SHARED, lll_private_futex_wait, lll_private_futex_timed_wait and - lll_private_futex_wake. - (lll_futex_wait): Add private parameter. Adjust FUTEX_PRIVATE_FLAG - bit from private parm before syscall. - (lll_futex_timed_wait): Likewise. - (lll_futex_wake): Likewise. - (lll_futex_wake_unlock): Likewise. - (lll_mutex_unlock): Add LLL_SHARED parm to lll_futex_wake call. - (lll_robust_mutex_unlock): Likewise. - (lll_mutex_unlock_force): Likewise. - (lll_wait_tid): Add LLL_SHARED parm to lll_futex_wait call. - -2007-07-23 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S: Fix - compilation when unconditionally using private futexes. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S: Likewise. - -2007-07-17 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/bits/stdio-lock.h (_IO_acquire_lock_clear_flags2): - Define. - -2007-07-06 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/sh/tls.h: Include stdlib.h, list.h, sysdep.h and - kernel-features.h. - -2007-05-16 Roland McGrath <roland@redhat.com> - - * init.c (__nptl_initial_report_events): New variable. - (__pthread_initialize_minimal_internal): Initialize pd->report_events - to that. - -2007-06-22 Jakub Jelinek <jakub@redhat.com> - - * pthread_getattr_np.c (pthread_getattr_np): Clear cpuset and - cpusetsize if pthread_getaffinity_np failed with ENOSYS. - -2007-06-19 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/rtld-lowlevel.h: Remove mrlock - implementation. - -2007-06-18 Ulrich Drepper <drepper@redhat.com> - - * pthreadP.h: Define PTHREAD_MUTEX_TYPE. - * phtread_mutex_lock.c: Use PTHREAD_MUTEX_TYPE. - * pthread_mutex_timedlock.c: Likewise. - * pthread_mutex_trylock.c: Likewise. - * pthread_mutex_unlock.c: Likewise. - -2007-06-17 Andreas Schwab <schwab@suse.de> - - * sysdeps/pthread/pt-initfini.c: Tell gcc about the nonstandard - sections. - -2007-06-17 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (allocate_stack): Make code compile if - __ASSUME_PRIVATE_FUTEX is set. - -2007-06-17 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: - (__pthread_rwlock_rdlock): Don't use non SH-3/4 instruction. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S: - (__pthread_rwlock_wrlock): Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S: - (pthread_rwlock_timedrdlock): Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S: - (pthread_rwlock_timedwrlock): Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S: - (__pthread_rwlock_unlock): Likewise. - -2007-06-10 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/sh/tcb-offsets.sym: Add PRIVATE_FUTEX. - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h: Include endian.h. - Split __flags into __flags, __shared, __pad1 and __pad2. - * sysdeps/unix/sysv/linux/sh/libc-lowlevellock.S: Use private - futexes if they are available. - * sysdeps/unix/sysv/linux/sh/lowlevellock.S: Adjust so that change - in libc-lowlevellock.S allow using private futexes. - * sysdeps/unix/sysv/linux/sh/lowlevellock.h: Define - FUTEX_PRIVATE_FLAG. Add additional parameter to lll_futex_wait, - lll_futex_timed_wait and lll_futex_wake. Change lll_futex_wait - to call lll_futex_timed_wait. Add lll_private_futex_wait, - lll_private_futex_timed_wait and lll_private_futex_wake. - (lll_robust_mutex_unlock): Fix typo. - * sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S: Use private - field in futex command setup. - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Use - COND_NWAITERS_SHIFT instead of COND_CLOCK_BITS. - * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_once.S: Use private futexes - if they are available. Remove clear_once_control. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: Use private - futexes if they are available. - * 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. - * sysdeps/unix/sysv/linux/sh/sem_post.S: Add private futex support. - Wake only when there are waiters. - * sysdeps/unix/sysv/linux/sh/sem_wait.S: Add private futex - support. Indicate that there are waiters. Remove unnecessary - extra cancellation test. - * sysdeps/unix/sysv/linux/sh/sem_timedwait.S: Likewise. Removed - left-over duplication of __sem_wait_cleanup. - -2007-06-07 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Add additional - parameter to lll_futex_wait, lll_futex_timed_wait, and - lll_futex_wake. Change lll_futex_wait to call lll_futex_timed_wait. - Add lll_private_futex_wait, lll_private_futex_timed_wait, and - lll_private_futex_wake. - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Likewise. - * allocatestack.c: Adjust use of lll_futex_* macros. - * init.c: Likewise. - * lowlevellock.h: Likewise. - * pthread_barrier_wait.c: Likewise. - * pthread_cond_broadcast.c: Likewise. - * pthread_cond_destroy.c: Likewise. - * pthread_cond_signal.c: Likewise. - * pthread_cond_timedwait.c: Likewise. - * pthread_cond_wait.c: Likewise. - * pthread_create.c: Likewise. - * pthread_mutex_lock.c: Likewise. - * pthread_mutex_setprioceiling.c: Likewise. - * pthread_mutex_timedlock.c: Likewise. - * pthread_mutex_unlock.c: Likewise. - * pthread_rwlock_timedrdlock.c: Likewise. - * pthread_rwlock_timedwrlock.c: Likewise. - * pthread_rwlock_unlock.c: Likewise. - * sysdeps/alpha/tls.h: Likewise. - * sysdeps/i386/tls.h: Likewise. - * sysdeps/ia64/tls.h: Likewise. - * sysdeps/powerpc/tls.h: Likewise. - * sysdeps/pthread/aio_misc.h: Likewise. - * sysdeps/pthread/gai_misc.h: Likewise. - * sysdeps/s390/tls.h: Likewise. - * sysdeps/sh/tls.h: Likewise. - * sysdeps/sparc/tls.h: Likewise. - * sysdeps/unix/sysv/linux/fork.c: Likewise. - * sysdeps/unix/sysv/linux/lowlevellock.c: Likewise. - * sysdeps/unix/sysv/linux/lowlevelrobustlock.c: Likewise. - * sysdeps/unix/sysv/linux/rtld-lowlevel.h: Likewise. - * sysdeps/unix/sysv/linux/sem_post.c: Likewise. - * sysdeps/unix/sysv/linux/sem_timedwait.c: Likewise. - * sysdeps/unix/sysv/linux/sem_wait.c: Likewise. - * sysdeps/unix/sysv/linux/unregister-atfork.c: Likewise. - * sysdeps/unix/sysv/linux/sparc/pthread_once.c: Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_wait.c: - Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c: Likewise. - * sysdeps/x86_64/tls.h: Likewise. - -2007-05-29 Ulrich Drepper <drepper@redhat.com> - - * pthread_getattr_np.c: No need to install a cancellation handler, - this is no cancellation point. - * pthread_getschedparam.c: Likewise. - * pthread_setschedparam.c: Likewise. - * pthread_setschedprio.c: Likewise. - * sysdeps/unix/sysv/linux/lowlevellock.c: Remove all traces of - lll_unlock_wake_cb. - * sysdeps/unix/sysv/linux/alpha/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/sh/lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/sh/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc32/lowlevellock.c: Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Likewise. - - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S: Checking - whether there are more than one thread makes no sense here since - we only call the slow path if the locks are taken. - * sysdeps/unix/sysv/linux/x86_64/libc-lowlevellock.S: Likewise. - - * sysdeps/unix/sysv/linux/internaltypes.h: Introduce - COND_NWAITERS_SHIFT. - * pthread_cond_destroy.c: Use COND_NWAITERS_SHIFT instead of - COND_CLOCK_BITS. - * pthread_cond_init.c: Likewise. - * pthread_cond_timedwait.c: Likewise. - * pthread_cond_wait.c: Likewise. - * pthread_condattr_getclock.c: Likewise. - * pthread_condattr_setclock.c: Likewise. - * sysdeps/unix/sysv/linux/lowlevelcond.sym: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - -2007-05-28 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/powerpc/pthread_attr_setstacksize.c: Include - unistd.h. - - * sysdeps/i386/tls.h (THREAD_GSCOPE_RESET_FLAG): Use explicit - insn suffix. - (THREAD_GSCOPE_GET_FLAG): Remove. - * sysdeps/x86_64/tls.h (THREAD_GSCOPE_GET_FLAG): Remove. - * allocatestack.c (__wait_lookup_done): Revert 2007-05-24 - changes. - * sysdeps/powerpc/tls.h (tcbhead_t): Remove gscope_flag. - (THREAD_GSCOPE_GET_FLAG): Remove. - (THREAD_GSCOPE_RESET_FLAG): Use THREAD_SELF->header.gscope_flag - instead of THREAD_GSCOPE_GET_FLAG. - (THREAD_GSCOPE_SET_FLAG): Likewise. Add atomic_write_barrier after - it. - * sysdeps/s390/tls.h (THREAD_GSCOPE_FLAG_UNUSED, - THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT, - THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG, - THREAD_GSCOPE_WAIT): Define. - * sysdeps/sparc/tls.h (THREAD_GSCOPE_FLAG_UNUSED, - THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT, - THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG, - THREAD_GSCOPE_WAIT): Define. - * sysdeps/sh/tls.h (THREAD_GSCOPE_FLAG_UNUSED, - THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT, - THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG, - THREAD_GSCOPE_WAIT): Define. - * sysdeps/ia64/tls.h (THREAD_GSCOPE_FLAG_UNUSED, - THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT, - THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG, - THREAD_GSCOPE_WAIT): Define. - -2007-05-24 Richard Henderson <rth@redhat.com> - - * descr.h (struct pthread): Add header.gscope_flag. - * sysdeps/alpha/tls.h (THREAD_GSCOPE_FLAG_UNUSED, - THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT, - THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG, - THREAD_GSCOPE_WAIT): Define. - -2007-05-27 Ulrich Drepper <drepper@redhat.com> - - * init.c: Make it compile with older kernel headers. - - * tst-initializers1.c: Show through exit code which test failed. - - * pthread_rwlock_init.c: Also initialize __shared field. - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h: Split __flags - element in rwlock structure into four byte elements. One of them is - the new __shared element. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h [__WORDSIZE=32]: - Likewise. - [__WORDSIZE=64]: Renamed __pad1 element int rwlock structure to - __shared, adjust names of other padding elements. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. - * sysdeps/pthread/pthread.h: Adjust rwlock initializers. - * sysdeps/unix/sysv/linux/lowlevelrwlock.sym: Add PSHARED. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Define - FUTEX_PRIVATE_FLAG. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S: Change main - futex to use private operations if possible. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: Likewise. - -2007-05-26 Ulrich Drepper <drepper@redhat.com> - - * pthreadP.h (PTHREAD_RWLOCK_PREFER_READER_P): Define. - * pthread_rwlock_rdlock.c: Use PTHREAD_RWLOCK_PREFER_READER_P. - * pthread_rwlock_timedrdlock.c: Likewise. - * pthread_rwlock_tryrdlock.c: Likewise. - - * sysdeps/unix/sysv/linux/x86_64/sem_trywait.S (sem_trywait): Tiny - optimization. - - * sysdeps/unix/sysv/linux/sem_wait.c: Add missing break. - * sysdeps/unix/sysv/linux/sem_timedwait.c: Removed left-over - duplication of __sem_wait_cleanup. - - * allocatestack.c: Revert last change. - * init.c: Likewise. - * sysdeps/i386/tls.h: Likewise. - * sysdeps/x86_64/tls.h: Likewise. - * descr.h [TLS_DTV_AT_TP] (struct pthread): Add private_futex field to - header structure. - * sysdeps/powerpc/tcb-offsets.sym: Add PRIVATE_FUTEX_OFFSET. - - * sysdeps/unix/sysv/linux/internaltypes.h (struct pthread_barrier): - Add private field. - * sysdeps/unix/sysv/linux/lowlevelbarrier.sym: Add PRIVATE definition. - * pthread_barrier_init.c: Set private flag if pshared and private - futexes are supported. - * sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S: Use - private field in futex command setup. - * sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S: Likewise. - -2007-05-25 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Add private futex - support. - * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_wait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_post.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Likewise. - - * semaphoreP.h: Declare __old_sem_init and __old_sem_wait. - * sem_init.c (__new_sem_init): Rewrite to initialize all three - fields in the structure. - (__old_sem_init): New function. - * sem_open.c: Initialize all fields of the structure. - * sem_getvalue.c: Adjust for renamed element. - * sysdeps/unix/sysv/linux/Makefile [subdir=nptl] - (gen-as-const-headers): Add structsem.sym. - * sysdeps/unix/sysv/linux/structsem.sym: New file. - * sysdeps/unix/sysv/linux/internaltypes.h: Rename struct sem to - struct new_sem. Add struct old_sem. - * sysdeps/unix/sysv/linux/sem_post.c: Wake only when there are waiters. - * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_post.S: Likewise. - * sysdeps/unix/sysv/linux/sem_wait.c: Indicate that there are waiters. - * sysdeps/unix/sysv/linux/i386/i486/sem_wait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Likewise. - * sysdeps/unix/sysv/linux/sem_timedwait.c: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: Likewise. - * Makefile (tests): Add tst-sem10, tst-sem11, tst-sem12. - * tst-sem10.c: New file. - * tst-sem11.c: New file. - * tst-sem12.c: New file. - * tst-typesizes.c: Test struct new_sem and struct old_sem instead - of struct sem. - -2007-05-25 Ulrich Drepper <drepper@redhat.com> - Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S (sem_timedwait): - Move __pthread_enable_asynccancel right before futex syscall. - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S (sem_timedwait): - Likewise. - -2007-05-24 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/i386/tls.h (THREAD_SET_PRIVATE_FUTEX, - THREAD_COPY_PRIVATE_FUTEX): Define. - * sysdeps/x86_64/tls.h (THREAD_SET_PRIVATE_FUTEX, - THREAD_COPY_PRIVATE_FUTEX): Define. - * allocatestack.c (allocate_stack): Use THREAD_COPY_PRIVATE_FUTEX. - * init.c (__pthread_initialize_minimal_internal): Use - THREAD_SET_PRIVATE_FUTEX. - - * sysdeps/powerpc/tls.h (tcbhead_t): Add gscope_flag. - (THREAD_GSCOPE_FLAG_UNUSED, THREAD_GSCOPE_FLAG_USED, - THREAD_GSCOPE_FLAG_WAIT): Define. - (THREAD_GSCOPE_GET_FLAG, THREAD_GSCOPE_SET_FLAG, - THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_WAIT): Define. - * sysdeps/i386/tls.h (THREAD_GSCOPE_WAIT): Don't use - PTR_DEMANGLE. - (THREAD_GSCOPE_GET_FLAG): Define. - * sysdeps/x86_64/tls.h (THREAD_GSCOPE_GET_FLAG): Define. - * allocatestack.c (__wait_lookup_done): Use THREAD_GSCOPE_GET_FLAG - instead of ->header.gscope_flag directly. - -2007-05-23 Ulrich Drepper <drepper@redhat.com> - - * init.c (__pthread_initialize_minimal_internal): Check whether - private futexes are available. - * allocatestack.c (allocate_stack): Copy private_futex field from - current thread into the new stack. - * sysdeps/unix/sysv/linux/x86_64/libc-lowlevellock.S: Use private - futexes if they are available. - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S: Likewise - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: Adjust so that change - in libc-lowlevellock.S allow using private futexes. - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Define - FUTEX_PRIVATE_FLAG. - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_once.S: Use private futexes - if they are available. - * sysdeps/unix/sysv/linux/i386/pthread_once.S: Likewise. - * sysdeps/x86_64/tcb-offsets.sym: Add PRIVATE_FUTEX. - * sysdeps/i386/tcb-offsets.sym: Likewise. - * sysdeps/x86_64/tls.h (tcbhead_t): Add private_futex field. - * sysdeps/i386/tls.h (tcbhead_t): Likewise. - -2007-05-21 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread-functions.h (struct pthread_functions): - Remove ptr_wait_lookup_done again. - * init.c (pthread_functions): Don't add .ptr_wait_lookup_done here. - (__pthread_initialize_minimal_internal): Initialize - _dl_wait_lookup_done pointer in _rtld_global directly. - * sysdeps/unix/sysv/linux/libc_pthread_init.c (__libc_pthread_init): - Remove code to code _dl_wait_lookup_done. - * sysdeps/x86_64/tls.h (THREAD_GSCOPE_WAIT): The pointer is not - encrypted for now. - -2007-05-21 Jakub Jelinek <jakub@redhat.com> - - * tst-robust9.c (do_test): Don't fail if ENABLE_PI and - pthread_mutex_init failed with ENOTSUP. - -2007-05-19 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (__wait_lookup_done): New function. - * sysdeps/pthread/pthread-functions.h (struct pthread_functions): - Add ptr_wait_lookup_done. - * init.c (pthread_functions): Initialize .ptr_wait_lookup_done. - * pthreadP.h: Declare __wait_lookup_done. - * sysdeps/i386/tls.h (tcbhead_t): Add gscope_flag. - Define macros to implement reference handling of global scope. - * sysdeps/x86_64/tls.h: Likewise. - * sysdeps/unix/sysv/linux/libc_pthread_init.c (__libc_pthread_init): - Initialize GL(dl_wait_lookup_done). - -2007-05-17 Ulrich Drepper <drepper@redhat.com> - - [BZ #4512] - * pthread_mutex_lock.c: Preserve FUTEX_WAITERS bit when dead owner - is detected. - * pthread_mutex_timedlock.c: Likewise. - * pthread_mutex_trylock.c: Likewise. - Patch in part by Atsushi Nemoto <anemo@mba.ocn.ne.jp>. - - * Makefile (tests): Add tst-robust9 and tst-robustpi9. - * tst-robust9.c: New file. - * tst-robustpi9.c: New file. - - * sysdeps/unix/sysv/linux/sem_wait.c (__new_sem_wait): Remove - unnecessary extra cancellation test. - -2007-05-14 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Remove unnecessary - extra cancellation test. - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: Likewise. - -2007-05-10 Ulrich Drepper <drepper@redhat.com> - - * descr.h (struct pthread): Rearrange members to fill hole in - 64-bit layout. - - * sysdeps/unix/sysv/linux/pthread_setaffinity.c - (__pthread_setaffinity_new): If syscall was successful and - RESET_VGETCPU_CACHE is defined, use it before returning. - * sysdeps/unix/sysv/linux/x86_64/pthread_setaffinity.c: New file. - -2007-05-10 Jakub Jelinek <jakub@redhat.com> - - [BZ #4455] - * tst-align2.c: Include stackinfo.h. - * tst-getpid1.c: Likewise. - -2007-05-02 Carlos O'Donell <carlos@systemhalted.org> - - [BZ #4455] - * tst-align2.c (do_test): Add _STACK_GROWS_UP case. - * tst-getpid1.c (do_test): Likewise. - - [BZ #4456] - * allocatestack.c (change_stack_perm): Add _STACK_GROWS_UP case. - (allocate_stack): Likewise. - -2007-05-07 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/lowlevelrobustlock.c - (__lll_robust_lock_wait): Fix race caused by reloading of futex value. - (__lll_robust_timedlock_wait): Likewise. - Reported by Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>. - -2007-05-06 Mike Frysinger <vapier@gentoo.org> - - [BZ #4465] - * tst-cancel-wrappers.sh: Set C["fdatasync"] to 1. - * tst-cancel4.c (tf_fdatasync): New test. - -2007-04-27 Ulrich Drepper <drepper@redhat.com> - - [BZ #4392] - * pthread_mutex_trylock.c (__pthread_mutex_trylock): Treat error - check mutexes like normal mutexes. - - [BZ #4306] - * sysdeps/unix/sysv/linux/timer_create.c (timer_create): - Initialize the whole sigevent structure to appease valgrind. - -2007-04-25 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/x86_64/tls.h (tcbhead_t): Add vgetcpu_cache. - * sysdeps/x86_64/tcb-offsets.sym: Add VGETCPU_CACHE_OFFSET. - -2007-04-06 Ulrich Drepper <drepper@redhat.com> - - * tst-locale1.c: Avoid warnings. - * tst-locale2.c: Likewise. - -2007-03-19 Steven Munroe <sjmunroe@us.ibm.com> - - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h - (__lll_robust_trylock): Add MUTEX_HINT_ACQ to lwarx instruction. - -2007-03-16 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/bits/libc-lock.h: Use __extern_inline and - __extern_always_inline where appropriate. - * sysdeps/pthread/pthread.h: Likewise. - -2007-03-13 Richard Henderson <rth@redhat.com> - - * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h (PSEUDO): Use two - separate cfi regions for the two subsections. - -2007-02-25 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/fork.c (__libc_fork): Reset refcntr in - new thread, don't just decrement it. - Patch by Suzuki K P <suzuki@in.ibm.com>. - -2007-02-21 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread-functions.h: Correct last patch, correct - PTHFCT_CALL definition. - -2007-02-18 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread-functions.h: If PTR_DEMANGLE is not - available, don't use it. - -2007-02-09 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S - (__lll_mutex_timedlock_wait): Use correct pointer when we don't - call into the kernel to delay. - -2007-01-18 Ulrich Drepper <drepper@redhat.com> - - * tst-initializers1.c: We want to test the initializers as seen - outside of libc, so undefined _LIBC. - - * pthread_join.c (cleanup): Avoid warning. - -2007-01-17 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S - (__lll_timedwait_tid): Add unwind info. - - * sysdeps/unix/sysv/linux/libc_pthread_init.c: Don't just copy the - function table, mangle the pointers. - * sysdeps/pthread/pthread-functions.h: Define PTHFCT_CALL. - * forward.c: Use PTHFCT_CALL and __libc_pthread_functions_init. - * sysdeps/pthread/bits/libc-lock.h: When using __libc_pthread_functions - demangle pointers before use. - * sysdeps/unix/sysv/linux/s390/jmp-unwind.c: Use PTHFCT_CALL to - demangle pointer. - * sysdeps/unix/sysv/linux/jmp-unwind.c: Likewise. - * sysdeps/pthread/setxid.h: Likewise. - -2007-01-12 Ulrich Drepper <drepper@redhat.com> - - * tst-rwlock7.c: Show some more information in case of correct - behavior. - -2007-01-11 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h - (lll_futex_timed_wait): Undo part of last change, don't negate - return value. - -2007-01-10 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Cleanups. Define - FUTEX_CMP_REQUEUE and lll_futex_requeue. - -2006-12-28 David S. Miller <davem@davemloft.net> - - * shlib-versions: Fix sparc64 linux target specification. - -2007-01-10 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/pthread_barrier_wait.c: - Adjust include path for pthread_barrier_wait.c move. - -2006-12-21 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/pthread_kill.c (pthread_kill): Make sure - tid isn't reread from pd->tid in between ESRCH test and the syscall. - -2006-12-06 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h (PSEUDO): Handle - 6 argument cancellable syscalls. - (STM_6, LM_6, LR7_0, LR7_1, LR7_2, LR7_3, LR7_4, LR7_5, LR7_6): Define. - * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h (PSEUDO): Handle - 6 argument cancellable syscalls. - (STM_6, LM_6, LR7_0, LR7_1, LR7_2, LR7_3, LR7_4, LR7_5, LR7_6): Define. - -2006-12-09 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/rtld-lowlevel.h - (__rtld_mrlock_initialize): Add missing closing parenthesis. - -2006-10-30 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/ia64/pthread_spin_unlock.c (pthread_spin_unlock): Use - __sync_lock_release instead of __sync_lock_release_si. - -2006-10-29 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (RTLD_SINGLE_THREAD_P): - Define. - (SINGLE_THREAD_P): Define to 1 if IS_IN_rtld. - * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Likewise. - -2006-10-27 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread_barrier_wait.c: Move to... - * pthread_barrier_wait.c: ...here. - * sysdeps/pthread/pthread_cond_broadcast.c: Move to... - * pthread_cond_broadcast.c: ...here. - * sysdeps/pthread/pthread_cond_signal.c: Move to... - * pthread_cond_signal.c: ...here. - * sysdeps/pthread/pthread_cond_timedwait.c: Move to... - * pthread_cond_timedwait.c: ...here. - * sysdeps/pthread/pthread_cond_wait.c: Move to... - * pthread_cond_wait.c: ...here. - * sysdeps/pthread/pthread_once.c: Move to... - * pthread_once.c: ...here. - * sysdeps/pthread/pthread_rwlock_rdlock.c: Move to... - * pthread_rwlock_rdlock.c: ...here. - * sysdeps/pthread/pthread_rwlock_timedrdlock.c: Move to... - * pthread_rwlock_timedrdlock.c: ...here. - * sysdeps/pthread/pthread_rwlock_timedwrlock.c: Move to... - * pthread_rwlock_timedwrlock.c: ...here. - * sysdeps/pthread/pthread_rwlock_unlock.c: Move to... - * pthread_rwlock_unlock.c: ...here. - * sysdeps/pthread/pthread_rwlock_wrlock.c: Move to... - * pthread_rwlock_wrlock.c: ...here. - * sysdeps/pthread/pthread_spin_destroy.c: Move to... - * pthread_spin_destroy.c: ...here. - * sysdeps/pthread/pthread_spin_init.c: Move to... - * pthread_spin_init.c: ...here. - * sysdeps/pthread/pthread_spin_unlock.c: Move to... - * pthread_spin_unlock.c: ...here. - * sysdeps/pthread/pthread_getcpuclockid.c: Move to... - * pthread_getcpuclockid.c: ...here. - - * init.c: USE_TLS support is now always enabled. - * tst-tls5.h: Likewise. - * sysdeps/alpha/tls.h: Likewise. - * sysdeps/i386/tls.h: Likewise. - * sysdeps/ia64/tls.h: Likewise. - * sysdeps/powerpc/tls.h: Likewise. - * sysdeps/s390/tls.h: Likewise. - * sysdeps/sh/tls.h: Likewise. - * sysdeps/sparc/tls.h: Likewise. - * sysdeps/x86_64/tls.h: Likewise. - -2006-10-27 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/rtld-lowlevel.h (__rtld_mrlock_lock, - __rtld_mrlock_change): Update oldval if atomic compare and exchange - failed. - - * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h (SINGLE_THREAD_P): - Define to THREAD_SELF->header.multiple_threads. - * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h (SINGLE_THREAD_P): - Likewise. - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (SINGLE_THREAD_P): - Likewise. - * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h - (SINGLE_THREAD_P): Likewise. - * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h - (SINGLE_THREAD_P): Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h - (SINGLE_THREAD_P): Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h - (SINGLE_THREAD_P): Likewise. - * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h (SINGLE_THREAD_P): - Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h - (SINGLE_THREAD_P): Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h - (SINGLE_THREAD_P): Likewise. - * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (SINGLE_THREAD_P): - Likewise. - -2006-10-26 Jakub Jelinek <jakub@redhat.com> - - * pthread_attr_setstacksize.c (NEW_VERNUM): Define to GLIBC_2_3_3 - by default rather than 2_3_3. - -2006-10-17 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/rtld-lowlevel.h (__rtld_mrlock_lock, - __rtld_mrlock_unlock, __rtld_mrlock_change, __rtld_mrlock_done): Use - atomic_* instead of catomic_* macros. - -2006-10-12 Ulrich Drepper <drepper@redhat.com> - - [BZ #3285] - * sysdeps/unix/sysv/linux/bits/local_lim.h: Add SEM_VALUE_MAX. - * sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/bits/local_lim.h: Likewise. - * sysdeps/unix/sysv/linux/alpha/bits/local_lim.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/bits/local_lim.h: Likewise. - * sysdeps/unix/sysv/linux/i386/bits/semaphore.h: Remove SEM_VALUE_MAX. - * sysdeps/unix/sysv/linux/powerpc/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/alpha/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/sh/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/semaphore.h: Likewise. - -2006-10-11 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Add support for - cancelable syscalls with six parameters. - - * sysdeps/unix/sysv/linux/rtld-lowlevel.h: Use catomic_* - operations instead of atomic_*. - -2006-10-09 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/rtld-lowlevel.h: New file.. - -2006-10-07 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h: New file. - * sysdeps/unix/sysv/linux/powerpc/pthread_attr_setstack.c: New file. - * sysdeps/unix/sysv/linux/powerpc/pthread_attr_setstacksize.c: - New file. - * pthread_attr_setstack.c: Allow overwriting the version number of the - new symbol. - * pthread_attr_setstacksize.c: Likewise. - (__old_pthread_attr_setstacksize): If STACKSIZE_ADJUST is defined use - it. - * sysdeps/unix/sysv/linux/powerpc/Versions (libpthread): Add - pthread_attr_setstack and pthread_attr_setstacksize to GLIBC_2.6. - -2006-09-24 Ulrich Drepper <drepper@redhat.com> - - [BZ #3251] - * descr.h (ENQUEUE_MUTEX_BOTH): Add cast to avoid warning. - Patch by Petr Baudis. - -2006-09-18 Jakub Jelinek <jakub@redhat.com> - - * tst-kill4.c (do_test): Explicitly set tf thread's stack size. - - * tst-cancel2.c (tf): Loop as long as something was written. - -2006-09-12 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S: For PI - mutexes wake all mutexes. - * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Don't increment - WAKEUP_SEQ if this would increase the value beyond TOTAL_SEQ. - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Likewise. - -2006-09-12 Ulrich Drepper <drepper@redhat.com> - - * tst-cond22.c (tf): Slight changes to the pthread_cond_wait use - to guarantee the thread is always canceled. - -2006-09-08 Jakub Jelinek <jakub@redhat.com> - - * tst-cond22.c: Include pthread.h instead of pthreadP.h. - Include stdlib.h. - * sysdeps/pthread/pthread_cond_wait.c (__condvar_cleanup): Only - increase FUTEX if increasing WAKEUP_SEQ. Fix comment typo. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - -2006-09-08 Ulrich Drepper <drepper@redhat.com> - - [BZ #3123] - * sysdeps/pthread/pthread_cond_wait.c (__condvar_cleanup): Don't - increment WAKEUP_SEQ if this would increase the value beyond TOTAL_SEQ. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - * Makefile (tests): Add tst-cond22. - * tst-cond22.c: New file. - -2006-09-05 Ulrich Drepper <drepper@redhat.com> - - [BZ #3124] - * descr.h (struct pthread): Add parent_cancelhandling. - * sysdeps/pthread/createthread.c (create_thread): Pass parent - cancelhandling value to child. - * pthread_create.c (start_thread): If parent thread was canceled - reset the SIGCANCEL mask. - * Makefile (tests): Add tst-cancel25. - * tst-cancel25.c: New file. - -2006-09-05 Jakub Jelinek <jakub@redhat.com> - Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/gai_misc.h (GAI_MISC_NOTIFY): Don't decrement - counterp if it is already zero. - * sysdeps/pthread/aio_misc.h (AIO_MISC_NOTIFY): Likewise.. - -2006-03-04 Jakub Jelinek <jakub@redhat.com> - Roland McGrath <roland@redhat.com> - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h - (LLL_STUB_UNWIND_INFO_START, LLL_STUB_UNWIND_INFO_END, - LLL_STUB_UNWIND_INFO_3, LLL_STUB_UNWIND_INFO_4): Define. - (lll_mutex_lock, lll_robust_mutex_lock, lll_mutex_cond_lock, - lll_robust_mutex_cond_lock, lll_mutex_timedlock, - lll_robust_mutex_timedlock, lll_mutex_unlock, - lll_robust_mutex_unlock, lll_lock, lll_unlock): Use them. - Add _L_*_ symbols around the subsection. - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Add unwind info. - * sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S: Likewise. - -2006-03-03 Jakub Jelinek <jakub@redhat.com> - Roland McGrath <roland@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h - (LLL_STUB_UNWIND_INFO_START, LLL_STUB_UNWIND_INFO_END, - LLL_STUB_UNWIND_INFO_5, LLL_STUB_UNWIND_INFO_6): Define. - (lll_mutex_lock, lll_robust_mutex_lock, lll_mutex_cond_lock, - lll_robust_mutex_cond_lock, lll_mutex_timedlock, - lll_robust_mutex_timedlock, lll_mutex_unlock, - lll_robust_mutex_unlock, lll_lock, lll_unlock): Use them. - Add _L_*_ symbols around the subsection. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: Add unwind info. - * sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S: Likewise. - -2006-08-31 Ulrich Drepper <drepper@redhat.com> - - * pthread_rwlock_trywrlock.c (__pthread_rwlock_trywrlock): Undo last - change because it can disturb too much existing code. If real hard - reader preference is needed we'll introduce another type. - * sysdeps/pthread/pthread_rwlock_timedwrlock.c - (pthread_rwlock_timedwrlock): Likewise. - * sysdeps/pthread/pthread_rwlock_wrlock.c (__pthread_rwlock_wrlock): - Likewise. - -2006-08-30 Ulrich Drepper <drepper@redhat.com> - - * pthread_rwlock_trywrlock.c (__pthread_rwlock_trywrlock): Respect - reader preference. - * sysdeps/pthread/pthread_rwlock_timedwrlock.c - (pthread_rwlock_timedwrlock): Likewise. - * sysdeps/pthread/pthread_rwlock_wrlock.c (__pthread_rwlock_wrlock): - Likewise. - -2006-08-25 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/libc_pthread_init.c (freeres_libpthread): - Only define ifdef SHARED. - -2006-08-23 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (queue_stack): Move freeing of surplus stacks to... - (free_stacks): ...here. - (__free_stack_cache): New function. - * pthreadP.h: Declare __free_stack_cache. - * sysdeps/pthread/pthread-functions.h (pthread_functions): Add - ptr_freeres. - * init.c (pthread_functions): Initialize ptr_freeres. - * sysdeps/unix/sysv/linux/libc_pthread_init.c (freeres_libptread): - New freeres function. - -2006-07-30 Joseph S. Myers <joseph@codesourcery.com> - - [BZ #3018] - * Makefile (extra-objs): Add modules to extra-test-objs instead. - -2006-08-20 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define - _XOPEN_REALTIME_THREADS. - -2006-08-15 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/clock_settime.c (INTERNAL_VSYSCALL): Use - HAVE_CLOCK_GETRES_VSYSCALL as guard macro rather than - HAVE_CLOCK_GETTIME_VSYSCALL. - (maybe_syscall_settime_cpu): Use plain INTERNAL_VSYSCALL here. - -2006-08-14 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/bits/posix_opt.h - (_POSIX_THREAD_PRIO_PROTECT): Define to 200112L. - * descr.h (struct priority_protection_data): New type. - (struct pthread): Add tpp field. - * pthreadP.h (PTHREAD_MUTEX_PP_NORMAL_NP, - PTHREAD_MUTEX_PP_RECURSIVE_NP, PTHREAD_MUTEX_PP_ERRORCHECK_NP, - PTHREAD_MUTEX_PP_ADAPTIVE_NP): New enum values. - * pthread_mutex_init.c (__pthread_mutex_init): Handle non-robust - TPP mutexes. - * pthread_mutex_lock.c (__pthread_mutex_lock): Handle TPP mutexes. - * pthread_mutex_trylock.c (__pthread_mutex_trylock): Likewise. - * pthread_mutex_timedlock.c (pthread_mutex_timedlock): Likewise. - * pthread_mutex_unlock.c (__pthread_mutex_unlock_usercnt): Likewise. - * tpp.c: New file. - * pthread_setschedparam.c (__pthread_setschedparam): Handle priority - boosted by TPP. - * pthread_setschedprio.c (pthread_setschedprio): Likewise. - * pthread_mutexattr_getprioceiling.c - (pthread_mutexattr_getprioceiling): If ceiling is 0, ensure it is - in the SCHED_FIFO priority range. - * pthread_mutexattr_setprioceiling.c - (pthread_mutexattr_setprioceiling): Fix prioceiling validation. - * pthread_mutex_getprioceiling.c (pthread_mutex_getprioceiling): Fail - if mutex is not TPP. Ceiling is now in __data.__lock. - * pthread_mutex_setprioceiling.c: Include stdbool.h. - (pthread_mutex_setprioceiling): Fix prioceiling validation. Ceiling - is now in __data.__lock. Add locking. - * pthread_create.c (__free_tcb): Free pd->tpp structure. - * Makefile (libpthread-routines): Add tpp. - (xtests): Add tst-mutexpp1, tst-mutexpp6 and tst-mutexpp10. - * tst-tpp.h: New file. - * tst-mutexpp1.c: New file. - * tst-mutexpp6.c: New file. - * tst-mutexpp10.c: New file. - * tst-mutex1.c (TEST_FUNCTION): Don't redefine if already defined. - * tst-mutex6.c (TEST_FUNCTION): Likewise. - -2006-08-12 Ulrich Drepper <drepper@redhat.com> - - [BZ #2843] - * pthread_join.c (pthread_join): Account for self being canceled - when checking for deadlocks. - * tst-join5.c: Cleanups. Allow to be used in tst-join6. - (tf1): Don't print anything after pthread_join returns, this would be - another cancellation point. - (tf2): Likewise. - * tst-join6.c: New file. - * Makefile (tests): Add tst-join6. - -2006-08-03 Ulrich Drepper <drepper@redhat.com> - - [BZ #2892] - * pthread_setspecific.c (__pthread_setspecific): Check - out-of-range index before checking for unused key. - - * sysdeps/pthread/gai_misc.h: New file. - -2006-08-01 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/smp.h: New file. Old Linux-specific - file. Don't use sysctl. - * sysdeps/unix/sysv/linux/smp.h: Always assume SMP. Archs can - overwrite the file if this is likely not true. - -2006-07-31 Daniel Jacobowitz <dan@codesourcery.com> - - * allocatestack.c (__reclaim_stacks): Reset the PID on cached stacks. - * Makefile (tests): Add tst-getpid3. - * tst-getpid3.c: New file. - -2006-07-30 Roland McGrath <roland@redhat.com> - - * Makefile (libpthread-routines): Add ptw-sigsuspend. - - * sysdeps/unix/sysv/linux/i386/not-cancel.h - (pause_not_cancel): New macro. - (nanosleep_not_cancel): New macro. - (sigsuspend_not_cancel): New macro. - * pthread_mutex_timedlock.c (pthread_mutex_timedlock): Use - nanosleep_not_cancel macro from <not-cancel.h>. - * pthread_mutex_lock.c (__pthread_mutex_lock): Use pause_not_cancel - macro from <not-cancel.h>. - -2006-07-28 Ulrich Drepper <drepper@redhat.com> - Jakub Jelinek <jakub@redhat.com> - - * descr.h: Change ENQUEUE_MUTEX and DEQUEUE_MUTEX for bit 0 - notification of PI mutex. Add ENQUEUE_MUTEX_PI. - * pthreadP.h: Define PTHREAD_MUTEX_PI_* macros for PI mutex types. - * pthread_mutex_setprioceilining.c: Adjust for mutex type name change. - * pthread_mutex_init.c: Add support for priority inheritance mutex. - * pthread_mutex_lock.c: Likewise. - * pthread_mutex_timedlock.c: Likewise. - * pthread_mutex_trylock.c: Likewise. - * pthread_mutex_unlock.c: Likewise. - * sysdeps/pthread/pthread_cond_broadcast.c: For PI mutexes wake - all mutexes. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.c: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.c: Likewise. - * sysdeps/unix/sysv/linux/pthread-pi-defines.sym: New file. - * sysdeps/unix/sysv/linux/Makefile (gen-as-const-header): Add - pthread-pi-defines.sym. - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Define FUTEX_LOCK_PI, - FUTEX_UNLOCK_PI, and FUTEX_TRYLOCK_PI. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/alpha/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/sh/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define - _POSIX_THREAD_PRIO_INHERIT to 200112L. - * tst-mutex1.c: Adjust to allow use in PI mutex test. - * tst-mutex2.c: Likewise. - * tst-mutex3.c: Likewise. - * tst-mutex4.c: Likewise. - * tst-mutex5.c: Likewise. - * tst-mutex6.c: Likewise. - * tst-mutex7.c: Likewise. - * tst-mutex7a.c: Likewise. - * tst-mutex8.c: Likewise. - * tst-mutex9.c: Likewise. - * tst-robust1.c: Likewise. - * tst-robust7.c: Likewise. - * tst-robust8.c: Likewise. - * tst-mutexpi1.c: New file. - * tst-mutexpi2.c: New file. - * tst-mutexpi3.c: New file. - * tst-mutexpi4.c: New file. - * tst-mutexpi5.c: New file. - * tst-mutexpi6.c: New file. - * tst-mutexpi7.c: New file. - * tst-mutexpi7a.c: New file. - * tst-mutexpi8.c: New file. - * tst-mutexpi9.c: New file. - * tst-robust1.c: New file. - * tst-robust2.c: New file. - * tst-robust3.c: New file. - * tst-robust4.c: New file. - * tst-robust5.c: New file. - * tst-robust6.c: New file. - * tst-robust7.c: New file. - * tst-robust8.c: New file. - * Makefile (tests): Add the new tests. - - * pthread_create.c (start_thread): Add some casts to avoid warnings. - * pthread_mutex_destroy.c: Remove unneeded label. - -2006-07-01 Ulrich Drepper <drepper@redhat.com> - - * pthread_mutex_init.c (__pthread_mutex_init): Move some - computations to compile time. - -2006-06-04 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread.h: Add pthread_equal inline version. - -2006-05-15 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/fork.h: Mark __fork_handlers as hidden. - -2006-05-11 Ulrich Drepper <drepper@redhat.com> - - * pthread_key_create.c (__pthread_key_create): Do away with - __pthread_keys_lock. - - * sysdeps/unix/sysv/linux/pthread_setaffinity.c - (__kernel_cpumask_size): Mark as hidden. - * sysdeps/unix/sysv/linux/pthread_attr_setaffinity.c: Likewise. - - * sem_open.c (__sem_mappings_lock): Mark as hidden. - * semaphoreP.h (__sem_mappings_lock): Likewise. - -2006-05-10 Ulrich Drepper <drepper@redhat.com> - - * pthread_atfork.c: Mark __dso_handle as hidden. - -2006-05-09 Ulrich Drepper <drepper@redhat.com> - - [BZ #2644] - * sysdeps/pthread/unwind-forcedunwind.c: Different solution for - the reload problem. Change the one path in pthread_cancel_init - which causes the problem. Force gcc to reload. Simplify callers. - * sysdeps/unix/sysv/linux/ia64/unwind-forcedunwind.c - (_Unwind_GetBSP): Undo last patch. - -2006-05-07 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/ia64/unwind-forcedunwind.c: Make sure the - function pointer is reloaded after pthread_cancel_init calls. - - [BZ #2644] - * sysdeps/pthread/unwind-forcedunwind.c: Make sure functions - pointers are reloaded after pthread_cancel_init calls. - -2006-05-01 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/allocalim.h (__libc_use_alloca): Mark with - __always_inline. - -2006-04-27 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/timer_routines.c (timer_helper_thread): - Allocate new object which is passed to timer_sigev_thread so that - the timer can be deleted before the new thread is scheduled. - -2006-04-26 Roland McGrath <roland@redhat.com> - - * sysdeps/x86_64/tls.h: Include <asm/prctl.h> inside [! __ASSEMBLER__]. - -2006-04-08 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Remove branch predicion - suffix for conditional jumps. - * sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_wait.S: Likewise. - - * init.c (sigcancel_handler): Compare with correct PID even if the - thread is in the middle of a fork call. - (sighandler_setxid): Likewise. - Reported by Suzuki K P <suzuki@in.ibm.com> . - -2006-04-07 Jakub Jelinek <jakub@redhat.com> - - * pthreadP.h (FUTEX_TID_MASK): Sync with kernel. - -2006-04-06 Ulrich Drepper <drepper@redhat.com> - - * pthread_getattr_np.c (pthread_getattr_np): Close fp if getrlimit - fails [Coverity CID 105]. - -2006-04-05 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread.h: Add nonnull attributes. - -2006-04-03 Steven Munroe <sjmunroe@us.ibm.com> - - [BZ #2505] - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h [_ARCH_PWR4]: - Define __lll_rel_instr using lwsync. - -2006-03-27 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (allocate_stack): Always initialize robust_head. - * descr.h: Define struct robust_list_head. - (struct pthread): Use robust_list_head in robust mutex list definition. - Adjust ENQUEUE_MUTEX and DEQUEUE_MUTEX. - * init.c [!__ASSUME_SET_ROBUST_LIST] (__set_robust_list_avail): Define. - (__pthread_initialize_minimal_internal): Register robust_list with - the kernel. - * pthreadP.h: Remove PRIVATE_ from PTHREAD_MUTEX_ROBUST_* names. - Declare __set_robust_list_avail. - * pthread_create.c (start_thread): Register robust_list of new thread. - [!__ASSUME_SET_ROBUST_LIST]: If robust_list is not empty wake up - waiters. - * pthread_mutex_destroy.c: For robust mutexes don't look at the - number of users, it's unreliable. - * pthread_mutex_init.c: Allow use of pshared robust mutexes if - set_robust_list syscall is available. - * pthread_mutex_consistent.c: Adjust for PTHREAD_MUTEX_ROBUST_* rename. - * pthread_mutex_lock.c: Simplify robust mutex code a bit. - Set robust_head.list_op_pending before trying to lock a robust mutex. - * pthread_mutex_timedlock.c: Likewise. - * pthread_mutex_trylock.c: Likewise. - * pthread_mutex_unlock.c: Likewise for unlocking. - * Makefile (tests): Add tst-robust8. - * tst-robust8.c: New file. - -2006-03-08 Andreas Schwab <schwab@suse.de> - - * sysdeps/unix/sysv/linux/ia64/dl-sysdep.h - (DL_SYSINFO_IMPLEMENTATION): Add missing newline. - -2006-03-05 Roland McGrath <roland@redhat.com> - - * configure (libc_add_on): Disable add-on when $add_ons_automatic = yes - and $config_os doesn't match *linux*. - -2006-03-05 David S. Miller <davem@sunset.davemloft.net> - - * sysdeps/unix/sysv/linux/sparc/sparc32/pt-vfork.S: - Use __syscall_error. - * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S: Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc64/pt-vfork.S: Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S: Likewise. - * sysdeps/unix/sysv/linux/sparc/Makefile: New file. - -2006-03-02 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/aio_misc.h: Various cleanups. - -2006-03-01 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S - (__lll_robust_lock_wait): Also set FUTEX_WAITERS bit if we got the - mutex. - (__lll_robust_timedlock_wait): Likewise. - * sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S - (__lll_robust_lock_wait): Likewise. - (__lll_robust_timedlock_wait): Likewise. - * sysdeps/unix/sysv/linux/lowlevelrobustlock.c - (__lll_robust_lock_wait): Likewise. - (__lll_robust_timedlock_wait): Likewise. - -2006-03-01 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h (lll_robust_mutex_dead, - lll_robust_mutex_trylock, lll_robust_mutex_lock, - lll_robust_mutex_cond_lock, lll_robust_mutex_timedlock, - lll_robust_mutex_unlock): Define. - (__lll_robust_lock_wait, __lll_robust_timedlock_wait): New prototypes. - -2006-02-28 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/unix/sysv/linux/ia64/clone2.S: Include <clone2.S> - instead of <clone.S>. - -2006-02-27 Jakub Jelinek <jakub@redhat.com> - - * Makefile (libpthread-routines): Add - pthread_mutexattr_[sg]etprotocol, pthread_mutexattr_[sg]etprioceiling - and pthread_mutex_[sg]etprioceiling. - * Versions (GLIBC_2.4): Export pthread_mutexattr_getprotocol, - pthread_mutexattr_setprotocol, pthread_mutexattr_getprioceiling, - pthread_mutexattr_setprioceiling, pthread_mutex_getprioceiling and - pthread_mutex_setprioceiling. - * sysdeps/pthread/pthread.h (PTHREAD_PRIO_NONE, PTHREAD_PRIO_INHERIT, - PTHREAD_PRIO_PROTECT): New enum values. - (pthread_mutexattr_getprotocol, pthread_mutexattr_setprotocol, - pthread_mutexattr_getprioceiling, pthread_mutexattr_setprioceiling, - pthread_mutex_getprioceiling, pthread_mutex_setprioceiling): New - prototypes. - * pthreadP.h (PTHREAD_MUTEX_PRIO_INHERIT_PRIVATE_NP, - PTHREAD_MUTEX_PRIO_PROTECT_PRIVATE_NP): New enum values. - (PTHREAD_MUTEX_PRIO_CEILING_SHIFT, PTHREAD_MUTEX_PRIO_CEILING_MASK): - Define. - (PTHREAD_MUTEXATTR_PROTOCOL_SHIFT, PTHREAD_MUTEXATTR_PROTOCOL_MASK, - PTHREAD_MUTEXATTR_PRIO_CEILING_SHIFT, - PTHREAD_MUTEXATTR_PRIO_CEILING_MASK): Define. - (PTHREAD_MUTEXATTR_FLAG_BITS): Or in PTHREAD_MUTEXATTR_PROTOCOL_MASK - and PTHREAD_MUTEXATTR_PRIO_CEILING_MASK. - * pthread_mutex_init.c (__pthread_mutex_init): For the time being - return ENOTSUP for PTHREAD_PRIO_INHERIT or PTHREAD_PRIO_PROTECT - protocol mutexes. - * pthread_mutex_getprioceiling.c: New file. - * pthread_mutex_setprioceiling.c: New file. - * pthread_mutexattr_getprioceiling.c: New file. - * pthread_mutexattr_setprioceiling.c: New file. - * pthread_mutexattr_getprotocol.c: New file. - * pthread_mutexattr_setprotocol.c: New file. - -2006-02-27 Daniel Jacobowitz <dan@codesourcery.com> - - * sysdeps/unix/sysv/linux/aio_misc.h: Include <limits.h>. - -2006-02-27 Roland McGrath <roland@redhat.com> - - * sysdeps/pthread/Subdirs: List nptl here too. - * configure (libc_add_on_canonical): New variable. - - * sysdeps/unix/sysv/linux/sh/sh4/lowlevellock.h: Use #include_next. - - * sysdeps/unix/sysv/linux/sleep.c: Use #include_next after #include of - self to get main source tree's file. - * sysdeps/unix/sysv/linux/alpha/clone.S: Likewise. - * sysdeps/unix/sysv/linux/i386/clone.S: Likewise. - * sysdeps/unix/sysv/linux/i386/vfork.S: Likewise. - * sysdeps/unix/sysv/linux/ia64/clone2.S: Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc32/clone.S: Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S: Likewise. - * sysdeps/unix/sysv/linux/s390/s390-32/clone.S: Likewise. - * sysdeps/unix/sysv/linux/s390/s390-64/clone.S: Likewise. - * sysdeps/unix/sysv/linux/sh/clone.S: Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc32/clone.S: Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc64/clone.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/clone.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/vfork.S: Likewise. - - * Makefile: Use $(sysdirs) in vpath directive. - - * sysdeps/pthread/Makefile (CFLAGS-libc-start.c): Variable removed. - (CPPFLAGS-timer_routines.c): Likewise. - - * Makeconfig (includes): Variable removed. - -2006-02-26 Roland McGrath <roland@redhat.com> - - * sysdeps/generic/pt-raise.c: Moved to ... - * pt-raise.c: ... here. - * sysdeps/generic/lowlevellock.h: Moved to ... - * lowlevellock.h: ... here. - -2006-02-23 Roland McGrath <roland@redhat.com> - - * descr.h (struct pthread): Add final member `end_padding'. - (PTHREAD_STRUCT_END_PADDING): Use it. - -2006-02-20 Roland McGrath <roland@redhat.com> - - * sysdeps/mips: Directory removed, saved in ports repository. - * sysdeps/unix/sysv/linux/mips: Likewise. - -2006-02-18 Ulrich Drepper <drepper@redhat.com> - - * tst-robust1.c: Add second mutex to check that the mutex list is - handled correctly. - -2006-02-17 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/alpha/lowlevellock.h (lll_robust_mutex_dead, - lll_robust_mutex_trylock, lll_robust_mutex_lock, - lll_robust_mutex_cond_lock, lll_robust_mutex_timedlock, - lll_robust_mutex_unlock): New macros. - (__lll_robust_lock_wait, __lll_robust_timedlock_wait): New prototypes. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/lowlevelrobustlock.c: New file. - -2006-02-17 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/lowlevellock.h: Add lll_robust_mutex_* - definitions. - * sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S: New file. - -2006-02-17 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h - (lll_robust_mutex_unlock): Avoid unnecessary wakeups. - * sysdeps/unix/sysv/linux/i386/lowlevellock.h - (lll_robust_mutex_unlock): Likewise. - -2006-02-13 Jakub Jelinek <jakub@redhat.com> - - * descr.h [!__PTHREAD_MUTEX_HAVE_PREV] (DEQUEUE_MUTEX): - Set robust_list.__next rather than robust_list. - * sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h - (__pthread_list_t): New typedef. - (pthread_mutex_t): Replace __next and __prev fields with __list. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h - (__pthread_list_t): New typedef. - (pthread_mutex_t): Replace __next and __prev fields with __list. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h - (__pthread_list_t, __pthread_slist_t): New typedefs. - (pthread_mutex_t): Replace __next and __prev fields with __list. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h - (__pthread_list_t, __pthread_slist_t): New typedefs. - (pthread_mutex_t): Replace __next and __prev fields with __list. - * sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h - (__pthread_list_t, __pthread_slist_t): New typedefs. - (pthread_mutex_t): Replace __next and __prev fields with __list. - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h - (__pthread_slist_t): New typedef. - (pthread_mutex_t): Replace __next field with __list. - -2006-02-15 Ulrich Drepper <drepper@redhat.com> - - * pthreadP.h: Define PTHREAD_MUTEX_INCONSISTENT instead of - PTHREAD_MUTEX_OWNERDEAD. - (PTHREAD_MUTEX_ROBUST_PRIVATE_NP): Define as 16, not 256. - Define FUTEX_WAITERS, FUTEX_OWNER_DIED, FUTEX_TID_MASK. - * Makefile (libpthread-routines): Add lowlevelrobustlock. - * pthread_create.c (start_thread): Very much simplify robust_list loop. - * pthread_mutex_consistent.c: Inconsistent mutex have __owner now set - to PTHREAD_MUTEX_INCONSISTENT. - * pthread_mutex_destroy.c: Allow destroying of inconsistent mutexes. - * pthread_mutex_lock.c: Reimplement robust mutex handling. - * pthread_mutex_trylock.c: Likewise. - * pthread_mutex_timedlock.c: Likewise. - * pthread_mutex_unlock.c: Likewise. - * sysdeps/unix/sysv/linux/pthread_mutex_cond_lock.c: Likewise. - * sysdeps/unix/sysv/linux/Makefile (gen-as-const-headers): Add - lowlevelrobustlock.sym. - * sysdeps/unix/sysv/linux/lowlevelrobustlock.sym: New file. - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Add lll_robust_mutex_* - definitions. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S: New file. - * sysdeps/unix/sysv/linux/i386/i586/lowlevelrobustlock.S: New file. - * sysdeps/unix/sysv/linux/i386/i686/lowlevelrobustlock.S: New file. - * sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S: New file. - -2006-02-12 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (allocate_stack): Initialize robust_list. - * init.c (__pthread_initialize_minimal_internal): Likewise. - * descr.h (struct xid_command): Pretty printing. - (struct pthread): Use __pthread_list_t or __pthread_slist_t for - robust_list. Adjust macros. - * pthread_create.c (start_thread): Adjust robust_list handling. - * phtread_mutex_unlock.c: Don't allow unlocking from any thread - but the owner for all robust mutex types. - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h: Define - __pthread_list_t and __pthread_slist_t. Use them in pthread_mutex_t. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Likewise. - * sysdeps/pthread/pthread.h: Adjust mutex initializers. - - * sysdeps/unix/sysv/linux/i386/not-cancel.h: Define openat_not_cancel, - openat_not_cancel_3, openat64_not_cancel, and openat64_not_cancel_3. - -2006-02-08 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h (lll_futex_wait, - lll_futex_timedwait, lll_wait_tid): Add "memory" clobber. - -2006-01-20 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/lowlevellock.h (lll_futex_wait): - Return status. - (lll_futex_timed_wait): Define. - -2006-01-19 Ulrich Drepper <drepper@redhat.com> - - * tst-cancel4.c: Test ppoll. - -2006-01-18 Andreas Jaeger <aj@suse.de> - - [BZ #2167] - * sysdeps/unix/sysv/linux/mips/bits/pthreadtypes.h - (pthread_mutex_t): Follow changes for other archs. Based on patch - by Jim Gifford <patches@jg555.com>. - -2006-01-13 Richard Henderson <rth@redhat.com> - - * sysdeps/alpha/tls.h (tcbhead_t): Rename member to __private. - -2006-01-10 Roland McGrath <roland@redhat.com> - - * sysdeps/alpha/jmpbuf-unwind.h: File moved to main source tree. - * sysdeps/i386/jmpbuf-unwind.h: Likewise. - * sysdeps/mips/jmpbuf-unwind.h: Likewise. - * sysdeps/powerpc/jmpbuf-unwind.h: Likewise. - * sysdeps/s390/jmpbuf-unwind.h: Likewise. - * sysdeps/sh/jmpbuf-unwind.h: Likewise. - * sysdeps/sparc/sparc32/jmpbuf-unwind.h: Likewise. - * sysdeps/sparc/sparc64/jmpbuf-unwind.h: Likewise. - * sysdeps/x86_64/jmpbuf-unwind.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/jmpbuf-unwind.h: Likewise. - -2006-01-09 Roland McGrath <roland@redhat.com> - - * tst-initializers1-c89.c: New file. - * tst-initializers1-c99.c: New file. - * tst-initializers1-gnu89.c: New file. - * tst-initializers1-gnu99.c: New file. - * Makefile (tests): Add them. - (CFLAGS-tst-initializers1-c89.c): New variable. - (CFLAGS-tst-initializers1-c99.c): New variable. - (CFLAGS-tst-initializers1-gnu89.c): New variable. - (CFLAGS-tst-initializers1-gnu99.c): New variable. - - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h (pthread_mutex_t): - Use __extension__ on anonymous union definition. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h: Likewise. - -2006-01-08 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h (pthread_mutex_t): - Don't give the union a name because it changes the mangled name. - Instead name the struct for __data. - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h (pthread_mutex_t): - Likewise. - * sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h (pthread_mutex_t): - Likewise. - -2006-01-09 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/sparc/sparc64/jmpbuf-unwind.h (_JMPBUF_UNWINDS_ADJ): Add - stack bias to mc_ftp field. - -2006-01-07 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/aio_misc.h (AIO_MISC_WAIT): Work around gcc - being too clever and reloading the futex value where it shouldn't. - -2006-01-06 Ulrich Drepper <drepper@redhat.com> - - * descr.h [!__PTHREAD_MUTEX_HAVE_PREV] (DEQUEUE_MUTEX): Use - correct type. - -2006-01-06 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h (PSEUDO): - Add cfi directives. - -2006-01-06 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/ia64/tls.h (tcbhead_t): Rename private member to __private. - * sysdeps/ia64/tcb-offsets.sym: Adjust for private->__private - rename in tcbhead_t. - - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h (pthread_mutex_t): - Don't give the union a name because it changes the mangled name. - Instead name the struct for __data. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Likewise. - * pthread_create.c (start_thread): Adjust robust mutex free loop. - * descr.h (ENQUEUE_MUTEX, DEQUEUE_MUTEX): Adjust. - -2006-01-05 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h (lll_futex_wait): - Return status. - (lll_futex_timed_wait): Define. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Likewise. - * sysdeps/pthread/aio_misc.h: New file. - -2006-01-03 Joseph S. Myers <joseph@codesourcery.com> - - * Makefile ($(objpfx)$(multidir)): Use mkdir -p. - -2006-01-03 Steven Munroe <sjmunroe@us.ibm.com> - - * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h - (PSEUDO): Remove redundant cfi_startproc and cfi_endproc directives. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: Likewise. - -2006-01-04 Ulrich Drepper <drepper@redhat.com> - - * tst-cancel24.cc: Use C headers instead of C++ headers. - -2006-01-03 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h: Remove #error for - sparc-linux configured glibc. - (lll_futex_wake_unlock): Define to 1 for sparc-linux configured glibc. - (__lll_mutex_trylock, __lll_mutex_cond_trylock, __lll_mutex_lock, - __lll_mutex_cond_lock, __lll_mutex_timedlock): Use - atomic_compare_and_exchange_val_24_acq instead of - atomic_compare_and_exchange_val_acq. - (lll_mutex_unlock, lll_mutex_unlock_force): Use atomic_exchange_24_rel - instead of atomic_exchange_rel. - * sysdeps/unix/sysv/linux/sparc/sparc32/lowlevellock.c: New file. - * sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_init.c: New - file. - * sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_wait.c: New - file. - * sysdeps/unix/sysv/linux/sparc/sparc32/sem_init.c: New file. - * sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c: New file. - * sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c: New file. - * sysdeps/unix/sysv/linux/sparc/sparc32/sem_trywait.c: New file. - * sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c: New file. - * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/pthread_barrier_init.c: - New file. - * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/pthread_barrier_wait.c: - New file. - * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_init.c: New file. - * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_post.c: New file. - * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_timedwait.c: New - file. - * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_trywait.c: New - file. - * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_wait.c: New file. - -2006-01-03 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread.h [__WORDSIZE==64]: Don't use cast in - mutex initializers. - -2006-01-02 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/sparc/tls.h (tcbhead_t): Add pointer_guard field. - (THREAD_GET_POINTER_GUARD, THREAD_SET_POINTER_GUARD, - THREAD_COPY_POINTER_GUARD): Define. - * sysdeps/sparc/tcb-offsets.sym (POINTER_GUARD): Define. - * sysdeps/sparc/sparc64/jmpbuf-unwind.h: Revert 2005-12-27 changes. - -2006-01-01 Ulrich Drepper <drepper@redhat.com> - - * version.c: Update copyright year. - -2005-12-29 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Remove explicit - .eh_frame section, use cfi_* directives. - * sysdeps/unix/sysv/linux/sh/lowlevellock.S: Add cfi instrumentation. - -2005-12-30 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/ia64/jmpbuf-unwind.h: Undo last change for - now. - -2005-12-29 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/sigaction.c: Removed. - * sigaction.c: New file. - * sysdeps/unix/sysv/linux/Makefile: Define CFLAGS-sigaction.c. - -2005-12-28 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-signal7. - * tst-signal7.c: New file. - -2005-12-27 Roland McGrath <roland@redhat.com> - - * sysdeps/x86_64/jmpbuf-unwind.h (_jmpbuf_sp): New inline function. - (_JMPBUF_UNWINDS_ADJ): Use it, to PTR_DEMANGLE before comparison. - * sysdeps/alpha/jmpbuf-unwind.h: Likewise. - * sysdeps/i386/jmpbuf-unwind.h: Likewise. - * sysdeps/mips/jmpbuf-unwind.h: Likewise. - * sysdeps/powerpc/jmpbuf-unwind.h: Likewise. - * sysdeps/s390/jmpbuf-unwind.h: Likewise. - * sysdeps/sh/jmpbuf-unwind.h: Likewise. - * sysdeps/sparc/sparc32/jmpbuf-unwind.h: Likewise. - * sysdeps/sparc/sparc64/jmpbuf-unwind.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/jmpbuf-unwind.h: Likewise. - -2005-12-27 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h: Add __next - and __prev field to pthread_mutex_t. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h: Add __next field - to pthread_mutex_t. - -2005-12-26 Ulrich Drepper <drepper@redhat.com> - - * pthreadP.h: Define PTHREAD_MUTEX_ROBUST_PRIVATE_NP, - PTHREAD_MUTEX_ROBUST_PRIVATE_RECURSIVE_NP, - PTHREAD_MUTEX_ROBUST_PRIVATE_ERRORCHECK_NP, - PTHREAD_MUTEX_ROBUST_PRIVATE_ADAPTIVE_NP, - PTHREAD_MUTEXATTR_FLAG_ROBUST, PTHREAD_MUTEXATTR_FLAG_PSHARED, - and PTHREAD_MUTEXATTR_FLAG_BITS. - * descr.h (struct pthread): Add robust_list field and define - ENQUEUE_MUTEX and DEQUEUE_MUTEX macros. - * pthread_mutexattr_getrobust.c: New file. - * pthread_mutexattr_setrobust.c: New file. - * pthread_mutex_consistent.c: New file. - * sysdeps/pthread/pthread.h: Declare pthread_mutexattr_getrobust, - pthread_mutexattr_setrobust, and pthread_mutex_consistent. - Define PTHREAD_MUTEX_STALLED_NP and PTHREAD_MUTEX_ROBUST_NP. - Adjust pthread_mutex_t initializers. - * nptl/sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h: Add __next - field to pthread_mutex_t. - * nptl/sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Add __next - and __prev field to pthread_mutex_t. - * Versions [GLIBC_2.4]: Export pthread_mutexattr_getrobust_np, - pthread_mutexattr_setrobust_np, and pthread_mutex_consistent_np. - * pthread_mutexattr_getpshared.c: Use PTHREAD_MUTEXATTR_FLAG_PSHARED - and PTHREAD_MUTEXATTR_FLAG_BITS macros instead of magic numbers. - * pthread_mutexattr_gettype.c: Likewise. - * pthread_mutexattr_setpshared.c: Likewise. - * pthread_mutexattr_settype.c: Likewise. - * pthread_mutex_init.c: Reject robust+pshared attribute for now. - Initialize mutex kind according to robust flag. - * pthread_mutex_lock.c: Implement local robust mutex. - * pthread_mutex_timedlock.c: Likewise. - * pthread_mutex_trylock.c: Likewise. - * pthread_mutex_unlock.c: Likewise. - * pthread_create.c (start_thread): Mark robust mutexes which remained - locked as dead. - * tst-robust1.c: New file. - * tst-robust2.c: New file. - * tst-robust3.c: New file. - * tst-robust4.c: New file. - * tst-robust5.c: New file. - * tst-robust6.c: New file. - * tst-robust7.c: New file. - * Makefile (libpthread-routines): Add pthread_mutexattr_getrobust, - pthread_mutexattr_setrobust, and pthread_mutex_consistent. - (tests): Add tst-robust1, tst-robust2, tst-robust3, tst-robust4, - tst-robust5, tst-robust6, and tst-robust7. - - * tst-typesizes.c: New file. - * Makefile (tests): Add tst-typesizes. - - * tst-once3.c: More debug output. - -2005-12-24 Ulrich Drepper <drepper@redhat.com> - - * pthread_mutex_trylock.c (__pthread_mutex_trylock): Add break - missing after last change. - - * version.c: Update copyright year. - -2005-12-23 Ulrich Drepper <drepper@redhat.com> - - * pthread_mutex_destroy.c: Set mutex type to an invalid value. - * pthread_mutex_lock.c: Return EINVAL for invalid mutex type. - * pthread_mutex_trylock.c: Likewise. - * pthread_mutex_timedlock.c: Likewise. - * pthread_mutex_unlock.c: Likewise. - -2005-12-22 Roland McGrath <roland@redhat.com> - - * sysdeps/pthread/sigaction.c: Use "" instead of <> to include self, - so that #include_next's search location is not reset to the -I.. - directory where <nptl/...> can be found. - -2005-12-22 Ulrich Drepper <drepper@redhat.com> - - [BZ #1913] - * sysdeps/unix/sysv/linux/i386/i486/sem_wait.S (__new_sem_wait): - Fix unwind info. Remove useless branch prediction prefix. - * tst-cancel24.cc: New file. - * Makefile: Add rules to build and run tst-cancel24. - -2005-12-21 Roland McGrath <roland@redhat.com> - - * libc-cancellation.c: Use <> rather than "" #includes. - * pt-cleanup.c: Likewise. - * pthread_create.c: Likewise. - * pthread_join.c: Likewise. - * pthread_timedjoin.c: Likewise. - * pthread_tryjoin.c: Likewise. - * sysdeps/unix/sysv/linux/libc_pthread_init.c: Likewise. - * sysdeps/unix/sysv/linux/register-atfork.c: Likewise. - * sysdeps/unix/sysv/linux/unregister-atfork.c: Likewise. - * unwind.c: Likewise. - -2005-12-19 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/sh/tcb-offsets.sym: Add POINTER_GUARD. - * sysdeps/sh/tls.h (tcbhead_t): Remove private and add pointer_guard. - (THREAD_GET_POINTER_GUARD, THREAD_SET_POINTER_GUARD, - THREAD_COPY_POINTER_GUARD): Define. - -2005-12-19 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/ia64/tls.h (TLS_PRE_TCB_SIZE): Make room for 2 uintptr_t's - rather than one. - (THREAD_GET_POINTER_GUARD, THREAD_SET_POINTER_GUARD, - THREAD_COPY_POINTER_GUARD): Define. - * sysdeps/powerpc/tcb-offsets.sym (POINTER_GUARD): Add. - * sysdeps/powerpc/tls.h (tcbhead_t): Add pointer_guard field. - (THREAD_GET_POINTER_GUARD, THREAD_SET_POINTER_GUARD, - THREAD_COPY_POINTER_GUARD): Define. - * sysdeps/s390/tcb-offsets.sym (STACK_GUARD): Add. - * sysdeps/s390/tls.h (THREAD_GET_POINTER_GUARD, - THREAD_SET_POINTER_GUARD, THREAD_COPY_POINTER_GUARD): Define. - * sysdeps/unix/sysv/linux/ia64/__ia64_longjmp.S (__ia64_longjmp): - Use PTR_DEMANGLE for B0 if defined. - -2005-12-17 Ulrich Drepper <drepper@redhat.com> - - * pthread_create.c (__pthread_create_2_1): Use - THREAD_COPY_POINTER_GUARD if available. - * sysdeps/i386/tcb-offsets.sym: Add POINTER_GUARD. - * sysdeps/x86_64/tcb-offsets.sym: Likewise. - * sysdeps/i386/tls.h (tcbhead_t): Add pointer_guard. - Define THREAD_SET_POINTER_GUARD and THREAD_COPY_POINTER_GUARD. - * sysdeps/x86_64/tls.h: Likewise. - -2005-12-15 Roland McGrath <roland@redhat.com> - - * sysdeps/unix/sysv/linux/mq_notify.c: Don't use sysdeps/generic. - -2005-12-13 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/sigfillset.c: Adjust for files moved out of - sysdeps/generic. - * errno-loc.c: New file. - -2005-12-12 Roland McGrath <roland@redhat.com> - - * init.c (__pthread_initialize_minimal_internal): Do __static_tls_size - adjustments before choosing stack size. Update minimum stack size - calculation to match allocate_stack change. - -2005-12-12 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (allocate_stack): Don't demand that there is an - additional full page available on the stack beside guard, TLS, the - minimum stack. - -2005-11-24 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h - (__cleanup_fct_attribute): Use __regparm__ not regparm. - - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: When - compiling 32-bit code we must define __cleanup_fct_attribute. - -005-11-24 Jakub Jelinek <jakub@redhat.com> - - [BZ #1920] - * sysdeps/pthread/pthread.h (__pthread_unwind_next): Use - __attribute__ instead of __attribute. - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h - (__cleanup_fct_attribute): Likewise. - -2005-11-17 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/unwind-forcedunwind.c (pthread_cancel_init): Put - a write barrier before writing libgcc_s_getcfa. - -2005-11-06 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/configure: Removed. - -2005-11-05 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/ia64/pt-initfini.c: Remove trace of - optional init_array/fini_array support. - -2005-10-24 Roland McGrath <roland@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/sem_trywait.S: Remove unnecessary - versioned_symbol use. - -2005-10-16 Roland McGrath <roland@redhat.com> - - * init.c (__pthread_initialize_minimal_internal): Even when using a - compile-time default stack size, apply the minimum that allocate_stack - will require, and round up to page size. - -2005-10-10 Daniel Jacobowitz <dan@codesourcery.com> - - * Makefile ($(test-modules)): Remove static pattern rule. - -2005-10-14 Jakub Jelinek <jakub@redhat.com> - Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_once.S: Fix stack - alignment in callback function. - * Makefile: Add rules to build and run tst-align3. - * tst-align3.c: New file. - -2005-10-03 Jakub Jelinek <jakub@redhat.com> - - * allocatestack.c (setxid_signal_thread): Add - INTERNAL_SYSCALL_DECL (err). - -2005-10-02 Jakub Jelinek <jakub@redhat.com> - - * allocatestack.c (setxid_signal_thread): Need to use - atomic_compare_and_exchange_bool_acq. - -2005-10-01 Ulrich Drepper <drepper@redhat.com> - Jakub Jelinek <jakub@redhat.com> - - * descr.h: Define SETXID_BIT and SETXID_BITMASK. Adjust - CANCEL_RESTMASK. - (struct pthread): Move specific_used field to avoid padding. - Add setxid_futex field. - * init.c (sighandler_setxid): Reset setxid flag and release the - setxid futex. - * allocatestack.c (setxid_signal_thread): New function. Broken - out of the bodies of the two loops in __nptl_setxid. For undetached - threads check whether they are exiting and if yes, don't send a signal. - (__nptl_setxid): Simplify loops by using setxid_signal_thread. - * pthread_create.c (start_thread): For undetached threads, check - whether setxid bit is set. If yes, wait until signal has been - processed. - - * allocatestack.c (STACK_VARIABLES): Initialize them. - * pthread_create.c (__pthread_create_2_1): Initialize pd. - -2004-09-02 Jakub Jelinek <jakub@redhat.com> - - * pthread_cond_destroy.c (__pthread_cond_destroy): If there are - waiters, awake all waiters on the associated mutex. - -2005-09-22 Roland McGrath <roland@redhat.com> - - * perf.c [__x86_64__] (HP_TIMING_NOW): New macro (copied from - ../sysdeps/x86_64/hp-timing.h). - -2005-08-29 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h (FUTEX_WAKE_OP, - FUTEX_OP_CLEAR_WAKE_IF_GT_ONE): Define. - (lll_futex_wake_unlock): Define. - * sysdeps/unix/sysv/linux/alpha/lowlevellock.h (FUTEX_WAKE_OP, - FUTEX_OP_CLEAR_WAKE_IF_GT_ONE): Define. - (lll_futex_wake_unlock): Define. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h (FUTEX_WAKE_OP, - FUTEX_OP_CLEAR_WAKE_IF_GT_ONE): Define. - (lll_futex_wake_unlock): Define. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h (FUTEX_WAKE_OP, - FUTEX_OP_CLEAR_WAKE_IF_GT_ONE): Define. - (lll_futex_wake_unlock): Define. - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h (FUTEX_WAKE_OP, - FUTEX_OP_CLEAR_WAKE_IF_GT_ONE): Define. - (lll_futex_wake_unlock): Define. - * sysdeps/pthread/pthread_cond_signal.c (__pthread_cond_signal): Use - lll_futex_wake_unlock. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S - (FUTEX_WAKE_OP, FUTEX_OP_CLEAR_WAKE_IF_GT_ONE): Define. - (__pthread_cond_signal): Use FUTEX_WAKE_OP. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S - (FUTEX_WAKE_OP, FUTEX_OP_CLEAR_WAKE_IF_GT_ONE): Define. - (__pthread_cond_signal): Use FUTEX_WAKE_OP. - -2005-09-05 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/lowlevellock.S (__lll_mutex_lock_wait): - Fix typo in register name. - -2005-08-23 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/timer_routines.c (timer_helper_thread): - Use __sigfillset. Document that sigfillset does the right thing wrt - to SIGSETXID. - -2005-07-11 Jakub Jelinek <jakub@redhat.com> - - [BZ #1102] - * sysdeps/pthread/pthread.h (PTHREAD_MUTEX_INITIALIZER, - PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, - PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP, - PTHREAD_MUTEX_ADAPTIVE_NP, PTHREAD_RWLOCK_INITIALIZER, - PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP, - PTHREAD_COND_INITIALIZER): Supply zeros for all fields - in the structure. - * Makefile (tests): Add tst-initializers1. - (CFLAGS-tst-initializers1.c): Set. - * tst-initializers1.c: New test. - -2005-07-11 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h (pthread_rwlock_t): - Make sure __flags are located at offset 48 from the start of the - structure. - -2005-07-02 Roland McGrath <roland@redhat.com> - - * Makeconfig: Comment fix. - -2005-07-05 Jakub Jelinek <jakub@redhat.com> - - * descr.h (PTHREAD_STRUCT_END_PADDING): Define. - * sysdeps/ia64/tls.h (TLS_PRE_TCB_SIZE): If PTHREAD_STRUCT_END_PADDING - is smaller than 8 bytes, increase TLS_PRE_TCB_SIZE by 16 bytes. - (THREAD_SYSINFO, THREAD_SELF, DB_THREAD_SELF): Don't assume - TLS_PRE_TCB_SIZE is sizeof (struct pthread). - (THREAD_SET_STACK_GUARD, THREAD_COPY_STACK_GUARD): Define. - * sysdeps/ia64/tcb-offsets.sym (PID, TID, MULTIPLE_THREADS_OFFSET): - Use TLS_PRE_TCB_SIZE instead of sizeof (struct pthread). - * sysdeps/unix/sysv/linux/ia64/createthread.c (TLS_VALUE): Don't - assume TLS_PRE_TCB_SIZE is sizeof (struct pthread). - -2005-06-25 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/i386/tls.h (tcbhead_t): Add stack_guard field. - (THREAD_SET_STACK_GUARD, THREAD_COPY_STACK_GUARD): Define. - * sysdeps/x86_64/tls.h (tcbhead_t): Add sysinfo and stack_guard - fields. - (THREAD_SET_STACK_GUARD, THREAD_COPY_STACK_GUARD): Define. - * sysdeps/s390/tls.h (tcbhead_t): Add stack_guard - field. Put in sysinfo field unconditionally. - (THREAD_SET_STACK_GUARD, THREAD_COPY_STACK_GUARD): Define. - * sysdeps/powerpc/tls.h (tcbhead_t): Add stack_guard field. - (THREAD_SET_STACK_GUARD, THREAD_COPY_STACK_GUARD): Define. - * sysdeps/sparc/tls.h (tcbhead_t): Add sysinfo and stack_guard - fields. - (THREAD_SET_STACK_GUARD, THREAD_COPY_STACK_GUARD): Define. - * pthread_create.c (__pthread_create_2_1): Use - THREAD_COPY_STACK_GUARD macro. - * Makefile: Add rules to build and run tst-stackguard1{,-static} - tests. - * tst-stackguard1.c: New file. - * tst-stackguard1-static.c: New file. - -2005-06-14 Alan Modra <amodra@bigpond.net.au> - - * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h (PSEUDO): - Invoke CGOTSETUP and CGOTRESTORE. - (CGOTSETUP, CGOTRESTORE): Define. - -2005-05-29 Richard Henderson <rth@redhat.com> - - * tst-cancel4.c (WRITE_BUFFER_SIZE): New. - (tf_write, tf_writev): Use it. - (do_test): Use socketpair instead of pipe. Set SO_SNDBUF to - the system minimum. - -2005-05-23 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h - [IS_IN_librt] (CENABLE, CDISABLE): Use JUMPTARGET instead of - __librt_*_asynccancel@local. - -2005-05-17 Alan Modra <amodra@bigpond.net.au> - - * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Delete - all occurrences of JUMPTARGET. Instead append @local to labels. - -2005-05-20 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/i386/tls.h (TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN): Define to - size/alignment of struct pthread rather than tcbhead_t. - * sysdeps/x86_64/tls.h (TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN): - Likewise. - * sysdeps/s390/tls.h (TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN): - Likewise. - * sysdeps/sparc/tls.h (TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN): - Likewise. - -2005-05-19 Richard Henderson <rth@redhat.com> - - * sysdeps/ia64/pthread_spin_lock.c (pthread_spin_lock): Use - __sync_val_compare_and_swap, not explicit _si variant. - * sysdeps/ia64/pthread_spin_trylock.c (pthread_spin_trylock): Likewise. - -2005-05-03 Ulrich Drepper <drepper@redhat.com> - - [BZ #915] - * sysdeps/pthread/pthread.h: Avoid empty initializers. - -2005-05-03 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Remove explicit - .eh_frame section, use cfi_* directives. - -2005-04-27 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/pthread_getcpuclockid.c: Use <> instead - of "" includes. - -2005-04-27 Ulrich Drepper <drepper@redhat.com> - - [BZ #1075] - * tst-cancel17.c (do_test): Add arbitrary factor to make sure - aio_write blocks. - -2005-04-27 Roland McGrath <roland@redhat.com> - - * Makefile (tests): Remove tst-clock2. - - * sysdeps/unix/sysv/linux/timer_create.c (timer_create): Handle - CLOCK_PROCESS_CPUTIME_ID and CLOCK_PROCESS_THREAD_ID specially, - translating to the kernel clockid_t for our own process/thread clock. - - * sysdeps/unix/sysv/linux/pthread_getcpuclockid.c: New file. - -2005-04-15 Jakub Jelinek <jakub@redhat.com> - - * old_pthread_cond_init.c: Include <errno.h>. - (__pthread_cond_init_2_0): Fail with EINVAL if COND_ATTR is - process shared or uses clock other than CLOCK_REALTIME. - * pthread_cond_init.c (__pthread_cond_init): Remove bogus comment. - -2005-04-13 David S. Miller <davem@davemloft.net> - - * sysdeps/sparc/sparc64/jmpbuf-unwind.h: New file. - * sysdeps/sparc/sparc64/clone.S: New file. - -2005-04-05 Jakub Jelinek <jakub@redhat.com> - - [BZ #1102] - * sysdeps/pthread/pthread.h (__pthread_cleanup_routine): Use - __inline instead of inline. - * sysdeps/pthread/bits/libc-lock.h (__libc_cleanup_routine): Likewise. - -2005-03-31 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S: Use - functionally equivalent, but shorter instructions. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_once.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_post.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: Likewise. - -2005-03-28 Daniel Jacobowitz <dan@codesourcery.com> - - * sysdeps/mips/Makefile: New file. - * sysdeps/mips/nptl-sysdep.S: New file. - * sysdeps/mips/tcb-offsets.sym: New file. - * sysdeps/mips/pthread_spin_lock.S: New file. - * sysdeps/mips/pthread_spin_trylock.S: New file. - * sysdeps/mips/pthreaddef.h: New file. - * sysdeps/mips/tls.h: New file. - * sysdeps/mips/jmpbuf-unwind.h: New file. - * sysdeps/unix/sysv/linux/mips/lowlevellock.h: New file. - * sysdeps/unix/sysv/linux/mips/bits/pthreadtypes.h: New file. - * sysdeps/unix/sysv/linux/mips/bits/semaphore.h: New file. - * sysdeps/unix/sysv/linux/mips/pthread_once.c: New file. - * sysdeps/unix/sysv/linux/mips/fork.c: New file. - * sysdeps/unix/sysv/linux/mips/pt-vfork.S: New file. - * sysdeps/unix/sysv/linux/mips/vfork.S: New file. - * sysdeps/unix/sysv/linux/mips/clone.S: New file. - * sysdeps/unix/sysv/linux/mips/createthread.c: New file. - * sysdeps/unix/sysv/linux/mips/sysdep-cancel.h: New file. - -2005-03-23 Ulrich Drepper <drepper@redhat.com> - - [BZ #1112] - * pthread_create.c (__pthread_create_2_1): Rename syscall error - variable to scerr. - -2005-03-10 Jakub Jelinek <jakub@redhat.com> - - * tst-getpid1.c (do_test): Align stack passed to clone{2,}. - -2005-02-25 Roland McGrath <roland@redhat.com> - - * alloca_cutoff.c: Correct license text. - * tst-unload.c: Likewise. - * sysdeps/pthread/allocalim.h: Likewise. - * sysdeps/pthread/pt-initfini.c: Likewise. - * sysdeps/pthread/bits/libc-lock.h: Likewise. - * sysdeps/pthread/bits/sigthread.h: Likewise. - * sysdeps/unix/sysv/linux/bits/local_lim.h: Likewise. - * sysdeps/unix/sysv/linux/bits/posix_opt.h: Likewise. - -2005-02-16 Roland McGrath <roland@redhat.com> - - * sysdeps/pthread/pthread-functions.h (struct pthread_functions): - Use unsigned int * for ptr_nthreads. - -2005-02-14 Alan Modra <amodra@bigpond.net.au> - - [BZ #721] - * sysdeps/powerpc/tcb-offsets.sym (thread_offsetof): Redefine to suit - gcc4. - -2005-02-07 Richard Henderson <rth@redhat.com> - - [BZ #787] - * sysdeps/pthread/pthread.h (__sigsetjmp): Use pointer as first - argument. - -2004-11-03 Marcus Brinkmann <marcus@gnu.org> - - * sysdeps/generic/lowlevellock.h (__generic_mutex_unlock): Fix - order of arguments in invocation of atomic_add_zero. - -2005-01-26 Jakub Jelinek <jakub@redhat.com> - - [BZ #737] - * sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S (__new_sem_trywait): - Use direct %gs segment access or, if NO_TLS_DIRECT_SEG_REFS, - at least gotntpoff relocation and addition. - * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S (sem_timedwait): - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_post.S (__new_sem_post): - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_wait.S (__new_sem_wait): - Likewise. - -2005-01-06 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (init_one_static_tls): Adjust initialization of DTV - entry for static tls deallocation fix. - * sysdeps/alpha/tls.h (dtv_t): Change pointer type to be struct which - also contains information whether the memory pointed to is static - TLS or not. - * sysdeps/i386/tls.h: Likewise. - * sysdeps/ia64/tls.h: Likewise. - * sysdeps/powerpc/tls.h: Likewise. - * sysdeps/s390/tls.h: Likewise. - * sysdeps/sh/tls.h: Likewise. - * sysdeps/sparc/tls.h: Likewise. - * sysdeps/x86_64/tls.h: Likewise. - -2004-12-27 Ulrich Drepper <drepper@redhat.com> - - * init.c (__pthread_initialize_minimal_internal): Use __sigemptyset. - -2004-12-21 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/i386/tls.h (CALL_THREAD_FCT): Maintain 16 byte alignment of - %esp. - * Makefile (tests): Add tst-align2. - * tst-align2.c: New test. - * sysdeps/i386/Makefile (CFLAGS-tst-align{,2}.c): Add - -mpreferred-stack-boundary=4. - -2004-12-18 Roland McGrath <roland@redhat.com> - - * sysdeps/unix/sysv/linux/powerpc/powerpc64/bits/local_lim.h: - New file removed withdrawn for the moment. - -2004-12-17 Richard Henderson <rth@redhat.com> - - * sysdeps/unix/sysv/linux/alpha/clone.S: New file. - * sysdeps/alpha/tcb-offsets.sym (TID_OFFSET): New. - -2004-12-16 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/powerpc/powerpc64/bits/local_lim.h: New file. - Increased PTHREAD_STACK_MIN. - - * tst-context1.c (stacks): Use bigger stack size. - -2004-12-16 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/sparc/sparc32/clone.S: New file. - * sysdeps/sparc/tcb-offsets.sym: Add TID. - -2004-12-15 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/s390/s390-32/clone.S: New file. - * sysdeps/unix/sysv/linux/s390/s390-64/clone.S: New file. - * sysdeps/s390/tcb-offsets.sym (TID): Add. - -2004-12-15 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/powerpc/powerpc32/clone.S: New file. - -2004-12-14 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/powerpc/tcb-offsets.sym: Add TID. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S: New file. - - * tst-getpid1.c: If child crashes, report this first. Print which - signal. - -2004-12-09 Ulrich Drepper <drepper@redhat.com> - - * init.c (__pthread_initialize_minimal_internal): Also unblock - SIGSETXID. - -2004-12-01 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/bits/posix_opt.h (_POSIX_CPUTIME, - _POSIX_THREAD_CPUTIME): Define to 0. - * sysdeps/pthread/timer_create.c (timer_create): Remove unused code - handling CLOCK_PROCESS_CPUTIME_ID and CLOCK_THREAD_CPUTIME_ID. - * sysdeps/pthread/timer_routines.c (__timer_signal_thread_pclk, - __timer_signal_thread_tclk): Remove. - (init_module): Remove their initialization. - (thread_cleanup): Remove their cleanup assertions. - * sysdeps/pthread/posix-timer.h (__timer_signal_thread_pclk, - __timer_signal_thread_tclk): Remove. - * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Removed. - * sysdeps/unix/sysv/linux/ia64/bits/posix_opt.h: Removed. - * sysdeps/unix/sysv/linux/x86_64/bits/posix_opt.h: Removed. - -2004-12-07 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/ia64/tcb-offsets.sym (TID): Add. - * sysdeps/unix/sysv/linux/ia64/clone2.S: New file. - - * Makefile (tests): Add tst-getpid2. - * tst-getpid1.c (TEST_CLONE_FLAGS): Define. - (do_test): Use it. Use __clone2 instead of clone on ia64. - * tst-getpid2.c: New test. - -2004-12-07 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/clone.S: New file. - -2004-12-04 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-getpid1. - * tst-getpid1.c: New file. - * sysdeps/unix/sysv/linux/i386/clone.S: New file. - * sysdeps/unix/sysv/linux/x86_64/clone.S: New file. - -2004-12-02 Roland McGrath <roland@redhat.com> - - * Makefile (libpthread-nonshared): Variable removed. - ($(objpfx)libpthread_nonshared.a): Target removed. - ($(inst_libdir)/libpthread_nonshared.a): Likewise. - These are now handled by generic magic from - libpthread-static-only-routines being set. - -2004-11-27 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/bits/posix_opt.h (_POSIX_PRIORITIZED_IO, - _POSIX2_CHAR_TERM, _POSIX_THREAD_PRIO_INHERIT, - _POSIX_THREAD_PRIO_PROTECT): Define. - * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/bits/posix_opt.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/posix_opt.h: Likewise. - -2004-11-26 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/bits/posix_opt.h (_POSIX_ADVISORY_INFO, - _POSIX_SPORADIC_SERVER, _POSIX_THREAD_SPORADIC_SERVER, _POSIX_TRACE, - _POSIX_TRACE_EVENT_FILTER, _POSIX_TRACE_INHERIT, _POSIX_TRACE_LOG, - _POSIX_TYPED_MEMORY_OBJECTS, _POSIX_IPV6, _POSIX_RAW_SOCKETS): Define. - * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/bits/posix_opt.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/posix_opt.h: Likewise. - -2004-11-24 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/x86_64/Makefile [nptl]: Define CFLAGS-pthread_create.c. - - * Makefile (libpthread-routines): Add pthread_setschedprio. - * Versions [libpthread, GLIBC_2.3.4]: Add pthread_setschedprio. - * sysdeps/pthread/pthread.h: Declare pthread_setschedprio. - * pthread_setschedprio.c: New file. - -2004-11-20 Jakub Jelinek <jakub@redhat.com> - - * pthread_create.c (pthread_cancel): Add PTHREAD_STATIC_FN_REQUIRE. - * pthread_cancel.c (pthread_create): Likewise. - - * Makefile (libpthread-routines): Add vars. - * sysdeps/pthread/createthread.c (__pthread_multiple_threads): Remove. - * init.c (__default_stacksize, __is_smp): Remove. - * vars.c: New file. - * pthreadP.h (__find_thread_by_id): If !SHARED, add weak_function - and define a wrapper macro. - (PTHREAD_STATIC_FN_REQUIRE): Define. - * allocatestack.c (__find_thread_by_id): Undefine. - * pthread_create (__pthread_keys): Remove. - (pthread_mutex_lock, pthread_mutex_unlock, pthread_once, - pthread_key_create, pthread_setspecific, pthread_getspecific): Add - PTHREAD_STATIC_FN_REQUIRE. - -2004-11-18 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/sh/tls.h (DB_THREAD_SELF): Set the correct bias - parameter to REGISTER macro. - -2004-11-17 Roland McGrath <roland@redhat.com> - - * sysdeps/unix/sysv/linux/timer_routines.c (__start_helper_thread): - Make sure SIGCANCEL is blocked as well. - -2004-11-10 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/setxid.h: New file. - * sysdeps/pthread/pthread-functions.h (HAVE_PTR__NPTL_SETXID): Remove. - (struct xid_command): Add forward decl. - (struct pthread_functions): Change return type of __nptl_setxid hook - to int. - * pthreadP.h (__nptl_setxid): Change return type to int. - * allocatestack.c (__nptl_setxid): Call INTERNAL_SYSCALL_NCS in the - calling thread, return its return value and set errno on failure. - * descr.h (struct xid_command): Change id type to long array. - - * Makefile: Add rules to build and test tst-setuid1 and - tst-setuid1-static. - * tst-setuid1.c: New test. - * tst-setuid1-static.c: New test. - -2004-11-10 Jakub Jelinek <jakub@redhat.com> - - * Makefile (tests): Add tst-exit3. - * tst-exit3.c: New test. - -2004-11-09 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-exit2. - * tst-exit2.c: New file. - -2004-11-09 Roland McGrath <roland@redhat.com> - - [BZ #530] - * sysdeps/pthread/createthread.c (do_clone): Increment __nptl_nthreads - here, before calling clone. - * pthread_create.c (start_thread): Don't do it here. - -2004-11-02 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/smp.h: Include <errno.h>. - -2004-10-29 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/sem_timedwait.S (sem_timedwait): - Set ETIMEDOUT to errno when time is up. Tweak to avoid - assembler warning. - -2004-10-28 Jakub Jelinek <jakub@redhat.com> - - * pthread_create.c (__pthread_create_2_1): Avoid leaking stacks - if sched_priority is not between minprio and maxprio. - -2004-10-25 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Use clock_gettime syscall if exists. - - * sysdeps/unix/sysv/linux/sh/lowlevellock.S - (__lll_mutex_timedlock_wait): Fix a bad branch condition. - -2004-10-24 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/smp.h (is_smp_system): Use - not-cancelable I/O functions. - -2004-10-21 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/lowlevellock.S - (__lll_mutex_timedlock_wait): If woken but cannot get the lock, - make sure 2 is stored in the futex and we looked at the old value. - Fix a few other problems to return the correct value. - -2004-10-14 Richard Henderson <rth@redhat.com> - - * sysdeps/alpha/tcb-offsets.sym (thread_offsetof): Redefine to - make gcc4 happy. - -2004-10-06 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/jmp-unwind.c: Include pthreadP.h instead - of pthread-functions.h and pthreaddef.h. - * sysdeps/unix/sysv/linux/s390/jmp-unwind.c: Likewise. - - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h (pthread_cond_t): - Change __data.__nwaiters from int to unsigned int. - - * tst-clock2.c (do_test): Don't fail if _POSIX_THREAD_CPUTIME == 0 and - sysconf (_SC_THREAD_CPUTIME) returns negative value. - - * allocatestack.c (__find_thread_by_id): Move attribute_hidden - before return type. - - * sysdeps/s390/jmpbuf-unwind.h: Include bits/wordsize.h. - (JMPBUF_CFA_UNWINDS_ADJ): Subtract 96 resp. 160 bytes from CFA. - -2004-10-06 Ulrich Drepper <drepper@redhat.com> - - * tst-cancel4.c (tf_msgrcv): Check for failure in msgget. If the - test fails, remove message queue. - (tf_msgsnd): Likewise. - -2004-10-05 Jakub Jelinek <jakub@redhat.com> - - * tst-clock1.c: Change #ifdef to #if defined. - * tst-clock2.c: Likewise. - * tst-cond11.c: Likewise. - - * sysdeps/pthread/timer_create.c (timer_create): Use - defined _POSIX_CPUTIME && _POSIX_CPUTIME >= 0 instead of - defined CLOCK_PROCESS_CPUTIME_ID #ifs and similarly for - THREAD_CPUTIME. - -2004-10-05 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/bits/posix_opt.h (_POSIX_CPUTIME, - _POSIX_THREAD_CPUTIME): Define to 0. - -2004-10-04 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Define _POSIX_CPUTIME - and _POSIX_THREAD_CPUTIME to zero. - * sysdeps/unix/sysv/linux/ia64/bits/posix_opt.h: Likewise. - * tst-barrier2.c: Fix testing for POSIX feature. - * tst-clock1.c: Likewise. - * tst-clock2.c: Likewise. - * tst-cond11.c: Likewise. - * tst-cond4.c: Likewise. - * tst-cond6.c: Likewise. - * tst-flock2.c: Likewise. - * tst-mutex4.c: Likewise. - * tst-mutex9.c: Likewise. - * tst-rwlock12.c: Likewise. - * tst-rwlock4.c: Likewise. - * tst-signal1.c: Likewise. - * tst-spin2.c: Likewise. - * sysdeps/pthread/posix-timer.h: Likewise. - * sysdeps/pthread/timer_create.c: Likewise. - * sysdeps/pthread/timer_routines.c: Likewise. - -2004-10-01 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S - (__lll_mutex_timedlock_wait): Address futex correctly. - - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S - (__lll_mutex_timedlock_wait): If woken but cannot get the lock, - make sure 2 is stored in the futex and we looked at the old value. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S - (__lll_mutex_timedlock_wait): Likewise. Fix a few other problems - which might very well made the code not working at all before. - [BZ #417] - -2004-09-28 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/pthread_kill.c (__pthread_kill): Don't - allow SIGSETXID to be sent. - * sysdeps/pthread/sigaction.c (__sigaction): Don't allow action - for SIGSETXID to be defined. - * sysdeps/pthread/pthread_sigmask.c (pthread_sigmask): Make sure - SIGSETXID cannot be blocked. - - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h (pthread_cond_t): - Add __extension__ to long long types. - * sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Likewise. - -2004-09-25 Ulrich Drepper <drepper@redhat.com> - - * descr.h (struct pthread): Add stopped_start field. - * sysdeps/pthread/createthread.c (create_thread): Set - start_stopped flag in descriptor for new thread appropriately. - * pthread_create.c (start_thread): Only take lock to be stopped on - startup if stopped_start flag says so. - -2004-09-24 Ulrich Drepper <drepper@redhat.com> - - * pthread_create.c (__pthread_create_2_1): Remember whether thread - is created detached and if yes, do not try to free the stack in case - the thread creation failed. - * sysdeps/pthread/createthread.c (do_clone): Free stack here if clone - call fails. Don't depend on INTERNAL_SYSCALL_ERRNO return zero in - case there has been no error. [BZ #405] - - * pthread_create.c (start_thread): Don't wait for scheduler data - etc to be set at the beginning of the function. The cancellation - infrastructure must have been set up. And enable async - cancellation before potentially going to sleep. [BZ #401] - -2004-09-20 Ulrich Drepper <drepper@redhat.com> - - * Versions: Remove exports for pthread_set*id_np functions. - * sysdeps/pthread/pthread.h: Remove pthread_set*id_np prototypes - for now. - * Makefile: Don't build pthread_set*id code for now. - -2004-09-19 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/allocrtsig.c: Allocate second signal for - internal use. - * allocatestack.c (__nptl_setxid): New function. - * descr.h (struct xid_command): Define type. - * init.c (pthread_functions): Add ptr__nptl_setxid initialization. - (sighandler_setxid): New function. - (__pthread_initialize_minimal): Register sighandler_setxid for - SIGCANCEL. - * pt-allocrtsig.c: Update comment. - * pthreadP.h: Define SIGSETXID. Declare __xidcmd variable. - Declare __nptl_setxid. - * sysdeps/pthread/pthread-functions.h: Add ptr__nptl_setxid. - * sysdeps/pthread/pthread.h: Declare pthread_setgid_np, - pthread_setuid_np, pthread_setegid_np, pthread_seteuid_np, - pthread_setregid_np, pthread_setreuid_np, pthread_setresgid_np, - and pthread_setresuid_np. - * pthread_setgid_np.c: New file. - * pthread_setuid_np.c: New file. - * pthread_setegid_np.c: New file. - * pthread_seteuid_np.c: New file. - * pthread_setregid_np.c: New file. - * pthread_setreuid_np.c: New file. - * pthread_setresgid_np.c: New file. - * pthread_setresuid_np.c: New file. - * Versions [libpthread, GLIBC_2.3.4]: Add pthread_setgid_np, - pthread_setuid_np, pthread_setegid_np, pthread_seteuid_np, - pthread_setregid_np, pthread_setreuid_np, pthread_setresgid_np, - and pthread_setresuid_np. - * Makefile (libpthread-routines): Add pthread_setuid, pthread_seteuid, - pthread_setreuid, pthread_setresuid, pthread_setgid, pthread_setegid, - pthread_setregid, and pthread_setresgid. - -2004-09-18 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (allocate_stack): Return EAGAIN instead of - ENOMEM when out of memory. - -2004-09-10 Roland McGrath <roland@redhat.com> - - [BZ #379] - * allocatestack.c (allocate_stack): Remove [__ASSUME_CLONE_STOPPED] - code, since we don't try to use the broken CLONE_STOPPED any more. - * pthread_create.c (start_thread): Likewise. - -2004-09-15 Richard Henderson <rth@redhat.com> - - * sysdeps/unix/sysv/linux/alpha/vfork.S: Use libc_hidden_def. - -2004-09-01 David Mosberger <davidm@hpl.hp.com> - - * sysdeps/unix/sysv/linux/ia64/jmpbuf-unwind.h - (__libc_unwind_longjmp): Delete macro and declare as function. - * sysdeps/unix/sysv/linux/ia64/Makefile (sysdep_routines): Mention - __ia64_longjmp, sigstack_longjmp, and __sigstack_longjmp for - nptl directory. - * sysdeps/unix/sysv/linux/ia64/__ia64_longjmp.S: New file. - * sysdeps/unix/sysv/linux/ia64/__sigstack_longjmp.c: New file. - * sysdeps/unix/sysv/linux/ia64/unwind_longjmp.c: New file. - -2004-09-12 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread.h: Make rwlock prototypes available also - for __USE_XOPEN2K. - * sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h: Define rwlock - types also for __USE_XOPEN2K. - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Likewise. - [BZ #320] - -2004-09-08 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread.h - (PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP): Make safe for C++. - (PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP): Likewise. - (PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP): Likewise. - (PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP): Likewise. - [BZ #375] - -2004-09-07 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: Allow - PSEUDO to be used with . prefix. - - * sysdeps/unix/sysv/linux/alpha/pthread_once.c (__pthread_once): - Use atomic_increment instead of atomic_exchange_and_add. - * sysdeps/unix/sysv/linux/sparc/pthread_once.c (__pthread_once): - Likewise. - * sysdeps/unix/sysv/linux/ia64/pthread_once.c (__pthread_once): - Likewise. - * sysdeps/unix/sysv/linux/powerpc/pthread_once.c (__pthread_once): - Likewise. - - * allocatestack.c (allocate_stack): Use atomic_increment_val - instead of atomic_exchange_and_add. - * sysdeps/unix/sysv/linux/sem_post.c (__new_sem_post): Likewise. - * sysdeps/unix/sysv/linux/powerpc/sem_post.c (__new_sem_post): - Likewise. - * sysdeps/pthread/pthread_barrier_wait.c (pthread_barrier_wait): - Likewise. - - * sysdeps/pthread/pthread.h (pthread_once): Remove __THROW since - the initialization function might throw. - -2005-09-05 Richard Henderson <rth@redhat.com> - - * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h (SINGLE_THREAD_P): - Move definition inside libpthread, libc, librt check. Provide - definition for rtld. - -2004-09-02 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/alpha/jmpbuf-unwind.h: Define __libc_unwind_longjmp. - * sysdeps/i386/jmpbuf-unwind.h: Likewise - * sysdeps/powerpc/jmpbuf-unwind.h: Likewise. - * sysdeps/s390/jmpbuf-unwind.h: Likewise. - * sysdeps/sh/jmpbuf-unwind.h: Likewise. - * sysdeps/sparc/sparc32/jmpbuf-unwind.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/jmpbuf-unwind.h: Likewise. - * sysdeps/x86_64/jmpbuf-unwind.h: Likewise. - * unwind.c: Use it. - - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h (pthread_cond_t): - Rename __data.__clock to __data.__nwaiters, make it unsigned int. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h (pthread_cond_t): - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: - Decrement __nwaiters. If pthread_cond_destroy has been called and - this is the last waiter, signal pthread_cond_destroy caller and - avoid using the pthread_cond_t structure after unlock. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - Read clock type from the least significant bits of __nwaiters instead - of __clock. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/internaltypes.h: Define COND_CLOCK_BITS. - -2004-08-31 Jakub Jelinek <jakub@redhat.com> - - [BZ #342] - * Makefile (tests): Add tst-cond20 and tst-cond21. - * tst-cond20.c: New test. - * tst-cond21.c: New test. - * sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h - (pthread_cond_t): Rename __data.__clock to __data.__nwaiters, make - it unsigned int. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h (pthread_cond_t): - Likewise. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h - (pthread_cond_t): Likewise. - * sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h (pthread_cond_t): - Likewise. - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h (pthread_cond_t): - Likewise. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h (pthread_cond_t): - Likewise. - * sysdeps/unix/sysv/linux/lowlevelcond.sym (cond_clock): Remove. - (cond_nwaiters): New. - (clock_bits): New. - * pthread_cond_destroy.c (__pthread_cond_destroy): Return EBUSY - if there are waiters not signalled yet. - Wait until all already signalled waiters wake up. - * sysdeps/pthread/pthread_cond_wait.c (__condvar_cleanup): Decrement - __nwaiters. If pthread_cond_destroy has been called and this is the - last waiter, signal pthread_cond_destroy caller and avoid using - the pthread_cond_t structure after unlock. - (__pthread_cond_wait): Increment __nwaiters in the beginning, - decrement it when leaving. If pthread_cond_destroy has been called - and this is the last waiter, signal pthread_cond_destroy caller. - * sysdeps/pthread/pthread_cond_timedwait.c (__pthread_cond_timedwait): - Likewise. Read clock type from the least significant bits of - __nwaiters instead of __clock. - * pthread_condattr_setclock.c (pthread_condattr_setclock): Check - whether clock ID can be encoded in COND_CLOCK_BITS bits. - * pthread_condattr_getclock.c (pthread_condattr_getclock): Decode - clock type just from the last COND_CLOCK_BITS bits of value. - * pthread_cond_init.c (__pthread_cond_init): Initialize __nwaiters - instead of __clock, just from second bit of condattr's value. - -2004-08-30 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Include - bits/wordsize.h. Make the header match i386 header when __WORDSIZE - != 64. - * sysdeps/unix/sysv/linux/x86_64/bits/semaphore.h: Likewise. - -2004-08-15 Roland McGrath <roland@frob.com> - - * pthread_atfork.c: Update copyright terms including special exception - for these trivial files, which are statically linked into executables - that use dynamic linking for the significant library code. - -2004-08-09 Jakub Jelinek <jakub@redhat.com> - - * DESIGN-rwlock.txt: Add decreasing of nr_readers_queued to - pthread_rwlock_rdlock. - * sysdeps/pthread/pthread_rwlock_rdlock (__pthread_rwlock_rdlock): - Decrease __nr_readers_queued after reacquiring lock. - * sysdeps/pthread/pthread_rwlock_timedrdlock - (pthread_rwlock_timedrdlock): Likewise. - Reported by Bob Cook <bobcook47@hotmail.com>. - -2004-08-11 Jakub Jelinek <jakub@redhat.com> - - * tst-rwlock14.c (tf): Read main thread handle from *ARG - before pthread_barrier_wait. - -2004-08-07 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: - Remove unnecessary exception handling data. - -2004-07-23 Jakub Jelinek <jakub@redhat.com> - - [BZ #284] - * sysdeps/pthread/pthread.h (pthread_getcpuclockid): Use __clockid_t - instead of clockid_t. - -2004-07-21 Roland McGrath <roland@redhat.com> - - * Makefile ($(objpfx)multidir.mk): Use $(make-target-directory). - -2004-07-19 Roland McGrath <roland@redhat.com> - - * tst-cancel4.c (tf_waitid): Use WEXITED flag bit if available. - -2004-07-02 Roland McGrath <roland@redhat.com> - - * configure: Don't exit. - -2004-07-14 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Check for invalid nanosecond in - timeout value. - -2004-07-07 Ulrich Drepper <drepper@redhat.com> - - * Makefile: Add rules to build and run tst-fini1. - * tst-fini1.c: New file. - * tst-fini1mod.c: New file. - -2004-07-05 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Define NO_CANCELLATION - if no cancellation support is needed. - * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise. - - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Define __NR_futex - only if not already defined. - -2004-07-05 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h (lll_unlock): Use - constraint "m" instead of "0" for futex. - - * shlib-versions: Add powerpc64-.*-linux.*. - -2004-07-04 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S - (pthread_rwlock_timedrdlock): Use cmpq instead of cmpl to check - for valid tv_nsec. - * tst-rwlock14.c (do_test): Test for invalid tv_nsec equal to - 1 billion and 64-bit tv_nsec which is valid when truncated to 32 - bits. - -2004-06-29 Roland McGrath <roland@redhat.com> - - * Banner: NPTL no longer has its own version number. - * Makefile (nptl-version): Variable removed. - * sysdeps/pthread/Makefile (CFLAGS-confstr.c): Set LIBPTHREAD_VERSION - using $(version), the glibc version number. - -2004-06-29 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/pthread_once.S (__pthread_once): - Fix branch offset for a PLT entry. - * sysdeps/unix/sysv/linux/sh/sem_post.S (__new_sem_post): - Likewise. - * sysdeps/unix/sysv/linux/sh/sem_timedwait.S (sem_timedwait): - Likewise. - * sysdeps/unix/sysv/linux/sh/sem_trywait.S (__new_sem_trywait): - Likewise. - * sysdeps/unix/sysv/linux/sh/sem_wait.S (__new_sem_wait): - Likewise. - -2004-06-28 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/alpha/tcb-offsets.sym (MULTIPLE_THREADS_OFFSET): Define - unconditionally. - -2004-06-28 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/pthread_rwlock_timedwrlock.c - (pthread_rwlock_timedwrlock): Return EINVAL if tv_nsec is negative, - instead of tv_sec. - * sysdeps/pthread/pthread_rwlock_timedrdlock.c - (pthread_rwlock_timedrdlock): Likewise. - -2004-06-22 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/s390/lowlevellock.h (lll_futex_requeue): - Set __r7 to val, not mutex. - -2004-06-27 Ulrich Drepper <drepper@redhat.com> - - * Makefile: Add rules to build tst-rwlock14. - * tst-rwlock14.c: New file. - -2004-06-24 Boris Hu <boris.hu@intel.com> - - * sysdeps/pthread/pthread_rwlock_timedrdlock.c: Add timeout validation - check. - * sysdeps/pthread/pthread_rwlock_timedwrlock.c: Likewise. - -2004-06-19 Andreas Jaeger <aj@suse.de> - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Fix - assembler in last patch. - -2004-06-17 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread_cond_timedwait.c - (__pthread_cond_timedwait): Also check for negativ nanoseconds. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Check for invalid nanosecond in - timeout value. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - * tst-cond19.c: New file. - * Makefile: Add rules to build and run tst-cond19. - -2004-06-15 Steven Munroe <sjmunroe@us.ibm.com> - - * tst-context1.c (GUARD_PATTERN): Defined. - (tst_context_t): Define struct containing ucontext_t & guard words. - (ctx): Declare as an array of tst_context_t. - (fct): Verify uc_link & guard words are still valid. - (tf): Initialize guard words in ctx. Adjust ctx refs for new struct. - -2004-06-13 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h (pthread_cond_t): - Add __data.__futex field, reshuffle __data.__clock. - * sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S - (__pthread_cond_signal): Increment __futex at the same time as - __wakeup_seq or __total_seq. Pass address of __futex instead of - address of low 32-bits of __wakeup_seq to futex syscall. - * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S - (__pthread_cond_wait): Likewise. Pass __futex value from before - releasing internal lock to FUTEX_WAIT. - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S - (FUTEX_CMP_REQUEUE): Define. - (__pthread_cond_broadcast): Set __futex to 2 * __total_seq. - Use FUTEX_CMP_REQUEUE operation instead of FUTEX_REQUEUE. - Pass __futex value from before the unlock and __futex address instead - of address of low 32-bits of __wakeup_seq to futex syscall. - Fallback to FUTEX_WAKE all on any errors. - -2004-06-08 Jakub Jelinek <jakub@redhat.com> - - * pthread_mutexattr_getpshared.c (pthread_mutex_getpshared): Fix - comment typo. - * pthread_mutexattr_gettype.c (pthread_mutexattr_gettype): Likewise. - * pthread_mutexattr_init.c (__pthread_mutexattr_init): Likewise. - * pthread_mutexattr_settype.c (__pthread_mutexattr_settype): Likewise. - * pthread_mutexattr_setpshared.c (pthread_mutexattr_setpshared): - Likewise. Reported by Bob Cook <bobcook47@hotmail.com>. - -2004-06-11 Martin Schwidefsky <schwidefsky@de.ibm.com> - - * sysdeps/unix/sysv/linux/s390/lowlevellock.h (lll_compare_and_swap): - Add memory clobber to inline assembly. - (__lll_mutex_trylock): Likewise. - (__lll_mutex_cond_trylock): Likewise. - -2004-06-07 Martin Schwidefsky <schwidefsky@de.ibm.com> - - * sysdeps/unix/sysv/linux/s390/lowlevellock.h (lll_futex_requeue): - Pass val argument as 6th system call argument in %r7. - -2004-05-21 Jakub Jelinek <jakub@redhat.com> - - * Makefile (tests): Add tst-cond16. - * sysdeps/unix/sysv/linux/lowlevelcond.sym (cond_futex): Add. - * pthread_cond_init.c (__pthread_cond_init): Clear __data.__futex. - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h (pthread_cond_t): - Add __data.__futex field, reshuffle __data.__clock. - * sysdeps/unix/sysv/linux/i386/pthread_cond_signal.S - (__pthread_cond_signal): Increment __futex at the same time as - __wakeup_seq or __total_seq. Pass address of __futex instead of - address of low 32-bits of __wakeup_seq to futex syscall. - * sysdeps/unix/sysv/linux/i386/pthread_cond_wait.S - (__pthread_cond_wait): Likewise. Pass __futex value from before - releasing internal lock to FUTEX_WAIT. - * sysdeps/unix/sysv/linux/i386/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Likewise. - * sysdeps/unix/sysv/linux/i386/pthread_cond_broadcast.S - (FUTEX_CMP_REQUEUE): Define. - (__pthread_cond_broadcast): Set __futex to 2 * __total_seq. - Use FUTEX_CMP_REQUEUE operation instead of FUTEX_REQUEUE. - Pass __futex value from before the unlock and __futex address instead - of address of low 32-bits of __wakeup_seq to futex syscall. - Fallback to FUTEX_WAKE all on any errors. - * sysdeps/unix/sysv/linux/alpha/lowlevellock.h (FUTEX_CMP_REQUEUE): - Define. - (lll_futex_requeue): Add val argument, use FUTEX_CMP_REQUEUE - internally. Return non-zero if error, zero if success. - * sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h (pthread_cond_t): - Add __data.__futex field, reshuffle __data.__clock. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h (FUTEX_CMP_REQUEUE): - Define. - (lll_futex_requeue): Add val argument, return 1 unconditionally - for the time being. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h (pthread_cond_t): - Add __data.__futex field, reshuffle __data.__clock. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h (FUTEX_CMP_REQUEUE): - Define. - (lll_futex_requeue): Add val argument, use FUTEX_CMP_REQUEUE - internally. Return non-zero if error, zero if success. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h - (pthread_cond_t): Add __data.__futex field, reshuffle __data.__clock. - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h (FUTEX_CMP_REQUEUE): - Define. - (lll_futex_requeue): Add val argument, use FUTEX_CMP_REQUEUE - internally. Return non-zero if error, zero if success. - * sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h (pthread_cond_t): - Add __data.__futex field, reshuffle __data.__clock. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h (FUTEX_CMP_REQUEUE): - Define. - (lll_futex_requeue): Add val argument, use FUTEX_CMP_REQUEUE - internally. Return non-zero if error, zero if success. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h (pthread_cond_t): - Add __data.__futex field, reshuffle __data.__clock. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h (pthread_cond_t): - Add __data.__futex field, reshuffle __data.__clock. - * sysdeps/pthread/pthread_cond_signal.c (__pthread_cond_signal): - Increment __futex at the same time as __wakeup_seq or __total_seq. - Pass address of __futex instead of address of low 32-bits of - __wakeup_seq to futex syscall. - * sysdeps/pthread/pthread_cond_wait.c (__pthread_cond_wait): Likewise. - Pass __futex value from before releasing internal lock - to FUTEX_WAIT. - * sysdeps/pthread/pthread_cond_timedwait.c (__pthread_cond_timedwait): - Likewise. Avoid unnecessary shadowing of variables. - * sysdeps/pthread/pthread_cond_broadcast.c (__pthread_cond_broadcast): - Set __futex to 2 * __total_seq. Pass __futex value from before the - unlock and __futex address instead of address of low 32-bits of - __wakeup_seq to futex_requeue macro, adjust for new return value - meaning. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S - (__pthread_cond_signal): Increment __futex at the same time as - __wakeup_seq or __total_seq. Pass address of __futex instead of - address of low 32-bits of __wakeup_seq to futex syscall. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S - (__pthread_cond_wait): Likewise. Pass __futex value from before - releasing internal lock to FUTEX_WAIT. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S - (FUTEX_CMP_REQUEUE): Define. - (__pthread_cond_broadcast): Set __futex to 2 * __total_seq. - Use FUTEX_CMP_REQUEUE operation instead of FUTEX_REQUEUE. - Pass __futex value from before the unlock and __futex address instead - of address of low 32-bits of __wakeup_seq to futex syscall. - Fallback to FUTEX_WAKE all on any errors. - -2004-06-03 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/lowlevellock.h (lll_mutex_lock): - Add nop to align the end of critical section. - (lll_mutex_cond_lock, lll_mutex_timedlock): Likewise. - -2004-06-01 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h (pthread_cond_t): - Add __broadcast_seq field. - * sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S: Mark - all waiters as woken with woken_seq and bump broadcast counter. - * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Use new - __broadcast_seq. Increment __woken_seq correctly when cleanuped. - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Likewise. - Comment typo fixes. Avoid returning -ETIMEDOUT. - -2004-06-01 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__condvar_tw_cleanup): Fix access to saved broadcast_seq value. - Reported by Kaz Kojima. - -2004-05-25 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/aio_misc.h: New file. - -2004-05-21 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/pthread_cond_wait.c (__pthread_cond_wait): Compare - __broadcast_seq with bc_seq after acquiring internal lock instead of - before it. - -2004-05-18 Jakub Jelinek <jakub@redhat.com> - - * Makefile (.NOTPARALLEL): Only serialize make check/xcheck, not - compilation. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Avoid returning -ETIMEDOUT. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h - (pthread_cond_t): Add __data.__broadcast_seq field. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S - (FRAME_SIZE): Define. - (__pthread_cond_timedwait): Use it. Store/check broadcast_seq. - Comment typo fixes. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S (FRAME_SIZE): - Define. - (__pthread_cond_wait): Use it. Store/check broadcast_seq. Comment - typo fixes. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S - (__pthread_cond_broadcast): Increment broadcast_seq. Comment typo - fixes. - -2004-05-18 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/lowlevelcond.sym: Add broadcast_seq entry. - * sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h (pthread_cond_t): - Add __broadcast_seq field. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: Mark - all waiters as woken with woken_seq and bump broadcast counter. - * sysdeps/pthread/pthread_cond_broadcast.c: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Use new - __broadcast_seq field. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - * sysdeps/pthread/pthread_cond_wait.c: Likewise. - * sysdeps/pthread/pthread_cond_timedwait.c: Likewise. - * pthread_cond_init.c: Initialize __broadcast_seq field. - * Makefile (tests): Add tst-cond17 and tst-cond18. - Add .NOTPARALLEL goal. - * tst-cond16.c: New file. From Jakub. - * tst-cond17.c: New file. From Jakub. - * tst-cond18.c: New file. From Jakub. - -2004-05-16 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S: Correct some - unwind info. - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: - Parametrize frame size. Correct some unwind info. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - -2004-05-04 Jakub Jelinek <jakub@redhat.com> - - * tst-stack3.c: Note testing functionality beyond POSIX. - -2004-05-04 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h (USE___THREAD): - Change conditional from ifdef to if. - -2004-04-23 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h (SYSDEP_CANCEL_ERRNO, - SYSDEP_CANCEL_ERROR): Define. - (PSEUDO): Use it. - -2004-05-01 Jakub Jelinek <jakub@redhat.com> - - * Versions (libpthread): Remove __pthread_cleanup_upto@@GLIBC_PRIVATE. - -2004-04-20 Jakub Jelinek <jakub@redhat.com> - - * sem_unlink.c (sem_unlink): Change EPERM into EACCES. - -2004-04-19 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/sem_timedwait.S: Add frame info. - Use HIDDEN_JUMPTARGET to jump to __pthread_unwind. - * sysdeps/unix/sysv/linux/sh/sem_wait.S: Remove unneeded frame - info. Use HIDDEN_JUMPTARGET to jump to __pthread_unwind. - -2004-04-19 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/timer_routines.c: Make sure helper - thread has all signals blocked. - -2004-04-18 Andreas Jaeger <aj@suse.de> - - * sysdeps/unix/sysv/linux/x86_64/bits/semaphore.h - (SEM_VALUE_MAX): Add missing brace. - -2004-04-17 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/Makefile (tests): Add tst-mqueue8x - in rt subdir. - (CFLAGS-tst-mqueue8x.c): Add -fexceptions. - * sysdeps/pthread/tst-mqueue8x.c: New test. - * tst-cancel4.c: Update comment about message queues. - - * sysdeps/pthread/timer_gettime.c (timer_gettime): For expired timer - return it_value { 0, 0 }. - * sysdeps/pthread/timer_create.c (timer_create): Handle SIGEV_NONE - like SIGEV_SIGNAL. - * sysdeps/pthread/timer_routines.c (thread_expire_timer): Remove - assertion for SIGEV_NONE. - (thread_attr_compare): Compare all attributes, not just a partial - subset. - -2004-04-17 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/mq_notify.c: Include stdlib.h. - -2004-04-17 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/alpha/bits/semaphore.h (SEM_VALUE_MAX): - Just use a plain number. - * sysdeps/unix/sysv/linux/i386/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/sh/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/bits/semaphore.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/semaphore.h: Likewise. - -2004-04-16 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Remove unneeded - frame info. - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Likewise. - -2004-04-15 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/timer_routines.c: Include errno.h. - (timer_helper_thread): Use inline rt_sigtimedwait syscall instead - of calling sigwaitinfo. - -2004-04-16 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (allocate_stack): Set reported_guardsize - unconditionally. - * pthread_getattr_np.c (pthread_getattr_np): Use - reported_guardsize instead of guardsize. - * descr.h (struct pthread): Add reported_guardsize field. - -2004-04-13 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/mq_notify.c: Shut up GCC warning. - -2004-04-12 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/mq-notify.c: New file. - -2004-04-08 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/bits/local_lim.h (MQ_PRIO_MAX): Define. - * sysdeps/unix/sysv/linux/alpha/bits/local_lim.h (MQ_PRIO_MAX): Define. - * sysdeps/unix/sysv/linux/ia64/bits/local_lim.h (MQ_PRIO_MAX): Define. - * sysdeps/unix/sysv/linux/sparc/bits/local_lim.h (MQ_PRIO_MAX): Define. - * sysdeps/unix/sysv/linux/bits/posix_opt.h (_POSIX_MESSAGE_PASSING): - Define. - * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h - (_POSIX_MESSAGE_PASSING): Define. - * sysdeps/unix/sysv/linux/ia64/bits/posix_opt.h - (_POSIX_MESSAGE_PASSING): Define. - * sysdeps/unix/sysv/linux/x86_64/bits/posix_opt.h - (_POSIX_MESSAGE_PASSING): Define. - -2004-04-04 Ulrich Drepper <drepper@redhat.com> - - * tst-context1.c (fct): Check whether correct stack is used. - -2004-04-03 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Never use - matching constraints for asm mem parameters. - - * tst-clock2.c (tf): Don't define unless needed. - -2004-03-30 H.J. Lu <hongjiu.lu@intel.com> - - * Makefile (link-libc-static): Use $(static-gnulib) instead of - $(gnulib). - -2004-03-30 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread-functions.h: Add ptr__nptl_deallocate_tsd. - * init.c (pthread_functions): Add ptr__nptl_deallocate_tsd. - * pthreadP.h: Declare __nptl_deallocate_tsd. - * pthread_create.c (deallocate_tsd): Remove to __nptl_deallocate_tsd. - Adjust caller. - - * Makefile (tests): Add tst-tsd5. - * tst-tsd5.c: New file. - -2004-03-29 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/pthread_attr_setaffinity.c - (__pthread_attr_setaffinity_old): Prepend GLIBC_ to version names - is SHLIB_COMPAT check. - * sysdeps/unix/sysv/linux/pthread_attr_getaffinity.c - (__pthread_attr_getaffinity_old): Likewise. - * sysdeps/unix/sysv/linux/pthread_getaffinity.c - (__pthread_getaffinity_old): Likewise. - * sysdeps/unix/sysv/linux/pthread_setaffinity.c - (__pthread_setaffinity_old): Likewise. - -2004-03-26 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (_make_stacks_executable): Call - _dl_make_stack_executable first. - -2004-03-24 Roland McGrath <roland@redhat.com> - - * sysdeps/i386/pthread_spin_lock.c (pthread_spin_lock): Use "m" - constraint instead of "0". - -2004-03-24 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h - (lll_mutex_cond_trylock): Define as wrapper around __lll_cond_trylock. - - * sysdeps/unix/sysv/linux/getpid.c (really_getpid): Reorganize - code to avoid warning. - -2004-03-24 Andreas Jaeger <aj@suse.de> - - * sysdeps/unix/sysv/linux/pthread_attr_setaffinity.c - (__pthread_attr_setaffinity_old): Remove const. - -2004-03-23 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/smp.h: New file. - * sysdeps/unix/sysv/linux/sh/smp.h: New file. - * init.c: Define __is_smp. - (__pthread_initialize_minimal_internal): Call is_smp_system to - initialize __is_smp. - * pthreadP.h: Declare __is_smp. - Define MAX_ADAPTIVE_COUNT is necessary. - * pthread_mutex_init.c: Add comment regarding __spins field. - * pthread_mutex_lock.c: Implement adaptive mutex type. - * pthread_mutex_timedlock.c: Likewise. - * sysdeps/unix/sysv/linux/pthread_mutex_cond_lock.c: Likewise. - * sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h (pthread_mutex_t): - Add __spins field. - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h: Define - lll_mutex_cond_trylock. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h: Likewise. - Define BUSY_WAIT_NOP. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Likewise. - - * tst-mutex5.c: Add support for testing adaptive mutexes. - * tst-mutex7.c: Likewise. - * tst-mutex5a.c: New file. - * tst-mutex7a.c: New file. - * Makefile (tests): Add tst-mutex5a and tst-mutex7a. - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S - (__lll_mutex_timedlock_wait): Preserve r8 and r9 since the - vgettimeofday call might destroy the content. - - * sysdeps/ia64/pthread_spin_lock.c (pthread_spin_lock): Use hint - @pause in the loop. - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h (lll_mutex_trylock): - No need to restrict type of ret. Make it int. Add comment. - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h (lll_mutex_trylock): - Remove unnecessary setne instruction. - -2004-03-22 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/pthread_getaffinity.c - (__pthread_getaffinity_new): Use INT_MAX instead of UINT_MAX. - * pthread_getattr_np.c (pthread_getattr_np): Double size every cycle. - If realloc fails, break out of the loop. - -2004-03-20 Andreas Jaeger <aj@suse.de> - - * sysdeps/unix/sysv/linux/pthread_setaffinity.c - (__pthread_setaffinity_old): Fix interface. - * sysdeps/unix/sysv/linux/pthread_getaffinity.c - (__pthread_getaffinity_old): Likewise. - - * sysdeps/unix/sysv/linux/pthread_setaffinity.c - (__pthread_setaffinity_new): Remove duplicate declaration. - -2004-03-20 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (CENABLE): Save - the return value to a safe register. - (CDISABLE): Set the function argument correctly. - -2004-03-17 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h (XCHG): Define. - * sysdeps/unix/sysv/linux/sh/lowlevellock.S (__lll_mutex_lock_wait): - Rewrite so that only one locked memory operation per round is needed. - * sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S - (pthread_barrier_wait): After wakeup, release lock only when the - last thread stopped using the barrier object. - * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S - (__pthread_cond_wait): Don't store mutex address if the current - value is ~0l. Add correct cleanup support and unwind info. - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S - (__pthread_cond_broadcast): Don't use requeue for pshared condvars. - * sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S: Update comment. - * sysdeps/unix/sysv/linux/sh/pthread_once.S (__pthread_once): - Add correct cleanup support and unwind info. - * sysdeps/unix/sysv/linux/sh/sem_wait.S (__new_sem_wait): Likewise. - * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Add unwind - information for syscall wrappers. - -2004-03-18 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/internaltypes.h (struct pthread_attr): Add - cpusetsize field, remove next. - * sysdeps/pthread/pthread.h (pthread_getaffinity_np): Add new second - parameter for size of the CPU set. - (pthread_setaffinity_np): Likewise. - (pthread_attr_getaffinity_np): Likewise. - (pthread_attr_setaffinity_np): Likewise. - * sysdeps/unix/sysv/linux/pthread_attr_getaffinity.c: Implement - interface change, keep compatibility code. - * sysdeps/unix/sysv/linux/pthread_attr_setaffinity.c: Likewise. - * sysdeps/unix/sysv/linux/pthread_getaffinity.c: Likewise. - * sysdeps/unix/sysv/linux/pthread_setaffinity.c: Likewise. - * pthreadP.h: Remove hidden_proto for pthread_getaffinity_np. Declare - __pthread_getaffinity_np. - * Versions: Add version for changed interfaces. - * tst-attr3.c: Adjust test for interface change. - * pthread_getattr_np.c: Query the kernel about the affinity mask with - increasing buffer sizes. - * pthread_attr_destroy.c: Remove unused list handling. - * pthread_attr_init.c: Likewise. - -2004-03-17 Roland McGrath <roland@redhat.com> - - * sysdeps/unix/sysv/linux/timer_create.c (timer_create): Pass missing - first argument to clock_getres so we ever enable kernel timers. - -2004-03-15 Ulrich Weigand <uweigand@de.ibm.com> - - * init.c (nptl_version): Add __attribute_used__ to nptl_version. - -2004-03-12 Richard Henderson <rth@redhat.com> - - * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h: Propagate - oldvalue from CENABLE to CDISABLE. - -2004-03-12 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/bits/local_lim.h: Define HOST_NAME_MAX. - * sysdeps/unix/sysv/linux/alpha/bits/local_lim.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/bits/local_lim.h: Likewise. - * sysdeps/unix/sysv/linux/sparc/bits/local_lim.h: Likewise. - -2004-03-11 Richard Henderson <rth@redhat.com> - - * sysdeps/alpha/tcb-offsets.sym (PID_OFFSET): New. - * sysdeps/unix/sysv/linux/alpha/pt-vfork.S: Save/restore PID. - * sysdeps/unix/sysv/linux/alpha/vfork.S: New file. - -2004-03-11 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/s390/s390-64/vfork.S (__vfork): Use jgnl - instead of jnl instruction to jump to SYSCALL_ERROR_LABEL. - * sysdeps/unix/sysv/linux/s390/s390-64/pt-vfork.S (__vfork): Likewise. - -2004-03-11 Jakub Jelinek <jakub@redhat.com> - - * forward.c (__pthread_cond_broadcast_2_0, - __pthread_cond_destroy_2_0, __pthread_cond_init_2_0, - __pthread_cond_signal_2_0, __pthread_cond_wait_2_0, - __pthread_cond_timedwait_2_0): Use return 0 as defaction instead of 0. - -2004-03-11 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/sh/tcb-offsets.sym: Add PID. - * sysdeps/unix/sysv/linux/sh/pt-vfork.S: Properly handle PID cache. - * sysdeps/unix/sysv/linux/sh/vfork.S: New file. - -2004-03-10 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S: No need to - include <sysdep-cancel.h>, vfork is no cancellation point. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S: Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/pt-vfork.S: Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc32/pt-vfork.S: Likewise. - -2004-03-10 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/s390/s390-32/vfork.S (__vfork): Add - libc_hidden_def. - * sysdeps/unix/sysv/linux/s390/s390-64/vfork.S (__vfork): Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S (__vfork): - Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S (__vfork): - Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S (__vfork): Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S (__vfork): Likewise. - * sysdeps/unix/sysv/linux/ia64/pt-vfork.S: Include tcb-offsets.h. - * sysdeps/unix/sysv/linux/ia64/vfork.S (__vfork): Use DO_CALL instead - of DO_CALL_VIA_BREAK. Work around a gas problem. - - * sysdeps/unix/sysv/linux/powerpc/pt-vfork.S: Remove. - * sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S: New file. - * sysdeps/unix/sysv/linux/powerpc/powerpc32/pt-vfork.S: New file. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S: New file. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/pt-vfork.S: New file. - * sysdeps/powerpc/tcb-offsets.sym: Add PID. - - * sysdeps/unix/sysv/linux/ia64/pt-vfork.S (__vfork): Don't use - a local register for saving old PID. Negate PID in parent upon exit. - - * sysdeps/unix/sysv/linux/s390/s390-32/pt-vfork.S: Include - tcb-offsets.h. - (__vfork): Negate PID if non-zero and set to INT_MIN if zero - before syscall, set to the old value in the parent afterwards. - * sysdeps/unix/sysv/linux/s390/s390-32/vfork.S: New file. - * sysdeps/unix/sysv/linux/s390/s390-64/pt-vfork.S: Include - tcb-offsets.h. - (__vfork): Negate PID if non-zero and set to INT_MIN if zero - before syscall, set to the old value in the parent afterwards. - * sysdeps/unix/sysv/linux/s390/s390-64/vfork.S: New file. - * sysdeps/s390/tcb-offsets.sym: Add PID. - - * sysdeps/unix/sysv/linux/sparc/pt-vfork.S: Remove. - * sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S: New file. - * sysdeps/unix/sysv/linux/sparc/sparc32/pt-vfork.S: New file. - * sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S: New file. - * sysdeps/unix/sysv/linux/sparc/sparc64/pt-vfork.S: New file. - * sysdeps/sparc/tcb-offsets.sym: Add PID. - -2004-03-10 Andreas Schwab <schwab@suse.de> - - * sysdeps/ia64/tcb-offsets.sym: Add PID. - * sysdeps/unix/sysv/linux/ia64/vfork.S: New file. - * sysdeps/unix/sysv/linux/ia64/pt-vfork.S: Properly handle PID cache. - -2004-03-09 Jakub Jelinek <jakub@redhat.com> - - * tst-cancel20.c (do_one_test): Clear in_sh_body first. - * tst-cancel21.c (do_one_test): Likewise. - Reported by Gordon Jin <gordon.jin@intel.com>. - -2004-02-09 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/i386/vfork.S (SAVE_PID): Negate PID - if non-zero and set to INT_MIN if zero. - * sysdeps/unix/sysv/linux/x86_64/vfork.S (SAVE_PID): Likewise. - * sysdeps/unix/sysv/linux/i386/pt-vfork.S: Include tcb-offsets.h. - (SAVE_PID, RESTORE_PID): Define. - (__vfork): Use it. - * sysdeps/unix/sysv/linux/x86_64/pt-vfork.S: Include tcb-offsets.h. - Use relative path to avoid including NPTL i386/vfork.S. - (SAVE_PID, RESTORE_PID): Define. - * sysdeps/unix/sysv/linux/raise.c: Include limits.h. - (raise): Handle THREAD_SELF->pid INT_MIN the same as 0. - * Makefile (tests): Add tst-vfork1, tst-vfork2, tst-vfork1x and - tst-vfork2x. - (tests-reverse): Add tst-vfork1x and tst-vfork2x. - * tst-vfork1.c: New test. - * tst-vfork2.c: New test. - * tst-vfork1x.c: New test. - * tst-vfork2x.c: New test. - -2004-03-08 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/i386/tcb-offsets.sym: Add PID. - * sysdeps/x86_64/tcb-offsets.sym: Likewise. - * sysdeps/unix/sysv/linux/i386/vfork.S: New file. - * sysdeps/unix/sysv/linux/x86_64/vfork.S: New file. - -2004-03-08 Steven Munroe <sjmunroe@us.ibm.com> - - * sysdeps/unix/sysv/linux/powerpc/Versions: Remove leading tabs. - -2004-03-08 H.J. Lu <hongjiu.lu@intel.com> - - * sysdeps/s390/tls.h (INIT_SYSINFO): _dl_sysinfo is now in - _rtld_global_ro. - -2004-03-07 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/ia64/tls.h (INIT_SYSINFO): _dl_sysinfo is now in - _rtld_global_ro. - - * tst-once4.c: Remove unnecessary macro definition. - - * tst-mutex7.c (do_test): Limit thread stack size. - * tst-once2.c (do_test): Likewise. - * tst-tls3.c (do_test): Likewise. - * tst-tls1.c (do_test): Likewise. - * tst-signal3.c (do_test): Likewise. - * tst-kill6.c (do_test): Likewise. - * tst-key4.c (do_test): Likewise. - * tst-join4.c (do_test): Likewise. - * tst-fork1.c (do_test): Likewise. - * tst-context1.c (do_test): Likewise. - * tst-cond2.c (do_test): Likewise. - * tst-cond10.c (do_test): Likewise. - * tst-clock2.c (do_test): Likewise. - * tst-cancel10.c (do_test): Likewise. - * tst-basic2.c (do_test): Likewise. - * tst-barrier4.c (do_test): Likewise. - -2004-03-05 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/i386/tls.h: Use GLRO instead of GL where appropriate. - -2004-03-01 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Optimize wakeup test. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S - (__pthread_cond_wait): Likewise. - * sysdeps/pthread/pthread_cond_wait.c (__pthread_cond_wait): Likewise. - * sysdeps/pthread/pthread_cond_timedwait.c (__pthread_cond_timedwait): - Likewise. - -2004-02-29 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S - (__lll_mutex_lock_wait): Optimize a bit more. Just one copy of - the atomic instruction needed. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S - (__lll_mutex_lock_wait): Likewise. - -2004-02-28 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-cond14 and tst-cond15. - * tst-cond14.c: New file. - * tst-cond15.c: New file. - -2004-02-27 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/createthread.c (create_thread): Remove use of - CLONE_STOPPED. We cannot use SIGCONT which means CLONE_STOPPED - needs to be implemented differently to be useful. - -2004-02-26 Ulrich Drepper <drepper@redhat.com> - - * pthread_attr_setschedparam.c: Don't test priority against limits - here. Set ATTR_FLAG_SCHED_SET flag. - * pthread_attr_setschedpolicy.c: Set ATTR_FLAG_POLICY_SET flag. - * pthread_create.c (__pthread_create_2_1): Copy scheduling attributes - from parent thread to child. If attribute is used and scheduling - parameters are not inherited, copy parameters from attribute or - compute them. Check priority value. - * pthread_getschedparam.c: If the parameters aren't known yet get - them from the kernel. - * pthread_setschedparam.c: Set ATTR_FLAG_SCHED_SET and - ATTR_FLAG_POLICY_SET flag for thread. - * sysdeps/unix/sysv/linux/internaltypes.h: Define ATTR_FLAG_SCHED_SET - and ATTR_FLAG_POLICY_SET. - - * sysdeps/pthread/createthread.c: Use tgkill if possible. - - * pthread_attr_getstackaddr.c (__pthread_attr_getstackaddr): Don't - fail if stack address hasn't been set. Just return 0. - -2004-02-25 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests-nolibpthread): Add tst-unload. Don't link with - libpthread for the files in this list. - (CFLAGS-tst-unload): Removed. - * tst-unload.c (do_test): Don't use complete path for - LIBPHREAD_SO. - - * Makefile: Define sonames for tst-tls5mod, tst-_res1mod1, and - tst-_res1mod2. - -2004-02-22 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S - (__lll_mutex_lock_wait): Rewrite so that only one locked memory - operation per round is needed. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S - (__lll_mutex_lock_wait): Likewise. - -2004-02-20 Ulrich Drepper <drepper@redhat.com> - - * tst-cancel9.c (cleanup): Don't print to stderr. - -2004-02-20 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/sh/jmpbuf-unwind.h (_JMPBUF_UNWINDS_ADJ): Fix variable name. - -2004-02-20 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h - (__syscall_error_handler2): Call CDISABLE. - * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h - (__syscall_error_handler2): Call CDISABLE. - - * sysdeps/pthread/pthread_barrier_wait.c (pthread_barrier_wait): - Release lock before the loop, don't reacquire it. - - * sysdeps/unix/sysv/linux/ia64/dl-sysdep.h (DL_ARGV_NOT_RELRO): Define. - -2004-02-19 Andreas Schwab <schwab@suse.de> - - * sysdeps/pthread/pthread_barrier_wait.c (pthread_barrier_wait): - Fix last change. - -2004-02-18 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S - (pthread_barrier_wait): After wakeup, release lock only when the - last thread stopped using the barrier object. - * sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S - (pthread_barrier_wait): Likewise. - * sysdeps/pthread/pthread_barrier_wait.c (pthread_barrier_wait): - Likewise. - * Makefile (tests): Add tst-barrier4. - * tst-barrier4.c: New file. - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Perform timeout test while holding - internal lock to prevent wakeup race. - Patch by Dinakar Guniguntala <dgunigun@in.ibm.com>. - * sysdeps/pthread/pthread_cond_timedwait.c - (__pthread_cond_timedwait): Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Likewise. - -2004-02-18 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S - (__pthread_rwlock_unlock): Access WRITER as 32-bit value. - * Makefile (tests): Add tst-rwlock13. - * tst-rwlock13.c: New test. - -2004-02-16 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__condvar_tw_cleanup): Little optimization. - Patch by Dinakar Guniguntala <dgunigun@in.ibm.com>. - -2004-02-16 Steven Munroe <sjmunroe@us.ibm.com> - - * sysdeps/unix/sysv/linux/powerpc/pt-longjmp.c: Replace libc with - libpthread as "lib" parameter to SHLIB_COMPAT. - (__novmx_siglongjmp): Fix typo in function name. - (__novmx_longjmp): Fix typo in function name. - -2004-02-13 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread_cond_wait.c (__pthread_cond_wait): Add a - __builtin_expect. - - * sysdeps/generic/pt-longjmp.c: Moved to... - * sysdeps/pthread/pt-longjmp.c: ...here. New file. - -2004-01-29 Steven Munroe <sjmunroe@us.ibm.com> - - * Makefile (libpthread-routines): Add pt-cleanup. - * pt-longjmp.c: Removed. - * pt-cleanup.c: Copied __pthread_cleanup_upto to here. New file. - * sysdeps/generic/pt-longjmp.c: Copied longjmp to here. New file. - * sysdeps/unix/sysv/linux/powerpc/Versions: New file. - Version longjmp, siglongjmp for GLIBC_2.3.4. - * sysdeps/unix/sysv/linux/powerpc/pt-longjmp.c: New File. - -2004-02-13 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread_cond_timedwait.c - (__pthread_cond_timedwait): Optimize. Drop internal lock earlier. - Reuse code. Add __builtin_expects. - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Get internal lock in case timeout has - passed before the futex syscall. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - -2004-01-20 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c: Pretty printing. - - * sysdeps/pthread/createthread.c (create_thread): Don't add - CLONE_DETACHED bit if it is not necessary. - -2004-01-16 Ulrich Drepper <drepper@redhat.com> - - * pthread_getattr_np.c: Include ldsodefs.h. - -2004-01-16 Richard Henderson <rth@redhat.com> - - * allocatestack.c: Don't declare __libc_stack_end. - * init.c (__pthread_initialize_minimal_internal): Likewise. - * pthread_getattr_np.c (pthread_getattr_np): Likewise. - -2004-01-15 Richard Henderson <rth@redhat.com> - - * sysdeps/alpha/tls.h (tcbhead_t): Add private. - (TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN, TLS_TCB_SIZE, - TLS_PRE_TCB_SIZE, TLS_TCB_ALIGN, INSTALL_DTV, INSTALL_NEW_DTV, - GET_DTV, THREAD_DTV, THREAD_SELF, DB_THREAD_SELF): Match ia64. - (TLS_TCB_OFFSET, THREAD_ID, NO_TLS_OFFSET): Remove. - (THREAD_GETMEM, THREAD_GETMEM_NC): Simplify. - (THREAD_SETMEM, THREAD_SETMEM_NC): Likewise. - * sysdeps/unix/sysv/linux/alpha/createthread.c (TLS_VALUE): Match ia64. - -2004-01-14 Ulrich Drepper <drepper@redhat.com> - - * init.c (pthread_functions): Make array const. - -2004-01-13 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (__make_stacks_executable): Change interface. - Check parameters. Pass parameter on to libc counterpart. - * pthreadP.h: Change declaration. - -2004-01-13 Richard Henderson <rth@redhat.com> - - * pthread_attr_setstack.c (__old_pthread_attr_setstack): Use - prototype form. - * pthread_attr_setstacksize.c (__old_pthread_attr_setstacksize): - Likewise. - - * sysdeps/alpha/Makefile: New file. - * sysdeps/alpha/tcb-offsets.sym: New file. - * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h (SINGLE_THREAD_P): - Use MULTIPLE_THREADS_OFFSET to implement !libpthread !libc version. - - * sysdeps/unix/sysv/linux/alpha/lowlevellock.h: Rewrite based - on powerpc version. - -2004-01-08 Jakub Jelinek <jakub@redhat.com> - - * Makefile (tests): Add tst-backtrace1. - * tst-backtrace1.c: New test. - -2003-12-11 Ulrich Weigand <uweigand@de.ibm.com> - - * sysdeps/alpha/tls.h (DB_THREAD_SELF): Pass bit size of thread - register as second parameter to the REGISTER macro. - * sysdeps/ia64/tls.h (DB_THREAD_SELF): Likewise. - * sysdeps/powerpc/tls.h (DB_THREAD_SELF): Likewise. - * sysdeps/sh/tls.h (DB_THREAD_SELF): Likewise. - * sysdeps/sparc/tls.h (DB_THREAD_SELF): Likewise. - * sysdeps/s390/tls.h (DB_THREAD_SELF): Pass __WORDSIZE as bit size - of thread register as second parameter to REGISTER macro in 64 case. - -2004-01-03 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/Makefile (CFLAGS-getpid.c): Removed. - (CFLAGS-getpid.o): Defined. - (CFLAGS-getpid.os): Defined. - -2003-12-31 Ulrich Drepper <drepper@redhat.com> - - * pthread_getattr_np.c (pthread_getattr_np): Make sure stack info - returned for main thread does not overlap with any other VMA. - Patch by Jakub Jelinek. - -2003-12-29 Jakub Jelinek <jakub@redhat.com> - - * tst-raise1.c: Include stdio.h. - -2003-12-23 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/raise.c (raise): Protect pid = selftid - setting with __ASSUME_TGKILL || defined __NR_tgkill. - If pid is 0, set it to selftid. - * sysdeps/unix/sysv/linux/getpid.c (really_getpid): Make inline. - Don't set self->pid but self->tid. If self->pid == 0 and self->tid - != 0, return self->tid without doing a syscall. - * descr.h (struct pthread): Move pid field after tid. - - * Makefile (tests): Add tst-raise1. - * tst-raise1.c: New file. - -2003-12-23 Roland McGrath <roland@redhat.com> - - * tst-oddstacklimit.c: New file. - * Makefile (tests): Add it. - (tst-oddstacklimit-ENV): New variable. - - * init.c (__pthread_initialize_minimal_internal): Round stack rlimit - value up to page size for __default_stacksize. - -2003-12-21 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-eintr5. - * tst-eintr5.c: New file. - - * eintr.c (eintr_source): Prevent sending signal to self. - - * tst-eintr2.c (tf1): Improve error message. - -2003-12-20 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/Makefile (CFLAGS-getpid.c): Define. - * sysdeps/unix/sysv/linux/getpid.c: New file. - * pthread_cancel.c: Add comment explaining use of PID field. - * sysdeps/unix/sysv/linux/pthread_kill.c: Likewise. - * pthread_getattr_np.c: Use abs() when comparing PID and TID fields. - * sysdeps/unix/sysv/linux/fork.c: Negate PID field of parent - temporarily to signal the field must not be relied on and updated - by getpid(). - * sysdeps/unix/sysv/linux/pt-raise.c: Handle case where PID is - temporarily negative. - * sysdeps/unix/sysv/linux/raise.c: Likewise. - -2003-12-19 Ulrich Drepper <drepper@redhat.com> - - * eintr.c (setup_eintr): Add new parameter. Pass to thread function. - (eintr_source): If ARG != NULL, use pthread_kill. - * tst-eintr1.c: Adjust for this change. - * tst-eintr2.c: Likewise. - * Makefile (tests): Add tst-eintr3 and tst-eintr4. - * tst-eintr3.c: New file. - * tst-eintr4.c: New file. - -2003-12-19 Jakub Jelinek <jakub@redhat.com> - - * libc-cancellation.c (__libc_enable_asynccancel): Don't cancel - if CANCELSTATE_BITMASK is set. - * sysdeps/pthread/librt-cancellation.c (__librt_enable_asynccancel): - Likewise. - - * Makefile (tests): Add tst-cancel22 and tst-cancel23. - (tests-reverse): Add tst-cancel23. - * tst-cancel22.c: New test. - * tst-cancel23.c: New test. - -2003-12-18 Ulrich Drepper <drepper@redhat.com> - - * tst-eintr1.c: Better error messages. - - * Makefile (tests): Add tst-eintr2. - * tst-eintr2.c: New file. - -2003-12-18 Jakub Jelinek <jakub@redhat.com> - - * Makefile (tests): Add tst-cancel21 and tst-cancelx21. - (CFLAGS-tst-cancelx21.c): Set. - * tst-cancel21.c: New test. - * tst-cancelx21.c: New test. - - * unwind.c (FRAME_LEFT): Add adj argument. Subtract it from each - comparison operand. - (unwind_stop): Use _JMPBUF_CFA_UNWINDS_ADJ macro instead of - _JMPBUF_CFA_UNWINDS. Adjust FRAME_LEFT invocations. - * pt-longjmp.c: Include jmpbuf-unwind.h. - (__pthread_cleanup_upto): Use _JMPBUF_UNWINDS_ADJ macro instead of - _JMPBUF_UNWINDS. Adjust compared pointers. - * init.c (__pthread_initialize_minimal_internal): Initialize - pd->stackblock_size. - * sysdeps/pthread/jmpbuf-unwind.h: Removed. - * sysdeps/alpha/jmpbuf-unwind.h: New file. - * sysdeps/i386/jmpbuf-unwind.h: New file. - * sysdeps/powerpc/jmpbuf-unwind.h: New file. - * sysdeps/s390/jmpbuf-unwind.h: New file. - * sysdeps/sh/jmpbuf-unwind.h: New file. - * sysdeps/sparc/sparc32/jmpbuf-unwind.h: New file. - * sysdeps/x86_64/jmpbuf-unwind.h: New file. - * sysdeps/unix/sysv/linux/ia64/jmpbuf-unwind.h: Include stdint.h. - (_JMPBUF_CFA_UNWINDS): Remove. - (_JMPBUF_CFA_UNWINDS_ADJ, _JMPBUF_UNWINDS_ADJ): Define. - -2003-12-12 Jakub Jelinek <jakub@redhat.com> - - * Makefile (tests): Add tst-cancel20 and tst-cancelx20. - (CFLAGS-tst-cancelx20.c): Set. - * tst-cancel20.c: New test. - * tst-cancelx20.c: New test. - -2003-12-17 Ulrich Drepper <drepper@redhat.com> - - * init.c (__pthread_initialize_minimal_internal): Don't treat - architectures with separate register stack special here when - computing default stack size. - -2003-12-17 Roland McGrath <roland@redhat.com> - - * Makefile (tst-cancelx7-ARGS): New variable. - Reportd by Greg Schafer <gschafer@zip.com.au>. - -2003-12-17 Jakub Jelinek <jakub@redhat.com> - - * Makefile (tests): Add tst-stack3. Depend on $(objpfx)tst-stack3-mem. - (generated): Add tst-stack3.mtrace and tst-stack3-mem. - (tst-stack3-ENV): Set. - ($(objpfx)tst-stack3-mem): New. - * tst-stack3.c: New test. - -2003-12-10 David Mosberger <davidm@hpl.hp.com> - - * sysdeps/unix/sysv/linux/ia64/pt-initfini.c (_init_EPILOG_BEGINS): - Add unwind directives. Drop unused .regstk directive. - (_fini_EPILOG_BEGINS): Add unwind directives. - -2003-12-11 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h (lll_futex_wait): - Assume parameter is a pointer. - (lll_futex_wake): Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h (lll_futex_wait): - Likewise. - (lll_futex_wake): Likewise. - Reported by Boris Hu. - * sysdeps/unix/sysv/linux/unregister-atfork.c - (__unregister_atfork): Pass pointer to refcntr to lll_futex_wait. - - * sysdeps/unix/sysv/linux/sem_wait.c (__new_sem_wait): Simplify a bit. - -2003-12-10 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/bits/libc-lock.h (__rtld_lock_initialize): Define. - * sysdeps/unix/sysv/linux/fork.c (__libc_fork): Call - __rtld_lock_initialize for ld.so lock. - Patch in part by Adam Li <adam.li@intel.com>. - -2003-12-02 David Mosberger <davidm@hpl.hp.com> - - * Makefile (link-libc-static): Remove -lgcc_eh---it's already mentioned - in $(gnulib). Also, remove stale comment. - -2003-11-12 David Mosberger <davidm@hpl.hp.com> - - * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h (PSEUDO): Take - advantage of new syscall stub and optimize accordingly. - - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h (__NR_futex): Rename - from SYS_futex, to match expectations of - sysdep.h:DO_INLINE_SYSCALL. - (lll_futex_clobbers): Remove. - (lll_futex_timed_wait): Rewrite in terms of DO_INLINE_SYSCALL. - (lll_futex_wake): Likewise. - (lll_futex_requeue): Likewise. - (__lll_mutex_trylock): Rewrite to a macro, so we can include this - file before DO_INLINE_SYSCALL is defined (proposed by Jakub - Jelinek). - (__lll_mutex_lock): Likewise. - (__lll_mutex_cond_lock): Likewise. - (__lll_mutex_timed_lock): Likewise. - (__lll_mutex_unlock): Likewise. - (__lll_mutex_unlock_force): Likewise. - - * sysdeps/ia64/tls.h: Move declaration of __thread_self up so it - comes before the include of <sysdep.h>. - (THREAD_SELF_SYSINFO): New macro. - (THREAD_SYSINFO): Likewise. - (INIT_SYSINFO): New macro. - (TLS_INIT_TP): Call INIT_SYSINFO. - - * sysdeps/ia64/tcb-offsets.sym: Add SYSINFO_OFFSET. - - * sysdeps/pthread/createthread.c (create_thread): Use - THREAD_SELF_SYSINFO and THREAD_SYSINFO instead of open code. - * allocatestack.c (allocate_stack): Use THREAD_SYSINFO and - THREAD_SELF_SYSINFO instead of open code. - * sysdeps/i386/tls.h (THREAD_SELF_SYSINFO): New macro. - (THREAD_SYSINFO): Likewise. - - * sysdeps/unix/sysv/linux/ia64/dl-sysdep.h: New file. - - * sysdeps/unix/sysv/linux/ia64/pt-vfork.S: Work around gas problem. - -2003-12-06 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/ia64/pt-initfini.c: Use .init_array - instead of .init. Patch by David Mosberger. - -2003-11-30 Thorsten Kukuk <kukuk@suse.de> - - * sysdeps/pthread/configure.in: Remove broken declaration in C - cleanup handling check. - -2003-11-30 Andreas Jaeger <aj@suse.de> - - * Makefile (CFLAGS-pt-initfini.s): Add $(fno_unit_at_a_time). - * sysdeps/unix/sysv/linux/x86_64/Makefile (CFLAGS-pt-initfini.s): - Likewise. - -2003-11-27 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/internaltypes.h (ATTR_FLAG_OLDATTR): Define. - * pthread_attr_destroy.c: Include shlib-compat.h. - (__pthread_attr_destroy): Return immediately if ATTR_FLAG_OLDATTR - is set in iattr->flags. - * pthread_attr_init.c (__pthread_attr_init_2_0): Set ATTR_FLAG_OLDATTR. - -2003-11-21 Jakub Jelinek <jakub@redhat.com> - - * Makefile (distribute): Add tst-cleanup4aux.c. - - * tst-cond12.c (prepare): Add prototype. Move after test-skeleton.c - include. - -2003-11-21 Ulrich Drepper <drepper@redhat.com> - - * tst-cond12.c (do_test): If USE_COND_SIGNAL is defined, use - pthread_cond_signal. - - * sysdeps/pthread/pthread_cond_wait.c (__pthread_cond_wait): Don't - store mutex address if the current value is ~0l. - * sysdeps/pthread/pthread_cond_timedwait.c - (__pthread_cond_timedwait): Likewise. - * sysdeps/pthread/pthread_cond_broadcast.c - (__pthread_cond_broadcast): Don't use requeue for pshared - condvars. - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S - (__pthread_cond_wait): Don't store mutex address if the current - value is ~0l. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S - (__pthread_cond_broadcast): Don't use requeue for pshared - condvars. - - * pthread_cond_init.c (__pthread_cond_init): Initialize __mutex - element with ~0l for pshared condvars, with NULL otherwise. - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S - (__pthread_cond_wait): Don't store mutex address if the current - value is ~0l. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S - (__pthread_cond_broadcast): Don't use requeue for pshared - condvars. - - * Makefile: Add rules to build and run tst-cond12 and tst-cond13. - * tst-cond12.c: New file. - * tst-cond13.c: New file. - -2003-11-17 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/configure.in: Make missing forced unwind support - fatal. - -2003-11-11 Ulrich Drepper <drepper@redhat.com> - - * pthreadP.h: Don't declare __pthread_unwind as weak inside libpthread. - -2003-11-06 Ulrich Drepper <drepper@redhat.com> - - * Makefile: Add magic to clean up correctly. - -2003-11-05 Jakub Jelinek <jakub@redhat.com> - - * unwind.c (FRAME_LEFT): Define. - (unwind_stop): Handle old style cleanups here. - (__pthread_unwind): Handle old style cleanups only if - !HAVE_FORCED_UNWIND. - * Makefile (tests): Add tst-cleanup4 and tst-cleanupx4. - (CFLAGS-tst-cleanupx4.c): Add -fexceptions. - ($(objpfx)tst-cleanup4): Depend on $(objpfx)tst-cleanup4aux.o. - ($(objpfx)tst-cleanupx4): Likewise. - * tst-cleanup4.c: New test. - * tst-cleanup4aux.c: New. - * tst-cleanupx4.c: New test. - -2003-11-04 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/bits/stdio-lock.h: Use lll_*lock instead of - lll_mutex_*lock macros to skip atomic operations on some archs. - -2003-11-03 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/tst-timer.c (main): Initialize - sigev2.sigev_value as well. - -2003-10-15 Roland McGrath <roland@redhat.com> - - * sysdeps/pthread/configure.in: Barf if visibility attribute support - is missing. - * sysdeps/pthread/configure: Regenerated. - -2003-10-09 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/unix/sysv/linux/sh/lowlevellock.h: Completely revamp the - locking macros. No distinction between normal and mutex locking - anymore. - * sysdeps/unix/sysv/linux/sh/lowlevellock.S: Rewrite mutex locking. - Merge bits from lowlevelmutex.S we still need. - * sysdeps/unix/sysv/linux/sh/libc-lowlevelmutex.S: Remove. - * sysdeps/unix/sysv/linux/sh/lowlevelmutex.S: Likewise. - * sysdeps/unix/sysv/linux/sh/not-cancel.h: New file. - * sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S: Adjust for - new mutex implementation. - * sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Likewise. - * 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. - * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (PSEUDO): Also defined - symbol for entry point to avoid cancellation. - -2003-10-07 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Backout 2003-10-02 - changes. - (SAVE_OLDTYPE_0): Fix a typo. - -2003-10-03 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/pthread_once.S (__pthread_once): - Check __sigsetjmp return value. Reported by Daniel Jacobowitz. - -2003-10-02 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (DOCARGS_1): Use - correct offset. - -2003-10-02 Jakub Jelinek <jakub@redhat.com> - - * Makefile (tests): Add tst-cancel19. - * tst-cancel19.c: New test. - -2003-10-02 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Fix saving and - restoring of the old cancellation type. - -2003-09-30 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/malloc-machine.h: Remove misleading comment. - -2003-09-27 Wolfram Gloger <wg@malloc.de> - - * sysdeps/pthread/malloc-machine.h: New file - -2003-09-24 Roland McGrath <roland@redhat.com> - - * allocatestack.c (__make_stacks_executable): Don't ignore return - value from _dl_make_stack_executable. - -2003-09-24 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (__make_stacks_executable): Also change - permission of the currently unused stacks. - - * allocatestack.c (change_stack_perm): Split out from - __make_stacks_executable. - (allocate_stack): If the required permission changed between the time - we started preparing the stack and queueing it, change the permission. - (__make_stacks_executable): Call change_stack_perm. - - * Makefile: Build tst-execstack-mod locally. - * tst-execstack-mod.c: New file. - -2003-09-23 Jakub Jelinek <jakub@redhat.com> - - * Makefile (tests): Only add tst-execstack if have-z-execstack is yes. - -2003-09-23 Roland McGrath <roland@redhat.com> - - * tst-execstack.c: New file. - * Makefile (tests): Add it. - ($(objpfx)tst-execstack, $(objpfx)tst-execstack.out): New targets. - (LDFLAGS-tst-execstack): New variable. - - * allocatestack.c (allocate_stack): Use GL(dl_stack_flags) to decide - whether to use PROT_EXEC for stack mmap. - (__make_stacks_executable): New function. - * pthreadP.h: Declare it. - * init.c (__pthread_initialize_minimal_internal): Set - GL(dl_make_stack_executable_hook) to that. - -2003-09-22 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Adjust for latest - recommendation from AMD re avoidance of lock prefix. - -2003-09-22 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/lowlevellock.c (__lll_timedlock_wait): Use - lll_futex_timed_wait instead of lll_futex_wait. - * sysdeps/unix/sysv/linux/s390/lowlevellock.c: Removed. - * sysdeps/unix/sysv/linux/s390/lowlevelmutex.c: Removed. - * sysdeps/unix/sysv/linux/s390/libc-lowlevellock.c: Removed. - * sysdeps/unix/sysv/linux/s390/libc-lowlevelmutex.c: Removed. - * sysdeps/unix/sysv/linux/s390/sem_trywait.c: Removed. - * sysdeps/unix/sysv/linux/s390/sem_wait.c: Removed. - * sysdeps/unix/sysv/linux/s390/sem_post.c: Removed. - * sysdeps/unix/sysv/linux/s390/sem_timedwait.c: Removed. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h: Include atomic.h. - Completely revamp the locking macros. No distinction between - normal and mutex locking anymore. - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h (__lll_lock_wait, - __lll_lock_timedwait): Fix prototypes. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h (__lll_lock_wait, - __lll_lock_timedwait): Likewise. - (lll_mutex_lock, lll_mutex_cond_lock): Use _val instead of _bool - macros, add __builtin_expect. - (lll_mutex_timedlock): Likewise. Fix return value. - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S: Removed. - * sysdeps/unix/sysv/linux/i386/i586/libc-lowlevelmutex.S: Removed. - * sysdeps/unix/sysv/linux/i386/i586/lowlevelmutex.S: Removed. - * sysdeps/unix/sysv/linux/i386/i686/libc-lowlevelmutex.S: Removed. - * sysdeps/unix/sysv/linux/i386/i686/lowlevelmutex.S: Removed. - * sysdeps/unix/sysv/linux/x86_64/libc-lowlevelmutex.S: Removed. - * sysdeps/unix/sysv/linux/lowlevelmutex.c: Removed. - * sysdeps/unix/sysv/linux/libc-lowlevelmutex.c: Removed. - -2003-09-22 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S - (__lll_mutex_lock_wait): Minor optimization to avoid one atomic - operation if possible. - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Don't play tricks - like jumping over the lock prefix. - -2003-09-21 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Completely revamp the - locking macros. No distinction between normal and mutex locking - anymore. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Rewrite mutex - locking. Merge bits from lowlevelmutex.S we still need. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/lowlevellock.c: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/lowlevelmutex.S: Removed. - * sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S: Removed. - * Makefile (routines): Remove libc-lowlevelmutex. - (libpthread-rountines): Remove lowlevelmutex. - * sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S: Adjust - for new mutex implementation. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S: Likewise - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S: Likewise. - Don't use requeue. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S: Likewise. - * sysdeps/pthread/pthread_cond_signal.c: Don't use requeue. - -2003-09-20 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Don't match memory - in parameters of asm with output parameters. - - * pthread_mutex_unlock.c (__pthread_mutex_unlock_usercnt): Change - type of DECR parameter to int. - * pthreadP.h: Adjust prototype of __pthread_mutex_unlock_usercnt. - -2003-09-18 Jakub Jelinek <jakub@redhat.com> - - * tst-attr3.c (tf, do_test): Print stack start/end/size and - guardsize for each thread. - -2003-09-17 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/pthread.h (pthread_getattr_np): Clarify usage. - * sysdeps/unix/sysv/linux/pthread_attr_setaffinity.c - (pthread_attr_setaffinity_np): Handle cpuset == NULL. - - * sysdeps/unix/sysv/linux/pthread_attr_getaffinity.c - (pthread_attr_getaffinity_np): Don't segfault if iattr->cpuset is - NULL. - * pthread_getattr_np.c: Set cpuset using pthread_getaffinity_np. - * pthreadP.h (pthread_getaffinity_np): Add hidden_proto. - * sysdeps/unix/sysv/linux/pthread_getaffinity.c - (pthread_getaffinity_np): Add hidden_def. - - * Makefile (tests): Add tst-attr3. - * tst-attr3.c: New test. - - * sysdeps/i386/Makefile (CFLAGS-tst-align.c): Remove. - -2003-09-15 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/i386/Makefile (CFLAGS-pthread_create.c, - CFLAGS-tst-align.c): Add -mpreferred-stack-boundary=4. - -2003-09-17 Jakub Jelinek <jakub@redhat.com> - - * Makefile (CFLAGS-tst-align.c): Add $(stack-align-test-flags). - * tst-align.c: Include tst-stack-align.h. - (tf, do_test): Use TEST_STACK_ALIGN macro. - -2003-09-17 Ulrich Drepper <drepper@redhat.com> - - * pthread_attr_init.c (__pthread_attr_init_2_0): Remove unused - variable. - -2003-09-16 Ulrich Drepper <drepper@redhat.com> - - * pthread_getattr_np.c (pthread_getattr_np): Correctly fill in the - stack-related values for the initial thread. - -2003-09-15 Jakub Jelinek <jakub@redhat.com> - - * Makefile (CFLAGS-pthread_once.c): Add $(uses-callbacks). - -2003-09-11 Ulrich Drepper <drepper@redhat.com> - - * pthread_mutex_lock.c: Minor code rearrangements. - -2003-09-05 Roland McGrath <roland@redhat.com> - - * pthread_create.c (__pthread_pthread_sizeof_descr): Removed. - Instead, include ../nptl_db/db_info.c to do its magic. - * pthread_key_create.c (__pthread_pthread_keys_max): Removed. - (__pthread_pthread_key_2ndlevel_size): Likewise. - * sysdeps/alpha/tls.h (DB_THREAD_SELF): New macro. - * sysdeps/i386/tls.h (DB_THREAD_SELF): New macro. - * sysdeps/ia64/tls.h (DB_THREAD_SELF): New macro. - * sysdeps/powerpc/tls.h (DB_THREAD_SELF): New macro. - * sysdeps/s390/tls.h (DB_THREAD_SELF): New macro. - * sysdeps/sh/tls.h (DB_THREAD_SELF): New macro. - * sysdeps/sparc/tls.h (DB_THREAD_SELF): New macro. - * sysdeps/x86_64/tls.h (DB_THREAD_SELF): New macro. - * sysdeps/alpha/td_ta_map_lwp2thr.c: File removed. - * sysdeps/generic/td_ta_map_lwp2thr.c: File removed. - * sysdeps/i386/td_ta_map_lwp2thr.c: File removed. - * sysdeps/ia64/td_ta_map_lwp2thr.c: File removed. - * sysdeps/powerpc/td_ta_map_lwp2thr.c: File removed. - * sysdeps/s390/td_ta_map_lwp2thr.c: File removed. - * sysdeps/sh/td_ta_map_lwp2thr.c: File removed. - * sysdeps/sparc/td_ta_map_lwp2thr.c: File removed. - * sysdeps/x86_64/td_ta_map_lwp2thr.c: File removed. - -2003-09-08 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Change type - of pthread_t to be compatible with LT. - * sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h: Likewise. - -2003-09-04 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/not-cancel.h (fcntl_not_cancel): Define. - -2003-09-04 Jakub Jelinek <jakub@redhat.com> - - * unwind-forcedunwind.c: Move to... - * sysdeps/pthread/unwind-forcedunwind.c: ...here. - (pthread_cancel_init): Use ARCH_CANCEL_INIT if defined. - * sysdeps/pthread/jmpbuf-unwind.h: New file. - * sysdeps/unix/sysv/linux/ia64/unwind-forcedunwind.c: New file. - * sysdeps/unix/sysv/linux/ia64/jmpbuf-unwind.h: New file. - * unwind.c: Include jmpbuf-unwind.h. - (unwind_stop): Use _JMPBUF_CFA_UNWINDS macro. - -2003-09-02 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/ia64/bits/local_lim.h: New file. - * sysdeps/unix/sysv/linux/ia64/Versions (libpthread): Export - pthread_attr_setstack and pthread_attr_setstacksize @@GLIBC_2.3.3. - * sysdeps/unix/sysv/linux/alpha/bits/local_lim.h: New file. - * sysdeps/unix/sysv/linux/alpha/Versions: New file. - * sysdeps/unix/sysv/linux/sparc/bits/local_lim.h: New file. - * sysdeps/unix/sysv/linux/sparc/Versions: New file. - * pthread_attr_setstack.c (__old_pthread_attr_setstack): New function. - (pthread_attr_setstack): If PTHREAD_STACK_MIN != 16384, export - as @@GLIBC_2.3.2 and also export compatibility @GLIBC_2.2. - * pthread_attr_setstacksize.c (__old_pthread_attr_setstacksize): New - function. - (pthread_attr_setstacksize): If PTHREAD_STACK_MIN != 16384, export - as @@GLIBC_2.3.2 and also export compatibility @GLIBC_2.1. - * Makefile (tests): Add tst-stack2. - * tst-stack2.c: New test. - * tst-stack1.c: Include limits.h and sys/param.h. - (do_test): Set size to MAX (4 * getpagesize (), PTHREAD_STACK_MIN). - - * pthread_condattr_setpshared.c: Include errno.h. - (pthread_condattr_setpshared): Return EINVAL if pshared - is neither PTHREAD_PROCESS_PRIVATE nor PTHREAD_PROCESS_SHARED. - - * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h (PSEUDO): Also - defined symbol for entry point to avoid cancellation. - * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h (PSEUDO): - Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h (PSEUDO): - Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h (PSEUDO): - Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h (PSEUDO): - Likewise. - * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h (PSEUDO): - Likewise. - * sysdeps/unix/sysv/linux/i386/not-cancel.h (__open_nocancel, - __close_nocancel, __read_nocancel, __write_nocancel, - __waitpid_nocancel): Add attribute_hidden. If not in libc.so, - libpthread.so or librt.so, define to corresponding function - without _nocancel suffix. - * sysdeps/unix/sysv/linux/s390/not-cancel.h: New file. - * sysdeps/unix/sysv/linux/powerpc/not-cancel.h: New file. - * sysdeps/unix/sysv/linux/sparc/not-cancel.h: New file. - - * sysdeps/unix/sysv/linux/x86_64/not-cancel.h: Fix a typo. - -2003-09-02 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/not-cancel.h: New file. - * sysdeps/unix/sysv/linux/x86_64/not-cancel.h: New file. - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Make sure the code - in subsections has a symbol associated with it. - - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (PSEUDO): Also - defined symbol for entry point to avoid cancellation. - * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h (PSEUDO): Likewise. - -2003-09-01 Jakub Jelinek <jakub@redhat.com> - - * Makefile (tests): Add tst-tls5. - (module-names): Add tst-tls5mod{,a,b,c,d,e,f}. - ($(objpfx)tst-tls5mod{,a,b,c,d,e,f}.so-no-z-defs): Set to yes. - ($(objpfx)tst-tls5): New. - ($(objpfx)tst-tls6.out): Likewise. - (tests): Depend on $(objpfx)tst-tls6.out. - * tst-tls3.c: Include stdint.h and pthreaddef.h. - (do_test): Check pthread_self () return value alignment. - * tst-tls3mod.c: Include stdint.h and pthreaddef.h. - (tf): Check pthread_self () return value alignment. - * tst-tls5.c: New test. - * tst-tls5.h: New. - * tst-tls5mod.c: New. - * tst-tls5moda.c: New. - * tst-tls5modb.c: New. - * tst-tls5modc.c: New. - * tst-tls5modd.c: New. - * tst-tls5mode.c: New. - * tst-tls5modf.c: New. - * tst-tls6.sh: New test. - - * sysdeps/pthread/pthread-functions.h (struct pthread_functions): Add - ptr___pthread_cond_timedwait and ptr___pthread_cond_timedwait_2_0. - * init.c (pthread_functions): Initialize them. - * forward.c (pthread_cond_timedwait@GLIBC_2.0, - pthread_cond_timedwait@@GLIBC_2.3.2): New forwards. - * Versions (libc): Export pthread_cond_timedwait@GLIBC_2.0, - pthread_cond_timedwait@@GLIBC_2.3.2. - -2003-09-01 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/alpha/timer_create.c: New file. - * sysdeps/unix/sysv/linux/alpha/timer_delete.c: New file. - * sysdeps/unix/sysv/linux/alpha/timer_getoverr.c: New file. - * sysdeps/unix/sysv/linux/alpha/timer_gettime.c: New file. - * sysdeps/unix/sysv/linux/alpha/timer_settime.c: New file. - * sysdeps/unix/sysv/linux/alpha/Versions: New file. - - * sysdeps/unix/sysv/linux/alpha/aio_cancel.c: New file. - - * sysdeps/unix/sysv/linux/ia64/bits/posix_opt.h: Define - _POSIX_THREAD_PRIORITY_SCHEDULING. - * sysdeps/unix/sysv/linux/x86_64/bits/posix_opt.h: Likewise. - -2003-08-31 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/bits/stdio-lock.h (_IO_acquire_lock): Avoid - nested function, use static inline function from libio.h. - Code by Richard Henderson. - - * sysdeps/pthread/bits/libc-lock.h: Mark pthread_setcancelstate as - weak. - -2003-08-30 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/sparc/sparc64/Versions: New file. - * sysdeps/unix/sysv/linux/sparc/sparc64/timer_create.c: New file. - * sysdeps/unix/sysv/linux/sparc/sparc64/timer_delete.c: New file. - * sysdeps/unix/sysv/linux/sparc/sparc64/timer_getoverr.c: New file. - * sysdeps/unix/sysv/linux/sparc/sparc64/timer_gettime.c: New file. - * sysdeps/unix/sysv/linux/sparc/sparc64/timer_settime.c: New file. - * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: New file. - * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: New file. - * sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h: New file. - * sysdeps/unix/sysv/linux/sparc/bits/semaphore.h: New file. - * sysdeps/unix/sysv/linux/sparc/lowlevellock.h: New file. - * sysdeps/unix/sysv/linux/sparc/pthread_once.c: New file. - * sysdeps/unix/sysv/linux/sparc/pt-vfork.S: New file. - * sysdeps/unix/sysv/linux/sparc/fork.c: New file. - * sysdeps/unix/sysv/linux/sparc/aio_cancel.c: New file. - * sysdeps/sparc/sparc32/sparcv9/pthread_spin_lock.c: New file. - * sysdeps/sparc/sparc32/sparcv9/pthread_spin_trylock.c: New file. - * sysdeps/sparc/sparc32/sparcv9/pthread_spin_unlock.c: New file. - * sysdeps/sparc/sparc32/pthread_spin_lock.c: New file. - * sysdeps/sparc/sparc32/pthread_spin_trylock.c: New file. - * sysdeps/sparc/sparc32/pthreaddef.h: New file. - * sysdeps/sparc/sparc64/pthread_spin_lock.c: New file. - * sysdeps/sparc/sparc64/pthread_spin_trylock.c: New file. - * sysdeps/sparc/sparc64/pthread_spin_unlock.c: New file. - * sysdeps/sparc/sparc64/pthreaddef.h: New file. - * sysdeps/sparc/tls.h: New file. - * sysdeps/sparc/tcb-offsets.sym: New file. - * sysdeps/sparc/Makefile: New file. - * sysdeps/sparc/td_ta_map_lwp2thr.c: New file. - * init.c [__sparc__] (__NR_set_tid_address): Define. - -2003-08-29 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/bits/stdio-lock.h (_IO_acquire_lock, - _IO_release_lock): Define. - -2003-08-29 Jakub Jelinek <jakuB@redhat.com> - - * tst-cancel4.c (tf_sigwait, tf_sigwaitinfo, tf_sigtimedwait): Add - sigemptyset before sigaddset. Reported by jreiser@BitWagon.com. - -2003-08-27 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread.h (pthread_exit): Remove __THROW. - (__pthread_cleanup_class): Add missing return types of member - functions. - -2003-08-26 Steven Munroe <sjmunroe@us.ibm.com> - - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h - (lll_mutex_unlock_force): Add memory barrier between store and futex - syscall. - -2003-08-25 Ulrich Drepper <drepper@redhat.com> - - * tst-cancel4.c (do_test): Also unlink tempfname and remove - tempmsg in first loop. - -2003-08-18 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define - _POSIX_THREAD_PRIORITY_SCHEDULING. - * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise. - -2003-08-07 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/bits/libc-lock.h [_LIBC && SHARED] - (__rtld_lock_default_lock_recursive, - __rtld_lock_default_unlock_recursive): Define. - [_LIBC && SHARED] (__rtld_lock_lock_recursive, - __rtld_lock_unlock_recursive): Define using - GL(_dl_rtld_*lock_recursive). - * init.c (__pthread_initialize_minimal_internal): Initialize - _dl_rtld_lock_recursive and _dl_rtld_unlock_recursive. - Lock GL(_dl_load_lock) the same number of times as - GL(_dl_load_lock) using non-mt implementation was nested. - - * pthreadP.h (__pthread_cleanup_upto): Add hidden_proto. - * pt-longjmp.c (__pthread_cleanup_upto): Add hidden_def. - -2003-08-06 Jakub Jelinek <jakub@redhat.com> - - * tst-cancel17.c (do_test): Make len2 maximum of page size and - PIPE_BUF. - -2003-08-07 Jakub Jelinek <jakub@redhat.com> - - * pthread_create.c (__pthread_create_2_0): Clear new_attr.cpuset. - -2003-08-03 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/createthread.c (do_clone): Move error handling - to first syscall error check. Move syscall error check for tkill - into __ASSUME_CLONE_STOPPED #ifdef. - -2003-08-02 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/createthread.c (do_clone): If __ASSUME_CLONE_STOPPED - is not defined, do explicit synchronization. - (create_thread): Do not lock pd->lock here. If __ASSUME_CLONE_STOPPED - is not defined also unlock pd->lock for non-debugging case in case - it is necessary. - * pthread_create.c (start_thread): Always get and release pd->lock - if __ASSUME_CLONE_STOPPED is not defined. - (start_thread_debug): Removed. Adjust users. - * allocatestack.c (allocate_stack): Always initialize lock if - __ASSUME_CLONE_STOPPED is not defined. - * Makefile (tests): Add tst-sched1. - * tst-sched1.c: New file. - - * sysdeps/pthread/createthread.c (do_clone): Only use - sched_setschduler and pass correct parameters. - -2003-07-31 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/pthread.h (pthread_attr_setstackaddr, - pthread_attr_setstacksize): Change PTHREAD_STACK_SIZE to - PTHREAD_STACK_MIN in comments. - -2003-07-31 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/pthread_cond_timedwait.c (__pthread_cond_timedwait): - Shut up warnings if INTERNAL_SYSCALL_ERROR_P does not use its first - argument. - * sysdeps/unix/sysv/linux/timer_create.c (timer_create): Likewise. - * pthread_condattr_setclock.c (pthread_condattr_setclock): Likewise. - * sysdeps/unix/sysv/linux/s390/jmp-unwind.c: Include pthreaddef.h. - (__pthread_cleanup_upto): Fix prototype. - (_longjmp_unwind): Adjust caller. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h (__lll_mutex_timedlock): - Change second argument to const struct pointer. - * tst-sem8.c (main): Remove unused s2 and s3 variables. - * tst-sem9.c (main): Likewise. - * unwind.c: Include string.h for strlen prototype. - -2003-07-31 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Don't use cmov unless HAVE_CMOV is defined. - * sysdeps/unix/sysv/linux/i386/i686/pthread_cond_timedwait.S: - Define HAVE_CMOV. - Patch by Nicholas Miell <nmiell@attbi.com>. - -2003-07-30 Jakub Jelinek <jakub@redhat.com> - - * init.c (__pthread_initialize_minimal_internal): Initialize - GL(dl_init_static_tls). - * pthreadP.h (__pthread_init_static_tls): New prototype. - * allocatestack.c (init_one_static_tls, __pthread_init_static_tls): - New functions. - * Makefile (tests): Add tst-tls4. - (modules-names): Add tst-tls4moda and tst-tls4modb. - ($(objpfx)tst-tls4): Link against libdl and libpthread. - ($(objpfx)tst-tls4.out): Depend on tst-tls4moda.so and - tst-tls4modb.so. - * tst-tls4.c: New file. - * tst-tls4moda.c: New file. - * tst-tls4modb.c: New file. - -2003-06-19 Daniel Jacobowitz <drow@mvista.com> - - * sysdeps/pthread/timer_create.c (timer_create): Call timer_delref - before __timer_dealloc. - * sysdeps/pthread/timer_routines.c (__timer_thread_find_matching): - Don't call list_unlink. - -2003-07-29 Roland McGrath <roland@redhat.com> - - * Makefile [$(build-shared) = yes] (tests): Depend on $(test-modules). - -2003-07-25 Jakub Jelinek <jakub@redhat.com> - - * tst-cancel17.c (do_test): Check if aio_cancel failed. - Don't reuse struct aiocb A if it failed. - Write fpathconf (fds[1], _PC_PIPE_BUF) + 2 bytes using aio_write, - not just one byte, as that does not block. - -2003-07-22 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/unwind-resume.c: New file. - * sysdeps/pthread/Makefile (routines, shared-only-routines): Add - unwind-resume in csu subdir. - (CFLAGS-unwind-resume.c, CFLAGS-rt-unwind-resume.c): Compile with - exceptions. - (librt-sysdep_routines, librt-shared-only-routines): Add - rt-unwind-resume. - * sysdeps/pthread/rt-unwind-resume.c: New file. - * unwind-forcedunwind.c: New file. - * Makefile (libpthread-routines): Add unwind-forcedunwind. - (libpthread-shared-only-routines): Likewise. - (CFLAGS-unwind-forcedunwind.c): Compile with exceptions. - * pthreadP.h (pthread_cancel_init): New prototype. - * pthread_cancel.c (pthread_cancel): Call pthread_cancel_init. - - * sysdeps/pthread/createthread.c (do_thread, create_thread): Make - attr argument const struct pthread_attr *. - - * res.c (__res_state): Return __resp. - * descr.h: Include resolv.h. - (struct pthread): Add res field. - * pthread_create.c: Include resolv.h. - (start_thread): Initialize __resp. - * Makefile (tests): Add tst-_res1. - (module-names): Add tst-_res1mod1, tst-_res1mod2. - ($(objpfx)tst-_res1mod2.so): Depend on $(objpfx)tst-_res1mod1.so. - ($(objpfx)tst-_res1): Depend on $(objpfx)tst-_res1mod2.so and - libpthread. - * tst-_res1.c: New file. - * tst-_res1mod1.c: New file. - * tst-_res1mod2.c: New file. - -2003-07-21 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/createthread.c: Don't define CLONE_STOPPED. - - * Makefile: Define various *-no-z-defs variables for test DSOs - which has undefined symbols. - -2003-07-21 Steven Munroe <sjmunroe@us.ibm.com> - - * sysdeps/unix/sysv/linux/powerpc/pthread_once.c (__pthread_once): - Retry if the stwcx fails to store once_control. - -2003-07-20 Ulrich Drepper <drepper@redhat.com> - - * Makefile (libpthread-routines): Add pthread_attr_getaffinity and - pthread_attr_setaffinity. - * Versions [libpthread] (GLIBC_2.3.3): Likewise. - * sysdeps/unix/sysv/linux/pthread_attr_getaffinity.c: New file. - * sysdeps/unix/sysv/linux/pthread_attr_setaffinity.c: New file. - * pthread_attr_destroy.c: Free cpuset element if allocated. - * pthread_create.c: Pass iattr as additional parameter to - create_thread. - * sysdeps/pthread/createthread.c: If attribute is provided and - a new thread is created with affinity set or scheduling parameters, - start thread with CLONE_STOPPED. - * sysdeps/pthread/pthread.h: Declare pthread_attr_getaffinity and - pthread_attr_setaffinity. - * sysdeps/unix/sysv/linux/internaltypes.h (struct pthread_attr): Add - cpuset element. - -2003-07-15 Ulrich Drepper <drepper@redhat.com> - - * tst-tcancel-wrappers.sh: lseek and llseek are not cancelation points. - -2003-07-14 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/configure.in: Require CFI directives also for - ppc and s390. - -2003-07-15 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h (PSEUDO): - Add cfi directives. - -2003-07-12 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/sh/tcb-offsets.sym: Add RESULT, TID, CANCELHANDLING and - CLEANUP_JMP_BUF. - * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Use more - registers as variables. Call __pthread_mutex_unlock_usercnt. - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: Store TID - not self pointer in __writer. Compare with TID to determine - deadlocks. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.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/sem_wait.S: Add cancellation support. - * sysdeps/unix/sysv/linux/sh/sem_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Define all the nice - macros also when compiling librt. - -2003-07-11 Jakub Jelinek <jakub@redhat.com> - - * Makefile (CFLAGS-pthread_once.c): Add -fexceptions - -fasynchronous-unwind-tables. - * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h - (PSEUDO): Add cfi directives. - * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h (PSEUDO): - Likewise. - * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h (PSEUDO): - Likewise. - -2003-07-08 Jakub Jelinek <jakub@redhat.com> - - * pthreadP.h (__pthread_unwind_next, __pthread_register_cancel, - __pthread_unregister_cancel): Add prototypes and hidden_proto. - * unwind.c (__pthread_unwind_next): Add hidden_def. - * cleanup.c (__pthread_register_cancel, __pthread_unregister_cancel): - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_wait.S (__new_sem_wait): - Use HIDDEN_JUMPTARGET to jump to __pthread_unwind. - * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S (sem_timedwait): - Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_wait.S (sem_wait): Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S (sem_timedwait): - Likewise. - * sysdeps/unix/sysv/linux/i386/pthread_once.S (__pthread_once): Use - HIDDEN_JUMPTARGET to call __pthread_register_cancel, - __pthread_unregister_cancel and __pthread_unwind_next. - -2003-07-04 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h (PSEUDO): Use - different symbol for the cancellation syscall wrapper and - non-cancellation syscall wrapper. - (PSEUDO_END): Define. - -2003-07-05 Richard Henderson <rth@redhat.com> - - * sysdeps/alpha/elf/pt-initfini.c: Avoid .ent/.end. - * sysdeps/unix/sysv/linux/alpha/lowlevellock.h (lll_futex_wait, - lll_futex_timed_wait, lll_futex_wake, lll_futex_requeue): On success - return actual return value from the syscall, not 0. - -2003-07-07 Ulrich Drepper <drepper@redhat.com> - - * descr.h (struct pthread): Add pid field. - * allocatestack.c (allocate_stack): Initialize pid field in descriptor. - (__reclaim_stacks): Likewise. - * init.c (sigcancel_handler): If __ASSUME_CORRECT_SI_PID is defined - also check for PID of the signal source. - (__pthread_initialize_minimal_internal): Also initialize pid field - of initial thread's descriptor. - * pthread_cancel.c: Use tgkill instead of tkill if possible. - * sysdeps/unix/sysv/linux/fork.c: Likewise. - * sysdeps/unix/sysv/linux/pt-raise.c: Likewise. - * sysdeps/unix/sysv/linux/pthread_kill.c: Likewise. - * sysdeps/unix/sysv/linux/raise.c: Likewise. - -2003-07-05 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/bits/libc-lock.h (__libc_cleanup_push): Renamed. - Fix use of parameter. - (__libc_cleanup_pop): Likewise. - -2003-07-04 Ulrich Drepper <drepper@redhat.com> - - * init.c (sigcancel_handler): Change parameters to match handler - for SA_SIGACTION. Check signal number and code to recognize - invalid invocations. - -2003-07-03 Roland McGrath <roland@redhat.com> - - * sysdeps/ia64/td_ta_map_lwp2thr.c (td_ta_map_lwp2thr): - Apply sizeof (struct pthread) bias to r13 value. - -2003-07-03 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/configure.in: Require CFI directives. - - * sysdeps/pthread/librt-cancellation.c (__pthread_unwind): Remove - definition. - * pthreadP.h (__pthread_unwind): Add hidden_proto if used in - libpthread compilation. - * unwind.c (__pthread_unwind): Add hidden_def. - * Versions (libpthread) [GLIBC_PRIVATE]: Add __pthread_unwind. - -2003-07-01 Ulrich Drepper <drepper@redhat.com> - - * libc-cancellation.c (__libc_cleanup_routine): Define. - * sysdeps/pthread/bits/libc-lock.h (__pthread_cleanup_push): Define. - (__pthread_cleanup_pop): Define. - -2003-07-01 Richard Henderson <rth@redhat.com> - - * sysdeps/alpha/elf/pt-initfini.c: New file. - * sysdeps/alpha/pthread_spin_lock.S: New file. - * sysdeps/alpha/pthread_spin_trylock.S: New file. - * sysdeps/alpha/pthreaddef.h: New file. - * sysdeps/alpha/td_ta_map_lwp2thr.c: New file. - * sysdeps/alpha/tls.h: New file. - * sysdeps/unix/sysv/linux/alpha/Makefile: New file. - * sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h: New file. - * sysdeps/unix/sysv/linux/alpha/bits/semaphore.h: New file. - * sysdeps/unix/sysv/linux/alpha/createthread.c: New file. - * sysdeps/unix/sysv/linux/alpha/fork.c: New file. - * sysdeps/unix/sysv/linux/alpha/lowlevellock.h: New file. - * sysdeps/unix/sysv/linux/alpha/pt-vfork.S: New file. - * sysdeps/unix/sysv/linux/alpha/pthread_once.c: New file. - * sysdeps/unix/sysv/linux/alpha/sem_post.c: New file. - * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h: New file. - -2003-07-01 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_once.S: Add correct - cleanup support and unwind info. - -2003-06-30 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/pthread_once.S (__pthread_once): - Use correct cleanup handler registration. Add unwind info. - * sysdeps/unix/sysv/linux/unwindbuf.sym: New file. - * sysdeps/unix/sysv/linux/Makefile: Add rule to build unwindbuf.h. - * tst-once3.c: Add cleanup handler and check it is called. - * tst-once4.c: Likewise. - * tst-oncex3.c: New file. - * tst-oncex4.c: New file. - * Makefile: Add rules to build and run tst-oncex3 and tst-oncex4. - -2003-06-29 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/configure.in: Check for C cleanup handling in gcc. - -2003-06-27 Ulrich Drepper <drepper@redhat.com> - - * tst-cancel4.c (tf_msgrcv): Use IPC_PRIVATE in msgget call. - (tf_msgsnd): Likewise. - - * tst-cancel4.c (tf_msgrcv): Strengthen test against valid - premature returns a bit more. - -2003-06-26 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/librt-cancellation.c: Move __pthread_unwind - definition to the front. - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Rename - the cleanup functions to make the names unique. Fix dwarf opcode - un unwind table. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Rename cleanup - functions to make the names unique. Fix CFA offset for two blocks. - -2003-06-25 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread.h (class __pthread_cleanup_class): Add - missing closing braces. - Patch by Christophe Saout <christophe@saout.de>. - -2003-06-24 Roland McGrath <roland@redhat.com> - - * pthread_mutex_trylock.c (__pthread_mutex_trylock): Typo fix. - -2003-06-24 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/ia64/bits/posix_opt.h: New file. - * sysdeps/unix/sysv/linux/x86_64/bits/posix_opt.h: New file. - - * pthreadP.h: Declare __find_thread_by_id. - * allocatestack.c [HP_TIMING_AVAIL]: Define __find_thread_by_id. - * pthread_clock_gettime.c: Allow using other thread's clock. - * pthread_clock_settime.c: Likewise. - * sysdeps/pthread/pthread_getcpuclockid.c: Likewise. - * Makefile: Add rules to build and run tst-clock2. - * tst-clock2.c: New file. - -2003-06-23 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Rewrite - to use exception-based cleanup handler. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise. - - * tst-cond8.c (ch): Announce that we are done. - - * pthreadP.h (__pthread_mutex_cond_lock): Mark with internal_function. - - * tst-cancel17.c (tf): Retry aio_suspend in case of EINTR. - Also test aio_suspend with timeout value. - -2003-06-22 Ulrich Drepper <drepper@redhat.com> - - * pthreadP.h: Mark __pthread_mutex_unlock_usercnt also hidden. - * pthread_mutex_unlock.c (__pthread_mutex_unlock_usercnt): Add - attribute_hidden. - - * pthreadP.h (__pthread_mutex_init_internal): Mark hidden. - (__pthread_mutex_lock_internal): Likewise. - (__pthread_mutex_unlock_internal): Likewise. - (__pthread_mutex_unlock_usercnt): Declare. - * pthread_mutex_destroy.c: Always fail if used in any way. - * pthread_mutex_init.c: Update comment. - * pthread_mutex_lock.c: If NO_INCR is not defined adjust __nusers. - * pthread_mutex_timedlock.c: Adjust __nusers. - * pthread_mutex_trylock.c: Adjust __nusers. - * pthread_mutex_unlock.c: Old code is in __pthread_mutex_unlock_usercnt - and public interfaces are wrapper with pass additional parameter. - __pthread_mutex_unlock_usercnt does not adjust __nusers if second - parameter zero. - * tst-mutex8.c: New file. - * Makefile (tests): Add tst-mutex8. - * sysdeps/pthread/pthread_cond_timedwait.c: Call - __pthread_mutex_unlock_usercnt. - * sysdeps/pthread/pthread_cond_wait.c: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/pthread_mutex_cond_lock.c: Define NO_INCR. - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h (pthread_mutex_t): - Add __nusers. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Likewise. - - * pthread_mutex_lock.c: Don't store THREAD_ID in __owner, use TID. - * pthread_mutex_timedlock.c: Likewise. - * pthread_mutex_trylock.c: Adjust __nusers. - * pthread_mutex_unlock.c: Compare with TID not THREAD_ID. - * tst-mutex9.c: New file. - * Makefile (tests): Add tst-mutex9. - * sysdeps/i386/tls.h: Remove THREAD_ID definition. - * sysdeps/ia64/tls.h: Likewise. - * sysdeps/powerpc/tls.h: Likewise. - * sysdeps/s390/tls.h: Likewise. - * sysdeps/sh/tls.h: Likewise. - * sysdeps/x86_64/tls.h: Likewise. - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h (pthread_mutex_t): - Change type of __owner. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Likewise. - -2003-06-19 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/ia64/sem_post.c: Move to... - * sysdeps/unix/sysv/linux/sem_post.c: ...here. - - * sysdeps/unix/sysv/linux/sem_post.c: Move to... - * sysdeps/unix/sysv/linux/powerpc/sem_post.c: ... here. Pass nr + 1 - instead of nr to lll_futex_wake. Only set errno and return -1 - if err < 0. - - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h (lll_futex_wait, - lll_futex_timed_wait, lll_futex_wake, lll_futex_requeue): On success - return actual return value from the syscall, not 0. - -2003-06-18 Ulrich Drepper <drepper@redhat.com> - - * tst-cancel4.c (tf_msgsnd): Don't always use 100 as the type, - find a random value. - (tf_msgrcv): Likewise. Also don't report msgrcv returns if - errno==EIDRM. - - * sysdeps/unix/sysv/linux/timer_settime.c: Add prototype for - compat_timer_settime. - * sysdeps/unix/sysv/linux/timer_gettime.c: Add prototype for - compat_timer_gettime. - * sysdeps/unix/sysv/linux/timer_getoverr.c: Add prototype for - compat_timer_getoverrun. - * sysdeps/unix/sysv/linux/timer_delete.c: Add prototype for - compat_timer_delete. - - * pthread_mutex_destroy.c (__pthread_mutex_destroy): For - error-checking mutex detect busy mutexes. - -2003-06-17 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h (lll_mutex_lock): - Add ax to clobber list. - (lll_mutex_cond_lock): Likewise. - (lll_mutex_unlock): Likewise. - (lll_lock): Likewise. - (lll_unlock): Likewise. - - * Makefile: Add rules to build and run tst-cancel18 and tst-cancelx18. - * tst-cancel18.c: New file. - * tst-cancelx18.c: New file. - - * tst-cancel4.c: Test connect, creat, msgrcv, msgsnd, sendmsg, sendto, - and tcdrain. - - * Makefile: Add rules to build and run tst-cancel17 and tst-cancel17x. - * tst-cancel17.c: New file. - * tst-cancelx17.c: New file. - - * sysdeps/unix/sysv/linux/sigtimedwait.c: New file. - * sysdeps/unix/sysv/linux/sigwait.c: New file. - * sysdeps/unix/sysv/linux/sigwaitinfo.c: New file. - - * tst-cancel4.c: Test open, close, pread, pwrite, fsync, and msync. - -2003-06-16 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/createthread.c (create_thread): Set - header.multiple_threads unconditionally. - * allocatestack.c (allocate_stack): Likewise. - * descr.h (struct pthread): Add header.multiple_threads - unconditionally. - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (CENABLE, CDISABLE): - Define for librt. #error if neither libpthread, libc nor librt. - * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h (CENABLE, CDISABLE): - Likewise. - * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h (CENABLE, - CDISABLE): Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h (CENABLE, - CDISABLE): Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h (CENABLE, - CDISABLE): Likewise. - * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h (CENABLE, - CDISABLE): Likewise. Access header.multiple_threads outside of - libc and libpthread. - * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h (CENABLE, CDISABLE): - Likewise. - * sysdeps/x86_64/tls.h (tcbhead_t): Add multiple_threads. - * sysdeps/x86_64/tcb-offsets.sym (MULTIPLE_THREADS_OFFSET): Define. - -2003-06-17 Ulrich Drepper <drepper@redhat.com> - - * tst-cancel4.c: Add tests for the socket and signal functions, pause. - Also test early cancellation before the thread reaches the cancellation - point. - - * Makefile: Compile forward.c with exceptions. - - * sysdeps/unix/sysv/linux/sleep.c: New file. - -2003-06-16 Ulrich Drepper <drepper@redhat.com> - - * Makefile: Add CFLAGS definition to compile function wrappers - duplicated from libc with exceptions. - * tst-cancel4.c: Also check cancellation handlers. - - * Makefile: Add rules to build and run tst-cancel16 and - tst-cancelx16. Add missing CFLAGS definitions. - * tst-cancel16.c: New file. - * tst-cancelx16.c: New file. - -2003-06-15 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/dl-sysdep.h - (DL_SYSINFO_IMPLEMENTATION): Use CFI opcodes. - * sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h - (DL_SYSINFO_IMPLEMENTATION): Likewise. - - * pthreadP.h (LIBC_CANCEL_ASYNC): Also define for librt. - (LIBC_CANCEL_RESET): Likewise. - Declare __librt_enable_asynccancel and __librt_disable_asynccancel. - * sysdeps/pthread/Makefile (librt-sysdep_routines): Add - librt-cancellation. - (CFLAGS-libcrt-cancellation.c): Define. - * sysdeps/pthread/librt-cancellation.c: New file. - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Define all the nice - macros also when compiling librt. - * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h: Likewise. - - * sysdeps/unix/sysv/linux/timer_create.c: Add prototype for - compat_timer_create. - -2003-06-14 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/posix-timer.h (timespec_compare): Always inline. - - * sysdeps/unix/sysv/linux/fork.h: Add libc_hidden_proto for - __register_atfork. - * sysdeps/unix/sysv/linux/register-atfork.c (__register_atfork): - Add libc_hidden_def. - -2003-06-13 Roland McGrath <roland@redhat.com> - - * sysdeps/x86_64/td_ta_map_lwp2thr.c (td_ta_map_lwp2thr): Pass FS - constant from <sys/reg.h> to ps_get_thread_area, not register contents. - -2003-06-11 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (queue_stack): Always inline. - * ptreadhP.h (__do_cancel): Likewise. - -2003-06-10 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/s390/sem_timedwait.c (sem_timedwait): Fix - a typo. - -2003-06-10 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S - (__pthread_cond_signal): Remove incorrect second addition for - cond_lock!=0. - -2003-06-09 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S - (__pthread_cond_signal): Use correct futex pointer in - __lll_mutex_lock_wait call. - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S - (__pthread_cond_signal): Some more tweaks to handle cond_lock!=0. - -2003-06-08 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/s390/sem_wait.c (__new_sem_wait): Make - cancelable. - * sysdeps/unix/sysv/linux/s390/sem_timedwait.c (sem_timedwait): - Likewise. - - * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h: Remove - hand-written CFI generation code. Since ENTRY/END also initiated - CFI frames this caused two CFI sets to be generated. - -2003-06-07 Ulrich Drepper <drepper@redhat.com> - - * cleanup_routine.c: New file. - * Versions (libpthread) [GLIBC_2.3.3]: Add __pthread_cleanup_routine. - * sysdeps/pthread/pthread.h: Add support for fully exception-based - cleanup handling. - * Makefile (libpthread-routines): Add cleanup_routine. - Add more CFLAGS variables to compile with exceptions. Add comments - why which file needs unwind tables. - (tests) [have-forced-unwind==yes]: Add tst-cancelx* and tst-cleanupx* - tests. - * tst-cancelx1.c: New file. - * tst-cancelx2.c: New file. - * tst-cancelx3.c: New file. - * tst-cancelx4.c: New file. - * tst-cancelx5.c: New file. - * tst-cancelx6.c: New file. - * tst-cancelx7.c: New file. - * tst-cancelx8.c: New file. - * tst-cancelx9.c: New file. - * tst-cancelx10.c: New file. - * tst-cancelx11.c: New file. - * tst-cancelx12.c: New file. - * tst-cancelx13.c: New file. - * tst-cancelx14.c: New file. - * tst-cancelx15.c: New file. - * tst-cleanupx0.c: New file. - * tst-cleanupx0.expect: New file. - * tst-cleanupx1.c: New file. - * tst-cleanupx2.c: New file. - * tst-cleanupx3.c: New file. - - * tst-cleanup0.c: Make standard compliant. - * tst-cleanup1.c: Likewise. - - * sysdeps/unix/sysv/linux/sem_timedwait.c: Add cancellation support. - * sysdeps/unix/sysv/linux/sem_wait.c: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_wait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Likewise. - * sysdeps/i386/tcb-offsets.sym: Add RESULT, CANCELHANDLING, and - CLEANUP_JMP_BUF. - * sysdeps/x86_64/tcb-offsets.sym: Likewise. - * tst-cancel12.c: New file. - * tst-cancel13.c: New file. - * tst-cancel14.c: New file. - * tst-cancel15.c: New file. - * Makefile (tests): Add tst-cancel12, tst-cancel13, tst-cancel14, - and tst-cancel15. - - * tst-cancel1.c: Add some comments. - - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: Compute relative - timeout correctly. - -2003-06-06 Ulrich Drepper <drepper@redhat.com> - - * Makefile (CFLAGS-pthread_cancel.c): Define. - -2003-06-05 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h (pthread_rwlock_t): - Change type of __writer element to int. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Likewise. - * sysdeps/i386/tcb-offsets.sym: Replace SELF entry with TID entry. - * sysdeps/x86_64/tcb-offsets.sym: Likewise. - * pthread_rwlock_trywrlock.c: Store TID not self pointer in __writer. - Compare with TID to determine deadlocks. - * sysdeps/pthread/pthread_rwlock_rdlock.c: Likewise. - * sysdeps/pthread/pthread_rwlock_timedrdlock.c: Likewise. - * sysdeps/pthread/pthread_rwlock_timedwrlock.: Likewise. - * sysdeps/pthread/pthread_rwlock_wrlock.c: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S: Likewise. - * Makefile (tests): Add tst-rwlock12. - * tst-rwlock12.c: New file. - -2003-06-05 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/lowlevellock.c (__lll_lock_wait, - __lll_timedlock_wait, lll_unlock_wake_cb, __lll_timedwait_tid): - Remove bogus hidden_proto. - * sysdeps/unix/sysv/linux/s390/libc-lowlevellock.c (___lll_lock): - Likewise. - * sysdeps/unix/sysv/linux/s390/lowlevellock.c (___lll_lock, - lll_unlock_wake_cb, ___lll_timedwait_tid): Likewise. - * sysdeps/unix/sysv/linux/s390/lowlevelmutex.c (___lll_mutex_lock, - ___lll_mutex_timedlock): Likewise. - -2003-06-04 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S - (__pthread_cond_signal): Add some code to eventually handle - cond_lock!=0. - -2003-06-01 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-exec4. - (tst-exec4-ARGS): Define. - * tst-exec4.c: New file. - -2003-05-31 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/lowlevellock.c (__lll_timedlock_wait): - Also fail if tv_nsec < 0. - (__lll_timedwait_tid): Likewise. - * sysdeps/unix/sysv/linux/sem_timedwait.c (sem_timedwait): Likewise. - * sysdeps/unix/sysv/linux/i386/lowlevellock.h (lll_timedwait_tid): - Likewise. - * sysdeps/unix/sysv/linux/s390/lowlevellock.c (___lll_timedwait_tid): - Likewise. - * sysdeps/unix/sysv/linux/s390/lowlevelmutex.c (__lll_mutex_timedlock): - Likewise. - * sysdeps/unix/sysv/linux/s390/sem_timedwait.c (sem_timedwait): - Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h (lll_timedwait_tid): - Likewise. - * sysdeps/unix/sysv/linux/sh/lowlevellock.h (lll_timedwait_tid): - Likewise. - - * Makefile (tests): Add tst-sem8 and tst-sem9. - * tst-sem8.c: New file. - * tst-sem9.c: New file. - * sem_open.c: Fix creation of in_use record if the file exists but - no internal record. - - * posix-timer.h: Remove old, unused timer_id2ptr and timer_ptr2id - definitions. - - * sysdeps/pthread/timer_create.c (timer_create): In case - evp==NULL, assign timer ID to sival_ptr. - - * descr.h (struct pthread_unwind_buf): Change type of prev element to - struct pthread_unwind_buf *. - (struct pthread): Likewise for cleanup_jmp_buf element. - - * cleanup.c (__pthread_register_cancel): Add cast to avoid warning. - * cleanup_defer.c (__pthread_register_cancel_defer): Likewise. - * unwind.c (__pthread_unwind_next): Likewise. - -2003-05-30 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h - (lll_futex_timed_wait): Use int for futex value parameter. - (lll_futex_wake): Likewise. - (lll_futex_requeue): Likewise. - - * sysdeps/unix/sysv/linux/lowlevellock.c (__lll_lock_wait): - Replace one memory operation with one register operation. - - * tst-join4.c (do_test): Fix error message. - - * tst-rwlock6.c (do_test): Use correct format specifier. - - * sysdeps/unix/sysv/linux/i386/i486/lowlevelmutex.S - (__lll_mutex_lock_wait): Replace one memory operation with one - register operation. - * sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S - (__lll_mutex_lock_wait): Likewise. - - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h - (__lll_mutex_cond_lock): Add one to value parameter of - __lll_lock_wait to reflect reality in the futex syscall. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h - (lll_mutex_cond_lock): Likewise. - -2003-05-30 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/s390/lowlevellock.h (__lll_mutex_cond_lock): - New function. - (lll_mutex_cond_lock): Define. - -2003-05-29 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-signal6. - * tst-signal6.c: New file. - - * sysdeps/unix/sysv/linux/s390/lowlevellock.h - (__lll_mutex_unlock_force): New function - (lll_mutex_unlock_force): Use __lll_mutex_unlock_force. - - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h - (__lll_mutex_unlock_force): New function. - (lll_mutex_unlock_force): Use __lll_mutex_unlock_force. - - * tst-rwlock7.c (do_test): Use correct format specifier. - - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h (lll_futex_requeue): - Find break parameter in correct asm argument. - -2003-05-27 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h (lll_futex_clobbers): - Remove out4. - (lll_futex_requeue): Fix __o3 constraint, return negative errno if - error occured. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h (pthread_cond_t): - Add __mutex. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h (FUTEX_REQUEUE, - lll_futex_requeue, lll_mutex_unlock_force): Define. - -2003-05-30 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h - (pthread_cond_t): Add __mutex. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h (FUTEX_REQUEUE, - lll_futex_requeue, lll_mutex_unlock_force): Define. - -2003-05-28 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/sh/tcb-offsets.sym: Define MUTEX_FUTEX. - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h (pthread_cond_t): - Add __mutex field. - * sysdeps/unix/sysv/linux/sh/lowlevellock.h (SYSCALL_WITH_INST_PAD): - Define. - (lll_futex_wait, lll_futex_wake): Define. - * sysdeps/unix/sysv/linux/sh/sh4/lowlevellock.h: New file. - * sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S: Try using - FUTEX_REQUEUE instead of FUTEX_WAIT. - * sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Remember - mutex which was used in condvar structure. Call - __pthread_mutex_cond_lock instead of __pthread_mutex_lock_internal. - * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Likewise. - - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: Don't - include tcb-offsets.h. Read wakeup value in locked region. - Use the value of gbr register as THREAD_ID. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.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/sem_trywait.S: Remove futex related - macros. - -2003-05-28 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread_cond_broadcast.c - (__pthread_cond_broadcast): Fix typo: MAX_INT -> INT_MAX. - -2003-05-26 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S: Fix - typo in register name. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S: Use parameters - correctly. Actually use requeue. Little optimization. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Store - mutex address early. Handle cancellation state as 32-bit value. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - Remove unnecessary label. - -2003-05-25 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread_cond_broadcast.c: Try using FUTEX_REQUEUE - instead of FUTEX_WAIT. - * sysdeps/pthread/pthread_cond_signal.c: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S: Likewise. - * sysdeps/pthread/pthread_cond_timedwait.c: Remember mutex which was - used in condvar structure. Call __pthread_mutex_cond_lock instead - of __pthread_mutex_lock_internal. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - * sysdeps/pthread/pthread_cond_wait.c: Likewise. - (__condvar_cleanup): Always call __pthread_mutex_cond_lock. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/Makefile (libpthread-sysdep_routines): - Add pthread_mutex_cond_lock. - * sysdeps/unix/sysv/linux/lowlevelcond.sym: Add dep_mutex. - * sysdeps/unix/sysv/linux/pthread_cond_mutex_lock.c: New file. - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Define - lll_mutex_cond_lock. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h (pthread_cond_t): - Add __mutex field. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Likewise. - - * sysdeps/i386/tcb-offsets.sym: Define MUTEX_FUTEX. - * sysdeps/x86_64/tcb-offsets.sym: Likewise. - - * pthreadP.h: Declare __pthread_mutex_cond_lock. - * pthread_mutex_lock.c: Define LLL_MUTEX_LOCK if not already defined. - Use it instead of lll_mutex_lock. If __pthread_mutex_lock is a - macro don't define aliases. - - * cancellation.c: Remove __pthread_enable_asynccancel_2. - * pthreadP.h: Remove declaration of __pthread_enable_asynccancel_2. - * sysdeps/pthread/pthread_cond_timedwait.c: Use - __pthread_enable_asynccancel instead of __pthread_enable_asynccancel_2. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - * sysdeps/pthread/pthread_cond_wait.c: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - -2003-05-17 Ulrich Drepper <drepper@redhat.com> - - * sem_open.c: Fix one endless loop. Implement correct semantics - wrt opening the same semaphore more then once. - * sem_close.c: Adjust for sem_open change. - * semaphoreP.h: Include <semaphore.h>. Define struct inuse_sem. - Declare __sem_mappings, __sem_mappings_lock, __sem_search. - * Makefile (tests): Add tst-sem7. - * tst-sem7.c: New file. - -2003-05-16 Roland McGrath <roland@redhat.com> - - * sysdeps/unix/sysv/linux/register-atfork.c (libc_freeres_fn): Fix - uninitialized variable braino. - -2003-05-16 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/timer_gettime.c (timer_gettime): Correct - test for syscall availability. - - * sysdeps/unix/sysv/linux/timer_settime.c (timer_settime): Set - __no_posix_timers to -1 if the syscalls don't exist. - - * pthread_join.c (pthread_join): Set tid field of the joined - thread to -1. This isn't necessary but helps to recognize some - error conditions with almost no cost. - - * allocatestack.c (FREE_P): Also negative values indicate an - unused stack. - - * unwind.c: Include <unistd.h>. - -2003-05-14 Ulrich Drepper <drepper@redhat.com> - - * Makefile ($(objpfx)$(multidir)): Add rule to create the directory. - -2003-05-14 Jakub Jelinek <jakub@redhat.com> - - * Makefile (crti-objs, crtn-objs): New variables. - (omit-deps, extra-objs): Add crtn. - ($(objpfx)libpthread.so): Depend on both crti and crtn - and links to them in multidir. - ($(objpfx)crtn.S, $(objpfx)crtn.o): New rules. - -2003-05-12 Steven Munroe <sjmunroe@us.ibm.com> - - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h - (lll_mutex_unlock): Use atomic_exchange_rel. - -2003-05-11 Ulrich Drepper <drepper@redhat.com> - - * cond-perf.c (cons): Add missing locking around setting of alldone. - -2003-05-10 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S: Remove futex - related macros. - * sysdeps/unix/sysv/linux/x86_64/sem_trywait.S: Likewise. - -2003-05-09 Ulrich Drepper <drepper@redhat.com> - - * tst-sem6.c: New file. - * Makefile (tests): Add tst-sem6. - - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h (___lll_mutex_unlock): - Use atomic_exchange_rel instead of atomic_exchange. - * sysdeps/unix/sysv/linux/lowlevellock.c (lll_unlock_wake_cb): - Likewise. - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Improve quality of - code for lll_futex_wait and lll_futex_wake in static apps. Use - vsyscall is possible. - - * sysdeps/unix/sysv/linux/pthread_getaffinity.c: New file. - * sysdeps/unix/sysv/linux/pthread_setaffinity.c: New file. - * sysdeps/pthread/pthread.h: Declare pthread_getaffinity_np and - pthread_setaffinity_np. - * Versions [libpthread] (GLIBC_2.3.3): Add pthread_getaffinity_np - and pthread_setaffinity_np. - * Makefile (libpthread-routines): Add pthread_getaffinity and - pthread_setaffinity. - - * allocatestack.c (allocate_stack): If ARCH_RETRY_MMAP is defined, - use it in case mmap to allocate the stack fails. - * sysdeps/unix/sysv/linux/x86_64/Makefile: Don't define - ARCH_MAP_FLAGS here. - * sysdeps/x86_64/pthreaddef.h: Define ARCH_MAP_FLAGS and - ARCH_RETRY_MMAP. - -2003-05-08 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/fork.c: Complete rewrite of the atfork - handler implementation. It is now lockless in fork(). - * sysdeps/unix/sysv/linux/register-atfork.c: Likewise. - * sysdeps/unix/sysv/linux/unregister-atfork.c: Likewise. - * sysdeps/unix/sysv/linux/fork.h: Don't include <link.h>. Don't - declare the __fork_*_lists. - (struct fork_handler): Include pointers to all three functions. - Add next, refcntr and need_signal elements. - (__fork_handlers): New declaration. - (__register_atfork_malloc): Remove declaration. - (HAVE_register_atfork_malloc): Remove definition. - * sysdeps/unix/sysv/linux/libc_pthread_init.c: Remove - __pthread_child_handler variable. - (__libc_pthread_init): Use __register_atfork instead of explicitly - adding to the list. - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Define lll_futex_wait - and lll_futex_wake. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Likewise. - - * unwind.c (unwind_cleanup): Print error message and then abort. This - function must never be reached. - - * cond-perf.c: New file. - -2003-05-05 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/i386/tls.h (TLS_INIT_TP): Include \n in error message. - -2003-05-04 Roland McGrath <roland@redhat.com> - - * Makefile ($(objpfx)../libc.so): New target. - -2003-05-02 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h - (pthread_condattr_t): Size is only an int, don't use long for - alignment. - (pthread_mutexattr_t): Likewise. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise. - -2003-05-01 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/i386/tls.h: Define THREAD_ID. - * sysdeps/ia64/tls.h: Likewise. - * sysdeps/powerpc/tls.h: Likewise. - * sysdeps/s390/tls.h: Likewise. - * sysdeps/sh/tls.h: Likewise. - * sysdeps/x86_64/tls.h: Likewise. - * pthread_mutex_lock.c: Use THREAD_ID instead of THREAD_SELF to - record ownership. - * pthread_mutex_timedlock.c: Likewise. - * pthread_mutex_trylock.c: Likewise. - * pthread_mutex_unlock.c: Likewise. - * pthread_rwlock_trywrlock.c: Likewise. - * sysdeps/pthread/pthread_rwlocklock_rdlock.c: Likewise. - * sysdeps/pthread/pthread_rwlock_timedrdlock.c: Likewise. - * sysdeps/pthread/pthread_rwlock_timedwrlock.c: Likewise. - * sysdeps/pthread/pthread_rwlock_wrlock.c: Likewise. - - * sysdeps/pthread/createthread.c (create_thread): Use CLONE_SYSVSEM - flag. - -2003-04-29 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h - (__SIZEOF_PTHREAD_COND_T): Define to 48. - (pthread_rwlock_t): Add 16 bytes of pad instead of 8 before __flags. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h (pthread_cond_t): - Make __align long long instead of long. - (pthread_rwlock_t): Formatting. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h - (pthread_rwlock_t): Formatting. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h - (pthread_cond_t): Make __align long long instead of long. - (pthread_rwlock_t): Move __flags field to the same position as in - linuxthreads. - -2003-04-30 Ulrich Drepper <drepper@redhat.com> - - * tst-rwlock6.c (do_test): Use correct printf format specifiers. - * tst-rwlock7.c (do_test): Likewise. - -2003-04-26 Roland McGrath <roland@redhat.com> - - * Makefile ($(test-modules)): Depend on $(common-objpfx)shlib.lds. - -2003-04-22 Jakub Jelinek <jakub@redhat.com> - - * allocatestack.c (TLS_TPADJ): Add TLS_PRE_TCB_SIZE instead of - sizeof (struct pthread). - (allocate_stack): Subtract TLS_PRE_TCB_SIZE bytes instead of - 1 struct pthread. - * sysdeps/powerpc/tls.h (TLS_INIT_TCB_SIZE, TLS_TCB_SIZE): Define - to 0. - (TLS_INIT_TCB_ALIGN, TLS_TCB_ALIGN): Define to alignment of - struct pthread. - (TLS_PRE_TCB_SIZE): Increase to cover tcbhead_t preceeded by pad - to 32-bit bytes. - (INSTALL_DTV, GET_DTV, THREAD_DTV): tcbhead_t is immediately before - tcbp. - (TLS_INIT_TP, THREAD_SELF, INIT_THREAD_SELF): Don't add TLS_TCB_SIZE - unneccessarily. - (NO_TLS_OFFSET): Define. - * sysdeps/unix/sysv/linux/powerpc/createthread.c (TLS_VALUE): Don't - add TLS_TCB_SIZE unnecessarily. - -2003-04-22 Roland McGrath <roland@redhat.com> - - * Makeconfig (shared-thread-library): Reverse link order to work - around linker bug. - -2003-04-22 Ulrich Drepper <drepper@redhat.com> - - * semaphore.h: Fix typo in comment. - -2003-04-21 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/sigfillset.c: New file. - - * init.c (__pthread_initialize_minimal): Don't block SIGTIMER. - * pthreadP.h: Make SIGTIMER and SIGCANCEL the same. - * sysdeps/pthread/pthread_sigmask.c: Remove handling of SIGTIMER. - * sysdeps/pthread/sigaction.c: Likewise. - * sysdeps/pthread/sigprocmask.c: New file. - * sysdeps/unix/sysv/linux/allocrtsig.c (current_rtmin): Define as - __SIGRTMIN+1. - * sysdeps/unix/sysv/linux/timer_routines.c (timer_helper_thread): - Block SIGTIMER. Also handle SI_TKILL events and terminate thread - in this case. - -2003-04-19 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/dl-sysdep.h - (DL_SYSINFO_IMPLEMENTATION): Add .eh_frame information. - - * sysdeps/unix/sysv/linux/unregister-atfork.c - (__unregister_atfork): Don't free memory not allocated dynamically. - - * semaphore.h: Remove __THROW marker from cancellation points. - * nptl/sysdeps/pthread/pthread.h: Likewise. - -2003-04-18 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread.h: Don't mark pthread_testcancel, - pthread_cancel, pthread_setcancelstate, and pthread_setcanceltype with - __THROW. - -2003-04-16 Jakub Jelinek <jakub@redhat.com> - - * tst-cancel4.c (do_test): Use %zd instead of %d when printing cnt. - -2003-04-15 Roland McGrath <roland@redhat.com> - - * forward.c (__pthread_unwind): Tweak to avoid warning. - -2003-04-15 Ulrich Drepper <drepper@redhat.com> - - * pthreadP.h: Move THREAD_ATOMIC_* replacements to the top. - -2003-04-14 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Don't - overflow CFA advance instructions. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - -2003-04-14 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/i386/tls.h: Rename LOCK to LOCK_PREFIX. - * sysdeps/i386/pthread_spin_lock.c: Likewise. - * sysdeps/x86_64/tls.h: Likewise. Define LOCK_PREFIX if not already - defined. - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Use - DW_CFA_advance_loc2 for .Laddl-.Lsubl. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Use - DW_CFA_advance_loc for .Laddl-.Lsubl. - -2003-04-13 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Don't use - position-independent unwind data for static libraries. - Add missing unwind info. Add comments. - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Add unwind info. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - -2003-04-12 Ulrich Drepper <drepper@redhat.com> - - * Makefile: Make sure all cancellation points are compiled with - exception and asynchronous unwind tables. - - * sysdeps/x86_64/tls.h (THREAD_SETMEM): Word around compiler bug - which mishandles loading of global object addresses in PIC. - (THREAD_SETMEM_NC): Likewise. - -2003-04-11 Ulrich Drepper <drepper@redhat.com> - - * pthread.h: Define new data structure for cleanup buffer. Declare - new cleanup handler interfaces. - * descr.h: Include <unwind.h> if necessary. Define pthread_unwind_buf. - (struct pthread): Add cleanup_jmp_buf pointer. Define - HAVE_CLEANUP_JMP_BUF and not HAVE_CANCELBUF. - * pthreadP.h: Declare __pthread_unwind. Define __do_cancel to use - it. Declare old cleanup handler installation functions. - * cleanup.c: Rewrite. Install handler for unwind-based cleanup - handling. - * cleanup_defer.c: Likewise. - * cleanup_compat.c: New file. Old cleanup code. - * cleanup_def_compat.c: New file. Old cleanup code. - * pthread_create.c (start_thread): Initialize cleanup_jmp_buf element - if own thread descriptor. - * unwind.c: New file. - * forward.c: Add __pthread_unwind. - * init.c (pthread_functions): Add __pthread_unwind. - * sysdeps/pthread/pthread-functions.s (struct pthread_functions): - Add ptr___pthread_unwind. - * Versions [GLIBC_2.3.3] (libpthread): Export new cleanup handling - and unwind function. - * Makefile (libpthread-routines): Add cleanup_compat, - cleanup_def_compat, and unwind. Define CFLAGS to enable unwind - table generation if necessary. - * version.c: Record whether unwind support is compiled in. - * sysdeps/pthread/configure.in: Add checks for unwind unterfaces. - * sysdeps/pthread/bits/libc-lock.h: Add prototypes of the old cleanup - handler interfaces. - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Add quite a bit of - complication to generate unwind information for syscall wrappers. - * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h: Likewise. - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h: Define - __cleanup_fct_attribute. - - * Makefile: Add rules to build and run tst-cleanup0. - * tst-cleanup0.c: New file. - * tst-cleanup0.expect: New file. - - * pthread_create.c (deallocate_tsd): Don't take parameter. Adjust - caller. Optimize to avoid often unecessary local variable. - -2003-04-11 Roland McGrath <roland@redhat.com> - - * Makefile ($(objpfx)multidir.mk): New target, generated makefile that - sets variable `multidir'; include that. - (generated): Add it. - ($(objpfx)$(multidir)/crti.o): New target. - [$(multidir) != .] (generated-dirs, extra-objs, omit-deps): Add it. - -2003-04-11 Ulrich Drepper <drepper@redhat.com> - - * tst-attr2.c (do_test): Add cast to avoid warning. - * tst-mutex4.c (do_test): Likewise. - -2003-04-10 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/fork.c (__libc_fork): Reset CPU clocks - in child. - -2003-04-09 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-detach1. - * tst-detach1.c: New file. - -2003-04-08 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread.h: Remove duplicate - pthread_cleanup_{push,pop} definitions. - - * tst-barrier2.c: Eliminate warnings. - * tst-cancel4.c: Likewise. - * tst-cond4.c: Likewise. - * tst-cond6.c: Likewise. - * tst-detach1.c: Likewise. - * tst-rwlock4.c: Likewise. - * tst-rwlock6.c: Likewise. - * tst-rwlock7.c: Likewise. - * tst-sem3.c: Likewise. - * tst-spin2.c: Likewise. - * tst-umask1.c: Likewise. - -2003-04-07 Ulrich Drepper <drepper@redhat.com> - - * pthread_detach.c (pthread_detach): Fix test for invalid TID. - -2003-04-06 Ulrich Drepper <drepper@redhat.com> - - * descr.h (struct pthread): Move cancelhandling member to the front. - -2003-04-05 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/register-atfork.c: Define malloc_prepare, - malloc_parent, and malloc_child statically. - (__register_atfork_malloc): New function. - (free_mem): Don't free any of the malloc_* variables on the list. - * sysdeps/unix/sysv/linux/fork.h: Declare __register_atfork_malloc. - Define HAVE_register_atfork_malloc. - -2003-04-04 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/createthread.c (create_thread): Add some more - comments explaining when to set multiple_threads and when not. - - * pthreadP.h: Define THREAD_ATOMIC_CMPXCHG_VAL and - THREAD_ATOMIC_BIT_SET if not already defined. - * sysdeps/i386/tls.h: Define THREAD_ATOMIC_CMPXCHG_VAL and - THREAD_ATOMIC_BIT_SET: - * sysdeps/x86_64/tls.h: Likewise. - * cleanup_defer.c (_pthread_cleanup_push_defer): Rewrite to use - THREAD_ATOMIC_CMPXCHG_VAL. - (_pthread_cleanup_pop_restore): Likewise. - * cancellation.c (__pthread_enable_asynccancel): Likewise. - (__pthread_enable_asynccancel_2): Likewise. - (__pthread_disable_asynccancel): Likewise. - * libc-cancellation.c (__libc_enable_asynccancel): Likewise. - (__libc_disable_asynccancel): Likewise. - * init.c (sigcancel_handler): Likewise. - * pthread_setcancelstate.c (__pthread_setcancelstate): Likewise. - * pthread_setcanceltype.c (__pthread_setcanceltype): Likewise. - -2003-04-03 Ulrich Drepper <drepper@redhat.com> - - * init.c (sigcancel_handler): Don't set EXITING_BIT here. - * libc-cancellation.c (__libc_enable_asynccancel): Likewise. - * pthreadP.h (__do_cancel): Set EXITING_BIT here. - * Makefile (tests): Add tst-cancel11. - * tst-cancel11.c: New file. - -2003-04-01 Ulrich Drepper <drepper@redhat.com> - - * pthread_create.c (deallocate_tsd): Clear/free memory after the last - round, not the first. Use specific_used flag instead of local - found_nonzero variable. Use THREAD_[SG]ETMEM where possible. - (__free_tcb): Don't call deallocate_tsd here. - (start_thread): Call deallocate_tsd here. - * pthread_setspecific.c: Set specific_used flag really only when - needed. - * Makefile (tests): Add tst-tsd3.c and tst-tsd4. - * tst-tsd3.c: New file. - * tst-tsd4.c: New file. - -2003-03-31 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h (__lll_mutex_lock): - Use atomic_exchange_and_add instead of __lll_add. - (__lll_mutex_timedlock): Likewise. - Patch by Ian Wienand. - -2003-03-24 Steven Munroe <sjmunroe@us.ibm.com> - - * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h - (SINGLE_THREAD_P): Fix typo. - * tst-cancel-wrappers.sh: Handle '.'ed symbols. - -2003-03-31 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-align. - * tst-align.c: New file. - * sysdeps/i386/Makefile: Define CFLAGS-tst-align. - - * sysdeps/i386/tls.h (CALL_THREAD_FCT): Align stack of called - function correctly. - - * tst-tsd2.c: Add casts to avoid warnings. - -2003-03-30 Ulrich Drepper <drepper@redhat.com> - - * descr.h (struct pthread): Move most often used elements to the front. - -2003-03-29 Ulrich Drepper <drepper@redhat.com> - - * Makefile (libpthread-routines): Add pthread_atfork. - (libpthread-static-only-routines): Add pthread_atfork. - -2003-03-28 Kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/sh/tls.h: Include nptl/descr.h after the definition - of TLS_DTV_AT_TP. - (INSTALL_DTV): Add parens. - (THREAD_GETMEM, THREAD_GETMEM_NC, THREAD_SETMEM, THREAD_SETMEM_NC): - Use passed descr instead of THREAD_SELF. - * sysdeps/unix/sysv/linux/sh/lowlevelmutex.S - (__lll_mutex_timedlock_wait): Correct expected value after - spurious wakeup. - * sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S: - Release lock before waking up the waiters. - * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Correct exit - criteria. Reorderstruct passed to cleanup handler. Fix - handling of cancellation and failung pthread_mutex_unlock call. - Use __pthread_enable_asynccancel_2 instead of - __pthread_enable_asynccancel. - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Likewise. - Return result of lock re-get if it fails. - * sysdeps/unix/sysv/linux/sh/pthread_once.S: Fix wrong argument - for __pthread_cleanup_push. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: Fix - completely broken rwlock implementation. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.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. - * sysdeps/unix/sysv/linux/sh/sem_post.S: Fix error value. Use - versioned_symbol macro. - * sysdeps/unix/sysv/linux/sh/sem_trywait.S: Use versioned_symbol macro. - * sysdeps/unix/sysv/linux/sh/sem_wait.S: Likewise. - -2003-03-27 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/kernel-posix-timers.h: Don't declare - __timer_helper_thread. Declare __start_helper_thread, __helper_once, - and __helper_tid. - (struct timer): Remove th and bar field. - * sysdeps/unix/sysv/linux/timer_create.c (timer_create): Remove - debugging code. Create only one helper thread. - * sysdeps/unix/sysv/linux/timer_delete.c (timer_delete): Don't kill - helper thread. - * sysdeps/unix/sysv/linux/timer_routines.c (timer_helper_thread): - Renamed. Define statically. Use thread info from siginfo. - (__helper_once): New variable. - (__helper_tid): New variable. - (__reset_helper_control): New function. - (__start_helper_thread): New function. - - * pthread_create.c (start_thread): Don't use setjmp inside - __builtin_expect to work around gcc bug. - - * sysdeps/unix/sysv/linux/timer_delete.c (timer_delete): Even if - timer_delete syscall fails, but not with ENOSYS, set - __no_posix_timers. - - * sysdeps/unix/sysv/linux/timer_settime.c [!__ASSUME_POSIX_TIMERS] - (timer_settime): Fix typo. - * sysdeps/unix/sysv/linux/timer_getoverr.c - [!__ASSUME_POSIX_TIMERS] (timer_getoverrun): Likewise. - -2003-03-27 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Fix - offset of cleanupbuf.__prev. - -2003-03-26 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/timer_getoverr.c: Fix typo in name - of included file. - -2003-03-26 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/timer_create.c (timer_create): If EVP == - NULL provide default definition to syscall. - -2003-03-25 Roland McGrath <roland@redhat.com> - - * sysdeps/pthread/posix-timer.h (TIMER_MAX): Define if not defined. - (timer_id2ptr): Fix typo. - -2003-03-25 Ulrich Drepper <drepper@redhat.com> - - * pthreadP.h: Define SIGCANCEL and SIGTIMER. - * sysdeps/i386/pthreaddef.h: Remove SIGCANCEL definition. - * sysdeps/ia64/pthreaddef.h: Likewise. - * sysdeps/powerpc/pthreaddef.h: Likewise. - * sysdeps/s390/pthreaddef.h: Likewise. - * sysdeps/sh/pthreaddef.h: Likewise. - * sysdeps/x86_64/pthreaddef.h: Likewise. - * init.c (__pthread_initialize_minimal): Block SIGTIMER. - * sysdeps/pthread/sigaction.c: Also prevent SIGTIMER handler from - being changed. - * sysdeps/pthread/pthread_sigmask.c (pthread_sigmask): Make sure - SIGTIMER is not unblocked. - * sysdeps/unix/sysv/linux/allocrtsig.c (current_rtmin): One more - RT signal taken. - * sysdeps/unix/sysv/linux/pthread_kill.c: Do not allow SIGTIMER to - be send. - * sysdeps/pthread/posix-timer.h (timer_id2ptr, timer_ptr2id): Just - pass pointer through as ID. - * sysdeps/unix/sysv/linux/bits/local_lim.h (TIMER_MAX): Removed. - * sysdeps/unix/sysv/linux/kernel-posix-timers.h: New file. - * sysdeps/unix/sysv/linux/timer_create.c: New file. - * sysdeps/unix/sysv/linux/timer_delete.c: New file. - * sysdeps/unix/sysv/linux/timer_getoverr.c: New file. - * sysdeps/unix/sysv/linux/timer_gettime.c: New file. - * sysdeps/unix/sysv/linux/timer_routines.c: New file. - * sysdeps/unix/sysv/linux/timer_settime.c: New file. - * sysdeps/unix/sysv/linux/ia64/Versions: New file. - * sysdeps/unix/sysv/linux/ia64/timer_create.c: New file. - * sysdeps/unix/sysv/linux/ia64/timer_delete.c: New file. - * sysdeps/unix/sysv/linux/ia64/timer_getoverr.c: New file. - * sysdeps/unix/sysv/linux/ia64/timer_gettime.c: New file. - * sysdeps/unix/sysv/linux/ia64/timer_settime.c: New file. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/Versions: New file. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/timer_create.c: New file. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/timer_delete.c: New file. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/timer_getoverr.c: New file. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/timer_gettime.c: New file. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/timer_settime.c: New file. - * sysdeps/unix/sysv/linux/s390/s390-64/Versions: New file. - * sysdeps/unix/sysv/linux/s390/s390-64/timer_create.c: New file. - * sysdeps/unix/sysv/linux/s390/s390-64/timer_delete.c: New file. - * sysdeps/unix/sysv/linux/s390/s390-64/timer_getoverr.c: New file. - * sysdeps/unix/sysv/linux/s390/s390-64/timer_gettime.c: New file. - * sysdeps/unix/sysv/linux/s390/s390-64/timer_settime.c: New file. - * sysdeps/unix/sysv/linux/x86_64/Versions: New file. - * sysdeps/unix/sysv/linux/x86_64/compat-timer.h: New file. - * sysdeps/unix/sysv/linux/x86_64/timer_create.c: New file. - * sysdeps/unix/sysv/linux/x86_64/timer_delete.c: New file. - * sysdeps/unix/sysv/linux/x86_64/timer_getoverr.c: New file. - * sysdeps/unix/sysv/linux/x86_64/timer_gettime.c: New file. - * sysdeps/unix/sysv/linux/x86_64/timer_settime.c: New file. - - * pthreadP.h: Remove FRAME_LEFT definition. - * cleanup.c (_pthread_cleanup_push): Don't check for reference to - already left frame. Programs which have this problem are not POSIX - compliant. - * cleanup_defer.c (_pthread_cleanup_push_defer): Likewise. - -2003-03-24 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/tst-timer.c: Check return values of the - functions we test. - -2003-03-23 Roland McGrath <roland@redhat.com> - - * tst-tls3.c (do_test) [! HAVE___THREAD]: Don't test anything. - * tst-tls3mod.c: Likewise. - * tst-tls1.c: Likewise. - * tst-tls2.c: Likewise. - - * tst-mutex5.c (do_test): Unlock before destroy, otherwise we invoke - undefined behavior. - - * tst-join5.c (tf1, tf2): Add a cast. - - * Makeconfig (includes): Append -I$(..)nptl to this variable. - - * tst-barrier2.c (do_test) [! _POSIX_THREAD_PROCESS_SHARED]: - Don't test anything. - * tst-cond4.c: Likewise. - * tst-cond6.c: Likewise. - * tst-flock2.c: Likewise. - * tst-mutex4.c: Likewise. - * tst-rwlock4.c: Likewise. - * tst-signal1.c: Likewise. - * tst-spin2.c: Likewise. - * tst-cond11.c [! _POSIX_CLOCK_SELECTION]: Likewise. - - * tst-mutex4.c: Use test-skeleton.c. - * tst-spin2.c: Likewise. - * tst-sysconf.c: Likewise. - * tst-barrier2.c: Likewise. - * tst-cond4.c: Likewise. - * tst-cond6.c: Likewise. - * tst-rwlock4.c: Likewise. - * tst-unload.c: Likewise. - * tst-flock2.c (do_test): Use return instead of exit. - -2003-03-22 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/fork.c (__fork): Add libc_hidden_def. - -2003-03-21 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h - (__lll_mutex_trylock): Use atomic_compare_and_exchange_val_acq - instead of __lll_compare_and_swap. - * sysdeps/unix/sysv/linux/ia64/pthread_once.c (__pthread_once): - Likewise. - Removed definition if __lll_compare_and_swap. - - * cancellation.c: Adjust for new form of compare&exchange macros. - * cleanup_defer.c: Likewise. - * init.c: Likewise. - * libc-cancellation.c: Likewise. - * old_pthread_cond_broadcast.c: Likewise. - * old_pthread_cond_signal.c: Likewise. - * old_pthread_cond_timedwait.c: Likewise. - * old_pthread_cond_wait.c: Likewise. - * pthread_cancel.c: Likewise. - * pthread_create.c: Likewise. - * pthread_detach.c: Likewise. - * pthread_join.c: Likewise. - * pthread_key_delete.c: Likewise. - * pthread_setcancelstate.c: Likewise. - * pthread_setcanceltype.c: Likewise. - * pthread_timedjoin.c: Likewise. - * pthread_tryjoin.c: Likewise. - * sysdeps/pthread/createthread.c: Likewise. - -2003-03-20 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h: Include <atomic.h>. - Remove __lll_add, __lll_dec_if_positive, and __lll_test_and_set - definitions. Replace uses with calls to atomic_* functions. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/lowlevellock.c: Replace __lll_add and - __lll_test_and_set calls with atomic_exchange_and_add and - atomic_exchange calls respectively. - * sysdeps/unix/sysv/linux/sem_post.c: Likewise. - * sysdeps/unix/sysv/linux/sem_timedwait.c: Likewise. - * sysdeps/unix/sysv/linux/sem_trywait.c: Likewise. - * sysdeps/unix/sysv/linux/sem_wait.c: Likewise. - * sysdeps/unix/sysv/linux/ia64/pthread_once.c: Likewise. - * sysdeps/unix/sysv/linux/ia64/sem_port.c: Likewise. - * sysdeps/unix/sysv/linux/powerpc/pthread_once.c: Likewise. - - * allocatestack.c (allocate_stack): Assume atomic_exchange_and_add - returns the old value. - -2003-03-20 Martin Schwidefsky <sky@mschwid3.boeblingen.de.ibm.com> - - * sysdeps/s390/pthread_spin_lock.c (pthread_spin_lock): Use type - int for variable OLDVAL and correct inline assembler contraint. - * sysdeps/s390/pthread_spin_trylock.c (pthread_spin_trylock): Use - type int for variable OLD. - - * sysdeps/s390/tls.h (TLS_MULTIPLE_THREADS_IN_TCB): Define it - only for s390-32. - * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h - (SINGLE_THREAD_P): Use global variable __local_multiple_threads - instead of multiple_threads field in the TCB. - -2003-03-19 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/i386/i686/bits/atomic.h: Removed. - * sysdeps/i386/i586/bits/atomic.h: Removed. - * sysdeps/i386/i486/bits/atomic.h: Removed. Moved to glibc. - * sysdeps/x86_64/bits/atomic.h: Removed. Moved to glibc. - * sysdeps/s390/bits/atomic.h: Removed. Moved to glibc. - * sysdeps/sh/bits/atomic.h: Removed. Moved to glibc. - * sysdeps/ia64/bits/atomic.h: Removed. Moved to glibc. - * sysdeps/powerpc/bits/atomic.h: Removed. Moved to glibc. - * atomic.h: Removed. Moved to glibc. - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Add - support for clock selection. - - * sysdeps/pthread/pthread_cond_broadcast.c: Release lock before - signalling waiters. - -2003-03-18 Roland McGrath <roland@redhat.com> - - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h (__lll_test_and_set): - Add __lll_rel_instr first. Add memory clobber. - (lll_mutex_unlock): Use __lll_test_and_set. - From Paul Mackerras <paulus@samba.org>. - - * sysdeps/powerpc/tls.h (TLS_MULTIPLE_THREADS_IN_TCB): Define - unconditionally. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h - (SINGLE_THREAD_P): Add `header.' prefix. - From Paul Mackerras <paulus@samba.org>. - - * Versions (libpthread: GLIBC_2.3.2): Move pthread_tryjoin_np and - pthread_timedjoin_np to ... - (libpthread: GLIBC_2.3.3): ... here. - (libpthread: GLIBC_2.2): Move pthread_barrierattr_getpshared there too. - - * sysdeps/pthread/pthread_cond_timedwait.c (__pthread_cond_timedwait): - Avoid shadowing VAL variable. - - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h (__lll_test_and_set): - New macro. - -2003-03-18 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-cond11. - * tst-cond11.c: New file. - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Reorder - struct passed to cleanup handler to eliminate one more - instruction. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h - (pthrad_cond_t): Replace __unused field with __clock. - - * sysdeps/pthread/pthread_cond_wait.c: Release condvar lock before - waken all waiters in cleanup handler. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise. - - * pthread_condattr_getclock.c: New file. - * pthread_condattr_setclock.c: New file. - * sysdeps/pthread/pthread.h: Declare these new functions. - * Versions [GLIBC_2.3.3] (libpthread): Add the new functions. - * Makefile (libpthread-routines): Add the new functions. - * sysdeps/unix/sysv/linux/internaltypes.h (struct pthread_condattr): - Renamed field to value. Document use of the bits. - * pthread_condattr_getpshared.c: Adjust for struct pthread_condattr - change. - * pthread_condattr_setpshared.c: Likewise. - * pthread_cond_init.c (__pthread_cond_init): Initialized __clock field. - * sysdeps/unix/sysv/linux/lowlevelcond.sym: Add cond_clock symbol. - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h (pthread_cond_t): - Add __clock field. - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: - Implement clock selection. - * sysdeps/pthread/pthread_cond_timedwait.c: Likewise. - * pthread-errnos.sym: Add ENOSYS. - * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define - _POSIX_CLOCK_SELECTION. - * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise. - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Remove - invalid .size directive. - -2003-03-17 Roland McGrath <roland@redhat.com> - - * sysdeps/unix/sysv/linux/lowlevellock.c (__lll_lock_wait): - Formatting tweaks. - -2003-03-17 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/ia64/pthread_once.c: Use __builtin_expect. - Use __lll_add instead of spelling it out. Use protected symbol names. - * sysdeps/unix/sysv/linux/ia64/sem_post.c: Use __builtin_expect. - Use __lll_add. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h (__lll_compare_and_swap): - Renamed from lll_compare_and_swap. Use new name where necessary. - (__lll_add): Defined. - (__lll_dec_if_positive): Defined. - (__lll_test_and_set): Defined. - * sysdeps/ia64/pthread_spin_init.c: Removed. - * sysdeps/unix/sysv/linux/ia64/lowlevelmutex.c: Removed. - * sysdeps/unix/sysv/linux/ia64/sem_trywait.c: Removed. - * sysdeps/unix/sysv/linux/ia64/sem_wait.c: Removed. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.c: Removed. - * sysdeps/unix/sysv/linux/ia64/libc-lowlevellock.c: Removed. - * sysdeps/unix/sysv/linux/ia64/libc-lowlevelmutex.c: Removed. - * sysdeps/unix/sysv/linux/ia64/sem_timedwait.c: Removed. - * sysdeps/ia64/bits/atomic.h: Add __builtin_expect where appropriate. - * sysdeps/ia64/pthread_spin_unlock.c (pthread_spin_unlock): Use - __sync_lock_release_si. - Patch by Jakub Jelinek. - - * sysdeps/unix/sysv/linux/lowlevellock.c (__lll_timedlock_wait): - Fix timeout handling. - (__lll_timedwait_tid): Likewise. - (lll_unlock_wake_cb): Wake up other waiters if necessary. - Patch by Jakub Jelinek. - - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Pretty printing. - -2003-03-17 Roland McGrath <roland@redhat.com> - - PowerPC port contributed by Paul Mackerras <paulus@samba.org>. - * sysdeps/pthread/pthread_spin_init.c: New file. - * sysdeps/pthread/pthread_spin_unlock.c: New file. - * sysdeps/powerpc/Makefile: New file. - * sysdeps/powerpc/pthread_spin_lock.c: New file. - * sysdeps/powerpc/pthread_spin_trylock.c: New file. - * sysdeps/powerpc/pthreaddef.h: New file. - * sysdeps/powerpc/tcb-offsets.sym: New file. - * sysdeps/powerpc/td_ta_map_lwp2thr.c: New file. - * sysdeps/powerpc/tls.h: New file. - * sysdeps/powerpc/bits/atomic.h: New file. - * sysdeps/unix/sysv/linux/libc-lowlevelmutex.c: New file. - * sysdeps/unix/sysv/linux/libc-lowlevellock.c: New file. - * sysdeps/unix/sysv/linux/lowlevellock.c: New file. - - * sysdeps/unix/sysv/linux/lowlevelmutex.c: New file. - * sysdeps/unix/sysv/linux/sem_post.c: New file. - * sysdeps/unix/sysv/linux/sem_timedwait.c: New file. - * sysdeps/unix/sysv/linux/sem_trywait.c: New file. - * sysdeps/unix/sysv/linux/sem_wait.c: New file. - * sysdeps/unix/sysv/linux/powerpc/Makefile: New file. - * sysdeps/unix/sysv/linux/powerpc/createthread.c: New file. - * sysdeps/unix/sysv/linux/powerpc/fork.c: New file. - * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: New file. - * sysdeps/unix/sysv/linux/powerpc/pt-vfork.S: New file. - * sysdeps/unix/sysv/linux/powerpc/pthread_once.c: New file. - * sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: New file. - * sysdeps/unix/sysv/linux/powerpc/bits/semaphore.h: New file. - * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: New file. - * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: New file. - - * sysdeps/unix/sysv/linux/ia64/lowlevellock.c: Use __gettimeofday, - not gettimeofday. - * sysdeps/unix/sysv/linux/ia64/lowlevelmutex.c: Likewise. - * sysdeps/unix/sysv/linux/ia64/sem_timedwait.c: Likewise. - * sysdeps/unix/sysv/linux/s390/lowlevellock.c: Likewise. - * sysdeps/unix/sysv/linux/s390/lowlevelmutex.c: Likewise. - * sysdeps/unix/sysv/linux/s390/sem_timedwait.c: Likewise. - -2003-03-17 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread_cond_wait.c: Correct exit criteria. - * sysdeps/pthread/pthread_cond_timedwait.c: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise. - Patch by Ewald Snel <ewald@rambo.its.tudelft.nl>. - -2003-03-16 Roland McGrath <roland@redhat.com> - - * tst-fork4.c: Include <string.h>. - * tst-signal2.c: Likewise. - * tst-mutex5.c (do_test): exit -> return. - * tst-mutex2.c: Include <stdlib.h>. - -2003-03-16 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/lowlevelmutex.S - (__lll_mutex_timedlock_wait): Correct expected value after - spurious wakeup. Otherwise we would never wait again. - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Work around red - zone versus inline asm stupidity. Use correct instructions. - - * tst-rwlock6.c: Add some more status output. - -2003-03-15 Roland McGrath <roland@redhat.com> - - * sysdeps/pthread/configure.in: New file. - * sysdeps/pthread/configure: New file (generated). - -2003-03-15 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (allocate_stack): Store the exact stack size of - user allocated stacks. - -2003-03-15 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h - (SINGLE_THREAD): Use `header' prefix instead of `header.data'. - * sysdeps/sh/tcb-offsets.sym (MULTIPLE_THREADS_OFFSET): Likewise. - * sysdeps/sh/tls.h (TLS_MULTIPLE_THREADS_IN_TCB): Define. - * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h (SINGLE_THREAD_P): - Use `header.' prefix. - * sysdeps/ia64/tcb-offsets.sym (MULTIPLE_THREADS_OFFSET): Likewise. - -2003-03-15 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/x86_64/pthreaddef.h (CURRENT_STACK_FRAME): Don't use - __builtin_frame_address, use stack pointer. - - * sysdeps/unix/sysv/linux/jmp-unwind.c: Use CURRENT_STACK_FRAME - instead of __builtin_frame_pointer. - -2003-03-14 Ulrich Drepper <drepper@redhat.com> - - * tst-basic1.c (do_test): Add cast to avoid warning. - * tst-basic2.c (do_test): Likewise. - - * sysdeps/unix/sysv/linux/x86_64/pthread_once.S: Use correct - amount of stack correction. - - * tst-fork4.c: Use test-skeleton.c. - -2003-03-14 Roland McGrath <roland@redhat.com> - - * init.c: Fix typo "#eli" for "#else". - -2003-03-14 Steven Munroe <sjmunroe@us.ibm.com> - - * allocatestack.c (__stack_user): Use hidden_data_def. - * pthread_create.c (__pthread_keys): Likewise. - - * init.c [__powerpc__] (__NR_set_tid_address): Define it. - -2003-03-14 Roland McGrath <roland@redhat.com> - - * tst-fork4.c: New file. - * Makefile (tests): Add it. - - * descr.h (struct pthread): Move the union out of [!TLS_DTV_AT_TP], so - we always define the padding space. - [!TLS_DTV_AT_TP]: Give tcbhead_t field a name, `header', since GCC - stopped supporting its own extensions fully. - [TLS_MULTIPLE_THREADS_IN_TCB]: Put `multiple_threads' inside a wrapper - struct also called `header', so `header.multiple_threads' is the field - name to use on all machines. - * allocatestack.c (allocate_stack): Use `header.' prefix. - * sysdeps/pthread/createthread.c (create_thread): Likewise. - * pthread_create.c (__pthread_create_2_1): Likewise. - * sysdeps/i386/tls.h (INSTALL_NEW_DTV, THREAD_DTV): Likewise. - (THREAD_SELF): Likewise. - * sysdeps/x86_64/tls.h: Likewise. - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h - (SINGLE_THREAD_P): Likewise. - * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h - (SINGLE_THREAD_P): Likewise. - * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h - (SINGLE_THREAD_P): Likewise. - - * sysdeps/s390/td_ta_map_lwp2thr.c (td_ta_map_lwp2thr): Use REGS[18] - value directly. - -2003-03-14 Ulrich Drepper <drepper@redhat.com> - - * pthread_create.c (start_thread): Use CALL_THREAD_FCT if defined. - * sysdeps/i386/tls.h: Define CALL_THREAD_FCT. - - * pthread_create.c (start_thread): setjmp is expected to return 0. - - * sysdeps/x86_64/tls.h (THREAD_GETMEM): Mark asms volatile. - (THREAD_GETMEM_NC): Likewise. - -2003-03-13 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (allocate_stack): If MULTI_PAGE_ALIASING is defined - and the size of the stack which must be allocated is a multiple, - allocate one more page. - * sysdeps/i386/i686/Makefile: Don't define COLORING_INCREMENT, but - MULTI_PAGE_ALIASING. - -2003-03-13 Roland McGrath <roland@redhat.com> - - * pthread_create.c (start_thread): Set EXITING_BIT after the - event-reporting (and destructors), not before. - -2003-03-13 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h (lll_futex_timed_wait, - lll_futex_wake): Declare register variables as long int instead of - unsigned long int. Patch by Ian Wienand <ianw@gelato.unsw.edu.au>. - Make syscall arguments clobbered by the syscall. - (lll_futex_wait): Define using lll_futex_timed_wait. - - * sysdeps/ia64/td_ta_map_lwp2thr.c (td_ta_map_lwp2thr): Cast regs[13] - to void *. - - * sysdeps/unix/sysv/linux/fork.c (__libc_fork): Only declare and set - PPID if [! NDEBUG]. - - * allocatestack.c (nptl_ncreated): Only declare if - COLORING_INCREMENT != 0. - - * pthreadP.h (__pthread_enable_asynccancel_2): New prototype. - (__libc_enable_asynccancel_2): Remove prototype. - - * sysdeps/unix/sysv/linux/ia64/fork.c (ARCH_FORK): Swap ptid and - ctid to match kernel. - -2003-03-12 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/Makefile (sysdep_routines): Add - libc_multiple_threads. - * sysdeps/unix/sysv/linux/libc_pthread_init.c: Move definition of - __libc_multiple_threads to... - * sysdeps/unix/sysv/linux/libc_multiple_threads.c: ...here. New file. - - * sysdeps/unix/sysv/linux/x86_64/sem_post.S: Remove unnecessary - versioning. - * sysdeps/unix/sysv/linux/x86_64/sem_trywait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Likewise. - - * sysdeps/unix/sysv/linux/x86_64/pthread_once.S - (__pthread_once_internal): Define. - - * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Use shlib-compat.h - macros instead of .symver directly. - * sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_wait.S: Likewise. - - * sysdeps/x86_64/tls.h [__ASSEMBLER__]: Include tcb-offsets.h. - * sysdeps/x86_64/tcb-offsets.sym: New file. - * sysdeps/x86_64/Makefile: New file. - - * sysdeps/i386/tcb-offsets.sym: Add SELF. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Use SELF - to access own pthread_t in TCB. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: Likewise. - -2003-03-12 Roland McGrath <roland@redhat.com> - - * pthread-errnos.sym: New file. - * Makefile (gen-as-const-headers): New variable, list that file. - * sysdeps/unix/sysv/linux/i386/i486/sem_wait.S: Include generated - header <pthread-errnos.h> instead of defining errno values here. - * sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/lowlevelmutex.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_trywait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_post.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/sh/sem_trywait.S: Likewise. - * sysdeps/unix/sysv/linux/sh/sem_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/sh/sem_post.S: Likewise. - * sysdeps/unix/sysv/linux/sh/sem_wait.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: Likewise. - * sysdeps/unix/sysv/linux/sh/lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/sh/lowlevelmutex.S: Likewise. - * sysdeps/i386/i486/pthread_spin_trylock.S: Likewise. - * sysdeps/x86_64/pthread_spin_trylock.S: Likewise. - * sysdeps/sh/pthread_spin_trylock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S: Likewise. - - * sysdeps/unix/sysv/linux/fork.c: Add an assert to check that - CLONE_CHILD_SETTID worked. - -2003-03-12 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S: New - file. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S: New - file. - - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h - (pthread_cond_t): Add padding. - - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S: New file. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S: New file. - * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S: New file. - - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S - (__pthread_rwlock_timedwrlock): Add missing opcode suffix. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S - (__pthread_rwlock_timedrdlock): Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S - (__pthread_rwlock_wrlock): Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S - (__pthread_rwlock_rdlock): Likewise. - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: New file. - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Return - result of lock re-get if it fails. - -2003-03-11 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: Fix asm syntax. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_once.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_post.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_trywait.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Likewise. - - * sysdeps/x86_64/tls.h (THREAD_SELF, THREAD_GETMEM, THREAD_GETMEM_NC, - THREAD_SETMEM, THREAD_SETMEM_NC): Correct asm syntax. - - * allocatestack.c [! TLS_MULTIPLE_THREADS_IN_TCB] (allocate_stack): - Initialize *__libc_multiple_threads_ptr not __libc_multiple_threads. - * sysdeps/pthread/createthread.c [! TLS_MULTIPLE_THREADS_IN_TCB] - (create_thread): Likewise. - Define __pthread_multiple_threads and __libc_multiple_threads_ptr. - * init.c (__pthread_initialize_minimal_internal): Initialize - __libc_multiple_threads_ptr if necessary. - * pthreadP.h: Adjust prototype for __libc_pthread_init. Declare - __pthread_multiple_threads and __libc_multiple_threads_ptr. - * sysdeps/unix/sysv/linux/libc_pthread_init.c: Define - __libc_multiple_threads. - (__libc_pthread_init): Return pointer to __libc_pthread_init if - necessary. - - * sysdeps/i386/tls.h (THREAD_SETMEM): Fix one-byte variant. - (THREAD_SETMEM_NC): Likewise. - - * sysdeps/x86_64/pthread_spin_trylock.c: Removed. - * sysdeps/x86_64/pthread_spin_trylock.S: New file. - * sysdeps/x86_64/pthread_spin_unlock.c: Removed. - * sysdeps/x86_64/pthread_spin_unlock.S: New file. - - * sysdeps/i386/i486/pthread_spin_trylock.S (pthread_spin_trylock): - Eliminate one entire instruction. - - * cancellation.c (__pthread_enable_asynccancel_2): New function. - * pthreadP.h: Declare __pthread_enable_asynccancel_2. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S - (__pthread_cond_timedwait): Use __pthread_enable_asynccancel_2 - instead of __pthread_enable_asynccancel. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S - (__pthread_cond_wait): Likewise. - * sysdeps/pthread/pthread_cond_timedwait.c - (__pthread_cond_timedwait): Likewise. - * sysdeps/pthread/pthread_cond_wait.c (__pthread_cond_wait): Likewise. - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S - (__condvar_cleanup): Wake up all waiters in case we got signaled - after being woken up but before disabling asynchronous - cancellation. - * sysdeps/pthread/pthread_cond_wait.c (__condvar_cleanup): Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S - (__condvar_cleanup): Likewise. - - * init.c (__NR_set_tid_address): If already defined, don't redefine. - Make it an error if architecture has no #if case. Add x86-64. - - * sysdeps/unix/sysv/linux/x86_64/Makefile: Add flags for - pt-initfini.s generation. - - * sysdeps/x86_64/tls.h: Include <asm/prctl.h>. - (TLS_INIT_TP): Fix typo. - -2003-03-11 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/ia64/bits/atomic.h (atomic_exchange_and_add): Swap 2nd and - 3rd argument of __arch_compare_and_exchange_{32,64}_val_acq. - - * sysdeps/unix/sysv/linux/ia64/sem_post.c: Include semaphore.h. - * sysdeps/unix/sysv/linux/ia64/sem_timedwait.c: Likewise. - * sysdeps/unix/sysv/linux/ia64/sem_trywait.c: Likewise. - * sysdeps/unix/sysv/linux/ia64/sem_wait.c: Likewise. - * sysdeps/unix/sysv/linux/s390/sem_post.c: Likewise. - * sysdeps/unix/sysv/linux/s390/sem_timedwait.c: Likewise. - * sysdeps/unix/sysv/linux/s390/sem_trywait.c: Likewise. - * sysdeps/unix/sysv/linux/s390/sem_wait.c: Likewise. - -2003-03-11 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread_cond_timedwait.c - (__pthread_cond_timedwait): Return the result of the final - locking. If it succeeds, the regular function return value. - - * sysdeps/pthread/pthread_cond_wait.c (__pthread_cond_wait): - Return result of the final locking. - * version.c (__nptl_main): Work around problems with the strange - INTERNAL_SYSCALL macro on ppc32. - * init.c (__pthread_initialize_minimal_internal): Unblock - SIGCANCEL in case the parent blocked it. - Reported by Paul Mackerras <paulus@samba.org>. - - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S: New file. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_signal.S: New file. - * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: New file. - -2003-03-11 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/pthread_cond_timedwait.c - (__pthread_cond_timedwait): Unlock and fail if - __pthread_mutex_unlock_internal failed. - - * sysdeps/pthread/createthread.c (ARCH_CLONE): Define if not defined. - (create_thread): Only assert PD->tcb != NULL under [TLS_TCB_AT_TP]. - Use ARCH_CLONE. - * allocatestack.c (ALLOCATE_STACK_PARMS): New macro. - [NEED_SEPARATE_REGISTER_STACK] (STACK_VARIABLES, - STACK_VARIABLES_ARGS, STACK_VARIABLES_PARMS, ALLOCATE_STACK_PARMS, - ALLOCATE_STACK): New macros. - (TLS_TPADJ): New macro. - (get_cached_stack, queue_stack, __deallocate_stack): Use TLS_TPADJ. - (allocate_stack): Handle TLS_DTV_AT_TP and - NEED_SEPARATE_REGISTER_STACK. Use TLS_TPADJ. - * pthread_create.c (__pthread_create_2_1) [! TLS_TCB_AT_TP]: - Don't set PD->self. - * init.c [__ia64__] (__NR_set_tid_address): Define. - - * sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: New file. - * sysdeps/unix/sysv/linux/ia64/bits/semaphore.h: New file. - * sysdeps/unix/sysv/linux/ia64/fork.c: New file. - * sysdeps/unix/sysv/linux/ia64/createthread.c: New file. - * sysdeps/unix/sysv/linux/ia64/libc-lowlevellock.c: New file. - * sysdeps/unix/sysv/linux/ia64/libc-lowlevelmutex.c: New file. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.c: New file. - * sysdeps/unix/sysv/linux/ia64/lowlevellock.h: New file. - * sysdeps/unix/sysv/linux/ia64/lowlevelmutex.c: New file. - * sysdeps/unix/sysv/linux/ia64/pt-initfini.c: New file. - * sysdeps/unix/sysv/linux/ia64/pt-vfork.S: New file. - * sysdeps/unix/sysv/linux/ia64/pthread_once.c: New file. - * sysdeps/unix/sysv/linux/ia64/sem_post.c: New file. - * sysdeps/unix/sysv/linux/ia64/sem_timedwait.c: New file. - * sysdeps/unix/sysv/linux/ia64/sem_trywait.c: New file. - * sysdeps/unix/sysv/linux/ia64/sem_wait.c: New file. - * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h: New file. - * sysdeps/ia64/bits/atomic.h: New file. - * sysdeps/ia64/Makefile: New file. - * sysdeps/ia64/pthread_spin_init.c: New file. - * sysdeps/ia64/pthread_spin_lock.c: New file. - * sysdeps/ia64/pthread_spin_trylock.c: New file. - * sysdeps/ia64/pthread_spin_unlock.c: New file. - * sysdeps/ia64/pthreaddef.h: New file. - * sysdeps/ia64/tcb-offsets.sym: New file. - * sysdeps/ia64/td_ta_map_lwp2thr.c: New file. - * sysdeps/ia64/tls.h: New file. - - * sysdeps/s390/pthreaddef.h (__exit_thread_inline): Pass 1 argument - to syscall instead of no arguments. - -2003-03-10 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/sem_post.S: New file. - * sysdeps/unix/sysv/linux/x86_64/sem_trywait.S: New file. - * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: New file. - * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: New file. - - * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Fix error value in - unused code. - - * sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S: New file - - * sysdeps/unix/sysv/linux/Makefile (gen-as-const-headers): Add - lowlevelbarrier.sym. - * sysdeps/unix/sysv/linux/lowlevelbarrier.sym: New file. - * sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S: - Include lowlevelbarrier.h and don't define offsets locally. - * sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S: Likewise. - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h - (__lll_mutex_lock_wait): Reverse order of first two parameters. - (__lll_mutex_timedlock_wait): Likewise. - (lll_mutex_lock): Adjust asm for that. - (lll_mutex_timedlock): Likewise. Mark cx, cc, r10 as clobbered. - (lll_lock): Adjust asm for operand order change. - * sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S: New file. - * sysdeps/unix/sysv/linux/x86_64/libc-lowlevelmutex.S: New file. - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h (__lll_lock_wait): - Reverse order of parameters. - (__lll_timedwait_tid): Remove regparms attribute. - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: New file. - * sysdeps/unix/sysv/linux/x86_64/libc-lowlevellock.S: New file. - - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S - (__lll_timedwait_tid): Remove one unnecessary instruction. - - * sysdeps/unix/sysv/linux/sh/lowlevelmutex.S: Define - __lll_mutex_timedlock_wait only for NOT_IN_libc. - * sysdeps/unix/sysv/linux/sh/libc-lowlevelmutex.S: Include - lowlevelmutex.S. - - * sysdeps/unix/sysv/linux/sh/lowlevellock.S: Define - lll_unlock_wake_cb, __lll_wait_tid, and __lll_timedwait_tid only - for NOT_IN_libc. - * sysdeps/unix/sysv/linux/sh/libc-lowlevellock.S: Include - lowlevellock.S. - - * sysdeps/unix/sysv/linux/i386/i486/lowlevelmutex.S: Don't define - LOCK is already defined. Don't define __lll_mutex_timedlock_wait - for libc.so. - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S: Only - define LOCK here (if UP is not defined). The actual code is in - lowlevelmutex.S. - - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Don't define - LOCK is already defined. Don't define lll_unlock_wake_cb and - __lll_timedwait_tid for libc.so. - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S: Only - define LOCK here (if UP is not defined). The actual code is in - lowlevellock.S. - - * sysdeps/unix/sysv/linux/i386/lowlevelsem.h: Not needed anymore. - * sysdeps/unix/sysv/linux/s390/lowlevelsem.h: Likewise. - * sysdeps/unix/sysv/linux/s390/sem_post.c: Include lowlevellock.h - instead of lowlevelsem.h. - * sysdeps/unix/sysv/linux/s390/sem_timedwait.c: Likewise. - * sysdeps/unix/sysv/linux/s390/sem_trywait.c: Likewise. - * sysdeps/unix/sysv/linux/s390/sem_wait.c: Likewise. - - * sysdeps/unix/sysv/linux/Makefile (gen-as-const-headers): Add - lowlevelrwlock.sym. - * sysdeps/unix/sysv/linux/lowlevelrwlock.sym: New file. - * sysdeps/unix/sysv/linux/i386/lowlevelrwlock.h: Removed. - * sysdeps/unix/sysv/linux/sh/lowlevelrwlock.h: Removed. - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h (lll_trylock): Fix - register loading. - * sysdeps/unix/sysv/linux/i386/lowlevellock.h (lll_trylock): Undo - last changed. D'oh. - - * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: New file. - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Remove declaration - of __libc_locking_needed. - (lll_trylock): Initialize %eax to zero. - - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Update - pthread_cond_t definition. - -2003-03-10 Roland McGrath <roland@redhat.com> - - * sysdeps/unix/sysv/linux/lowlevelcond.sym: New file. - * sysdeps/unix/sysv/linux/Makefile (gen-as-const-headers): Add it. - * sysdeps/unix/sysv/linux/sh/lowlevelcond.h: File removed. - * sysdeps/unix/sysv/linux/i386/lowlevelcond.h: Likewise. - * sysdeps/unix/sysv/linux/x86_64/lowlevelcond.h: Likewise. - - * allocatestack.c (allocate_stack) [!TLS_MULTIPLE_THREADS_IN_TCB]: - Instead of setting PD->multiple_threads, set globals - __pthread_multiple_threads and __libc_multiple_threads. - * sysdeps/pthread/createthread.c (create_thread): Likewise. - * sysdeps/i386/tls.h (TLS_MULTIPLE_THREADS_IN_TCB): Define it. - * sysdeps/s390/tls.h (TLS_MULTIPLE_THREADS_IN_TCB): Likewise. - - * descr.h (struct pthread): Conditionalize first member on - [!TLS_DTV_AT_TP]. Replace the `header' member with an anonymous union - containing an anonymous tcbhead_t. Move `list' member out. - [TLS_MULTIPLE_THREADS_IN_TCB]: Define a `multiple_threads' member. - * allocatestack.c: Remove use of `header.data.' prefix. - * pthread_create.c: Likewise. - * init.c (__pthread_initialize_minimal_internal): Likewise. - * sysdeps/pthread/createthread.c (create_thread): Likewise. - * sysdeps/i386/tls.h (INSTALL_DTV): Add parens. - (THREAD_SELF, THREAD_DTV, INSTALL_NEW_DTV): No `header.data.' prefix. - * sysdeps/x86_64/tls.h: Likewise. - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h - (SINGLE_THREAD_P): Likewise. - * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h - (SINGLE_THREAD_P): Likewise. - * sysdeps/i386/tls.h (tcbhead_t): Remove `list' member. - * sysdeps/s390/tls.h (tcbhead_t): Likewise. - -2003-03-09 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/lowlevelcond.h: New file. - - * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h: New file. - * sysdeps/unix/sysv/linux/x86_64/fork.c: New file. - - * sysdeps/unix/sysv/linux/x86_64/pthread_once.S: Fix many - leftovers from the ia32 code. - - * sysdeps/unix/sysv/linux/i386/pthread_once.S: Remove unneccessary - memory load. - (clear_once_control): Don't load %esi. - - * sysdeps/x86_64/tls.h: Remove all traces of segment descriptor - handling. - - * sysdeps/unix/sysv/linux/x86_64/fork.c: New file. - - * sysdeps/unix/sysv/linux/s390/createthread.c: Moved to... - * sysdeps/unix/sysv/linux/createthread.c: ...here. - - * Makefile (tests): Add tst-cond10. - * tst-cond10.c: New file. - -2003-03-08 Ulrich Drepper <drepper@redhat.com> - - * tst-tls2.c (do_test): Add TEMP_FAILURE_RETRY around sem_wait call. - * tst-signal3.c (do_test): Likewise. - * tst-sem5.c (do_test): Likewise. - * tst-kill6.c (do_test): Likewise. - * tst-tls3.c (do_test): Likewise. Include <errno.h>. - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Use add/sub instead - of inc/dec. - * sysdeps/unix/sysv/linux/i386/lowlevelsem.h: Likewise. - * sysdeps/unix/sysv/linux/i386/pthread_once.S: Likewise - * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/lowlevelmutex.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Likewise. - - * allocatestack.c (allocate_stack): If mprotect() fails free the - TLS memory. - -2003-03-07 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/i386/i486/bits/atomic.h: Fix a few unused definitions. - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Remove all trace of - lll_wake_tid. This was used only to work around kernel limits in - the early days. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h: Likewise. - * sysdeps/unix/sysv/linux/sh/libc-lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/sh/lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/sh/lowlevellock.h: Likewise. - - * init.c (__static_tls_align_m1): Renamed from __static_tls_align. - (__pthread_initialize_minimal_internal): Change initialization of - __static_tls_align_m1 appropriately. - * pthreadP.h (__static_tls_align_m1): Renamed from - __static_tls_align. - * allocatestack.c (allocate_stack): Use __static_tls_align_m1 - instead of __static_tls_align-1. - -2003-03-04 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/x86_64/Makefile: New file. - - * pthread_create.c: Define __pthread_keys using nocommon - attribute, not by placing it explicitly in bss. - Remove DEFINE_DEALLOC definition. Not needed anymore. - - * allocatestack.c: Define ARCH_MAP_FLAGS if not already defined. - Use it in mmap call to allocate stacks. - - * sysdeps/pthread/createthread.c (create_thread): Fix comment. - - * pthread_create.c (start_thread): Use THREAD_SETMEM to store - result of the thread function. - -2003-03-03 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/s390/dl-sysdep.h: Removed. The generic - version is just fine. - - * sysdeps/unix/sysv/linux/libc_pthread_init.c - (__pthread_child_handler): Renamed from pthread_child_handler, - exported, and marked hidden. Change all users. - * sysdeps/unix/sysv/linux/register-atfork.c (free_mem): Do not - free __pthread_child_handler from child list. - -2003-03-03 Martin Schwidefsky <schwidefsky@de.ibm.com> - - * atomic.h (atomic_exchange_and_add): Return newval, not oldval. - - * sysdeps/pthread/pthread_cond_timedwait.c (__pthread_cond_timedwait): - Fix handling of cancellation and failing pthread_mutex_unlock call. - * sysdeps/pthread/pthread_cond_wait.c (__condvar_cleanup): Likewise. - (__pthread_cond_wait): Likewise. - - * sysdeps/pthread/pthread_rwlock_timedrdlock.c - (pthread_rwlock_timedrdlock): Fix clobber of result variable by - lll_futex_timed_wait call. - * sysdeps/pthread/pthread_rwlock_timedwrlock.c - (pthread_rwlock_timedwrlock): Likewise. - - * sysdeps/unix/sysv/linux/s390/libc-lowlevellock.c (___lll_lock): - Don't define lll_unlock_wake_cb and ___lll_timedwait_tid in libc.so. - * sysdeps/unix/sysv/linux/s390/lowlevellock.c: Remove XXX comments. - - * sysdeps/unix/sysv/linux/s390/sem_post.c (__new_sem_post): Fix - check of lll_futex_wake return value. - -2003-03-03 Roland McGrath <roland@redhat.com> - - * forward.c: Fix typo in __pthread_attr_init_2_0 compat_symbol decl. - - * sysdeps/pthread/pthread-functions.h (struct pthread_functions): - Argument to ptr___pthread_cleanup_upto is __jmp_buf, not jmp_buf. - * sysdeps/unix/sysv/linux/jmp-unwind.c: Likewise. - -2003-03-02 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/timer_create.c (timer_create): Return correct - error for CPU clocks. - - * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define - _POSIX_MONOTONIC_CLOCK. - * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise. - - * tst-cancel4.c (tf_sleep): Lower sleep time a bit to not upset - recent kernels. - -2003-03-01 Ulrich Drepper <drepper@redhat.com> - - * descr.h (struct pthread): Move cleanup field to the front. - -2003-03-01 Roland McGrath <roland@redhat.com> - - * sem_open.c (sem_open): Braino fix. - -2003-03-01 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/i386/tcb-offsets.sym: Add CLEANUP and CLEANUP_PREV. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Inline - __pthread_cleanup_pop functionality. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - - * descr.h (struct pthread): Move tid field to the front now that - it is often used. - - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S - (__lll_mutex_timedlock_wait): Remove. - (__lll_mutex_unlock_wake): Don't save, load, and restore %esi. - * sysdeps/unix/sysv/linux/i386/i486/lowlevelmutex.S - (__lll_mutex_unlock_wake): Don't save, load, and restore %esi. - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S - (lll_unlock_wake_cb): Don't save and restore %esi. - (__lll_unlock_wake): Add alignment. Don't save, load, and restore - %esi. - (__lll_timedwait_tid): Add alignment. - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S - (__lll_unlock_wake): Add alignment. Don't save, load, and restore - %esi. - (__lll_timedwait_tid): Removed. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S - (__pthread_cond_broadcast): Don't save, load, and restore %esi. - * sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S - (pthread_barrier_wait): Don't save, load, and restore %esi for - last thread. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S - (__pthread_cond_signal): Don't save, load, and restore %esi. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S - (__pthread_rwlock_unlock): Don't save, load, and restore %esi. - * sysdeps/unix/sysv/linux/i386/i486/sem_post.S (__new_sem_post): - Don't save, load, and restore %esi. - -2003-02-27 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: - Release lock before waking up the waiters. - - * tst-exit1.c (do_test): Don't start more than one thread in parallel. - - * tst-rwlock9.c (writer_thread): Correct adding TIMEOUT. - (reader_thread): Likewise. - - * sysdeps/pthread/pthread_rwlock_unlock.c - (__pthread_rwlock_unlock): Release internal lock early. Don't try - to wake up readers if there are none. - - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S: - Release internal lock before wake threads. - -2003-02-26 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-rwlock10 and tst-rwlock11. - * tst-rwlock8.c: Initialize lock with INIT. Allow INIT to be - predefined. - * tst-rwlock9.c: Likewise. - * tst-rwlock10.c: New file. - * tst-rwlock11.c: New file. - - * Makefile (tests): Add tst-dlsym1. - * tst-dlsym1.c: New file. - - * init.c (__pthread_initialize_minimal_internal): Set - GL(dl_error_catch_tsd) to __libc_dl_error_tsd. - * Versions (libc:GLIBC_PRIVATE): Export __libc_dl_error_tsd. - -2003-02-24 Ulrich Drepper <drepper@redhat.com> - - * sem_open.c (sem_open): Fix handling of O_CREAT without O_EXCL. - - * tst-cond2.c: Fix sychronization with child. - - * tst-rwlock8.c (reader_thread): Remove unused variable. - - * Makefile: Add rules to build and run tst-tls3. - * tst-tls3.c: New file. - * tst-tls3mod.c: New file. - - * Makefile (tests): Add tst-rwlock8 and tst-rwlock9. - * tst-rwlock8.c: New file. - * tst-rwlock9.c: New file. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Fix - complete broken rwlock implementation. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S: - Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: Likewise. - * sysdeps/pthread/pthread_rwlock_rdlock.c: Likewise. - * sysdeps/pthread/pthread_rwlock_timedrdlock.c: Likewise. - * sysdeps/pthread/pthread_rwlock_timedwrlock.c: Likewise. - * sysdeps/pthread/pthread_rwlock_unlock.c: Likewise. - * sysdeps/pthread/pthread_rwlock_wrlock.c: Likewise. - -2003-02-23 Roland McGrath <roland@redhat.com> - - * Makefile (nptl-version): Change regexp so case sensitivity is ok. - -2003-02-23 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-context1. - * tst-context1.c: New file. - - * Makefile (tests): Add tst-tls1 and tst-tls2. - * tst-tls1.c: New file. - * tst-tls2.c: New file. - - * libc-cancellation.c (__libc_enable_asynccancel): Correct test - for failed cmpxchg. - - * pthread_create.c (start_thread): Set EXITING_BIT early. - - * sysdeps/i386/tls.h (THREAD_GETMEM): Mark asm as volatile. - (THREAD_GETMEM_NC): Likewise. - -2003-02-22 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S: Shave - off 3 more bytes by using offset-less instructions when possible. - - * Makefile: Add dependency for $(objpfx)version.d. - - * eintr.c (eintr_source): Add unnecessary return but the compiler - insists. - - * tst-kill3.c: Include <unistd.h>. - -2003-02-21 Roland McGrath <roland@redhat.com> - - * pthread_create.c (start_thread): Call __libc_thread_freeres. - -2003-02-21 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-eintr1. - (distribute): Add eintr.c. - * tst-eintr1.c: New file. - * eintr.c: New file. - - * pthread_cancel.c (pthread_cancel): Use tkill directly. - - * sysdeps/unix/sysv/linux/pthread_kill.c (__pthread_kill): - Disallow sending SIGCANCEL. - - * Makefile (tests): Remove tst-basic7. Add tst-kill1, tst-kill2, - tst-kill3, tst-kill4, tst-kill5, tst-kill6. - * tst-kill1.c: New file. - * tst-kill2.c: New file. - * tst-kill3.c: New file. - * tst-kill5.c: New file. - * tst-kill6.c: New file. - * tst-basic7.c: Renamed to... - * tst-kill4.c: ...this. - -2003-02-21 Roland McGrath <roland@redhat.com> - - * Makefile (install-lib-ldscripts): New variable. - -2003-02-21 Ulrich Drepper <drepper@redhat.com> - - * pthreadP.h: Define INVALID_TD_P and INVALID_NOT_TERMINATED_TD_P. - * pthread_cancel.c: Use INVALID_TD_P. - * pthread_detach.c: Likewise. - * pthread_getschedparam.c: Likewise. - * pthread_setschedparam.c: Likewise. - * sysdeps/pthread/pthread_getcpuclockid.c: Likewise. - * sysdeps/unix/sysv/linux/pthread_kill.c: Likewise. - * pthread_join.c: Use INVALID_NOT_TERMINATED_TD_P. - * pthread_timedjoin.c: Likewise. - - * tst-basic7.c: Include <signal.h>. - - * pthread_join.c (pthread_join): Limited checking for invalid - descriptors. - * pthread_timedjoin.c (pthread_timedjoin_np): Likewise. - -2003-02-20 Ulrich Drepper <drepper@redhat.com> - - * pthread_create.c (deallocate_tsd): Reset found_nonzero at the - beginning of the loop. Clear the entire first block of TSD. - * Makefile (tests): Add tst-key4. - * tst-key4.c: New file. - -2003-02-18 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-basic7. - * tst-basic7.c: New file. - - * pthread_create.c (deallocate_tsd): Mark as internal_function. - Add some more __builtin_expect. - - * pthreadP.h: Define dummy version of DEBUGGING_P. - -2003-02-17 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Remnove - _POSIX_THREAD_PRIORITY_SCHEDULING. - * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Remove - _XOPEN_REALTIME_THREADS. - * sysdeps/unix/sysv/linux/bits/posix_opt.h: Likewise. - - * sysdeps/unix/sysv/linux/pthread_kill.c (__pthread_kill): The - kernel returns EINVAL for PID <= 0, work around it. - - * Makefile (tests): Add tst-signal5. - * tst-signal5.c: New file. - - * sysdeps/unix/sysv/linux/bits/local_lim.h: Define TTY_NAME_MAX - and LOGIN_NAME_MAX. - - * tst-cancel1.c (tf): Block all signals. - - * Makefile (tests): Add tst-basic6. - * tst-basic6.c: New file. - - * tst-basic1.c: Add test for process ID. - - * Makefile (tests): Add tst-cancel10. - * tst-cancel10.c: New file. - - * Makefile (tests): Add tst-signal4. - * tst-signal4.c: New file. - - * sysdeps/pthread/pthread_sigmask.c (pthread_sigmask): Use - __sigismember instead of sigismember. Add __builtin_expect. - -2003-02-16 Ulrich Drepper <drepper@redhat.com> - - * tst-attr1.c (do_test): Add tests for pthread_setcanceltype, - pthread_setcancelstate, and pthread_rwlock_setpshared. - - * tst-cancel7.c (do_test): Make sure the pid file exists before - canceling the thread. - - * tst-rwlock6.c: More pthread_rwlock_timedwrlock and - pthread_rwlock_timedrdlock tests. - * tst-rwlock7.c: More pthread_rwlock_timedwrlock tests. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: - Check for invalid tv_nsec field. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S: - Likewise. - - * pthread_mutex_trylock.c (__pthread_mutex_trylock): Protect - recursive mutex of overflow. - - * tst-attr1.c (do_test): Add test for pthread_mutexattr_setpshared. - - * libc-cancellation.c (__libc_enable_asynccancel): Rewrite to avoid - going into an endless loop. - * Makefile (tests): Add tst-cancel9. - * tst-cancel9.c: New file. - - * pthread_cancel.c (pthread_cancel): Use the result of __pthread_kill. - -2003-02-15 Ulrich Drepper <drepper@redhat.com> - - * tst-mutex5.c (do_test): Add more timedlock tests. - - * tst-mutex2.c: Tests of trylock and unlock with ERROR mutexes. - * tst-mutex3.c (do_test): Add tests for trylock with RECURSIVE mutexes. - - * sysdeps/unix/sysv/linux/pthread_kill.c (__pthread_kill): Don't - use INLINE_SYSCALL. Error number is returned, not -1. - - * pthreadP.h: Mark declarations of __find_in_stack_list, __free_tcb, - and __deallocate_stack with internal_function. - * pthread_create.c: Adjust definitions appropriately. - * allocatestack.c: Likewise. - - * pthread_join.c: Add one more __builtin_expect. - * pthread_timedjoin.c: Likewise. - - * pthread_getspecific.c (__pthread_getspecific): Clear data->data - not data of sequence number does not match. - Add one __builtin_expect. - - * Makefile (tests): Add tst-clock1. - * tst-clock1.c: New file. - - * pthread_setconcurrency.c (pthread_setconcurrency): Fail for - negative arguments. - * Makefile (tests): Add tst-basic5. - * tst-basic5.c: New file. - -2003-02-14 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-basic4. - * tst-basic4.c: New file. - - * pthreadP.h: Add declaraction for __nptl_nthreads. - * pthread_create.c: Define __nptl_nthreads - (start_thread): Increment __nptl_nthreads at beginning. Decrement - after thread is done. If then zero, call exit(0). - * sysdeps/pthread/pthread-functions.h (struct pthread_functions): - Add ptr_nthreads. Define HAVE_PTR_NTHREADS. - * init.c (pthread_functions): Initialize ptr_nthreads. - * allocatestack.c (nptl_nthreads): Remove definition and all uses. - (__reclaim_stacks): Decrement __nptl_nthreads. - * sysdeps/pthread/Makefile [$(subdir)==csu] (CFLAGS-libc-start.c): - Define. - * Makefile (tests): Add tst-basic3. - * tst-basic3.c: New file. - - * descr.h: Define CANCELING_BIT and CANCELING_BITMASK. Introduce - after CANCELTYPE_BIT, move the other bits up. Update CANCEL_RESTMASK. - * init.c (sigcancel_handler): Also set CANCELING_BITMASK bit in newval. - * pthread_cancel.c (pthread_cancel): Likewise. Also set CANCELING_BIT - if asynchronous canceling is enabled. - * pthread_join.c (pthread_join): When recognizing circular joins, - take into account the other thread might be already canceled. - * Makefile (tests): Add tst-join5. - * tst-join5.c: New file. - - * Makefile (tests): Add tst-join4. - * tst-join4.c: New file. - -2003-02-13 Ulrich Drepper <drepper@redhat.com> - - * tst-cond4.c (main): Add test of pthread_attr_getpshared. - -2003-02-13 Martin Schwidefsky <schwidefsky@de.ibm.com> - - * sysdeps/s390/tls.h (THREAD_GETMEM, THREAD_GETMEM_NC, THREAD_SETMEM, - THREAD_SETMEM_NC): Use passed descr instead of THREAD_SELF. - * sysdeps/unix/sysv/linux/s390/jmp-unwind.c (_longjmp_unwind): Avoid - warning. - * sysdeps/unix/sysv/linux/s390/lowlevellock.c: Include <sys/time.h> - to avoid warning. - * sysdeps/unix/sysv/linux/s390/sem_post.c (__new_sem_post): Return - error if lll_futex_wake failed. - -2003-02-13 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Fix - handling of cancellation and failung pthread_mutex_unlock call. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - * Makefile (tests): Add tst-cond8 and tst-cond9. - * tst-cond8.c: New file. - * tst-cond9.c: New file. - - * tst-cond7.c (do_test): Unlock the mutex before canceling the thread. - - * sysdeps/pthread/pthread.h: Add missing initializers. Protect - non-standard initializers with __USE_GNU. - - * Makefile (tests): Add tst-cleanup3. - * tst-cleanup3.c: New file. - -2003-02-12 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-attr1 and tst-attr2. - * tst-attr1.c: New file. - * tst-attr2.c: New file. - - * Makefile: Add rules to build and run tst-atfork2 test. - * tst-atfork2.c: New file. - * tst-atfork2mod.c: New file. - - * sysdeps/unix/sysv/linux/unregister-atfork.c - (__unregister_atfork): Free the memory allocated for the handlers - after removing them from the lists. - - * sysdeps/unix/sysv/linux/register-atfork.c: Define memeory - cleanup function. - - * tst-atfork1.c (do_test): Wait for the child we forked. - Report error in child. - - * sysdeps/unix/sysv/linux/fork.c (__libc_fork): Fix comment. - - * sysdeps/pthread/Makefile: Define CFLAGS-confstr.c. - -2003-02-10 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-cancel8. - * tst-cancel8.c: New file. - - * sysdeps/unix/sysv/linux/i386/pthread_once.S (clear_once_control): Fix - clearing of control variable. - * Makefile (tests): Add tst-once3 and tst-once4. - * tst-once3.c: New file. - * tst-once4.c: New file. - -2003-02-08 kaz Kojima <kkojima@rr.iij4u.or.jp> - - * sysdeps/sh/Makefile: New file. - * sysdeps/sh/bits/atomic.h: New file. - * sysdeps/sh/pthread_spin_init.c: New file. - * sysdeps/sh/pthread_spin_lock.c: New file. - * sysdeps/sh/pthread_spin_trylock.S: New file. - * sysdeps/sh/pthread_spin_unlock.S: New file. - * sysdeps/sh/pthreaddef.h: New file. - * sysdeps/sh/tcb-offsets.sym: New file. - * sysdeps/sh/td_ta_map_lwp2thr.c: New file. - * sysdeps/sh/tls.h: New file. - * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h: New file. - * sysdeps/unix/sysv/linux/sh/bits/semaphore.h: New file. - * sysdeps/unix/sysv/linux/sh/createthread.c: New file. - * sysdeps/unix/sysv/linux/sh/fork.c: New file. - * sysdeps/unix/sysv/linux/sh/libc-lowlevellock.S: New file. - * sysdeps/unix/sysv/linux/sh/libc-lowlevelmutex.S: New file. - * sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h: New file. - * sysdeps/unix/sysv/linux/sh/lowlevelcond.h: New file. - * sysdeps/unix/sysv/linux/sh/lowlevellock.S: New file. - * sysdeps/unix/sysv/linux/sh/lowlevellock.h: New file. - * sysdeps/unix/sysv/linux/sh/lowlevelmutex.S: New file. - * sysdeps/unix/sysv/linux/sh/lowlevelrwlock.h: New file. - * sysdeps/unix/sysv/linux/sh/pt-initfini.c: New file. - * sysdeps/unix/sysv/linux/sh/pt-vfork.S: New file. - * sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S: New file. - * sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S: New file. - * sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S: New file. - * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: New file. - * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: New file. - * sysdeps/unix/sysv/linux/sh/pthread_once.S: New file. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: New file. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S: New file. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S: New file. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S: New file. - * sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S: New file. - * sysdeps/unix/sysv/linux/sh/sem_post.S: New file. - * sysdeps/unix/sysv/linux/sh/sem_timedwait.S: New file. - * sysdeps/unix/sysv/linux/sh/sem_trywait.S: New file. - * sysdeps/unix/sysv/linux/sh/sem_wait.S: New file. - * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: New file. - -2003-02-08 Ulrich Drepper <drepper@redhat.com> - - * tst-cond2.c: Rearrange code to not rely on behavior undefined - according to POSIX. - - * tst-basic2.c (do_test): Lock mutex before creating the thread. - -2003-02-07 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/x86_64/tls.h: Remove unnecessary macros, left over from x86. - (TLS_GET_FS): New #define. - (TLS_SET_FS): New #define. - Correct value of __NR_set_thread_area. - - * sysdeps/x86_64/td_ta_map_lwp2thr.c: New file. - -2003-02-06 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-popen1. - * tst-popen1.c: New file. - - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Remove wrong - but inactive generalization. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S: Likewise. - Minor optimization, remove one instruction. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: Likewise. - -2003-02-04 Martin Schwidefsky <schwidefsky@de.ibm.com> - - * sysdeps/unix/sysv/linux/s390/fork.c: Correct order of parameters. - -2003-01-31 Martin Schwidefsky <schwidefsky@de.ibm.com> - - * init.c (__NR_set_tid_address): Add #ifdef for s390. - * sysdeps/pthread/pthread_barrier_wait.c: New file. - * sysdeps/pthread/pthread_cond_broadcast.c: New file. - * sysdeps/pthread/pthread_cond_signal.c: New file. - * sysdeps/pthread/pthread_cond_timedwait.c: New file. - * sysdeps/pthread/pthread_cond_wait.c: New file. - * sysdeps/pthread/pthread_rwlock_rdlock.c: New file. - * sysdeps/pthread/pthread_rwlock_timedrdlock.c: New file. - * sysdeps/pthread/pthread_rwlock_timedwrlock.c: New file. - * sysdeps/pthread/pthread_rwlock_unlock.c: New file. - * sysdeps/pthread/pthread_rwlock_wrlock.c: New file. - * sysdeps/s390/Makefile: New file. - * sysdeps/s390/bits/atomic.h: New file. - * sysdeps/s390/pthread_spin_init.c: New file. - * sysdeps/s390/pthread_spin_lock.c: New file. - * sysdeps/s390/pthread_spin_trylock.c: New file. - * sysdeps/s390/pthread_spin_unlock.c: New file. - * sysdeps/s390/pthreaddef.h: New file. - * sysdeps/s390/tcb-offsets.sym: New file. - * sysdeps/s390/td_ta_map_lwp2thr.c: New file. - * sysdeps/s390/tls.h: New file. - * sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: New file. - * sysdeps/unix/sysv/linux/s390/bits/semaphore.h: New file. - * sysdeps/unix/sysv/linux/s390/createthread.c: New file. - * sysdeps/unix/sysv/linux/s390/dl-sysdep.h: New file. - * sysdeps/unix/sysv/linux/s390/fork.c: New file. - * sysdeps/unix/sysv/linux/s390/jmp-unwind.c: New file. - * sysdeps/unix/sysv/linux/s390/libc-lowlevellock.c: New file. - * sysdeps/unix/sysv/linux/s390/libc-lowlevelmutex.c: New file. - * sysdeps/unix/sysv/linux/s390/lowlevellock.c: New file. - * sysdeps/unix/sysv/linux/s390/lowlevellock.h: New file. - * sysdeps/unix/sysv/linux/s390/lowlevelmutex.c: New file. - * sysdeps/unix/sysv/linux/s390/lowlevelsem.h: New file. - * sysdeps/unix/sysv/linux/s390/pthread_once.c: New file. - * sysdeps/unix/sysv/linux/s390/s390-32/pt-initfini.c: New file. - * sysdeps/unix/sysv/linux/s390/s390-32/pt-vfork.S: New file. - * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h: New file. - * sysdeps/unix/sysv/linux/s390/s390-64/pt-initfini.c: New file. - * sysdeps/unix/sysv/linux/s390/s390-64/pt-vfork.S: New file. - * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h: New file. - * sysdeps/unix/sysv/linux/s390/sem_post.c: New file. - * sysdeps/unix/sysv/linux/s390/sem_timedwait.c: New file. - * sysdeps/unix/sysv/linux/s390/libc-lowlevellock.c: New file. - * sysdeps/unix/sysv/linux/s390/sem_wait.c: New file. - -2003-02-04 Ulrich Drepper <drepper@redhat.com> - - * atomic.h: Add a couple more default implementations. - (atomic_compare_and_exchange_acq): Use - __arch_compare_and_exchange_32_acq in return value definition. It - always exists. - (atomic_bit_set): Renamed from atomic_set_bit. - Add missing atomic_ prefixes. - - * sysdeps/pthread/bits/libc-lock.h (__libc_once): In case no - thread library is available, use correct value to mark initialized - once variable. - -2003-02-03 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (allocate_stack): Use __getpagesize instead of - __sysconf to determine pagesize. - - * pthread_create.c: Include <atomic.h>. - * allocatestack.c (allocate_stack): Implement coloring of the - allocated stack memory. Rename pagesize to pagesize_m1. It's the - size minus one. Adjust users. - * sysdeps/i386/i686/Makefile: New file. - -2003-02-02 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c: Improve comment throughout the file. - - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S - (__lll_lock_wait): Add branch prediction. - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S - (__lll_lock_wait): Likewise. - (lll_unlock_wake_cb): Removed. - -2003-01-31 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/bits/posix_opt.h: Remove - _POSIX_THREAD_PRIORITY_SCHEDULING. - -2003-01-30 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/pthread-functions.h (struct pthread_functions): - Fix return type of ptr___pthread_getspecific. - -2003-01-29 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-umask1. - (tst-umask1-ARGS): Define. - * tst-umask1.c: New file. - -2003-01-28 Ulrich Drepper <drepper@redhat.com> - - * Makefile (libpthread-routines): Remove lowlevelrwlock. Add - pthread_rwlock_rdlock, pthread_rwlock_timedrdlock, - pthread_rwlock_wrlock, pthread_rwlock_timedwrlock, and - pthread_rwlock_unlock. - * sysdeps/unix/sysv/linux/i386/i486/lowlevelrwlock.S: Removed - * sysdeps/unix/sysv/linux/i386/i586/lowlevelrwlock.S: Removed - * sysdeps/unix/sysv/linux/i386/i686/lowlevelrwlock.S: Removed - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: New file. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: - New file. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: New file. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S: - New file. - * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S: New file. - * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_rdlock.S: New file. - * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedrdlock.S: - New file. - * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_wrlock.S: New file. - * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedwrlock.S: - New file. - * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_unlock.S: New file. - * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_rdlock.S: New file. - * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedrdlock.S: - New file. - * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_wrlock.S: New file. - * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedwrlock.S: - New file. - * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_unlock.S: New file. - - * Makefile (libpthread-routines): Remove lowlevelcond and - lowlevelsem. Add sem_wait, sem_trywait, sem_timedwait, sem_post, - pthread_cond_wait, pthread_cond_timedwait, pthread_cond_signal, - and pthread_cond_broadcast. - * sysdeps/unix/sysv/linux/i386/i486/lowlevelsem.S: Removed - * sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S: Removed - * sysdeps/unix/sysv/linux/i386/i586/lowlevelsem.S: Removed - * sysdeps/unix/sysv/linux/i386/i586/lowlevelcond.S: Removed - * sysdeps/unix/sysv/linux/i386/i686/lowlevelsem.S: Removed - * sysdeps/unix/sysv/linux/i386/i686/lowlevelcond.S: Removed - * sysdeps/unix/sysv/linux/i386/i486/sem_wait.S: New file. - * sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S: New file. - * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S: New file. - * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: New file. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: New file. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: New file. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S: New file. - * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: New file. - * sysdeps/unix/sysv/linux/i386/i586/sem_wait.S: New file. - * sysdeps/unix/sysv/linux/i386/i586/sem_trywait.S: New file. - * sysdeps/unix/sysv/linux/i386/i586/sem_timedwait.S: New file. - * sysdeps/unix/sysv/linux/i386/i586/sem_post.S: New file. - * sysdeps/unix/sysv/linux/i386/i586/pthread_cond_wait.S: New file. - * sysdeps/unix/sysv/linux/i386/i586/pthread_cond_timedwait.S: New file. - * sysdeps/unix/sysv/linux/i386/i586/pthread_cond_signal.S: New file. - * sysdeps/unix/sysv/linux/i386/i586/pthread_cond_broadcast.S: New file. - * sysdeps/unix/sysv/linux/i386/i686/sem_wait.S: New file. - * sysdeps/unix/sysv/linux/i386/i686/sem_trywait.S: New file. - * sysdeps/unix/sysv/linux/i386/i686/sem_timedwait.S: New file. - * sysdeps/unix/sysv/linux/i386/i686/sem_post.S: New file. - * sysdeps/unix/sysv/linux/i386/i686/pthread_cond_wait.S: New file. - * sysdeps/unix/sysv/linux/i386/i686/pthread_cond_timedwait.S: New file. - * sysdeps/unix/sysv/linux/i386/i686/pthread_cond_signal.S: New file. - * sysdeps/unix/sysv/linux/i386/i686/pthread_cond_broadcast.S: New file. - * sysdeps/unix/sysv/linux/i386/lowlevelcond.h: New file. - - * sysdeps/unix/sysv/linux/i386/createthread.c: Define - PREPARE_CREATE and TLS_VALUE with x86-specific bits. All the rest - of the code is moved to ... - * sysdeps/pthread/createthread.c: ...here. New file. - -2003-01-27 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/lowlevelsem.S - (__new_sem_post): Clear %eax before returning. - Reported by MAEDA Naoaki <maeda.naoaki@jp.fujitsu.com>. - - * Makefile (tests): Add tst-cleanup2. - * tst-cleanup2.c: New file. - - * sysdeps/pthread/bits/libc-lock.h (__libc_cleanup_region_start): - Interpret first parameter correctly. - -2003-01-17 Ulrich Drepper <drepper@redhat.com> - - * Makefile (headers): Add bits/semaphore.h. - -2003-01-16 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/i386/tls.h (INIT_SYSINFO): Initialize _head->sysinfo even - if not SHARED. - -2003-01-14 Ulrich Drepper <drepper@redhat.com> - - * sem_open.c (sem_open): Return SEM_FAILED if existing semaphore - must be used and mapping failed. - Reported by Luke Elliott <luke.elliott@activfinancial.com>. - - * Makefile (CFLAGS-pthread_self.os): Define this, not - CFLAGS-pthread_self.c. - -2003-01-13 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S: Don't export - lll_unlock_wake_cb. - - * Makefile (libpthread-routines): Add version. Add rules to build - version.os and banner.h. - * version.c: New file. - -2003-01-13 Jakub Jelinek <jakub@redhat.com> - - * pthread_mutex_lock.c (__pthread_mutex_lock_internal): Make - the alias unconditional. - * pthread_mutex_unlock.c (__pthread_mutex_unlock_internal): Likewise. - -2003-01-13 Ulrich Drepper <drepper@redhat.com> - - * Makefile (CFLAGS-pthread_self.c): New definition. - -2003-01-06 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/pthread_sigmask.c (pthread_sigmask): Add - INTERNAL_SYSCALL_DECL, add err argument to INTERNAL_SYSCALL* macros. - * sysdeps/unix/sysv/linux/raise.c (raise): Likewise. - * init.c (__pthread_initialize_minimal_internal): Likewise. - -2003-01-07 Jakub Jelinek <jakub@redhat.com> - - * pthreadP.h (__pthread_cond_timedwait): Add prototype. - - * sysdeps/unix/sysv/linux/i386/dl-sysdep.h - (RTLD_CORRECT_DYNAMIC_WEAK): Remove. - (DL_SYSINFO_IMPLEMENTATION): Change into .text section and back. - * sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h - (RTLD_CORRECT_DYNAMIC_WEAK): Remove. - (DL_SYSINFO_IMPLEMENTATION): Change into .text section and back. - -2003-01-06 Jakub Jelinek <jakub@redhat.com> - - * pthreadP.h (LIBC_CANCEL_HANDLED): Define. - * pt-system.c (LIBC_CANCEL_HANDLED): Add. - * tst-cancel-wrappers.sh: Remove all exceptions. - -2003-01-05 Ulrich Drepper <drepper@redhat.com> - - * tst-cancel-wrappers.sh: Invoke gawk not awk since we use GNU awk - features. Reported by Marijn Ros <marijn@mad.scientist.com>. - - * sysdeps/unix/sysv/linux/jmp-unwind.c: Include <pthread-functions.h>. - Use __libc_pthread_functions array if SHARED. - - * pthreadP.h: Move pthread_cond_2_0_t definition to... - * sysdeps/unix/sysv/linux/internaltypes.h: ...here. - - * sysdeps/pthread/bits/libc-lock.h (__libc_ptf_call): New #define. - (__libc_rwlock_rdlock, __libc_rwlock_wrlock, __libc_rwlock_unlock, - __libc_key_create, __libc_getspecific, __libc_setspecific): Use - __libc_ptf_call instead of __libc_maybe_call. - (PTF): New #define. - (__libc_cleanup_region_start): Wrap function name with PTF call. - (__libc_cleanup_region_end): Likewise. - (__libc_cleanup_end): Likewise. - - * pthread_getspecific.c: Add __pthread_getspecific_internal alias. - * pthread_setspecific.c: Add __pthread_setspecific_internal alias. - * pthread_key_create.c: Add __pthread_key_create_internal alias. - * pthreadP.h: Add prototypes. - - * sysdeps/unix/sysv/linux/i386/i486/lowlevelrwlock.S: Add - __pthread_rwlock_rdlock, __pthread_rwlock_wrlock, and - __pthread_rwlock_unlock aliases. - * pthreadP.h: Add prototypes for new aliases. - - * pthreadP.h (struct pthead_functions): Moved to... - * sysdeps/pthread/pthread-functions.h: ...here. New file. - * init.c (pthread_functions): Add initializers for new elements. - - * cleanup_defer.c: Add __pthread_cleanup_push_defer and - __pthread_cleanup_pop_restore aliases. - * pthreadP.h: Add prototypes. - - * cleanup.c: Rename _GI_pthread_cleanup_push to __pthread_cleanup_push - and _GI_pthread_cleanup_pop to __pthread_cleanup_pop. - * sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S: Adjust caller. - * sysdeps/unix/sysv/linux/i386/pthread_once.S: Likewise. - * sysdeps/unix/sysv/linux/x86_64/pthread_once.S: Likewise. - * pthreadP.h: Adjust prototypes and callers. - -2003-01-04 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-cancel7. - (tst-cancel7-ARGS): New variable. - * tst-cancel7.c: New file. - - * old_pthread_cond_broadcast.c: Optimize initialization a bit to work - around gcc defficiencies. - * old_pthread_cond_signal.c: Likewise. - * old_pthread_cond_timedwait.c: Likewise. - * old_pthread_cond_wait.c: Likewise. - - * pthreadP.h (pthread_cond_2_0_t): Remove unneeded lock element. - -2003-01-03 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-cond7. - * tst-cond7.c: New file. - - * sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S - (condvar_cleanup): Get condvar address from the right place. - - * atomic.h: Correct definitions of atomic_full_barrier, - atomic_read_barrier, atomic_write_barrier. - - * old_pthread_cond_broadcast.c: Make memory allocate and initialization - race-free. - * old_pthread_cond_signal.c: Likewise. - * old_pthread_cond_timedwait.c: Likewise. - * old_pthread_cond_wait.c: Likewise. - -2003-01-03 Jakub Jelinek <jakub@redhat.com> - - * Makefile ($(objpfx)libpthread.so): Depend on ld.so. - -2003-01-03 Ulrich Drepper <drepper@redhat.com> - - * pthreadP.h (pthread_cond_2_0_t): New type. - (struct pthread_functions): Use new type for 2.0 condvar callbacks. - Use new type for the 2.0 condvar function prototypes. - * forward.c: Use pthread_cond_2_0_t for 2.0 condvar functions. - * old_pthread_cond_init.c: Use pthread_cond_2_0_t for condvar - parameter. - * old_pthread_cond_destroy.c: Likewise. - * old_pthread_cond_broadcast.c: Likewise. Lock appropriately. - * old_pthread_cond_signal.c: Likewise. - * old_pthread_cond_timedwait.c: Likewise. - * old_pthread_cond_wait.c: Likewise. - - * sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S - (__pthread_cond_wait): Don't save cancellation mode and seq value - in same location. - - * herrno.c (__h_errno_location): Don't define as weak. - -2003-01-02 Jakub Jelinek <jakub@redhat.com> - - * Versions [libc] (GLIBC_2.3.2): Export pthread_cond_broadcast, - pthread_cond_destroy, pthread_cond_init, pthread_cond_signal - and pthread_cond_wait. - * old_pthread_cond_broadcast.c (__old_pthread_cond_broadcast): - Renamed to... - (__pthread_cond_broadcast_2_0): ... this. - * old_pthread_cond_destroy.c (__old_pthread_cond_destroy): - Renamed to... - (__pthread_cond_destroy_2_0): ... this. - * old_pthread_cond_init.c (__old_pthread_cond_init): - Renamed to... - (__pthread_cond_init_2_0): ... this. - * old_pthread_cond_signal.c (__old_pthread_cond_signal): - Renamed to... - (__pthread_cond_signal_2_0): ... this. - * old_pthread_cond_wait.c (__old_pthread_cond_wait): - Renamed to... - (__pthread_cond_wait_2_0): ... this. - * pthread_cond_destroy.c: Include shlib-compat.h. - (pthread_cond_destroy): Change strong_alias into versioned_symbol. - * pthread_cond_init.c: Include shlib-compat.h. - (pthread_cond_init): Change strong_alias into versioned_symbol. - * pthreadP.h (struct pthread_functions): Rename ptr_pthread_cond_* - fields to ptr___pthread_cond_* and add ptr___pthread_cond_*_2_0 - fields. - (__pthread_cond_broadcast_2_0, __pthread_cond_destroy_2_0, - __pthread_cond_init_2_0, __pthread_cond_signal_2_0, - __pthread_cond_wait_2_0): New prototypes. - (__old_pthread_cond_broadcast, __old_pthread_cond_destroy, - __old_pthread_cond_init, __old_pthread_cond_signal, - __old_pthread_cond_wait): Removed. - * init.c: Include shlib-compat.h. - (pthread_functions): Guard ptr___pthread_attr_init_2_0 - initialization with SHLIB_COMPAT (GLIBC_2_0, GLIBC_2_1). - Rename ptr_pthread_cond_* to ptr___pthread_cond_*, initialize - ptr___pthread_cond_*_2_0 fields. - * forward.c: Export both pthread_cond_*@@GLIBC_2.3.2 and - pthread_cond_*@GLIBC_2.0 compatibility symbols. - - * sysdeps/pthread/sigaction.c (SIGCANCEL): Only define if - LIBC_SIGACTION was not yet defined. - [!defined LIBC_SIGACTION]: Define LIBC_SIGACTION, #include self. - [!defined LIBC_SIGACTION] (__sigaction): New function and - libc_hidden_weak. - [!defined LIBC_SIGACTION] (sigaction): New weak_alias. - [defined LIBC_SIGACTION]: #include_next <sigaction.c>. - -2003-01-02 Jakub Jelinek <jakub@redhat.com> - - * Makefile (CFLAGS-pthread_atfork.c): Add -DNOT_IN_libc. - -2003-01-02 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h (pthread_cond_t): - New, larger type definition. - * sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S: New condvar - implementation. - * Versions [libpthread]: Add definitions for new pthread_cond_* - interfaces for version GLIBC_2.3.2. - * pthread_cond_init.c: Update initialization for new type definition. - * Makefile (libpthread-routines): Remove pthread_cond_wait, - pthread_cond_timedwait, pthread_cond_signal, and - pthread_cond_broadcast. Add old_pthread_cond_init, - old_pthread_cond_destroy, old_pthread_cond_wait, - old_pthread_cond_timedwait, old_pthread_cond_signal, and - old_pthread_cond_broadcast. - * old_pthread_cond_broadcast.c: New file. - * old_pthread_cond_destroy.c: New file. - * old_pthread_cond_init.c: New file. - * old_pthread_cond_signal.c: New file. - * old_pthread_cond_timedwait.c: New file. - * old_pthread_cond_wait.c: New file. - * pthreadP.h: Add prototypes for the compatibility interfaces. - - * pthread_cond_destroy.c: Don't include <errno.h>. - -2003-01-01 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/lowlevelrwlock.S: Avoid - unnecessary zero offset when addressing MUTEX. - -2002-12-31 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/fork.h: Add libc_hidden_proto for - __register_atfork. - * sysdeps/unix/sysv/linux/register-atfork.c: Add libc_hidden_def - for __register_atfork. - -2002-12-31 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Use __ASSEMBLER__ - instead of ASSEMBLER test macro. - - * sysdeps/unix/sysv/linux/allocrtsig.c (__libc_current_sigrtmin, - __libc_current_sigrtmax): Add libc_hidden_def. - - * sysdeps/pthread/list.h: Remove assert.h include. - -2002-12-31 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pt-initfini.c (call_initialize_minimal): Use - __pthread_initialize_minimal_internal not - __pthread_initialize_minimal. - -2002-12-30 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pt-initfini.c (call_initialize_minimal): Mark - __pthread_initialize_minimal as hidden. - - * init.c (__pthread_initialize_minimal_internal): Don't mark as - constructor. - -2002-12-31 Jakub Jelinek <jakub@redhat.com> - - * Makefile ($(inst_libdir)/libpthread.so): Depend on - $(common-objpfx)format.lds, include that into the output script. - Fix comment. - (extra-B-pthread.so): Change linuxthreads/ into nptl/. - -2002-12-28 Andreas Jaeger <aj@suse.de> - - * sysdeps/unix/sysv/linux/xstatconv.c (xstat_conv): Adjust for - nsec resolution changes. - (xstat64_conv): Likewise. - (xstat32_conv): Likewise. - * sysdeps/unix/sysv/linux/kernel_stat.h: Add nsec resolution for - struct kernel_stat. - * sysdeps/unix/sysv/linux/bits/stat.h: Add nsec resolution for - structs stat and stat64. - * time/time.h (__timespec_defined): Define for __USE_MISC. - * io/sys/stat.h [__USE_MISC]: Define __need_timespec for struct stat. - -2002-12-30 Jakub Jelinek <jakub@redhat.com> - - * forward.c (FORWARD2): Renamed from FORWARD3. Remove unused export - argument. - (pthread_attr_init_2_0, pthread_attr_init_2_1): Use FORWARD macro. - (pthread_exit): Use strong_alias to avoid warnings. - * pthreadP.h (struct pthread_functions): Rename ptr_pthread_exit - and ptr_pthread_attr_init_2_* to ptr___pthread_exit and - ptr___pthread_attr_init_2_*. - * init.c (pthread_functions): Adjust. - -2002-12-29 Ulrich Drepper <drepper@redhat.com> - - * forward.c: Make all functions available by default again. It - caused too much trouble. - - * pt-siglongjmp.c: Removed. - -2002-12-28 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/i386/tls.h: Include tcb-offsets.h in assembler. - (SYSINFO_OFFSET, MULTIPLE_THREADS_OFFSET): Remove. - * sysdeps/i386/Makefile: New file. - * sysdeps/i386/tcb-offsets.sym: New file. - * sysdeps/pthread/tcb-offsets.h: New file. - * sysdeps/unix/sysv/linux/libc_pthread_init.c (__libc_pthread_init): - Remove MULTIPLE_THREADS_OFFSET and SYSINFO_OFFSET checks. - - * sysdeps/unix/sysv/linux/Versions [libc] (GLIBC_PRIVATE): Move - __register_atfork... - (GLIBC_2.3.2): ...here. - -2002-12-28 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread.h: Mark pthread_attr_getstackaddr and - pthread_attr_setstackaddr with __attribute_deprecated__. - -2002-12-27 Jakub Jelinek <jakub@redhat.com> - - * pt-system.c (system): Remove cancellation handling. - * tst-cancel-wrappers.sh: Allow pt-system.o* to not use the - cancellation routines. - -2002-12-28 Ulrich Drepper <drepper@redhat.com> - - * descr.h: Include <dl-sysdep.h>. - (struct pthread): Move header.data.list to the back of the struct. - * sysdeps/i386/tls.h (tcbhead_t): Move list to the back of the struct. - (MULTIPLE_THREADS_OFFSET): Adjust offset. - (SYSINFO_OFFSEET): Likewise. - -2002-12-27 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h (USE_DL_SYSINFO): - Define. - (DL_SYSINFO_DEFAULT): Cast to uintptr_t to avoid warnings. - * sysdeps/unix/sysv/linux/i386/dl-sysdep.h (NEED_DL_SYSINFO, - DL_SYSINFO_DEFAULT, DL_SYSINFO_IMPLEMENTATION): Define. - (USE_DL_SYSINFO): Undef. - -2002-12-22 Jakub Jelinek <jakub@redhat.com> - - * Makefile (tests-reverse): Use $(objpfx)../libc.so instead of - $(common-objpfx)libc.so. - * tst-cancel4.c (tf_write, tf_writev): Increase buf sizes so that - it is bigger than pipe buffer size even on arches with bigger - page size. - (tf_usleep): Cast usleep argument to useconds_t to avoid warnings. - -2002-12-25 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/lowlevelsem.S: Implement - correct errno access for case that USE___THREAD is not defined. - -2002-12-24 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/dl-sysdep.h: Add missing #endif. - Patch by Marijn Ros <marijn@mad.scientist.com>. - -2002-12-22 Roland McGrath <roland@redhat.com> - - * Makefile (omit-deps): Add $(unix-syscalls:%=ptw-%). - -2002-12-20 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/bits/stdio-lock.h (_IO_lock_inexpensive): Define. - -2002-12-19 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/dl-sysdep.h: Don't define - NEED_DL_SYSINFO since no processor < i686 had the sysenter opcode. - * sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h: New file. - - * sysdeps/unix/sysv/linux/i386/pthread_once.S: Use ENTER_KERNEL instead - of int $0x80. - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/lowlevelmutex.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/lowlevelrwlock.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/lowlevelsem.S: Likewise. - * sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S: Likewise. - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Add support for using - sysenter. - * sysdeps/unix/sysv/linux/i386/lowlevelsem.h: Likewise. - - * sysdeps/i386/tls.h: Unconditionally include <dl-sysdep.h>. - - * allocatestack.c (allocate_stack) [NEED_DL_SYSINFO]: Set sysinfo - in new TCB. - * sysdeps/unix/sysv/linux/i386/createthread.c (create_thread): Check - that sysinfo is properly initialized. - * sysdeps/unix/sysv/linux/i386/dl-sysdep.h: Define RTLD_PRIVATE_ERRNO - to 1 only for ld.so. - - * sysdeps/unix/sysv/linux/i386/dl-sysdep.h: Define - RTLD_CORRECT_DYNAMIC_WEAK. - -2002-12-19 Jakub Jelinek <jakub@redhat.com> - - * forward.c (pthread_attr_init_2_0, pthread_attr_init_2_1): - Use return 0 as 6th argument to FORWARD4. - * pthread_equal.c: Include pthreadP.h instead of pthread.h. - -2002-12-18 Ulrich Drepper <drepper@redhat.com> - - * descr.h (struct pthread) [NEED_DL_SYSINFO]: Add sysinfo member. - * sysdeps/i386/tls.h (tcbhead_t): Add sysinfo member. - Define SYSINFO_OFFSEET if NEED_DL_SYSINFO is defined. - (INIT_SYSINFO): New #define. - (TLS_TP_INIT): Use INIT_SYSINFO. - * sysdeps/unix/sysv/linux/libc_pthread_init.c (__libc_pthread_init): - At test to make sure SYSINFO_OFFSET value is correct. - * sysdeps/unix/sysv/linux/i386/dl-sysdep.h: New file. - -2002-12-18 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/flockfile.c (flockfile): Change into weak alias. - * sysdeps/unix/sysv/linux/raise.c (gsignal): Add weak alias to raise. - * Versions [libc: GLIBC_2.0]: Add pthread_attr_init. - [libpthread: GLIBC_2.1]: Remove __pthread_rwlock_init, - __pthread_rwlock_destroy, __pthread_rwlock_rdlock, - __pthread_rwlock_wrlock, __pthread_rwlock_unlock, - __pthread_rwlock_tryrdlock and __pthread_rwlock_trywrlock. - -2002-12-18 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Use ENTER_KERNEL - macro instead of using int $0x80 directly. - - * sysdeps/pthread/bits/stdio-lock.h: New file. - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S: New file. - * sysdeps/unix/sysv/linux/i386/i586/libc-lowlevelmutex.S: New file. - * sysdeps/unix/sysv/linux/i386/i686/libc-lowlevelmutex.S: New file. - * Makefile (routines): Add libc-lowlevelmutex. - - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S: Remove - __i686.get_pc_thunk.dx. - -2002-12-17 Jakub Jelinek <jakub@redhat.com> - - * Makefile (libpthread-shared-only-routines): Add pt-allocrtsig. - (tests): Depend on $(objpfx)tst-cancel-wrappers.out. - ($(objpfx)tst-cancel-wrappers.out): New rule. - * tst-cancel-wrappers.sh: New test. - * tst-locale1.c: Include signal.h. - (uselocale): Test static linking of __libc_current_sigrt*. - -2002-12-17 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-cancel6. - * tst-cancel6.c: New file - -2002-12-17 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (SINGLE_THREAD_P): - Define meaningfully for assembler as well. - * pthreadP.h (struct pthread_functions): Remove - ptr_pthread_attr_init field. Add ptr_pthread_attr_init_2_0 - and ptr_pthread_attr_init_2_1 fields. - * init.c (pthread_functions): Initialize ptr_pthread_attr_init_2_0 - and ptr_pthread_attr_init_2_1 instead of ptr_pthread_attr_init. - * forward.c (FORWARD4): Renamed from FORWARD3. Add export argument. - (FORWARD3): Define using FORWARD4. - (pthread_attr_init): Provide both @GLIBC_2.0 and @@GLIBC_2.1 - versions. - * pt-system.c: Remove duplicate stdlib.h include. - -2002-12-16 Ulrich Drepper <drepper@redhat.com> - - * sem_init.c: Define sem_init@GLIBC_2.0. - * sem_destroy.c: Define sem_destroy@GLIBC_2.0. - * sem_getvalue.c: Define sem_getvalue@GLIBC_2.0. - - * flockfile.c: Moved to... - * sysdeps/pthread/flockfile.c: ...here. New file. - * funlockfile.c: Moved to... - * sysdeps/pthread/funlockfile.c: ...here. New file. - * ftrylockfile.c: Moved to... - * sysdeps/pthread/ftrylockfile.c: ...here. New file. - -2002-12-16 Jakub Jelinek <jakub@redhat.com> - - * libc-cancellation.c: Guard both function with - #if !defined NOT_IN_libc. - * Makefile (libpthread-routines): Use ptw-, not pt- prefix for the - automatically provided pthread wrappers. - * pthreadP.h (LIBC_CANCEL_ASYNC, LIBC_CANCEL_RESET): Define to - CANCEL_* if IS_IN_libpthread and to dummy versions if not in libc - nor in libpthread. - * pt-open.c: Removed. - * pt-fcntl.c: Removed. - * pt-fsync.c: Removed. - * pt-lseek.c: Removed. - * pt-msgrcv.c: Removed. - * pt-msgsnd.c: Removed. - * pt-msync.c: Removed. - * pt-nanosleep.c: Removed. - * pt-open64.c: Removed. - * pt-pause.c: Removed. - * pt-pread.c: Removed. - * pt-pread64.c: Removed. - * pt-pwrite.c: Removed. - * pt-pwrite64.c: Removed. - * pt-read.c: Removed. - * pt-recv.c: Removed. - * pt-recvfrom.c: Removed. - * pt-recvmsg.c: Removed. - * pt-send.c: Removed. - * pt-sendto.c: Removed. - * pt-sigtimedwait.c: Removed. - * pt-sigwait.c: Removed. - * pt-wait.c: Removed. - * pt-waitpid.c: Removed. - * pt-write.c: Removed. - * pt-accept.c: Removed. - * pt-close.c: Removed. - * pt-connect.c: Removed. - * pt-lseek64.c: Removed. - * pt-sendmsg.c: Removed. - * pt-tcdrain.c: Removed. - -2002-12-15 Ulrich Drepper <drepper@redhat.com> - - * init.c (__pthread_initialize_minimal_internal): Renamed from - __pthread_initialize_minimal. Make old name an alias. This - converts a normal relocation into a relative relocation. - - * pt-fcntl.c (__fcntl): Use fcntl64 syscall, not fcntl. - - * Versions [libpthread: GLIBC_2.3.2]: Remove creat, poll, pselect, - readv, select, sigpause, sigsuspend, sigwaitinfo, waitid, writev. - * Makefile (libpthread-routines): Remove pt-creat, pt-poll, - pt-pselect, pt-readv, pt-select, pt-sigpause, pt-sigsuspend, - pt-sigwaitinfo, pt-waitid, and pt-writev. - * pt-creat.c: Removed. - * pt-poll.c: Removed. - * pt-pselect.c: Removed. - * pt-readv.c: Removed. - * pt-select.c: Removed. - * pt-sigpause.c: Removed. - * pt-sigsuspend.c: Removed. - * pt-sigwaitinfo.c: Removed. - * pt-waitid.c: Removed. - * pt-writev.c: Removed. - - * init.c (pthread_functions): New variable. - (__pthread_initialize_minimal): Pass pointer to pthread_functions - (or NULL) to __libc_pthread_init. - * forward.c: Rewrite to use __libc:pthread_functions array to get - function addresses. - * sysdeps/unix/sysv/linux/fork.h: Remove __libc_pthread_init - prototype. - * sysdeps/unix/sysv/linux/libc_pthread_init.c (__libc_pthread_init): - Take new parameter. Copy content of variable pointed to by it - to __libc_pthread_init. - - * pthreadP.h (struct pthread_functions): New type. - (__libc_pthread_init): Declare. - - * pthread_attr_destroy.c: Add namespace protected alias. - * pthread_attr_getdetachstate.c: Likewise. - * pthread_attr_getinheritsched.c: Likewise. - * pthread_attr_getschedparam.c: Likewise. - * pthread_attr_getschedpolicy.c: Likewise. - * pthread_attr_getscope.c: Likewise. - * pthread_attr_setdetachstate.c: Likewise. - * pthread_attr_setinheritsched.c: Likewise. - * pthread_attr_setschedparam.c: Likewise. - * pthread_attr_setschedpolicy.c: Likewise. - * pthread_attr_setscope.c: Likewise. - * pthread_cond_broadcast.c: Likewise. - * pthread_cond_destroy.c: Likewise. - * pthread_cond_init.c: Likewise. - * pthread_cond_signal.c: Likewise. - * pthread_cond_wait.c: Likewise. - * pthread_condattr_destroy.c: Likewise. - * pthread_condattr_init.c: Likewise. - * pthread_equal.c: Likewise. - * pthread_exit.c: Likewise. - * pthread_getschedparam.c: Likewise. - * pthread_self.c: Likewise. - * pthread_setcancelstate.c: Likewise. - * pthread_setschedparam.c: Likewise. - * pthread_mutex_destroy.c: Likewise. - * pthread_mutex_init.c: Likewise. - * pthreadP.h: Add prototypes for the aliases. - - * sysdeps/unix/sysv/linux/i386/createthread.c (create_thread): Set - multiple_threads member in correct TCB to 1. - - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Define - SINGLE_THREAD_P. If in libc or libpthread examine multiple_thread - member of thread decriptor, otherwise return unconditionally 1. - -2002-12-14 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/pt-socket.S: Changes folded into the - regular Linux version. Remove file. - * sysdeps/unix/sysv/linux/connect.S: Likewise. Remove file. - * sysdeps/unix/sysv/linux/llseek.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/msgrcv.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/msgsnd.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/open64.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/poll.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/pread.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/pread64.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/pselect.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/pwrite.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/pwrite64.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/readv.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/recv.S: Likewise. Remove file. - * sysdeps/unix/sysv/linux/recvfrom.S: Likewise. Remove file. - * sysdeps/unix/sysv/linux/recvmsg.S: Likewise. Remove file. - * sysdeps/unix/sysv/linux/send.S: Likewise. Remove file. - * sysdeps/unix/sysv/linux/sendmsg.S: Likewise. Remove file. - * sysdeps/unix/sysv/linux/sendto.S: Likewise. Remove file. - * sysdeps/unix/sysv/linux/sigpause.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/sigsuspend.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/sigtimedwait.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/sigwait.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/sigwaitinfo.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/system.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/tcdrain.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/wait.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/waitid.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/waitpid.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/writev.c: Likewise. Remove file. - * sysdeps/unix/sysv/linux/i386/fcntl.c: Likewise. Remove file. - -2002-12-14 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: New file. - * sysdeps/unix/sysv/linux/open.c: Removed. - * sysdeps/unix/sysv/linux/fsync.c: Removed. - * sysdeps/unix/sysv/linux/lseek.c: Removed. - * sysdeps/unix/sysv/linux/msync.c: Removed. - * sysdeps/unix/sysv/linux/read.c: Removed. - * sysdeps/unix/sysv/linux/close.c: Removed. - * sysdeps/unix/sysv/linux/creat.c: Removed. - * sysdeps/unix/sysv/linux/nanosleep.c: Removed. - * sysdeps/unix/sysv/linux/pause.c: Removed. - * sysdeps/unix/sysv/linux/select.c: Removed. - * sysdeps/unix/sysv/linux/write.c: Removed. - -2002-12-14 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/pt-socket.S: Check multiple_threads - element in TCB to see whether locking is needed. - - * sysdeps/unix/sysv/linux/libc_pthread_init.c: Check that - MULTIPLE_THREADS_OFFSET value is correct. - - * sysdeps/unix/sysv/linux/close.c: New file. - * sysdeps/unix/sysv/linux/connect.S: New file. - * sysdeps/unix/sysv/linux/creat.c: New file. - * sysdeps/unix/sysv/linux/fsync.c: New file. - * sysdeps/unix/sysv/linux/llseek.c: New file. - * sysdeps/unix/sysv/linux/lseek.c: New file. - * sysdeps/unix/sysv/linux/msgrcv.c: New file. - * sysdeps/unix/sysv/linux/msgsnd.c: New file. - * sysdeps/unix/sysv/linux/msync.c: New file. - * sysdeps/unix/sysv/linux/nanosleep.c: New file. - * sysdeps/unix/sysv/linux/open.c: New file. - * sysdeps/unix/sysv/linux/open64.c: New file. - * sysdeps/unix/sysv/linux/pause.c: New file. - * sysdeps/unix/sysv/linux/poll.c: New file. - * sysdeps/unix/sysv/linux/pread.c: New file. - * sysdeps/unix/sysv/linux/pread64.c: New file. - * sysdeps/unix/sysv/linux/pselect.c: New file. - * sysdeps/unix/sysv/linux/pwrite.c: New file. - * sysdeps/unix/sysv/linux/pwrite64.c: New file. - * sysdeps/unix/sysv/linux/readv.c: New file. - * sysdeps/unix/sysv/linux/recv.S: New file. - * sysdeps/unix/sysv/linux/recvfrom.S: New file. - * sysdeps/unix/sysv/linux/recvmsg.S: New file. - * sysdeps/unix/sysv/linux/select.c: New file. - * sysdeps/unix/sysv/linux/send.S: New file. - * sysdeps/unix/sysv/linux/sendmsg.S: New file. - * sysdeps/unix/sysv/linux/sendto.S: New file. - * sysdeps/unix/sysv/linux/sigpause.c: New file. - * sysdeps/unix/sysv/linux/sigsuspend.c: New file. - * sysdeps/unix/sysv/linux/sigtimedwait.c: New file. - * sysdeps/unix/sysv/linux/sigwait.c: New file. - * sysdeps/unix/sysv/linux/sigwaitinfo.c: New file. - * sysdeps/unix/sysv/linux/system.c: New file. - * sysdeps/unix/sysv/linux/tcdrain.c: New file. - * sysdeps/unix/sysv/linux/wait.c: New file. - * sysdeps/unix/sysv/linux/waitid.c: New file. - * sysdeps/unix/sysv/linux/waitpid.c: New file. - * sysdeps/unix/sysv/linux/writev.c: New file. - * sysdeps/unix/sysv/linux/i386/fcntl.c: New file. - - * pt-readv.c: Fix comment. - -2002-12-14 Jakub Jelinek <jakub@redhat.com> - - * tst-cleanup1.c: Include stdlib.h. - - * tst-cancel5.c: New test. - * Makefile (tests): Add tst-cancel5. - (tst-cancel5): Link against libc.so libpthread.so in that order. - -2002-12-13 Ulrich Drepper <drepper@redhat.com> - - * forward.c (test_loaded): Prevent recursive calls. - - * Makefile (routines): Add libc-cancellation. - * libc-cancellation.c: New file. - * descr.h (struct pthread): Add multiple_threads field. - * allocatestack.c (allocate_stack): Initialize multiple_header field of - new thread descriptor to 1. - * sysdeps/unix/sysv/linux/i386/createthread.c (create_thread): - Initialize multiple_thread field after successful thread creation. - * cancellation.c (__do_cancel): Move to pthreadP.h. - (__pthread_enable_asynccancel): Remove parameter from __do_cancel call. - (__pthread_disable_asynccancel): Add internal_function attribute. - * init.c (sigcancel_handler): Remove parameter from __do_cancel call. - * pthread_setcancelstate.c: Likewise. - * pthread_setcanceltype.c: Likewise. - * pthread_exit.c: Likewise. - * pthreadP.h (CANCELLATION_P): Likewise. - (__do_cancel): Define as static inline. - (LIBC_CANCEL_ASYNC, LIBC_CANCEL_RESET): New #defines. - (__libc_enable_asynccancel, __libc_disable_asynccancel): New - declarations. - * sysdeps/i386/tls.h (tcbhead_t): Add list and multiple_threads - fields. Define MULTIPLE_THREADS_OFFSET. - * sysdeps/pthread/bits/libc-lock.h: Remove __libc_locking_needed - declaration. - * sysdeps/unix/sysv/linux/accept.S: New file. - * sysdeps/unix/sysv/linux/read.c: New file. - * sysdeps/unix/sysv/linux/write.c: New file. - * sysdeps/unix/sysv/linux/i386/pt-socket.S: New file. - * sysdeps/unix/sysv/linux/libc_pthread_init.c: Remove definition and - initialization of __libc_locking_needed. - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Don't use - __libc_locking_needed, use multiple_threads field in TCB. - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S: Likewise. - -2002-12-12 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i686/libc-lowlevellock.S: Use i486 - version. - * sysdeps/unix/sysv/linux/i386/i586/libc-lowlevellock.S: Likewise. - - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S: Correct - access to __libc_locking_needed for PIC. - -2002-12-12 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/pthread/bits/libc-lock.h (__libc_locking_needed): Only - declare for libc.so. - (__libc_lock_init, __libc_lock_init_recursive): Change into comma - expression. - (__libc_lock_lock): Put into statement expression. - (__libc_lock_unlock): Remove trailing semicolon. - * sysdeps/unix/sysv/linux/fork.h (__libc_pthread_init): Fix typo. - -2002-12-12 Roland McGrath <roland@redhat.com> - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Use asm operand with - "m" constraint to refer to __libc_locking_needed. Declare it here. - -2002-12-12 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/fork-gen.c: Renamed to... - * sysdeps/unix/sysv/linux/libc_pthread_init.c: ...this. - Initialize __libc_locking_needed. - * init.c (__pthread_initialize_minimal): Call __libc_pthread_init - instead of __register_pthread_fork_handler. - * sysdeps/pthread/bits/libc-lock.h: Declare __libc_locking_needed. - * sysdeps/unix/sysv/linux/Makefile (sysdep_routimes): Replace - fork-gen with libc_pthread_init. - * sysdeps/unix/sysv/linux/Versions: Use __libc_pthread_init instead - of __register_pthread_fork_handler. - * sysdeps/unix/sysv/linux/fork.h: Declare __libc_pthread_init instead - of __register_pthread_fork_handler. - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Use - __libc_locking_needed to determine whether lock prefix can be avoided. - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S: Likewise. - -2002-12-11 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-cleanup1. - * tst-cleanup1.c: New file. - * cancellation.c (__cleanup_thread): Removed. - (__do_cancel): Remove call to __cleanup_thread. - * pthreadP.h: Remove __cleanup_thread prorotype. - - * sysdeps/pthread/bits/libc-lock.h (__libc_cleanup_region_start): - Remember function and argument even if cancellation handler - function is not available. - (__libc_cleanup_region_end): Execute registered function directly if - pthread functions are not available. - (__libc_cleanup_end): Likewise. - - * init.c (__pthread_initialize_minimal): Fix initialization in - static lib by preventing gcc from being too clever. - -2002-12-10 Ulrich Drepper <drepper@redhat.com> - - * init.c (__pthread_initialize_minimal): Remove unneccesary - sigaddset call. - - * Makefile (tests): We can run tst-locale2 now. - -2002-12-09 Ulrich Drepper <drepper@redhat.com> - - * Versions: Remove duplicated sigwait entry. - -2002-12-08 Ulrich Drepper <drepper@redhat.com> - - * pthreadP.h: Enable pthread_cleanup_{push,pop} optimizations only - inside libpthread. - - * pt-fcntl.c (__fcntl): Initialize oldtype to avoid warning. - - * pthreadP.h: Declare __pthread_enable_asynccancel and - __pthread_disable_asynccancel. - (CANCEL_ASYNC): Use __pthread_enable_asynccancel. - (CANCEL_RESET): Use __pthread_disable_asynccancel. - * cancellation.c (__pthread_enable_asynccancel): New function. - (__pthread_disable_asynccancel): New function. - * pt-accept.c: Adjust for CANCEL_ASYNC and CANCEL_RESET change. - * pt-close.c: Likewise. - * pt-connect.c: Likewise. - * pt-creat.c: Likewise. - * pt-fcntl.c: Likewise. - * pt-fsync.c: Likewise. - * pt-lseek.c: Likewise. - * pt-lseek64.c: Likewise. - * pt-msgrcv.c: Likewise. - * pt-msgsnd.c: Likewise. - * pt-msync.c: Likewise. - * pt-nanosleep.c: Likewise. - * pt-open.c: Likewise. - * pt-open64.c: Likewise. - * pt-pause.c: Likewise. - * pt-poll.c: Likewise. - * pt-pread.c: Likewise. - * pt-pread64.c: Likewise. - * pt-pselect.c: Likewise. - * pt-pwrite.c: Likewise. - * pt-pwrite64.c: Likewise. - * pt-read.c: Likewise. - * pt-readv.c: Likewise. - * pt-recv.c: Likewise. - * pt-recvfrom.c: Likewise. - * pt-recvmsg.c: Likewise. - * pt-select.c: Likewise. - * pt-send.c: Likewise. - * pt-sendmsg.c: Likewise. - * pt-sendto.c: Likewise. - * pt-sigpause.c: Likewise. - * pt-sigsuspend.c: Likewise. - * pt-sigtimedwait.c: Likewise. - * pt-sigwait.c: Likewise. - * pt-sigwaitinfo.c: Likewise. - * pt-system.c: Likewise. - * pt-tcdrain.c: Likewise. - * pt-wait.c: Likewise. - * pt-waitid.c: Likewise. - * pt-waitpid.c: Likewise. - * pt-write.c: Likewise. - * pt-writev.c: Likewise. - * pthread_join.c: Likewise. - * pthread_timedjoin.c: Likewise. - - * pt-sigpause.c (sigsuspend): Call __sigsuspend. - (__xpg_sigpause): New function. - * Versions (libpthread:GLIBC_2.3.2): Add __xpg_sigpause. - -2002-12-07 Ulrich Drepper <drepper@redhat.com> - - * Makefile (CFLAGS-ftrylockfile.c): Add -D_IO_MTSAFE_IO. - - * cleanup.c: Move declarations of _GI_pthread_cleanup_push and - _GI_pthread_cleanup_pop to pthreadP.h. - - * ftrylockfile.c: Use _IO_lock_trylock instead of - pthread_mutex_trylock. - - * pthreadP.h (CANCEL_ASYNC): Use __pthread_setcanceltype. - (CANCEL_RESET): Likewise. - (__pthread_setcanceltype_): Declare. - (__pthread_mutex_lock_internal): Declare. - (__pthread_mutex_unlock_internal): Declare. - (__pthread_once_internal): Declare. - (pthread_cleanup_push): Redefine using _GI_pthread_cleanup_push. - (pthread_cleanup_pop): Redefine using _GI_pthread_cleanup_pop. - - * pthread_cond_timedwait.c: Use INTUSE is calls to pthread_mutex_lock - and pthread_mutex_unlock. - * pthread_cond_wait.c: Likewise. - * pthread_mutex_lock.c: Use INTDEF to define alias if needed. - * pthread_mutex_unlock.c: Likewise. - - * pthread_setcanceltype.c: Add additional alias - __pthread_setcanceltype. - - * sem_unlink.c (sem_unlink): Use __pthread_once with INTDEF. - * sem_open.c (sem_open): Likewise. - Use __libc_open, __libc_write, and __libc_close instead of - open, write, and close respectively. - - * sysdeps/pthread/bits/libc-lock.h (__libc_lock_trylock_internal): - Rewrite as statement expression since it must return a value. - - * pthread_cancel.c: Use __pthread_kill instead of pthread_kill. - * sysdeps/unix/sysv/linux/pthread_kill.c: Define additional alias - __pthread_kill. - - * sysdeps/unix/sysv/linux/i386/pthread_once.S: Define additional - alias __pthread_once_internal. - - * sysdeps/unix/sysv/linux/raise.c: Use libc_hidden_def for raise. - -2002-12-06 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-stdio1 and tst-stdio2. - * tst-stdio1.c: New file. - * tst-stdio2.c: New file. - - * init.c (__pthread_initialize_minimal): Correct INIT_LIST_HEAD use. - - * Makefile (tests): Comment out tst-locale2 for now. - (CFLAGS-flockfile.c, CFLAGS-funlockfile.c): Define to -D_IO_MTSAFE_IO. - - * sysdeps/unix/sysv/linux/Makefile: Define CFLAGS-fork.c to - -D_IO_MTSAFE_IO. - * sysdeps/unix/sysv/linux/fork.c: Include <bits/stdio-lock.h>. - Use _IO_lock_init instead of explicit assignment. - - * sysdeps/pthread/bits/libc-lock.h: Define __rtld_lock_* macros. - Define __libc_lock_* and __libc_lock_recursive macros with - lowlevellock macros, not pthread mutexes. - - * flockfile.c: Include <bits/stdio-lock.h>. Use _IO_lock_lock instead - of pthread_mutex_lock. - * funlockfile.c: Include <bits/stdio-lock.h>. Use _IO_lock_unlock - instead of pthread_mutex_unlock. - -2002-12-06 Roland McGrath <roland@redhat.com> - - * allocatestack.c (__stack_user): Use uninitialized defn. - * init.c (__pthread_initialize_minimal): Initialize it here. - -2002-12-05 Roland McGrath <roland@redhat.com> - - * sysdeps/i386/tls.h (TLS_INIT_TP): Make it return zero or an error - string. - * sysdeps/x86_64/tls.h (TLS_INIT_TP): Likewise. - - * sysdeps/unix/sysv/linux/i386/createthread.c (create_thread): Add - missing & here too. - -2002-12-05 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/Makefile (sysdep_routines): Remove - lowlevellock. - * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S: New file. - * sysdeps/unix/sysv/linux/i386/i586/libc-lowlevellock.S: New file. - * sysdeps/unix/sysv/linux/i386/i686/libc-lowlevellock.S: New file. - * sysdeps/pthread/bits/libc-lock.h: Use lowlevellock implementation - for __libc_lock_* macros. - * Makefile (routines): Add libc-lowlevellock. - -2002-10-09 Roland McGrath <roland@redhat.com> - - * sysdeps/pthread/bits/libc-lock.h (__libc_maybe_call): New macro. - Under [__PIC__], call the function via the pointer fetched for - comparison rather than a call by name that uses the PLT. - (__libc_lock_init, __libc_rwlock_init, __libc_lock_fini) - (__libc_rwlock_fini, __libc_lock_lock, __libc_rwlock_rdlock) - (__libc_rwlock_wrlock, __libc_lock_trylock, __libc_rwlock_tryrdlock) - (__libc_rwlock_trywrlock, __libc_lock_unlock, __libc_rwlock_unlock) - (__libc_key_create, __libc_getspecific, __libc_setspecific): Use it. - -2002-12-04 Roland McGrath <roland@redhat.com> - - * forward.c (pthread_self): Use FORWARD3 macro to correct return type. - - * sysdeps/i386/td_ta_map_lwp2thr.c: Moved from ../nptl_db. - * sysdeps/generic/td_ta_map_lwp2thr.c: New file. - - * pthread_create.c (start_thread): Add missing & on __nptl_last_event. - -2002-12-04 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h: Make pthread_t - a completely opaque, non-integer type. - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: Likewise. - -2002-12-05 Jakub Jelinek <jakub@redhat.com> - - * sysdeps/i386/tls.h: Include stdlib.h. - * sysdeps/x86_64/tls.h: Likewise. - -2002-12-04 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-locale2. - (tests-static): Likewise. - * tst-locale2.c: New file. - - * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Mark asms as - volatile and add memory clobbers to lock operations. - -2002-12-03 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/i386/i686/bits/atomic.h: Use i486 version. - * sysdeps/i386/i486/bits/atomic.h: New file. - * sysdeps/i386/i586/bits/atomic.h: New file. - * sysdeps/i386/i686/pthread_spin_trylock.S: Define HAVE_CMOV and - include i486 version. - * sysdeps/i386/i486/pthread_spin_trylock.S: New file. - * sysdeps/i386/i586/pthread_spin_trylock.S: New file. - Patch by Marijn Ros <marijn@mad.scientist.com>. - - * allocatestack.c (get_cached_stack): Don't crash if we first - found a stack with a larger size then needed. - Reported by Hui Huang <hui.huang@sun.com>. - - * Makefile (tests): Add tst-sysconf. - * tst-sysconf.c: New file. - - * sysdeps/unix/sysv/linux/bits/local_lim.h: Undefine - PTHREAD_THREADS_MAX. - -2002-12-02 Roland McGrath <roland@redhat.com> - - * pthreadP.h (__stack_user, __nptl_create_event, __nptl_death_event): - Declare using hidden_proto instead of attribute_hidden, so there are - non-.hidden static symbols for gdb to find. - (__pthread_keys): Likewise. - * events.c (__nptl_create_event, __nptl_death_event): Add hidden_def. - * allocatestack.c (__stack_user): Likewise. - * pthread_create.c (__pthread_keys): Likewise. - (__nptl_threads_events, __nptl_last_event): Make these static instead - of hidden. - * pthread_key_create.c (__pthread_pthread_keys_max, - __pthread_pthread_key_2ndlevel_size): Renamed from __linuxthreads_*. - -2002-12-02 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-locale1. If buid-static is yes link - statically. - * tst-locale1.c: New file. - - * pthread_cond_timedwait.c: Include <stdlib.h>. - - * Makefile (tests): Add tst-fork2 and tst-fork3. - * tst-fork2.c: New file. - * tst-fork3.c: New file. - -2002-11-28 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: New file. - - * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define macros which - require it to 200112L. - - * sysdeps/unix/sysv/linux/i386/i486/lowlevelrwlock.S: Use cmov - instruction only if HAVE_CMOV is defined. - * sysdeps/unix/sysv/linux/i386/i686/lowlevelrwlock.S: Define HAVE_CMOV. - - * sysdeps/unix/sysv/linux/x86_64/bits/semaphore.h: New file. - - * sysdeps/unix/sysv/linux/x86_64/pthread_once.S: New file. - - * sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h: New file. - - * sysdeps/unix/sysv/linux/x86_64/pt-vfork.S: New file. - -2002-11-27 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/x86_64/bits/atomic.h: New file. - - * sysdeps/i386/i686/bits/atomic.h: Fix asm syntax for 8- and - 16-bit operations. - - * sysdeps/unix/sysv/linux/raise.c (raise): Use INTERNAL_SYSCALL if - possible since gettid cannot fail. - - * sysdeps/x86_64/pthreaddef.h: New file. - - * sysdeps/i386/pthreaddef.h (gettid): Removed. - - * sysdeps/x86_64/pthread_spin_init.c: New file. - * sysdeps/x86_64/pthread_spin_lock.c: New file. - * sysdeps/x86_64/pthread_spin_trylock.c: New file. - * sysdeps/x86_64/pthread_spin_unlock.c: New file. - - * sysdeps/i386/i686/pthread_spin_trylock.S (pthread_spin_trylock): - Add missing lock prefix. Minute optimization. - - * tst-spin2.c (main): Also check successful trylock call. - - * sysdeps/pthread/pthread_sigmask.c (pthread_sigmask): Use correct - syscall. Fix typo in case INTERNAL_SYSCALL is not used. - - * sysdeps/i386/pthread_spin_destroy.c: Moved to... - * sysdeps/pthread/pthread_spin_destroy.c: ...here. New file. - - * sysdeps/i386/pthread_sigmask.c: Removed. Use the generic code. - * sysdeps/pthread/pthread_sigmask.c (pthread_sigmask): Return correct - value in case of an error. Add support for INTERNAL_SYSCALL. - - * sysdeps/i386/pthread_sigmask.c (pthread_sigmask): Return correct - value in case of an error. - - * sysdeps/x86_64/tls.h: New file. - -2002-11-26 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/i386/tls.h (THREAD_GETMEM_NC): Change interface. It now - takes the array member name and the index as parameters. - (THREAD_SETMEM_NC): Likewise. - * pthread_getspecific.c: Use new THREAD_GETMEM_NC interface. - * pthread_setspecific.c: Use new THREAD_GETMEM_NC and THREAD_SETMEM_NC - interfaces. - - * sysdeps/i386/tls.h (THREAD_SETMEM): Use size of member element - to decide which code to use. - (THREAD_SETMEM_NC): Likewise. - - * allocatestack.c (queue_stack): Don't remove stack from list here. - Do it in the caller. Correct condition to prematurely terminate - loop to free stacks. - (__deallocate_stack): Remove stack from list here. - -2002-11-26 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-stack1. - * tst-stack1.c: New file. - - * allocatestack.c (allocate_stack): Initialize the TCB on a user - provided stack. - - * pthread_attr_getstack.c: Return bottom of the thread area. - -2002-11-25 Ulrich Drepper <drepper@redhat.com> - - * Makefile (libpthread-routines): Add pt-allocrtsig and - pthread_kill_other_threads. - * pt-allocrtsig.c: New file. - * pthread_kill_other_threads.c: New file. - * sysdeps/unix/sysv/linux/allocrtsig.c: Add additional aliases for - all three functions. - * sysdeps/unix/sysv/linux/Makefile (sysdep_routines): Remove - allocrtsig. - * sysdeps/unix/sysv/linux/Versions (libc:GLIBC_PRIVATE): Export - __libc_current_sigrtmin_private, __libc_current_sigrtmax_private, - and __libc_allocate_rtsig_private. - * Versions (libpthread): Export pthread_kill_other_threads_np, - __libc_current_sigrtmin, and __libc_current_sigrtmax. - -2002-11-24 Ulrich Drepper <drepper@redhat.com> - - * allocatestack.c (allocate_stack): stackaddr in attribute points to - the end of the stack. Adjust computations. - When mprotect call fails dequeue stack and free it. - * pthread_attr_setstack.c: Store top of the stack in stackaddr - attribute. - * pthread_getattr_np.c: Likewise. - - * descr.h (IS_DETACHED): Add some more parenthesis to prevent - surprises. - -2002-11-23 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/pthread/pthread.h (pthread_self): __THROW must come before - attribute definitions. Patch by Luca Barbieri <ldb@ldb.ods.org>. - -2002-11-22 Ulrich Drepper <drepper@redhat.com> - - * pthread_getspecific.c: Optimize access to first 2nd-level array. - * pthread_setspecific.c: Likewise. - -2002-11-21 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/createthread.c: Remove CLONE_ flags - definitions. Get them from the official place. - * sysdeps/unix/sysv/linux/i386/fork.c: Likewise. - - * sysdeps/unix/sysv/linux/i386/createthread.c: Update CLONE_* flags. - Use new CLONE_ flags in clone() calls. - - * sysdeps/unix/sysv/linux/fork.c: Use ARCH_FORK to actually fork. - * sysdeps/unix/sysv/linux/i386/fork.c: New file. - - * Versions: Add pthread_* functions for libc. - * forward.c: New file. - - * sysdeps/pthread/Makefile (libpthread-sysdeps_routines): Add - errno-loc. - * herrno.c: New file. - * res.c: New file. - - * Makefile (libpthread-routines): Remove sem_post, sem_wait, - sem_trywait, and sem_timedwait. Add herrno and res. - * sem_init.c: Don't initialize lock and waiters members. - * sem_open.c: Likewise. - * sem_post.c: Removed. - * sem_wait.c: Removed. - * sem_trywait.c: Removed. - * sem_timedwait.c: Removed. - * sysdeps/unix/sysv/linux/i386/i486/lowlevelsem.S: Complete rewrite. - Includes full implementations of sem_post, sem_wait, sem_trywait, - and sem_timedwait. - * sysdeps/unix/sysv/linux/i386/lowlevelsem.h (lll_sem_post): Adjust - for new implementation. - * sysdeps/unix/sysv/linux/internaltypes.h (struct sem): Remove lock - and waiters fields. - - * tst-sem3.c: Improve error message. - * tst-signal3.c: Likewise. - - * init.c (__pthread_initialize_minimal): Use set_tid_address syscall - to tell the kernel about the termination futex and to initialize tid - member. Don't initialize main_thread. - * descr.h (struct pthread): Remove main_thread member. - * cancelllation.c (__do_cancel): Remove code handling main thread. - The main thread is not special anymore. - - * allocatestack.c (__reclaim_stacks): Mark stacks as unused. Add - size of the stacks to stack_cache_actsize. - - * pt-readv.c: Add missing "defined". - * pt-sigwait.c: Likewise. - * pt-writev.c: Likewise. - -2002-11-09 Ulrich Drepper <drepper@redhat.com> - - * Versions: Export __connect from libpthread. - Patch by Luca Barbieri <ldb@ldb.ods.org>. - - * Makefile (libpthread-routines): Add pt-raise. - * sysdeps/unix/sysv/linux/raise.c: New file. - * sysdeps/unix/sysv/linux/pt-raise.c: New file. - * sysdeps/generic/pt-raise.c: New file. - - * pthread_cond_init.c: Initialize all data elements of the condvar - structure. Patch by Luca Barbieri <ldb@ldb.ods.org>. - - * pthread_attr_init.c: Actually implement 2.0 compatibility version. - * pthread_create.c: Likewise. - - * Makefile (tests): Add tst-key1, tst-key2, tst-key3. - * tst-key1.c: New file. - * tst-key2.c: New file. - * tst-key3.c: New file. - - * Versions: Export pthread_detach for version GLIBC_2.0. - Reported by Saurabh Desai <sdesai@austin.ibm.com>. - -2002-11-08 Ulrich Drepper <drepper@redhat.com> - - * pthread_key_create.c: Terminate search after an unused key was found. - Patch by Luca Barbieri <ldb@ldb.ods.org>. - - * sysdeps/unix/sysv/linux/i386/pthread_once.S: Return zero. - Patch by Luca Barbieri <ldb@ldb.ods.org>. - -2002-10-10 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/i486/lowlevelsem.S: Use slow generic - dynamic lookup for errno in PIC. - - * allocatestack.c (get_cached_stack): Rearrange code slightly to - release the stack lock as soon as possible. - Call _dl_allocate_tls_init for TCB from the cache to re-initialize - the static TLS block. - (allocate_stack): Call _dl_allocate_tls_init for user-provided stack. - - * cancellation.c: Renamed from cancelation.c. - * Makefile: Adjust accordingly. - * pthreadP.h (CANCELLATION_P): Renamed from CANCELATION_P. - * cleanup_defer.c: Use CANCELLATION_P. - * pthread_testcancel.c: Likewise. - * descr.h: Fix spelling in comments. - * init.c: Likewise. - * pthread_getattr_np.c: Likewise. - * pthread_getschedparam.c: Likewise. - * pthread_setschedparam.c: Likewise. - * Versions: Likewise. - - * pt-pselect.c: New file. - * Makefile (libpthread-routines): Add pt-pselect. - * Versions: Add pselect. - - * tst-cancel4.c: New file. - * Makefile (tests): Add tst-cancel4. - -2002-10-09 Ulrich Drepper <drepper@redhat.com> - - * pthread_mutex_lock.c: Always record lock ownership. - * pthread_mutex_timedlock.c: Likewise. - * pthread_mutex_trylock.c: Likewise. - - * pt-readv.c: New file. - * pt-writev.c: New file. - * pt-creat.c: New file. - * pt-msgrcv.c: New file. - * pt-msgsnd.c: New file. - * pt-poll.c: New file. - * pt-select.c: New file. - * pt-sigpause.c: New file. - * pt-sigsuspend.c: New file. - * pt-sigwait.c: New file. - * pt-sigwaitinfo.c: New file. - * pt-waitid.c: New file. - * Makefile (libpthread-routines): Add pt-readv, pt-writev, pt-creat, - pt-msgrcv, pt-msgsnd, pt-poll, pt-select, pt-sigpause, pt-sigsuspend, - pt-sigwait, pt-sigwaitinfo, and pt-waitid. - * Versions: Add all the new functions. - - * tst-exit1.c: New file. - * Makefile (tests): Add tst-exit1. - - * sem_timedwait.c: Minor optimization for more optimal fastpath. - -2002-10-08 Ulrich Drepper <drepper@redhat.com> - - * pt-fcntl.c: Only enable asynchronous cancellation for F_SETLKW. - - * pthread_join.c: Enable asynchronous cancellation around lll_wait_tid - call. pthread_join is an official cancellation point. - * pthread_timedjoin.c: Likewise. - - * pthread_cond_wait.c: Revert order in which internal lock are dropped - and the condvar's mutex are retrieved. - * pthread_cond_timedwait.c: Likewise. - Reported by dice@saros.East.Sun.COM. - -2002-10-07 Ulrich Drepper <drepper@redhat.com> - - * pthreadP.h: Cut out all type definitions and move them... - * sysdeps/unix/sysv/linux/internaltypes.h: ...here. New file. - * pthreadP.h: Include <internaltypes.h>. - - * sysdeps/unix/sysv/linux/i386/lowlevelsem.h (lll_sem_post): Little - performance tweaks. - - * sem_trywait.c: Shuffle #includes around to get right order. - * sem_timedwait.c: Likewise. - * sem_post.c: Likewise. - * sem_wait.c: Likewise. - - * nptl 0.3 released. - - * Makefile (tests): Add tst-signal3. - * tst-signal3.c: New file. - -2002-10-05 Ulrich Drepper <drepper@redhat.com> - - * sysdeps/unix/sysv/linux/i386/lowlevelsem.h: Tell the compiler that - the asms modify the sem object. - (__lll_sem_timedwait): Now takes struct sem* as first parameter. - - * sysdeps/unix/sysv/linux/i386/bits/semaphore.h (sem_t): Don't expose - the actual members. - * pthreadP.h (struct sem): New type. Actual semaphore type. - * semaphoreP.h: Include pthreadP.h. - * sem_getvalue.c: Adjust to sem_t change. - * sem_init.c: Likewise. - * sem_open.c: Likewise. - * sem_post.c: Likewise. - * sem_timedwait.c: Likewise. - * sem_trywait.c: Likewise. - * sem_wait.c: Likewise. - -2002-10-04 Ulrich Drepper <drepper@redhat.com> - - * Makefile (tests): Add tst-basic2, tst-exec1, tst-exec3, tst-exec3. - * tst-basic2.c: New file. - * tst-exec1.c: New file. - * tst-exec2.c: New file. - * tst-exec3.c: New file. - - * tst-fork1.c: Remove extra */. - - * nptl 0.2 released. The API for IA-32 is complete. diff --git a/nptl/DESIGN-systemtap-probes.txt b/nptl/DESIGN-systemtap-probes.txt deleted file mode 100644 index ac972a9542..0000000000 --- a/nptl/DESIGN-systemtap-probes.txt +++ /dev/null @@ -1,73 +0,0 @@ -Systemtap is a dynamic tracing/instrumenting tool available on Linux. Probes -that are not fired at run time have close to zero overhead. - -The following probes are available for NPTL: - -Thread creation & Join Probes -============================= -pthread_create - probe for pthread_create - arg1 = pointer (pthread_t*) to thread - arg2 = pointer (pthread_attr_t*) to attr - arg3 = pointer (void *) to start_routine - arg4 = arguments to start_routine -pthread_start - probe for actual thread creation - arg1 = struct pthread (members include thread ID, process ID) - arg2 = address of start_routine - arg3 = pointer to the list of arguments -pthread_join - probe for pthread_join - arg1 = thread ID -pthread_join_ret - probe for pthread_join return - arg1 = thread ID - arg2 = return value - -Lock-related Probes -=================== -mutex_init - probe for pthread_mutex_init - arg1 = address of mutex lock -mutex_acquired - probe for succ. return of pthread_mutex_lock - arg1 = address of mutex lock -mutex_timedlock_acquired - probe for succ. return of pthread_mutex_timedlock - arg1 = address of mutex lock -mutex_entry - probe for entry to the pthread_mutex_lock function - arg1 = address of mutex lock -mutex_timedlock_entry - probe for entry to the pthread_mutex_timedlock function - arg1 = address of mutex lock, arg2 = address of timespec -mutex_release - probe for pthread_mutex_unlock after the successful release of a - mutex lock - arg1 = address of mutex lock -mutex_destroy - probe for pthread_mutex_destroy - arg1 = address of mutex lock - -wrlock_entry - probe for entry to the pthread_rwlock_wrlock function - arg1 = address of rw lock -rdlock_entry - probe for entry to the pthread_rwlock_rdlock function - arg1 = address of rw lock - -rwlock_destroy - probe for pthread_rwlock_destroy - arg1 = address of rw lock -wrlock_acquire_write - probe for pthread_rwlock_wrlock (after getting the lock) - arg1 = address of rw lock -rdlock_acquire_read - probe for pthread_rwlock_rdlock after successfully getting - the lock - arg1 = address of rw lock -rwlock_unlock - probe for pthread_rwlock_unlock - arg1 = address of rw lock - -Condition variable Probes -========================= -cond_init - probe for pthread_cond_init - arg1 = condition - arg2 = attr -cond_destroy - probe for pthread_cond_destroy - arg1 = cond -cond_wait - probe for pthread_cond_wait - arg1 = condition - arg2 = mutex lock -cond_timedwait - probe for pthread_cond_timedwait - arg1 = condition - arg2 = mutex lock - arg3 = timespec -cond_signal - probe for pthread_cond_signal - arg1 = condition -cond_broadcast - probe for pthread_cond_broadcast - arg1 = condition diff --git a/nptl/Makefile b/nptl/Makefile deleted file mode 100644 index 853da72e74..0000000000 --- a/nptl/Makefile +++ /dev/null @@ -1,722 +0,0 @@ -# Copyright (C) 2002-2017 Free Software Foundation, Inc. -# This file is part of the GNU C Library. - -# The GNU C Library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. - -# The GNU C Library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. - -# You should have received a copy of the GNU Lesser General Public -# License along with the GNU C Library; if not, see -# <http://www.gnu.org/licenses/>. - -# -# Sub-makefile for NPTL portion of the library. -# -subdir := nptl - -include ../Makeconfig - -headers := pthread.h semaphore.h bits/semaphore.h - -extra-libs := libpthread -extra-libs-others := $(extra-libs) -install-lib-ldscripts := libpthread.so - -routines = alloca_cutoff forward libc-lowlevellock libc-cancellation \ - libc-cleanup libc_pthread_init libc_multiple_threads \ - register-atfork unregister-atfork -shared-only-routines = forward - -# We need to provide certain routines for compatibility with existing -# binaries. -pthread-compat-wrappers = \ - write read close fcntl accept \ - connect recv recvfrom send \ - sendto fsync lseek lseek64 \ - msync nanosleep open open64 pause \ - pread pread64 pwrite pwrite64 \ - tcdrain wait waitpid msgrcv msgsnd \ - sigwait sigsuspend \ - recvmsg sendmsg - -libpthread-routines = nptl-init vars events version pt-interp \ - pthread_create pthread_exit pthread_detach \ - pthread_join pthread_tryjoin pthread_timedjoin \ - pthread_self pthread_equal pthread_yield \ - pthread_getconcurrency pthread_setconcurrency \ - pthread_getschedparam pthread_setschedparam \ - pthread_setschedprio \ - pthread_attr_init pthread_attr_destroy \ - pthread_attr_getdetachstate pthread_attr_setdetachstate \ - pthread_attr_getguardsize pthread_attr_setguardsize \ - pthread_attr_getschedparam pthread_attr_setschedparam \ - pthread_attr_getschedpolicy pthread_attr_setschedpolicy \ - pthread_attr_getinheritsched \ - pthread_attr_setinheritsched \ - pthread_attr_getscope pthread_attr_setscope \ - pthread_attr_getstackaddr pthread_attr_setstackaddr \ - pthread_attr_getstacksize pthread_attr_setstacksize \ - pthread_attr_getstack pthread_attr_setstack \ - pthread_getattr_np \ - pthread_mutex_init pthread_mutex_destroy \ - pthread_mutex_lock pthread_mutex_trylock \ - pthread_mutex_timedlock pthread_mutex_unlock \ - pthread_mutex_cond_lock \ - pthread_mutexattr_init pthread_mutexattr_destroy \ - pthread_mutexattr_getpshared \ - pthread_mutexattr_setpshared \ - pthread_mutexattr_gettype pthread_mutexattr_settype \ - pthread_rwlock_init pthread_rwlock_destroy \ - pthread_rwlock_rdlock pthread_rwlock_timedrdlock \ - pthread_rwlock_wrlock pthread_rwlock_timedwrlock \ - pthread_rwlock_tryrdlock pthread_rwlock_trywrlock \ - pthread_rwlock_unlock \ - pthread_rwlockattr_init pthread_rwlockattr_destroy \ - pthread_rwlockattr_getpshared \ - pthread_rwlockattr_setpshared \ - pthread_rwlockattr_getkind_np \ - pthread_rwlockattr_setkind_np \ - pthread_cond_init pthread_cond_destroy \ - pthread_cond_wait \ - pthread_cond_signal pthread_cond_broadcast \ - old_pthread_cond_init old_pthread_cond_destroy \ - old_pthread_cond_wait old_pthread_cond_timedwait \ - old_pthread_cond_signal old_pthread_cond_broadcast \ - pthread_condattr_init pthread_condattr_destroy \ - pthread_condattr_getpshared pthread_condattr_setpshared \ - pthread_condattr_getclock pthread_condattr_setclock \ - pthread_spin_init pthread_spin_destroy \ - pthread_spin_lock pthread_spin_trylock \ - pthread_spin_unlock \ - pthread_barrier_init pthread_barrier_destroy \ - pthread_barrier_wait \ - pthread_barrierattr_init pthread_barrierattr_destroy \ - pthread_barrierattr_getpshared \ - pthread_barrierattr_setpshared \ - pthread_key_create pthread_key_delete \ - pthread_getspecific pthread_setspecific \ - pthread_sigmask pthread_kill pthread_sigqueue \ - pthread_cancel pthread_testcancel \ - pthread_setcancelstate pthread_setcanceltype \ - pthread_once \ - old_pthread_atfork pthread_atfork \ - pthread_getcpuclockid \ - pthread_clock_gettime pthread_clock_settime \ - shm-directory \ - sem_init sem_destroy \ - sem_open sem_close sem_unlink \ - sem_getvalue \ - sem_wait sem_timedwait sem_post \ - cleanup cleanup_defer cleanup_compat \ - cleanup_defer_compat unwind \ - pt-longjmp pt-cleanup\ - cancellation \ - lowlevellock \ - lll_timedlock_wait lll_timedwait_tid \ - pt-fork pt-vfork \ - $(pthread-compat-wrappers) \ - pt-raise pt-system \ - flockfile ftrylockfile funlockfile \ - sigaction \ - herrno res pt-allocrtsig \ - pthread_kill_other_threads \ - pthread_getaffinity pthread_setaffinity \ - pthread_attr_getaffinity pthread_attr_setaffinity \ - pthread_mutexattr_getrobust pthread_mutexattr_setrobust \ - pthread_mutex_consistent \ - cleanup_routine unwind-forcedunwind \ - pthread_mutexattr_getprotocol \ - pthread_mutexattr_setprotocol \ - pthread_mutexattr_getprioceiling \ - pthread_mutexattr_setprioceiling tpp \ - pthread_mutex_getprioceiling \ - pthread_mutex_setprioceiling \ - pthread_setname pthread_getname \ - pthread_setattr_default_np pthread_getattr_default_np -# pthread_setuid pthread_seteuid pthread_setreuid \ -# pthread_setresuid \ -# pthread_setgid pthread_setegid pthread_setregid \ -# pthread_setresgid - -libpthread-shared-only-routines = version pt-interp pt-allocrtsig \ - unwind-forcedunwind -libpthread-static-only-routines = pthread_atfork - -# Since cancellation handling is in large parts handled using exceptions -# we have to compile some files with exception handling enabled, some -# even with asynchronous unwind tables. - -# nptl-init.c contains sigcancel_handler(). -CFLAGS-nptl-init.c = -fexceptions -fasynchronous-unwind-tables -# The unwind code itself, -CFLAGS-unwind.c = -fexceptions -CFLAGS-unwind-forcedunwind.c = -fexceptions -fasynchronous-unwind-tables - -# The following three functions must be async-cancel safe. -CFLAGS-pthread_cancel.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-pthread_setcancelstate.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-pthread_setcanceltype.c = -fexceptions -fasynchronous-unwind-tables - -# These are internal functions which similar functionality as setcancelstate -# and setcanceltype. -CFLAGS-cancellation.c = -fasynchronous-unwind-tables -CFLAGS-libc-cancellation.c = -fasynchronous-unwind-tables - -# Calling pthread_exit() must cause the registered cancel handlers to -# be executed. Therefore exceptions have to be thrown through this -# function. -CFLAGS-pthread_exit.c = -fexceptions - -# Among others, __pthread_unwind is forwarded. This function must handle -# exceptions. -CFLAGS-forward.c = -fexceptions - -# The following are cancellation points. Some of the functions can -# block and therefore temporarily enable asynchronous cancellation. -# Those must be compiled asynchronous unwind tables. -CFLAGS-pthread_testcancel.c = -fexceptions -CFLAGS-pthread_join.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-pthread_timedjoin.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-pthread_once.c = $(uses-callbacks) -fexceptions \ - -fasynchronous-unwind-tables -CFLAGS-pthread_cond_wait.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-sem_wait.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-sem_timedwait.c = -fexceptions -fasynchronous-unwind-tables - -# These are the function wrappers we have to duplicate here. -CFLAGS-fcntl.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-lockf.c = -fexceptions -CFLAGS-pread.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-pread64.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-pwrite.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-pwrite64.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-wait.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-waitpid.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-sigwait.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-msgrcv.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-msgsnd.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-tcdrain.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-open.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-open64.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-pause.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-recv.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-send.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-accept.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-sendto.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-connect.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-recvfrom.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-recvmsg.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-sendmsg.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-close.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-read.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-write.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-nanosleep.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-sigsuspend.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-msync.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-fdatasync.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-fsync.c = -fexceptions -fasynchronous-unwind-tables - -CFLAGS-pt-system.c = -fexceptions - -LDLIBS-tst-once5 = -lstdc++ -CFLAGS-tst-thread_local1.o = -std=gnu++11 -LDLIBS-tst-thread_local1 = -lstdc++ - -tests = tst-attr1 tst-attr2 tst-attr3 tst-default-attr \ - tst-mutex1 tst-mutex2 tst-mutex3 tst-mutex4 tst-mutex5 tst-mutex6 \ - tst-mutex7 tst-mutex9 tst-mutex5a tst-mutex7a \ - tst-mutexpi1 tst-mutexpi2 tst-mutexpi3 tst-mutexpi4 tst-mutexpi5 \ - tst-mutexpi5a tst-mutexpi6 tst-mutexpi7 tst-mutexpi7a \ - tst-mutexpi9 \ - tst-spin1 tst-spin2 tst-spin3 tst-spin4 \ - tst-cond1 tst-cond2 tst-cond3 tst-cond4 tst-cond5 tst-cond6 tst-cond7 \ - tst-cond8 tst-cond9 tst-cond10 tst-cond11 tst-cond12 tst-cond13 \ - tst-cond14 tst-cond15 tst-cond16 tst-cond17 tst-cond18 tst-cond19 \ - tst-cond20 tst-cond21 tst-cond22 tst-cond23 tst-cond24 tst-cond25 \ - tst-cond-except \ - tst-robust1 tst-robust2 tst-robust3 tst-robust4 tst-robust5 \ - tst-robust6 tst-robust7 tst-robust8 tst-robust9 \ - tst-robustpi1 tst-robustpi2 tst-robustpi3 tst-robustpi4 tst-robustpi5 \ - tst-robustpi6 tst-robustpi7 tst-robustpi8 tst-robustpi9 \ - tst-rwlock1 tst-rwlock2 tst-rwlock2a tst-rwlock2b tst-rwlock3 \ - tst-rwlock4 tst-rwlock5 tst-rwlock6 tst-rwlock7 tst-rwlock8 \ - tst-rwlock9 tst-rwlock10 tst-rwlock11 tst-rwlock12 tst-rwlock13 \ - tst-rwlock14 tst-rwlock15 tst-rwlock16 tst-rwlock17 tst-rwlock18 \ - tst-once1 tst-once2 tst-once3 tst-once4 tst-once5 \ - tst-key1 tst-key2 tst-key3 tst-key4 \ - tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 tst-sem7 \ - tst-sem8 tst-sem9 tst-sem10 tst-sem14 \ - tst-sem15 tst-sem16 \ - tst-barrier1 tst-barrier2 tst-barrier3 tst-barrier4 \ - tst-align tst-align3 \ - tst-basic1 tst-basic2 tst-basic3 tst-basic4 tst-basic5 tst-basic6 \ - tst-basic7 \ - tst-kill1 tst-kill2 tst-kill3 tst-kill4 tst-kill5 tst-kill6 \ - tst-raise1 \ - tst-join1 tst-join2 tst-join3 tst-join4 tst-join5 tst-join6 tst-join7 \ - tst-detach1 \ - tst-eintr1 tst-eintr2 tst-eintr3 tst-eintr4 tst-eintr5 \ - tst-tsd1 tst-tsd2 tst-tsd3 tst-tsd4 tst-tsd5 tst-tsd6 \ - tst-tls1 tst-tls2 \ - tst-fork1 tst-fork2 tst-fork3 tst-fork4 \ - tst-atfork1 \ - tst-cancel1 tst-cancel2 tst-cancel3 tst-cancel4 tst-cancel4_1 \ - tst-cancel4_2 tst-cancel5 \ - tst-cancel6 tst-cancel7 tst-cancel8 tst-cancel9 tst-cancel10 \ - tst-cancel11 tst-cancel12 tst-cancel13 tst-cancel14 tst-cancel15 \ - tst-cancel16 tst-cancel17 tst-cancel18 tst-cancel19 tst-cancel20 \ - tst-cancel21 tst-cancel22 tst-cancel23 tst-cancel24 tst-cancel25 \ - tst-cancel26 tst-cancel27 \ - tst-cancel-self tst-cancel-self-cancelstate \ - tst-cancel-self-canceltype tst-cancel-self-testcancel \ - tst-cleanup0 tst-cleanup1 tst-cleanup2 tst-cleanup3 tst-cleanup4 \ - tst-flock1 tst-flock2 \ - tst-signal1 tst-signal2 tst-signal3 tst-signal4 tst-signal5 \ - tst-signal6 \ - tst-exec1 tst-exec2 tst-exec3 tst-exec4 tst-exec5 \ - tst-exit1 tst-exit2 tst-exit3 \ - tst-stdio1 tst-stdio2 \ - tst-stack1 tst-stack2 tst-stack3 tst-stack4 tst-pthread-getattr \ - tst-pthread-attr-affinity tst-pthread-mutexattr \ - tst-unload \ - tst-dlsym1 \ - tst-sysconf \ - tst-locale1 tst-locale2 \ - tst-umask1 \ - tst-popen1 \ - tst-clock1 \ - tst-context1 \ - tst-sched1 \ - tst-backtrace1 \ - tst-abstime \ - tst-vfork1 tst-vfork2 tst-vfork1x tst-vfork2x \ - tst-getpid3 \ - tst-setuid3 \ - tst-initializers1 $(addprefix tst-initializers1-,\ - c89 gnu89 c99 gnu99 c11 gnu11) \ - tst-bad-schedattr \ - tst-thread_local1 tst-mutex-errorcheck tst-robust10 \ - tst-robust-fork tst-create-detached - -tests-internal := tst-typesizes tst-rwlock19 tst-sem11 tst-sem12 tst-sem13 \ - tst-barrier5 tst-signal7 tst-mutex8 tst-mutex8-static \ - tst-mutexpi8 tst-mutexpi8-static - -xtests = tst-setuid1 tst-setuid1-static tst-setuid2 \ - tst-mutexpp1 tst-mutexpp6 tst-mutexpp10 -test-srcs = tst-oddstacklimit - -# Test expected to fail on most targets (except x86_64) due to bug -# 18435 - pthread_once hangs when init routine throws an exception. -test-xfail-tst-once5 = yes - -# Files which must not be linked with libpthread. -tests-nolibpthread = tst-unload - -gen-as-const-headers = pthread-errnos.sym \ - unwindbuf.sym \ - pthread-pi-defines.sym - -gen-py-const-headers := nptl_lock_constants.pysym -pretty-printers := nptl-printers.py -tests-printers := test-mutexattr-printers test-mutex-printers \ - test-condattr-printers test-cond-printers \ - test-rwlockattr-printers test-rwlock-printers - -# We must specify both CFLAGS and CPPFLAGS to override any -# compiler options the user might have provided that conflict -# with what we need e.g. user specifies CPPFLAGS with -O2 and -# we need -O0. -CFLAGS-test-mutexattr-printers.c := $(CFLAGS-printers-tests) -CFLAGS-test-mutex-printers.c := $(CFLAGS-printers-tests) -CFLAGS-test-condattr-printers.c := $(CFLAGS-printers-tests) -CFLAGS-test-cond-printers.c := $(CFLAGS-printers-tests) -CFLAGS-test-rwlockattr-printers.c := $(CFLAGS-printers-tests) -CFLAGS-test-rwlock-printers.c := $(CFLAGS-printers-tests) -CPPFLAGS-test-mutexattr-printers.c := $(CFLAGS-printers-tests) -CPPFLAGS-test-mutex-printers.c := $(CFLAGS-printers-tests) -CPPFLAGS-test-condattr-printers.c := $(CFLAGS-printers-tests) -CPPFLAGS-test-cond-printers.c := $(CFLAGS-printers-tests) -CPPFLAGS-test-rwlockattr-printers.c := $(CFLAGS-printers-tests) -CPPFLAGS-test-rwlock-printers.c := $(CFLAGS-printers-tests) - -ifeq ($(build-shared),yes) -tests-printers-libs := $(shared-thread-library) -else -tests-printers-libs := $(static-thread-library) -endif - -LDFLAGS-pthread.so = -Wl,--enable-new-dtags,-z,nodelete,-z,initfirst - -# GCC-4.9 compiles 'sprintf(NULL, ...)' into UD2 on x86_64 without -fno-builtin -CFLAGS-tst-cleanup2.c = -fno-builtin -CFLAGS-tst-cleanupx2.c = -fno-builtin - -tests += tst-cancelx2 tst-cancelx3 tst-cancelx4 tst-cancelx5 \ - tst-cancelx6 tst-cancelx7 tst-cancelx8 tst-cancelx9 tst-cancelx10 \ - tst-cancelx11 tst-cancelx12 tst-cancelx13 tst-cancelx14 tst-cancelx15 \ - tst-cancelx16 tst-cancelx17 tst-cancelx18 tst-cancelx20 tst-cancelx21 \ - tst-cleanupx0 tst-cleanupx1 tst-cleanupx2 tst-cleanupx3 tst-cleanupx4 \ - tst-oncex3 tst-oncex4 -ifeq ($(build-shared),yes) -tests += tst-atfork2 tst-tls4 tst-_res1 tst-fini1 -tests-internal += tst-tls3 tst-tls3-malloc tst-tls5 tst-stackguard1 -tests-nolibpthread += tst-fini1 -ifeq ($(have-z-execstack),yes) -tests += tst-execstack -endif -endif - -modules-names = tst-atfork2mod tst-tls3mod tst-tls4moda tst-tls4modb \ - tst-tls5mod tst-tls5moda tst-tls5modb tst-tls5modc \ - tst-tls5modd tst-tls5mode tst-tls5modf tst-stack4mod \ - tst-_res1mod1 tst-_res1mod2 tst-execstack-mod tst-fini1mod \ - tst-join7mod -extra-test-objs += $(addsuffix .os,$(strip $(modules-names))) \ - tst-cleanup4aux.o tst-cleanupx4aux.o -test-extras += tst-cleanup4aux tst-cleanupx4aux -test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(modules-names))) - -tst-atfork2mod.so-no-z-defs = yes -tst-tls3mod.so-no-z-defs = yes -tst-tls5mod.so-no-z-defs = yes -tst-tls5moda.so-no-z-defs = yes -tst-tls5modb.so-no-z-defs = yes -tst-tls5modc.so-no-z-defs = yes -tst-tls5modd.so-no-z-defs = yes -tst-tls5mode.so-no-z-defs = yes -tst-tls5modf.so-no-z-defs = yes - -ifeq ($(build-shared),yes) -# Build all the modules even when not actually running test programs. -tests: $(test-modules) -endif - -ifeq ($(build-shared),yes) - -# Set the `multidir' variable by grabbing the variable from the compiler. -# We do it once and save the result in a generated makefile. --include $(objpfx)multidir.mk -$(objpfx)multidir.mk: $(common-objpfx)config.make - $(make-target-directory) - dir=`$(CC) $(CFLAGS) $(CPPFLAGS) -print-multi-directory`; \ - echo "multidir := $$dir" > $@T - mv -f $@T $@ - -crti-objs := crti.o -crtn-objs := crtn.o -ifneq (,$(patsubst .,,$(multidir))) -generated-dirs += $(firstword $(subst /, , $(multidir))) -crti-objs += $(multidir)/crti.o -crtn-objs += $(multidir)/crtn.o -$(objpfx)$(multidir): - mkdir -p $@ -endif -extra-objs += $(crti-objs) $(crtn-objs) -extra-objs += pt-crti.o -endif - -CFLAGS-flockfile.c = $(libio-mtsafe) -CFLAGS-ftrylockfile.c = $(libio-mtsafe) -CFLAGS-funlockfile.c = $(libio-mtsafe) - -link-libc-static := $(common-objpfx)libc.a $(static-gnulib) \ - $(common-objpfx)libc.a - -tests-static += tst-locale1 tst-locale2 tst-stackguard1-static \ - tst-cancel21-static tst-cancel24-static tst-cond8-static \ - tst-mutex8-static tst-mutexpi8-static tst-sem11-static \ - tst-sem12-static -tests += tst-cancel21-static tst-cancel24-static \ - tst-cond8-static -tests-internal += tst-sem11-static tst-sem12-static tst-stackguard1-static -xtests-static += tst-setuid1-static - -# These tests are linked with libc before libpthread -tests-reverse += tst-cancel5 tst-cancel23 tst-vfork1x tst-vfork2x - -ifeq ($(run-built-tests),yes) -tests-special += $(objpfx)tst-stack3-mem.out $(objpfx)tst-oddstacklimit.out -ifeq ($(build-shared),yes) -tests-special += $(objpfx)tst-tls6.out $(objpfx)tst-cleanup0-cmp.out \ - $(objpfx)tst-cancel-wrappers.out -endif -endif - -ifeq (,$(CXX)) -# These tests require a C++ compiler and runtime. -tests-unsupported += tst-cancel24 tst-cancel24-static tst-once5 -endif -# These tests require a C++ compiler and runtime with thread_local support. -ifneq ($(have-cxx-thread_local),yes) -tests-unsupported += tst-thread_local1 -endif - -include ../Rules - -ifeq (yes,$(build-shared)) -# Make sure these things are built in the `make lib' pass so they can be used -# to run programs during the `make others' pass. -lib-noranlib: $(addprefix $(objpfx),$(extra-objs)) - -# What we install as libpthread.so for programs to link against is in fact a -# link script. It contains references for the various libraries we need. -# The libpthread.so object is not complete since some functions are only -# defined in libpthread_nonshared.a. -# We need to use absolute paths since otherwise local copies (if they exist) -# of the files are taken by the linker. -install: $(inst_libdir)/libpthread.so - -$(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \ - $(objpfx)libpthread.so$(libpthread.so-version) \ - $(inst_libdir)/$(patsubst %,$(libtype.oS),\ - $(libprefix)pthread) \ - $(+force) - (echo '/* GNU ld script';\ - echo ' Use the shared library, but some functions are only in';\ - echo ' the static library, so try that secondarily. */';\ - cat $<; \ - echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \ - '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\ - ')' \ - ) > $@.new - mv -f $@.new $@ -endif - - -# 'pthread_self' is a simple memory or register load. Setting up the -# stack frame is more work than the actual operation. Disable the -# frame creation entirely. This will help applications which call the -# function frequently to get a thread-specific handle. -CFLAGS-pthread_self.os += -fomit-frame-pointer - -# Run the cancellation and cleanup tests also for the modern, exception-based -# implementation. For this we have to pass the -fexceptions parameter. -CFLAGS-tst-cancelx2.c += -fexceptions -CFLAGS-tst-cancelx3.c += -fexceptions -CFLAGS-tst-cancelx4.c += -fexceptions -CFLAGS-tst-cancelx5.c += -fexceptions -CFLAGS-tst-cancelx6.c += -fexceptions -CFLAGS-tst-cancelx7.c += -fexceptions -CFLAGS-tst-cancelx8.c += -fexceptions -CFLAGS-tst-cancelx9.c += -fexceptions -CFLAGS-tst-cancelx10.c += -fexceptions -CFLAGS-tst-cancelx11.c += -fexceptions -CFLAGS-tst-cancelx12.c += -fexceptions -CFLAGS-tst-cancelx13.c += -fexceptions -CFLAGS-tst-cancelx14.c += -fexceptions -CFLAGS-tst-cancelx15.c += -fexceptions -CFLAGS-tst-cancelx16.c += -fexceptions -CFLAGS-tst-cancelx17.c += -fexceptions -CFLAGS-tst-cancelx18.c += -fexceptions -CFLAGS-tst-cancelx20.c += -fexceptions -fasynchronous-unwind-tables -CFLAGS-tst-cancelx21.c += -fexceptions -fasynchronous-unwind-tables -CFLAGS-tst-cleanupx0.c += -fexceptions -fasynchronous-unwind-tables -CFLAGS-tst-cleanupx1.c += -fexceptions -fasynchronous-unwind-tables -CFLAGS-tst-cleanupx2.c += -fexceptions -CFLAGS-tst-cleanupx3.c += -fexceptions -CFLAGS-tst-cleanupx4.c += -fexceptions -CFLAGS-tst-cleanupx4aux.c += -fexceptions -CFLAGS-tst-oncex3.c += -fexceptions -CFLAGS-tst-oncex4.c += -fexceptions -CFLAGS-tst-align.c += $(stack-align-test-flags) -CFLAGS-tst-align3.c += $(stack-align-test-flags) -CFLAGS-tst-initializers1.c = -W -Wall -Werror -CFLAGS-tst-initializers1-< = $(CFLAGS-tst-initializers1.c) \ - $(patsubst tst-initializers1-%.c,-std=%,$<) -CFLAGS-tst-initializers1-c89.c = $(CFLAGS-tst-initializers1-<) -CFLAGS-tst-initializers1-c99.c = $(CFLAGS-tst-initializers1-<) -CFLAGS-tst-initializers1-c11.c = $(CFLAGS-tst-initializers1-<) -CFLAGS-tst-initializers1-gnu89.c = $(CFLAGS-tst-initializers1-<) -CFLAGS-tst-initializers1-gnu99.c = $(CFLAGS-tst-initializers1-<) -CFLAGS-tst-initializers1-gnu11.c = $(CFLAGS-tst-initializers1-<) - -tst-cancel7-ARGS = --command "exec $(host-test-program-cmd)" -tst-cancelx7-ARGS = $(tst-cancel7-ARGS) -tst-umask1-ARGS = $(objpfx)tst-umask1.temp - -$(objpfx)tst-atfork2: $(libdl) $(shared-thread-library) -LDFLAGS-tst-atfork2 = -rdynamic -tst-atfork2-ENV = MALLOC_TRACE=$(objpfx)tst-atfork2.mtrace -$(objpfx)tst-atfork2mod.so: $(shared-thread-library) - -tst-stack3-ENV = MALLOC_TRACE=$(objpfx)tst-stack3.mtrace -$(objpfx)tst-stack3-mem.out: $(objpfx)tst-stack3.out - $(common-objpfx)malloc/mtrace $(objpfx)tst-stack3.mtrace > $@; \ - $(evaluate-test) -generated += tst-stack3-mem.out tst-stack3.mtrace - -$(objpfx)tst-stack4: $(libdl) $(shared-thread-library) -tst-stack4mod.sos=$(shell for i in 0 1 2 3 4 5 6 7 8 9 10 \ - 11 12 13 14 15 16 17 18 19; do \ - for j in 0 1 2 3 4 5 6 7 8 9 10 \ - 11 12 13 14 15 16 17 18 19; do \ - echo $(objpfx)tst-stack4mod-$$i-$$j.so; \ - done; done) -$(objpfx)tst-stack4.out: $(tst-stack4mod.sos) -$(tst-stack4mod.sos): $(objpfx)tst-stack4mod.so - cp -f $< $@ -clean: - rm -f $(tst-stack4mod.sos) - -$(objpfx)tst-cleanup4: $(objpfx)tst-cleanup4aux.o $(shared-thread-library) -$(objpfx)tst-cleanupx4: $(objpfx)tst-cleanupx4aux.o $(shared-thread-library) - -$(objpfx)tst-tls3: $(libdl) $(shared-thread-library) -LDFLAGS-tst-tls3 = -rdynamic -$(objpfx)tst-tls3.out: $(objpfx)tst-tls3mod.so -$(objpfx)tst-tls3mod.so: $(shared-thread-library) - -$(objpfx)tst-tls3-malloc: $(libdl) $(shared-thread-library) -LDFLAGS-tst-tls3-malloc = -rdynamic -$(objpfx)tst-tls3-malloc.out: $(objpfx)tst-tls3mod.so - -$(objpfx)tst-tls4: $(libdl) $(shared-thread-library) -$(objpfx)tst-tls4.out: $(objpfx)tst-tls4moda.so $(objpfx)tst-tls4modb.so - -$(objpfx)tst-tls5: $(objpfx)tst-tls5mod.so $(shared-thread-library) -LDFLAGS-tst-tls5 = $(no-as-needed) -LDFLAGS-tst-tls5mod.so = -Wl,-soname,tst-tls5mod.so - -ifeq ($(build-shared),yes) -$(objpfx)tst-tls6.out: tst-tls6.sh $(objpfx)tst-tls5 \ - $(objpfx)tst-tls5moda.so $(objpfx)tst-tls5modb.so \ - $(objpfx)tst-tls5modc.so $(objpfx)tst-tls5modd.so \ - $(objpfx)tst-tls5mode.so $(objpfx)tst-tls5modf.so - $(BASH) $< $(common-objpfx) '$(test-via-rtld-prefix)' \ - '$(test-wrapper-env)' '$(run-program-env)'; \ - $(evaluate-test) -endif - -$(objpfx)tst-join7: $(libdl) $(shared-thread-library) -$(objpfx)tst-join7.out: $(objpfx)tst-join7mod.so -$(objpfx)tst-join7mod.so: $(shared-thread-library) -LDFLAGS-tst-join7mod.so = -Wl,-soname,tst-join7mod.so - -$(objpfx)tst-dlsym1: $(libdl) $(shared-thread-library) - -$(objpfx)tst-fini1: $(shared-thread-library) $(objpfx)tst-fini1mod.so - -ifeq (yes,$(build-shared)) -librt = $(common-objpfx)rt/librt.so -else -librt = $(common-objpfx)rt/librt.a -endif - -$(objpfx)tst-cancel17: $(librt) -$(objpfx)tst-cancelx17: $(librt) -$(objpfx)tst-_res1mod2.so: $(objpfx)tst-_res1mod1.so -LDFLAGS-tst-_res1mod1.so = -Wl,-soname,tst-_res1mod1.so -LDFLAGS-tst-_res1mod2.so = -Wl,-soname,tst-_res1mod2.so -$(objpfx)tst-_res1: $(objpfx)tst-_res1mod1.so $(objpfx)tst-_res1mod2.so \ - $(shared-thread-library) - -LDLIBS-tst-cancel24 = $(no-as-needed) -lstdc++ -LDLIBS-tst-cancel24-static = $(LDLIBS-tst-cancel24) - -extra-B-pthread.so = -B$(common-objpfx)nptl/ -$(objpfx)libpthread.so: $(addprefix $(objpfx),$(crti-objs) $(crtn-objs)) -$(objpfx)libpthread.so: +preinit += $(addprefix $(objpfx),$(crti-objs)) -$(objpfx)libpthread.so: +postinit += $(addprefix $(objpfx),$(crtn-objs)) - -# Make sure we link with the thread library. -ifeq ($(build-shared),yes) -$(addprefix $(objpfx), \ - $(filter-out $(tests-static) $(xtests-static) $(tests-reverse) \ - $(tests-nolibpthread), \ - $(tests) $(tests-internal) $(xtests) $(test-srcs))): \ - $(objpfx)libpthread.so \ - $(objpfx)libpthread_nonshared.a -$(objpfx)tst-unload: $(libdl) -# $(objpfx)../libc.so is used instead of $(common-objpfx)libc.so, -# since otherwise libpthread.so comes before libc.so when linking. -$(addprefix $(objpfx), $(tests-reverse)): \ - $(objpfx)../libc.so $(objpfx)libpthread.so \ - $(objpfx)libpthread_nonshared.a -$(objpfx)../libc.so: $(common-objpfx)libc.so ; -$(addprefix $(objpfx),$(tests-static) $(xtests-static)): $(objpfx)libpthread.a - -$(objpfx)tst-atfork2.out: $(objpfx)tst-atfork2mod.so -else -$(addprefix $(objpfx),$(tests) $(test-srcs)): $(objpfx)libpthread.a -endif - -ifeq ($(build-shared),yes) - -$(objpfx)tst-cleanup0.out: /dev/null $(objpfx)tst-cleanup0 - $(make-test-out) > $@ 2>&1; \ - $(evaluate-test) - -$(objpfx)tst-cleanup0-cmp.out: tst-cleanup0.expect $(objpfx)tst-cleanup0.out - cmp $^ > $@; \ - $(evaluate-test) - -$(objpfx)crti.o: $(objpfx)pt-crti.o - ln -f $< $@ - -ifneq ($(multidir),.) -$(objpfx)$(multidir)/crti.o: $(objpfx)crti.o $(objpfx)$(multidir)/ - ln -f $< $@ - -$(objpfx)$(multidir)/crtn.o: $(objpfx)crtn.o $(objpfx)$(multidir)/ - ln -f $< $@ -endif - -generated += libpthread_nonshared.a \ - multidir.mk tst-atfork2.mtrace tst-cancel-wrappers.out \ - tst-tls6.out - -generated += $(objpfx)tst-atfork2.mtrace \ - $(addsuffix .so,$(strip $(modules-names))) - -$(objpfx)version.d: $(objpfx)banner.h -$(objpfx)version.os: $(objpfx)banner.h -$(objpfx)banner.h: Banner - sed 's/\(.*\)/"\1\\n"/' $< > $@ -generated += banner.h -# Give libpthread.so an entry point and make it directly runnable itself. -LDFLAGS-pthread.so += -e __nptl_main -# pt-interp.c exists just to get the runtime linker path into libpthread.so. -$(objpfx)pt-interp.os: $(common-objpfx)runtime-linker.h -endif - -ifeq ($(run-built-tests),yes) -ifeq (yes,$(build-shared)) -$(objpfx)tst-cancel-wrappers.out: tst-cancel-wrappers.sh - $(SHELL) $< '$(NM)' \ - $(common-objpfx)libc_pic.a \ - $(common-objpfx)libc.a \ - $(objpfx)libpthread_pic.a \ - $(objpfx)libpthread.a > $@; \ - $(evaluate-test) -endif -endif - -tst-exec4-ARGS = $(host-test-program-cmd) - -$(objpfx)tst-execstack: $(libdl) -$(objpfx)tst-execstack.out: $(objpfx)tst-execstack-mod.so -LDFLAGS-tst-execstack = -Wl,-z,noexecstack -CFLAGS-tst-execstack-mod.c += -Wno-trampolines - -$(objpfx)tst-fini1mod.so: $(shared-thread-library) - -tst-stackguard1-ARGS = --command "$(host-test-program-cmd) --child" -tst-stackguard1-static-ARGS = --command "$(objpfx)tst-stackguard1-static --child" - -ifeq ($(run-built-tests),yes) -$(objpfx)tst-oddstacklimit.out: $(objpfx)tst-oddstacklimit $(objpfx)tst-basic1 - $(test-program-prefix) $< --command '$(host-test-program-cmd)' > $@; \ - $(evaluate-test) -endif - -# The tests here better do not run in parallel -ifneq ($(filter %tests,$(MAKECMDGOALS)),) -.NOTPARALLEL: -endif diff --git a/nptl/TODO b/nptl/TODO deleted file mode 100644 index 70b8fe4f76..0000000000 --- a/nptl/TODO +++ /dev/null @@ -1,31 +0,0 @@ -- we should probably extend pthread_mutexattr_t with a field to create a - single linked list of all instances. This requires changing the - pthread_mutexattr_* functions. - - -- a new attribute for mutexes: number of times we spin before calling -sys_futex - -- for adaptive mutexes: when releasing, determine whether somebody spins. -If yes, for a short time release lock. If someone else locks no wakeup -syscall needed. - - - -- test with threaded process terminating and semadj (?) being applied - only after all threads are gone - - - -- semaphore changes: - - - sem_post should only wake one thread and only when the state of - the semaphore changed from 0 to 1 - - this also requires that sem_wait and sem_timedwait don't drop the - post if they get canceled. - - - possibly add counter field. This requires reviving the - differences between old and new semaphose funtions. The old ones - stay as they are now. The new once can use an additional field - wich is the counter for the number of waiters diff --git a/nptl/TODO-kernel b/nptl/TODO-kernel deleted file mode 100644 index ad6d2a4b51..0000000000 --- a/nptl/TODO-kernel +++ /dev/null @@ -1,20 +0,0 @@ -- setuid/setgid must effect process - + test syscalls (getuid) afterwards - + test core file content - - + use UID/GID in access(2), chmod(2), chown(2), link(2) - -- nice level is process property - -- rlimit should be process-wide and SIGXCPU should be sent if all threads - together exceed the limit - -- getrusage() must return resource utilization for the process - - - -The following are possible optimizations and in no way required: - - -- the scheduler should be thread group-aware, i.e., it has to give time to - the thread group not proportional to the number of threads. diff --git a/nptl/TODO-testing b/nptl/TODO-testing deleted file mode 100644 index e076e5624f..0000000000 --- a/nptl/TODO-testing +++ /dev/null @@ -1,20 +0,0 @@ -pthread_attr_setguardsize - - test effectiveness - -pthread_attr_[sg]etschedparam - - what to test? - -pthread_attr_[sg]etstack - - some more tests needed - -pthread_getcpuclockid - - check that value is reset -> rt subdir - -pthread_getschedparam -pthread_setschedparam - - what to test? diff --git a/nptl/Versions b/nptl/Versions deleted file mode 100644 index 0ae5def464..0000000000 --- a/nptl/Versions +++ /dev/null @@ -1,275 +0,0 @@ -libc { - GLIBC_2.0 { - pthread_attr_destroy; pthread_attr_init; - pthread_attr_getdetachstate; pthread_attr_setdetachstate; - pthread_attr_getinheritsched; pthread_attr_setinheritsched; - pthread_attr_getschedparam; pthread_attr_setschedparam; - pthread_attr_getschedpolicy; pthread_attr_setschedpolicy; - pthread_attr_getscope; pthread_attr_setscope; - pthread_condattr_destroy; pthread_condattr_init; - pthread_cond_broadcast; pthread_cond_destroy; - pthread_cond_init; pthread_cond_signal; pthread_cond_wait; - pthread_cond_timedwait; - pthread_equal; pthread_exit; - pthread_getschedparam; pthread_setschedparam; - pthread_mutex_destroy; pthread_mutex_init; - pthread_mutex_lock; pthread_mutex_unlock; - pthread_self; - pthread_setcancelstate; pthread_setcanceltype; - } - GLIBC_2.1 { - pthread_attr_init; - } - GLIBC_2.3.2 { - __register_atfork; - - # Changed pthread_cond_t. - pthread_cond_init; pthread_cond_destroy; - pthread_cond_wait; pthread_cond_signal; - pthread_cond_broadcast; pthread_cond_timedwait; - } - GLIBC_PRIVATE { - __libc_alloca_cutoff; - # Internal libc interface to libpthread - __libc_dl_error_tsd; - __libc_vfork; - __libc_pthread_init; - __libc_current_sigrtmin_private; __libc_current_sigrtmax_private; - __libc_allocate_rtsig_private; - } -} - -libpthread { - GLIBC_2.0 { - pthread_create; pthread_join; pthread_self; pthread_equal; - pthread_exit; pthread_detach; - - pthread_getschedparam; pthread_setschedparam; - - pthread_attr_init; pthread_attr_destroy; - pthread_attr_getdetachstate; pthread_attr_setdetachstate; - pthread_attr_getschedparam; pthread_attr_setschedparam; - pthread_attr_getschedpolicy; pthread_attr_setschedpolicy; - pthread_attr_getinheritsched; pthread_attr_setinheritsched; - pthread_attr_getscope; pthread_attr_setscope; - - pthread_mutex_init; pthread_mutex_destroy; - pthread_mutex_lock; pthread_mutex_trylock; pthread_mutex_unlock; - - pthread_mutexattr_init; pthread_mutexattr_destroy; - - pthread_cond_init; pthread_cond_destroy; - pthread_cond_wait; pthread_cond_timedwait; - pthread_cond_signal; pthread_cond_broadcast; - - pthread_condattr_destroy; pthread_condattr_init; - - pthread_cancel; pthread_testcancel; - pthread_setcancelstate; pthread_setcanceltype; - - pthread_sigmask; pthread_kill; - - pthread_key_create; pthread_key_delete; - pthread_getspecific; pthread_setspecific; - - pthread_once; - - pthread_atfork; - - flockfile; funlockfile; ftrylockfile; - - # Non-standard POSIX1.x functions. - pthread_mutexattr_getkind_np; pthread_mutexattr_setkind_np; - - # Protected names for functions used in other shared objects. - __pthread_mutex_init; __pthread_mutex_destroy; - __pthread_mutex_lock; __pthread_mutex_trylock; __pthread_mutex_unlock; - __pthread_mutexattr_init; __pthread_mutexattr_destroy; - __pthread_mutexattr_settype; - __pthread_key_create; __pthread_getspecific; __pthread_setspecific; - __pthread_once; __pthread_atfork; - _IO_flockfile; _IO_ftrylockfile; _IO_funlockfile; - - # Semaphores. - sem_destroy; sem_getvalue; sem_init; sem_post; sem_trywait; sem_wait; - - # Special fork handling. - fork; __fork; vfork; - - # Cancellation points. - close; __close; fcntl; __fcntl; read; __read; write; __write; accept; - connect; __connect; recv; recvfrom; recvmsg; send; __send; sendmsg; sendto; - fsync; lseek; __lseek; msync; nanosleep; open; __open; pause; tcdrain; - system; wait; __wait; waitpid; - - # Hidden entry point (through macros). - _pthread_cleanup_push; _pthread_cleanup_pop; - _pthread_cleanup_push_defer; _pthread_cleanup_pop_restore; - - pthread_kill_other_threads_np; - - # The error functions. - __errno_location; __h_errno_location; - - # Functions which previously have been overwritten. - sigwait; sigaction; __sigaction; _exit; _Exit; longjmp; siglongjmp; - raise; - } - - GLIBC_2.1 { - pthread_create; - pthread_attr_init; - - pthread_attr_getguardsize; pthread_attr_setguardsize; - pthread_attr_getstackaddr; pthread_attr_setstackaddr; - pthread_attr_getstacksize; pthread_attr_setstacksize; - - pthread_mutexattr_gettype; pthread_mutexattr_settype; - - pthread_rwlock_init; pthread_rwlock_destroy; - pthread_rwlock_rdlock; pthread_rwlock_wrlock; pthread_rwlock_unlock; - pthread_rwlock_tryrdlock; pthread_rwlock_trywrlock; - - pthread_rwlockattr_init; pthread_rwlockattr_destroy; - pthread_rwlockattr_getpshared; pthread_rwlockattr_setpshared; - pthread_rwlockattr_getkind_np; pthread_rwlockattr_setkind_np; - - pthread_getconcurrency; pthread_setconcurrency; - - # Semaphores. - sem_destroy; sem_getvalue; sem_init; sem_post; sem_trywait; sem_wait; - - __libc_current_sigrtmin; __libc_current_sigrtmax; - __libc_allocate_rtsig; - } - - GLIBC_2.1.1 { - sem_close; sem_open; sem_unlink; - } - - GLIBC_2.1.2 { - __vfork; - } - - GLIBC_2.2 { - pthread_mutexattr_getpshared; pthread_mutexattr_setpshared; - - pthread_condattr_getpshared; pthread_condattr_setpshared; - - # New functions from IEEE Std. 1003.1-2001. - pthread_mutex_timedlock; - - pthread_rwlock_timedrdlock; pthread_rwlock_timedwrlock; - - pthread_attr_getstack; pthread_attr_setstack; - - pthread_spin_destroy; pthread_spin_init; pthread_spin_lock; - pthread_spin_trylock; pthread_spin_unlock; - - pthread_barrier_init; pthread_barrier_destroy; pthread_barrier_wait; - pthread_barrierattr_destroy; pthread_barrierattr_init; - pthread_barrierattr_setpshared; - - sem_timedwait; - - pthread_yield; - - pthread_getcpuclockid; - - # Cancellation points. - lseek64; open64; __open64; pread; pread64; __pread64; pwrite; pwrite64; - __pwrite64; - - # Names used internally. - __pthread_rwlock_init; __pthread_rwlock_destroy; - __pthread_rwlock_rdlock; __pthread_rwlock_tryrdlock; - __pthread_rwlock_wrlock; __pthread_rwlock_trywrlock; - __pthread_rwlock_unlock; - - __res_state; - } - - GLIBC_2.2.3 { - # Extensions. - pthread_getattr_np; - } - - GLIBC_2.2.6 { - # Cancellation wrapper - __nanosleep; - } - - GLIBC_2.3.2 { - # Changed pthread_cond_t. - pthread_cond_init; pthread_cond_destroy; - pthread_cond_wait; pthread_cond_timedwait; - pthread_cond_signal; pthread_cond_broadcast; - } - - GLIBC_2.3.3 { - # 1003.1-2001 function accidentally left out in 2.2. - pthread_barrierattr_getpshared; - - # Unix CS option. - pthread_condattr_getclock; pthread_condattr_setclock; - - # Proposed API extensions. - pthread_tryjoin_np; pthread_timedjoin_np; - - # New cancellation cleanup handling. - __pthread_register_cancel; __pthread_unregister_cancel; - __pthread_register_cancel_defer; __pthread_unregister_cancel_restore; - __pthread_unwind_next; - __pthread_cleanup_routine; - - # affinity interfaces without size parameter - pthread_getaffinity_np; pthread_setaffinity_np; - pthread_attr_getaffinity_np; pthread_attr_setaffinity_np; - } - - GLIBC_2.3.4 { - # New affinity interfaces. - pthread_getaffinity_np; pthread_setaffinity_np; - pthread_attr_getaffinity_np; pthread_attr_setaffinity_np; - - pthread_setschedprio; - } - - GLIBC_2.4 { - pthread_mutexattr_getrobust_np; pthread_mutexattr_setrobust_np; - pthread_mutex_consistent_np; - pthread_mutexattr_getprotocol; pthread_mutexattr_setprotocol; - pthread_mutexattr_getprioceiling; pthread_mutexattr_setprioceiling; - pthread_mutex_getprioceiling; pthread_mutex_setprioceiling; - }; - - GLIBC_2.11 { - pthread_sigqueue; - }; - - GLIBC_2.12 { - pthread_mutex_consistent; pthread_mutexattr_getrobust; - pthread_mutexattr_setrobust; - - pthread_setname_np; pthread_getname_np; - }; - - GLIBC_2.18 { - pthread_getattr_default_np; - pthread_setattr_default_np; - } - - GLIBC_2.20 { - } - - GLIBC_2.22 { - } - - GLIBC_PRIVATE { - __pthread_initialize_minimal; - __pthread_clock_gettime; __pthread_clock_settime; - __pthread_unwind; __pthread_get_minstack; - __pthread_barrier_init; __pthread_barrier_wait; - __shm_directory; - } -} diff --git a/nptl/alloca_cutoff.c b/nptl/alloca_cutoff.c deleted file mode 100644 index f2ae1a8e85..0000000000 --- a/nptl/alloca_cutoff.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Determine whether block of given size can be allocated on the stack or not. - Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#include <alloca.h> -#include <stdlib.h> -#include <sys/param.h> -#include <pthreadP.h> - - -int -__libc_alloca_cutoff (size_t size) -{ - return size <= (MIN (__MAX_ALLOCA_CUTOFF, - THREAD_GETMEM (THREAD_SELF, stackblock_size) / 4 - /* The main thread, before the thread library is - initialized, has zero in the stackblock_size - element. Since it is the main thread we can - assume the maximum available stack space. */ - ?: __MAX_ALLOCA_CUTOFF * 4)); -} -libc_hidden_def (__libc_alloca_cutoff) diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c deleted file mode 100644 index e5c5f79a82..0000000000 --- a/nptl/allocatestack.c +++ /dev/null @@ -1,1238 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <signal.h> -#include <stdint.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/param.h> -#include <dl-sysdep.h> -#include <dl-tls.h> -#include <tls.h> -#include <list.h> -#include <lowlevellock.h> -#include <futex-internal.h> -#include <kernel-features.h> -#include <stack-aliasing.h> - - -#ifndef NEED_SEPARATE_REGISTER_STACK - -/* Most architectures have exactly one stack pointer. Some have more. */ -# define STACK_VARIABLES void *stackaddr = NULL - -/* How to pass the values to the 'create_thread' function. */ -# define STACK_VARIABLES_ARGS stackaddr - -/* How to declare function which gets there parameters. */ -# define STACK_VARIABLES_PARMS void *stackaddr - -/* How to declare allocate_stack. */ -# define ALLOCATE_STACK_PARMS void **stack - -/* This is how the function is called. We do it this way to allow - other variants of the function to have more parameters. */ -# define ALLOCATE_STACK(attr, pd) allocate_stack (attr, pd, &stackaddr) - -#else - -/* We need two stacks. The kernel will place them but we have to tell - the kernel about the size of the reserved address space. */ -# define STACK_VARIABLES void *stackaddr = NULL; size_t stacksize = 0 - -/* How to pass the values to the 'create_thread' function. */ -# define STACK_VARIABLES_ARGS stackaddr, stacksize - -/* How to declare function which gets there parameters. */ -# define STACK_VARIABLES_PARMS void *stackaddr, size_t stacksize - -/* How to declare allocate_stack. */ -# define ALLOCATE_STACK_PARMS void **stack, size_t *stacksize - -/* This is how the function is called. We do it this way to allow - other variants of the function to have more parameters. */ -# define ALLOCATE_STACK(attr, pd) \ - allocate_stack (attr, pd, &stackaddr, &stacksize) - -#endif - - -/* Default alignment of stack. */ -#ifndef STACK_ALIGN -# define STACK_ALIGN __alignof__ (long double) -#endif - -/* Default value for minimal stack size after allocating thread - descriptor and guard. */ -#ifndef MINIMAL_REST_STACK -# define MINIMAL_REST_STACK 4096 -#endif - - -/* Newer kernels have the MAP_STACK flag to indicate a mapping is used for - a stack. Use it when possible. */ -#ifndef MAP_STACK -# define MAP_STACK 0 -#endif - -/* This yields the pointer that TLS support code calls the thread pointer. */ -#if TLS_TCB_AT_TP -# define TLS_TPADJ(pd) (pd) -#elif TLS_DTV_AT_TP -# define TLS_TPADJ(pd) ((struct pthread *)((char *) (pd) + TLS_PRE_TCB_SIZE)) -#endif - -/* Cache handling for not-yet free stacks. */ - -/* Maximum size in kB of cache. */ -static size_t stack_cache_maxsize = 40 * 1024 * 1024; /* 40MiBi by default. */ -static size_t stack_cache_actsize; - -/* Mutex protecting this variable. */ -static int stack_cache_lock = LLL_LOCK_INITIALIZER; - -/* List of queued stack frames. */ -static LIST_HEAD (stack_cache); - -/* List of the stacks in use. */ -static LIST_HEAD (stack_used); - -/* We need to record what list operations we are going to do so that, - in case of an asynchronous interruption due to a fork() call, we - can correct for the work. */ -static uintptr_t in_flight_stack; - -/* List of the threads with user provided stacks in use. No need to - initialize this, since it's done in __pthread_initialize_minimal. */ -list_t __stack_user __attribute__ ((nocommon)); -hidden_data_def (__stack_user) - - -/* Check whether the stack is still used or not. */ -#define FREE_P(descr) ((descr)->tid <= 0) - - -static void -stack_list_del (list_t *elem) -{ - in_flight_stack = (uintptr_t) elem; - - atomic_write_barrier (); - - list_del (elem); - - atomic_write_barrier (); - - in_flight_stack = 0; -} - - -static void -stack_list_add (list_t *elem, list_t *list) -{ - in_flight_stack = (uintptr_t) elem | 1; - - atomic_write_barrier (); - - list_add (elem, list); - - atomic_write_barrier (); - - in_flight_stack = 0; -} - - -/* We create a double linked list of all cache entries. Double linked - because this allows removing entries from the end. */ - - -/* Get a stack frame from the cache. We have to match by size since - some blocks might be too small or far too large. */ -static struct pthread * -get_cached_stack (size_t *sizep, void **memp) -{ - size_t size = *sizep; - struct pthread *result = NULL; - list_t *entry; - - lll_lock (stack_cache_lock, LLL_PRIVATE); - - /* Search the cache for a matching entry. We search for the - smallest stack which has at least the required size. Note that - in normal situations the size of all allocated stacks is the - same. As the very least there are only a few different sizes. - Therefore this loop will exit early most of the time with an - exact match. */ - list_for_each (entry, &stack_cache) - { - struct pthread *curr; - - curr = list_entry (entry, struct pthread, list); - if (FREE_P (curr) && curr->stackblock_size >= size) - { - if (curr->stackblock_size == size) - { - result = curr; - break; - } - - if (result == NULL - || result->stackblock_size > curr->stackblock_size) - result = curr; - } - } - - if (__builtin_expect (result == NULL, 0) - /* Make sure the size difference is not too excessive. In that - case we do not use the block. */ - || __builtin_expect (result->stackblock_size > 4 * size, 0)) - { - /* Release the lock. */ - lll_unlock (stack_cache_lock, LLL_PRIVATE); - - return NULL; - } - - /* Don't allow setxid until cloned. */ - result->setxid_futex = -1; - - /* Dequeue the entry. */ - stack_list_del (&result->list); - - /* And add to the list of stacks in use. */ - stack_list_add (&result->list, &stack_used); - - /* And decrease the cache size. */ - stack_cache_actsize -= result->stackblock_size; - - /* Release the lock early. */ - lll_unlock (stack_cache_lock, LLL_PRIVATE); - - /* Report size and location of the stack to the caller. */ - *sizep = result->stackblock_size; - *memp = result->stackblock; - - /* Cancellation handling is back to the default. */ - result->cancelhandling = 0; - result->cleanup = NULL; - - /* No pending event. */ - result->nextevent = NULL; - - /* Clear the DTV. */ - dtv_t *dtv = GET_DTV (TLS_TPADJ (result)); - for (size_t cnt = 0; cnt < dtv[-1].counter; ++cnt) - free (dtv[1 + cnt].pointer.to_free); - memset (dtv, '\0', (dtv[-1].counter + 1) * sizeof (dtv_t)); - - /* Re-initialize the TLS. */ - _dl_allocate_tls_init (TLS_TPADJ (result)); - - return result; -} - - -/* Free stacks until cache size is lower than LIMIT. */ -void -__free_stacks (size_t limit) -{ - /* We reduce the size of the cache. Remove the last entries until - the size is below the limit. */ - list_t *entry; - list_t *prev; - - /* Search from the end of the list. */ - list_for_each_prev_safe (entry, prev, &stack_cache) - { - struct pthread *curr; - - curr = list_entry (entry, struct pthread, list); - if (FREE_P (curr)) - { - /* Unlink the block. */ - stack_list_del (entry); - - /* Account for the freed memory. */ - stack_cache_actsize -= curr->stackblock_size; - - /* Free the memory associated with the ELF TLS. */ - _dl_deallocate_tls (TLS_TPADJ (curr), false); - - /* Remove this block. This should never fail. If it does - something is really wrong. */ - if (munmap (curr->stackblock, curr->stackblock_size) != 0) - abort (); - - /* Maybe we have freed enough. */ - if (stack_cache_actsize <= limit) - break; - } - } -} - - -/* Add a stack frame which is not used anymore to the stack. Must be - called with the cache lock held. */ -static inline void -__attribute ((always_inline)) -queue_stack (struct pthread *stack) -{ - /* We unconditionally add the stack to the list. The memory may - still be in use but it will not be reused until the kernel marks - the stack as not used anymore. */ - stack_list_add (&stack->list, &stack_cache); - - stack_cache_actsize += stack->stackblock_size; - if (__glibc_unlikely (stack_cache_actsize > stack_cache_maxsize)) - __free_stacks (stack_cache_maxsize); -} - - -static int -internal_function -change_stack_perm (struct pthread *pd -#ifdef NEED_SEPARATE_REGISTER_STACK - , size_t pagemask -#endif - ) -{ -#ifdef NEED_SEPARATE_REGISTER_STACK - void *stack = (pd->stackblock - + (((((pd->stackblock_size - pd->guardsize) / 2) - & pagemask) + pd->guardsize) & pagemask)); - size_t len = pd->stackblock + pd->stackblock_size - stack; -#elif _STACK_GROWS_DOWN - void *stack = pd->stackblock + pd->guardsize; - size_t len = pd->stackblock_size - pd->guardsize; -#elif _STACK_GROWS_UP - void *stack = pd->stackblock; - size_t len = (uintptr_t) pd - pd->guardsize - (uintptr_t) pd->stackblock; -#else -# error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP" -#endif - if (mprotect (stack, len, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) - return errno; - - return 0; -} - - -/* Returns a usable stack for a new thread either by allocating a - new stack or reusing a cached stack of sufficient size. - ATTR must be non-NULL and point to a valid pthread_attr. - PDP must be non-NULL. */ -static int -allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, - ALLOCATE_STACK_PARMS) -{ - struct pthread *pd; - size_t size; - size_t pagesize_m1 = __getpagesize () - 1; - - assert (powerof2 (pagesize_m1 + 1)); - assert (TCB_ALIGNMENT >= STACK_ALIGN); - - /* Get the stack size from the attribute if it is set. Otherwise we - use the default we determined at start time. */ - if (attr->stacksize != 0) - size = attr->stacksize; - else - { - lll_lock (__default_pthread_attr_lock, LLL_PRIVATE); - size = __default_pthread_attr.stacksize; - lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE); - } - - /* Get memory for the stack. */ - if (__glibc_unlikely (attr->flags & ATTR_FLAG_STACKADDR)) - { - uintptr_t adj; - char *stackaddr = (char *) attr->stackaddr; - - /* Assume the same layout as the _STACK_GROWS_DOWN case, with struct - pthread at the top of the stack block. Later we adjust the guard - location and stack address to match the _STACK_GROWS_UP case. */ - if (_STACK_GROWS_UP) - stackaddr += attr->stacksize; - - /* If the user also specified the size of the stack make sure it - is large enough. */ - if (attr->stacksize != 0 - && attr->stacksize < (__static_tls_size + MINIMAL_REST_STACK)) - return EINVAL; - - /* Adjust stack size for alignment of the TLS block. */ -#if TLS_TCB_AT_TP - adj = ((uintptr_t) stackaddr - TLS_TCB_SIZE) - & __static_tls_align_m1; - assert (size > adj + TLS_TCB_SIZE); -#elif TLS_DTV_AT_TP - adj = ((uintptr_t) stackaddr - __static_tls_size) - & __static_tls_align_m1; - assert (size > adj); -#endif - - /* The user provided some memory. Let's hope it matches the - size... We do not allocate guard pages if the user provided - the stack. It is the user's responsibility to do this if it - is wanted. */ -#if TLS_TCB_AT_TP - pd = (struct pthread *) ((uintptr_t) stackaddr - - TLS_TCB_SIZE - adj); -#elif TLS_DTV_AT_TP - pd = (struct pthread *) (((uintptr_t) stackaddr - - __static_tls_size - adj) - - TLS_PRE_TCB_SIZE); -#endif - - /* The user provided stack memory needs to be cleared. */ - memset (pd, '\0', sizeof (struct pthread)); - - /* The first TSD block is included in the TCB. */ - pd->specific[0] = pd->specific_1stblock; - - /* Remember the stack-related values. */ - pd->stackblock = (char *) stackaddr - size; - pd->stackblock_size = size; - - /* This is a user-provided stack. It will not be queued in the - stack cache nor will the memory (except the TLS memory) be freed. */ - pd->user_stack = true; - - /* This is at least the second thread. */ - pd->header.multiple_threads = 1; -#ifndef TLS_MULTIPLE_THREADS_IN_TCB - __pthread_multiple_threads = *__libc_multiple_threads_ptr = 1; -#endif - -#ifndef __ASSUME_PRIVATE_FUTEX - /* The thread must know when private futexes are supported. */ - pd->header.private_futex = THREAD_GETMEM (THREAD_SELF, - header.private_futex); -#endif - -#ifdef NEED_DL_SYSINFO - SETUP_THREAD_SYSINFO (pd); -#endif - - /* Don't allow setxid until cloned. */ - pd->setxid_futex = -1; - - /* Allocate the DTV for this thread. */ - if (_dl_allocate_tls (TLS_TPADJ (pd)) == NULL) - { - /* Something went wrong. */ - assert (errno == ENOMEM); - return errno; - } - - - /* Prepare to modify global data. */ - lll_lock (stack_cache_lock, LLL_PRIVATE); - - /* And add to the list of stacks in use. */ - list_add (&pd->list, &__stack_user); - - lll_unlock (stack_cache_lock, LLL_PRIVATE); - } - else - { - /* Allocate some anonymous memory. If possible use the cache. */ - size_t guardsize; - size_t reqsize; - void *mem; - const int prot = (PROT_READ | PROT_WRITE - | ((GL(dl_stack_flags) & PF_X) ? PROT_EXEC : 0)); - - /* Adjust the stack size for alignment. */ - size &= ~__static_tls_align_m1; - assert (size != 0); - - /* Make sure the size of the stack is enough for the guard and - eventually the thread descriptor. */ - guardsize = (attr->guardsize + pagesize_m1) & ~pagesize_m1; - if (__builtin_expect (size < ((guardsize + __static_tls_size - + MINIMAL_REST_STACK + pagesize_m1) - & ~pagesize_m1), - 0)) - /* The stack is too small (or the guard too large). */ - return EINVAL; - - /* Try to get a stack from the cache. */ - reqsize = size; - pd = get_cached_stack (&size, &mem); - if (pd == NULL) - { - /* To avoid aliasing effects on a larger scale than pages we - adjust the allocated stack size if necessary. This way - allocations directly following each other will not have - aliasing problems. */ -#if MULTI_PAGE_ALIASING != 0 - if ((size % MULTI_PAGE_ALIASING) == 0) - size += pagesize_m1 + 1; -#endif - - mem = mmap (NULL, size, prot, - MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0); - - if (__glibc_unlikely (mem == MAP_FAILED)) - return errno; - - /* SIZE is guaranteed to be greater than zero. - So we can never get a null pointer back from mmap. */ - assert (mem != NULL); - - /* Place the thread descriptor at the end of the stack. */ -#if TLS_TCB_AT_TP - pd = (struct pthread *) ((char *) mem + size) - 1; -#elif TLS_DTV_AT_TP - pd = (struct pthread *) ((((uintptr_t) mem + size - - __static_tls_size) - & ~__static_tls_align_m1) - - TLS_PRE_TCB_SIZE); -#endif - - /* Remember the stack-related values. */ - pd->stackblock = mem; - pd->stackblock_size = size; - - /* We allocated the first block thread-specific data array. - This address will not change for the lifetime of this - descriptor. */ - pd->specific[0] = pd->specific_1stblock; - - /* This is at least the second thread. */ - pd->header.multiple_threads = 1; -#ifndef TLS_MULTIPLE_THREADS_IN_TCB - __pthread_multiple_threads = *__libc_multiple_threads_ptr = 1; -#endif - -#ifndef __ASSUME_PRIVATE_FUTEX - /* The thread must know when private futexes are supported. */ - pd->header.private_futex = THREAD_GETMEM (THREAD_SELF, - header.private_futex); -#endif - -#ifdef NEED_DL_SYSINFO - SETUP_THREAD_SYSINFO (pd); -#endif - - /* Don't allow setxid until cloned. */ - pd->setxid_futex = -1; - - /* Allocate the DTV for this thread. */ - if (_dl_allocate_tls (TLS_TPADJ (pd)) == NULL) - { - /* Something went wrong. */ - assert (errno == ENOMEM); - - /* Free the stack memory we just allocated. */ - (void) munmap (mem, size); - - return errno; - } - - - /* Prepare to modify global data. */ - lll_lock (stack_cache_lock, LLL_PRIVATE); - - /* And add to the list of stacks in use. */ - stack_list_add (&pd->list, &stack_used); - - lll_unlock (stack_cache_lock, LLL_PRIVATE); - - - /* There might have been a race. Another thread might have - caused the stacks to get exec permission while this new - stack was prepared. Detect if this was possible and - change the permission if necessary. */ - if (__builtin_expect ((GL(dl_stack_flags) & PF_X) != 0 - && (prot & PROT_EXEC) == 0, 0)) - { - int err = change_stack_perm (pd -#ifdef NEED_SEPARATE_REGISTER_STACK - , ~pagesize_m1 -#endif - ); - if (err != 0) - { - /* Free the stack memory we just allocated. */ - (void) munmap (mem, size); - - return err; - } - } - - - /* Note that all of the stack and the thread descriptor is - zeroed. This means we do not have to initialize fields - with initial value zero. This is specifically true for - the 'tid' field which is always set back to zero once the - stack is not used anymore and for the 'guardsize' field - which will be read next. */ - } - - /* Create or resize the guard area if necessary. */ - if (__glibc_unlikely (guardsize > pd->guardsize)) - { -#ifdef NEED_SEPARATE_REGISTER_STACK - char *guard = mem + (((size - guardsize) / 2) & ~pagesize_m1); -#elif _STACK_GROWS_DOWN - char *guard = mem; -#elif _STACK_GROWS_UP - char *guard = (char *) (((uintptr_t) pd - guardsize) & ~pagesize_m1); -#endif - if (mprotect (guard, guardsize, PROT_NONE) != 0) - { - mprot_error: - lll_lock (stack_cache_lock, LLL_PRIVATE); - - /* Remove the thread from the list. */ - stack_list_del (&pd->list); - - lll_unlock (stack_cache_lock, LLL_PRIVATE); - - /* Get rid of the TLS block we allocated. */ - _dl_deallocate_tls (TLS_TPADJ (pd), false); - - /* Free the stack memory regardless of whether the size - of the cache is over the limit or not. If this piece - of memory caused problems we better do not use it - anymore. Uh, and we ignore possible errors. There - is nothing we could do. */ - (void) munmap (mem, size); - - return errno; - } - - pd->guardsize = guardsize; - } - else if (__builtin_expect (pd->guardsize - guardsize > size - reqsize, - 0)) - { - /* The old guard area is too large. */ - -#ifdef NEED_SEPARATE_REGISTER_STACK - char *guard = mem + (((size - guardsize) / 2) & ~pagesize_m1); - char *oldguard = mem + (((size - pd->guardsize) / 2) & ~pagesize_m1); - - if (oldguard < guard - && mprotect (oldguard, guard - oldguard, prot) != 0) - goto mprot_error; - - if (mprotect (guard + guardsize, - oldguard + pd->guardsize - guard - guardsize, - prot) != 0) - goto mprot_error; -#elif _STACK_GROWS_DOWN - if (mprotect ((char *) mem + guardsize, pd->guardsize - guardsize, - prot) != 0) - goto mprot_error; -#elif _STACK_GROWS_UP - if (mprotect ((char *) pd - pd->guardsize, - pd->guardsize - guardsize, prot) != 0) - goto mprot_error; -#endif - - pd->guardsize = guardsize; - } - /* The pthread_getattr_np() calls need to get passed the size - requested in the attribute, regardless of how large the - actually used guardsize is. */ - pd->reported_guardsize = guardsize; - } - - /* Initialize the lock. We have to do this unconditionally since the - stillborn thread could be canceled while the lock is taken. */ - pd->lock = LLL_LOCK_INITIALIZER; - - /* The robust mutex lists also need to be initialized - unconditionally because the cleanup for the previous stack owner - might have happened in the kernel. */ - pd->robust_head.futex_offset = (offsetof (pthread_mutex_t, __data.__lock) - - offsetof (pthread_mutex_t, - __data.__list.__next)); - pd->robust_head.list_op_pending = NULL; -#ifdef __PTHREAD_MUTEX_HAVE_PREV - pd->robust_prev = &pd->robust_head; -#endif - pd->robust_head.list = &pd->robust_head; - - /* We place the thread descriptor at the end of the stack. */ - *pdp = pd; - -#if _STACK_GROWS_DOWN - void *stacktop; - -# if TLS_TCB_AT_TP - /* The stack begins before the TCB and the static TLS block. */ - stacktop = ((char *) (pd + 1) - __static_tls_size); -# elif TLS_DTV_AT_TP - stacktop = (char *) (pd - 1); -# endif - -# ifdef NEED_SEPARATE_REGISTER_STACK - *stack = pd->stackblock; - *stacksize = stacktop - *stack; -# else - *stack = stacktop; -# endif -#else - *stack = pd->stackblock; -#endif - - return 0; -} - - -void -internal_function -__deallocate_stack (struct pthread *pd) -{ - lll_lock (stack_cache_lock, LLL_PRIVATE); - - /* Remove the thread from the list of threads with user defined - stacks. */ - stack_list_del (&pd->list); - - /* Not much to do. Just free the mmap()ed memory. Note that we do - not reset the 'used' flag in the 'tid' field. This is done by - the kernel. If no thread has been created yet this field is - still zero. */ - if (__glibc_likely (! pd->user_stack)) - (void) queue_stack (pd); - else - /* Free the memory associated with the ELF TLS. */ - _dl_deallocate_tls (TLS_TPADJ (pd), false); - - lll_unlock (stack_cache_lock, LLL_PRIVATE); -} - - -int -internal_function -__make_stacks_executable (void **stack_endp) -{ - /* First the main thread's stack. */ - int err = _dl_make_stack_executable (stack_endp); - if (err != 0) - return err; - -#ifdef NEED_SEPARATE_REGISTER_STACK - const size_t pagemask = ~(__getpagesize () - 1); -#endif - - lll_lock (stack_cache_lock, LLL_PRIVATE); - - list_t *runp; - list_for_each (runp, &stack_used) - { - err = change_stack_perm (list_entry (runp, struct pthread, list) -#ifdef NEED_SEPARATE_REGISTER_STACK - , pagemask -#endif - ); - if (err != 0) - break; - } - - /* Also change the permission for the currently unused stacks. This - might be wasted time but better spend it here than adding a check - in the fast path. */ - if (err == 0) - list_for_each (runp, &stack_cache) - { - err = change_stack_perm (list_entry (runp, struct pthread, list) -#ifdef NEED_SEPARATE_REGISTER_STACK - , pagemask -#endif - ); - if (err != 0) - break; - } - - lll_unlock (stack_cache_lock, LLL_PRIVATE); - - return err; -} - - -/* In case of a fork() call the memory allocation in the child will be - the same but only one thread is running. All stacks except that of - the one running thread are not used anymore. We have to recycle - them. */ -void -__reclaim_stacks (void) -{ - struct pthread *self = (struct pthread *) THREAD_SELF; - - /* No locking necessary. The caller is the only stack in use. But - we have to be aware that we might have interrupted a list - operation. */ - - if (in_flight_stack != 0) - { - bool add_p = in_flight_stack & 1; - list_t *elem = (list_t *) (in_flight_stack & ~(uintptr_t) 1); - - if (add_p) - { - /* We always add at the beginning of the list. So in this case we - only need to check the beginning of these lists to see if the - pointers at the head of the list are inconsistent. */ - list_t *l = NULL; - - if (stack_used.next->prev != &stack_used) - l = &stack_used; - else if (stack_cache.next->prev != &stack_cache) - l = &stack_cache; - - if (l != NULL) - { - assert (l->next->prev == elem); - elem->next = l->next; - elem->prev = l; - l->next = elem; - } - } - else - { - /* We can simply always replay the delete operation. */ - elem->next->prev = elem->prev; - elem->prev->next = elem->next; - } - } - - /* Mark all stacks except the still running one as free. */ - list_t *runp; - list_for_each (runp, &stack_used) - { - struct pthread *curp = list_entry (runp, struct pthread, list); - if (curp != self) - { - /* This marks the stack as free. */ - curp->tid = 0; - - /* Account for the size of the stack. */ - stack_cache_actsize += curp->stackblock_size; - - if (curp->specific_used) - { - /* Clear the thread-specific data. */ - memset (curp->specific_1stblock, '\0', - sizeof (curp->specific_1stblock)); - - curp->specific_used = false; - - for (size_t cnt = 1; cnt < PTHREAD_KEY_1STLEVEL_SIZE; ++cnt) - if (curp->specific[cnt] != NULL) - { - memset (curp->specific[cnt], '\0', - sizeof (curp->specific_1stblock)); - - /* We have allocated the block which we do not - free here so re-set the bit. */ - curp->specific_used = true; - } - } - } - } - - /* Add the stack of all running threads to the cache. */ - list_splice (&stack_used, &stack_cache); - - /* Remove the entry for the current thread to from the cache list - and add it to the list of running threads. Which of the two - lists is decided by the user_stack flag. */ - stack_list_del (&self->list); - - /* Re-initialize the lists for all the threads. */ - INIT_LIST_HEAD (&stack_used); - INIT_LIST_HEAD (&__stack_user); - - if (__glibc_unlikely (THREAD_GETMEM (self, user_stack))) - list_add (&self->list, &__stack_user); - else - list_add (&self->list, &stack_used); - - /* There is one thread running. */ - __nptl_nthreads = 1; - - in_flight_stack = 0; - - /* Initialize locks. */ - stack_cache_lock = LLL_LOCK_INITIALIZER; - __default_pthread_attr_lock = LLL_LOCK_INITIALIZER; -} - - -#if HP_TIMING_AVAIL -# undef __find_thread_by_id -/* Find a thread given the thread ID. */ -attribute_hidden -struct pthread * -__find_thread_by_id (pid_t tid) -{ - struct pthread *result = NULL; - - lll_lock (stack_cache_lock, LLL_PRIVATE); - - /* Iterate over the list with system-allocated threads first. */ - list_t *runp; - list_for_each (runp, &stack_used) - { - struct pthread *curp; - - curp = list_entry (runp, struct pthread, list); - - if (curp->tid == tid) - { - result = curp; - goto out; - } - } - - /* Now the list with threads using user-allocated stacks. */ - list_for_each (runp, &__stack_user) - { - struct pthread *curp; - - curp = list_entry (runp, struct pthread, list); - - if (curp->tid == tid) - { - result = curp; - goto out; - } - } - - out: - lll_unlock (stack_cache_lock, LLL_PRIVATE); - - return result; -} -#endif - - -#ifdef SIGSETXID -static void -internal_function -setxid_mark_thread (struct xid_command *cmdp, struct pthread *t) -{ - int ch; - - /* Wait until this thread is cloned. */ - if (t->setxid_futex == -1 - && ! atomic_compare_and_exchange_bool_acq (&t->setxid_futex, -2, -1)) - do - futex_wait_simple (&t->setxid_futex, -2, FUTEX_PRIVATE); - while (t->setxid_futex == -2); - - /* Don't let the thread exit before the setxid handler runs. */ - t->setxid_futex = 0; - - do - { - ch = t->cancelhandling; - - /* If the thread is exiting right now, ignore it. */ - if ((ch & EXITING_BITMASK) != 0) - { - /* Release the futex if there is no other setxid in - progress. */ - if ((ch & SETXID_BITMASK) == 0) - { - t->setxid_futex = 1; - futex_wake (&t->setxid_futex, 1, FUTEX_PRIVATE); - } - return; - } - } - while (atomic_compare_and_exchange_bool_acq (&t->cancelhandling, - ch | SETXID_BITMASK, ch)); -} - - -static void -internal_function -setxid_unmark_thread (struct xid_command *cmdp, struct pthread *t) -{ - int ch; - - do - { - ch = t->cancelhandling; - if ((ch & SETXID_BITMASK) == 0) - return; - } - while (atomic_compare_and_exchange_bool_acq (&t->cancelhandling, - ch & ~SETXID_BITMASK, ch)); - - /* Release the futex just in case. */ - t->setxid_futex = 1; - futex_wake (&t->setxid_futex, 1, FUTEX_PRIVATE); -} - - -static int -internal_function -setxid_signal_thread (struct xid_command *cmdp, struct pthread *t) -{ - if ((t->cancelhandling & SETXID_BITMASK) == 0) - return 0; - - int val; - pid_t pid = __getpid (); - INTERNAL_SYSCALL_DECL (err); - val = INTERNAL_SYSCALL_CALL (tgkill, err, pid, t->tid, SIGSETXID); - - /* If this failed, it must have had not started yet or else exited. */ - if (!INTERNAL_SYSCALL_ERROR_P (val, err)) - { - atomic_increment (&cmdp->cntr); - return 1; - } - else - return 0; -} - -/* Check for consistency across set*id system call results. The abort - should not happen as long as all privileges changes happen through - the glibc wrappers. ERROR must be 0 (no error) or an errno - code. */ -void -attribute_hidden -__nptl_setxid_error (struct xid_command *cmdp, int error) -{ - do - { - int olderror = cmdp->error; - if (olderror == error) - break; - if (olderror != -1) - /* Mismatch between current and previous results. */ - abort (); - } - while (atomic_compare_and_exchange_bool_acq (&cmdp->error, error, -1)); -} - -int -attribute_hidden -__nptl_setxid (struct xid_command *cmdp) -{ - int signalled; - int result; - lll_lock (stack_cache_lock, LLL_PRIVATE); - - __xidcmd = cmdp; - cmdp->cntr = 0; - cmdp->error = -1; - - struct pthread *self = THREAD_SELF; - - /* Iterate over the list with system-allocated threads first. */ - list_t *runp; - list_for_each (runp, &stack_used) - { - struct pthread *t = list_entry (runp, struct pthread, list); - if (t == self) - continue; - - setxid_mark_thread (cmdp, t); - } - - /* Now the list with threads using user-allocated stacks. */ - list_for_each (runp, &__stack_user) - { - struct pthread *t = list_entry (runp, struct pthread, list); - if (t == self) - continue; - - setxid_mark_thread (cmdp, t); - } - - /* Iterate until we don't succeed in signalling anyone. That means - we have gotten all running threads, and their children will be - automatically correct once started. */ - do - { - signalled = 0; - - list_for_each (runp, &stack_used) - { - struct pthread *t = list_entry (runp, struct pthread, list); - if (t == self) - continue; - - signalled += setxid_signal_thread (cmdp, t); - } - - list_for_each (runp, &__stack_user) - { - struct pthread *t = list_entry (runp, struct pthread, list); - if (t == self) - continue; - - signalled += setxid_signal_thread (cmdp, t); - } - - int cur = cmdp->cntr; - while (cur != 0) - { - futex_wait_simple ((unsigned int *) &cmdp->cntr, cur, - FUTEX_PRIVATE); - cur = cmdp->cntr; - } - } - while (signalled != 0); - - /* Clean up flags, so that no thread blocks during exit waiting - for a signal which will never come. */ - list_for_each (runp, &stack_used) - { - struct pthread *t = list_entry (runp, struct pthread, list); - if (t == self) - continue; - - setxid_unmark_thread (cmdp, t); - } - - list_for_each (runp, &__stack_user) - { - struct pthread *t = list_entry (runp, struct pthread, list); - if (t == self) - continue; - - setxid_unmark_thread (cmdp, t); - } - - /* This must be last, otherwise the current thread might not have - permissions to send SIGSETXID syscall to the other threads. */ - INTERNAL_SYSCALL_DECL (err); - result = INTERNAL_SYSCALL_NCS (cmdp->syscall_no, err, 3, - cmdp->id[0], cmdp->id[1], cmdp->id[2]); - int error = 0; - if (__glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (result, err))) - { - error = INTERNAL_SYSCALL_ERRNO (result, err); - __set_errno (error); - result = -1; - } - __nptl_setxid_error (cmdp, error); - - lll_unlock (stack_cache_lock, LLL_PRIVATE); - return result; -} -#endif /* SIGSETXID. */ - - -static inline void __attribute__((always_inline)) -init_one_static_tls (struct pthread *curp, struct link_map *map) -{ -# if TLS_TCB_AT_TP - void *dest = (char *) curp - map->l_tls_offset; -# elif TLS_DTV_AT_TP - void *dest = (char *) curp + map->l_tls_offset + TLS_PRE_TCB_SIZE; -# else -# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" -# endif - - /* Initialize the memory. */ - memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size), - '\0', map->l_tls_blocksize - map->l_tls_initimage_size); -} - -void -attribute_hidden -__pthread_init_static_tls (struct link_map *map) -{ - lll_lock (stack_cache_lock, LLL_PRIVATE); - - /* Iterate over the list with system-allocated threads first. */ - list_t *runp; - list_for_each (runp, &stack_used) - init_one_static_tls (list_entry (runp, struct pthread, list), map); - - /* Now the list with threads using user-allocated stacks. */ - list_for_each (runp, &__stack_user) - init_one_static_tls (list_entry (runp, struct pthread, list), map); - - lll_unlock (stack_cache_lock, LLL_PRIVATE); -} - - -void -attribute_hidden -__wait_lookup_done (void) -{ - lll_lock (stack_cache_lock, LLL_PRIVATE); - - struct pthread *self = THREAD_SELF; - - /* Iterate over the list with system-allocated threads first. */ - list_t *runp; - list_for_each (runp, &stack_used) - { - struct pthread *t = list_entry (runp, struct pthread, list); - if (t == self || t->header.gscope_flag == THREAD_GSCOPE_FLAG_UNUSED) - continue; - - int *const gscope_flagp = &t->header.gscope_flag; - - /* We have to wait until this thread is done with the global - scope. First tell the thread that we are waiting and - possibly have to be woken. */ - if (atomic_compare_and_exchange_bool_acq (gscope_flagp, - THREAD_GSCOPE_FLAG_WAIT, - THREAD_GSCOPE_FLAG_USED)) - continue; - - do - futex_wait_simple ((unsigned int *) gscope_flagp, - THREAD_GSCOPE_FLAG_WAIT, FUTEX_PRIVATE); - while (*gscope_flagp == THREAD_GSCOPE_FLAG_WAIT); - } - - /* Now the list with threads using user-allocated stacks. */ - list_for_each (runp, &__stack_user) - { - struct pthread *t = list_entry (runp, struct pthread, list); - if (t == self || t->header.gscope_flag == THREAD_GSCOPE_FLAG_UNUSED) - continue; - - int *const gscope_flagp = &t->header.gscope_flag; - - /* We have to wait until this thread is done with the global - scope. First tell the thread that we are waiting and - possibly have to be woken. */ - if (atomic_compare_and_exchange_bool_acq (gscope_flagp, - THREAD_GSCOPE_FLAG_WAIT, - THREAD_GSCOPE_FLAG_USED)) - continue; - - do - futex_wait_simple ((unsigned int *) gscope_flagp, - THREAD_GSCOPE_FLAG_WAIT, FUTEX_PRIVATE); - while (*gscope_flagp == THREAD_GSCOPE_FLAG_WAIT); - } - - lll_unlock (stack_cache_lock, LLL_PRIVATE); -} diff --git a/nptl/cancellation.c b/nptl/cancellation.c deleted file mode 100644 index e3f0b619d6..0000000000 --- a/nptl/cancellation.c +++ /dev/null @@ -1,101 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <setjmp.h> -#include <stdlib.h> -#include "pthreadP.h" -#include <futex-internal.h> - - -/* The next two functions are similar to pthread_setcanceltype() but - more specialized for the use in the cancelable functions like write(). - They do not need to check parameters etc. */ -int -attribute_hidden -__pthread_enable_asynccancel (void) -{ - struct pthread *self = THREAD_SELF; - int oldval = THREAD_GETMEM (self, cancelhandling); - - while (1) - { - int newval = oldval | CANCELTYPE_BITMASK; - - if (newval == oldval) - break; - - int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval, - oldval); - if (__glibc_likely (curval == oldval)) - { - if (CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS (newval)) - { - THREAD_SETMEM (self, result, PTHREAD_CANCELED); - __do_cancel (); - } - - break; - } - - /* Prepare the next round. */ - oldval = curval; - } - - return oldval; -} - - -void -internal_function attribute_hidden -__pthread_disable_asynccancel (int oldtype) -{ - /* If asynchronous cancellation was enabled before we do not have - anything to do. */ - if (oldtype & CANCELTYPE_BITMASK) - return; - - struct pthread *self = THREAD_SELF; - int newval; - - int oldval = THREAD_GETMEM (self, cancelhandling); - - while (1) - { - newval = oldval & ~CANCELTYPE_BITMASK; - - int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval, - oldval); - if (__glibc_likely (curval == oldval)) - break; - - /* Prepare the next round. */ - oldval = curval; - } - - /* We cannot return when we are being canceled. Upon return the - thread might be things which would have to be undone. The - following loop should loop until the cancellation signal is - delivered. */ - while (__builtin_expect ((newval & (CANCELING_BITMASK | CANCELED_BITMASK)) - == CANCELING_BITMASK, 0)) - { - futex_wait_simple ((unsigned int *) &self->cancelhandling, newval, - FUTEX_PRIVATE); - newval = THREAD_GETMEM (self, cancelhandling); - } -} diff --git a/nptl/cleanup.c b/nptl/cleanup.c deleted file mode 100644 index efbb89aa27..0000000000 --- a/nptl/cleanup.c +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdlib.h> -#include "pthreadP.h" - - -void -__cleanup_fct_attribute -__pthread_register_cancel (__pthread_unwind_buf_t *buf) -{ - struct pthread_unwind_buf *ibuf = (struct pthread_unwind_buf *) buf; - struct pthread *self = THREAD_SELF; - - /* Store old info. */ - ibuf->priv.data.prev = THREAD_GETMEM (self, cleanup_jmp_buf); - ibuf->priv.data.cleanup = THREAD_GETMEM (self, cleanup); - - /* Store the new cleanup handler info. */ - THREAD_SETMEM (self, cleanup_jmp_buf, (struct pthread_unwind_buf *) buf); -} -hidden_def (__pthread_register_cancel) - - -void -__cleanup_fct_attribute -__pthread_unregister_cancel (__pthread_unwind_buf_t *buf) -{ - struct pthread_unwind_buf *ibuf = (struct pthread_unwind_buf *) buf; - - THREAD_SETMEM (THREAD_SELF, cleanup_jmp_buf, ibuf->priv.data.prev); -} -hidden_def (__pthread_unregister_cancel) diff --git a/nptl/cleanup_compat.c b/nptl/cleanup_compat.c deleted file mode 100644 index fc76591178..0000000000 --- a/nptl/cleanup_compat.c +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdlib.h> -#include "pthreadP.h" - - -void -_pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer, - void (*routine) (void *), void *arg) -{ - struct pthread *self = THREAD_SELF; - - buffer->__routine = routine; - buffer->__arg = arg; - buffer->__prev = THREAD_GETMEM (self, cleanup); - - THREAD_SETMEM (self, cleanup, buffer); -} -strong_alias (_pthread_cleanup_push, __pthread_cleanup_push) - - -void -_pthread_cleanup_pop (struct _pthread_cleanup_buffer *buffer, int execute) -{ - struct pthread *self __attribute ((unused)) = THREAD_SELF; - - THREAD_SETMEM (self, cleanup, buffer->__prev); - - /* If necessary call the cleanup routine after we removed the - current cleanup block from the list. */ - if (execute) - buffer->__routine (buffer->__arg); -} -strong_alias (_pthread_cleanup_pop, __pthread_cleanup_pop) diff --git a/nptl/cleanup_defer.c b/nptl/cleanup_defer.c deleted file mode 100644 index 7e1942df28..0000000000 --- a/nptl/cleanup_defer.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdlib.h> -#include "pthreadP.h" - - -void -__cleanup_fct_attribute -__pthread_register_cancel_defer (__pthread_unwind_buf_t *buf) -{ - struct pthread_unwind_buf *ibuf = (struct pthread_unwind_buf *) buf; - struct pthread *self = THREAD_SELF; - - /* Store old info. */ - ibuf->priv.data.prev = THREAD_GETMEM (self, cleanup_jmp_buf); - ibuf->priv.data.cleanup = THREAD_GETMEM (self, cleanup); - - int cancelhandling = THREAD_GETMEM (self, cancelhandling); - - /* Disable asynchronous cancellation for now. */ - if (__glibc_unlikely (cancelhandling & CANCELTYPE_BITMASK)) - while (1) - { - int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, - cancelhandling - & ~CANCELTYPE_BITMASK, - cancelhandling); - if (__glibc_likely (curval == cancelhandling)) - /* Successfully replaced the value. */ - break; - - /* Prepare for the next round. */ - cancelhandling = curval; - } - - ibuf->priv.data.canceltype = (cancelhandling & CANCELTYPE_BITMASK - ? PTHREAD_CANCEL_ASYNCHRONOUS - : PTHREAD_CANCEL_DEFERRED); - - /* Store the new cleanup handler info. */ - THREAD_SETMEM (self, cleanup_jmp_buf, (struct pthread_unwind_buf *) buf); -} - - -void -__cleanup_fct_attribute -__pthread_unregister_cancel_restore (__pthread_unwind_buf_t *buf) -{ - struct pthread *self = THREAD_SELF; - struct pthread_unwind_buf *ibuf = (struct pthread_unwind_buf *) buf; - - THREAD_SETMEM (self, cleanup_jmp_buf, ibuf->priv.data.prev); - - int cancelhandling; - if (ibuf->priv.data.canceltype != PTHREAD_CANCEL_DEFERRED - && ((cancelhandling = THREAD_GETMEM (self, cancelhandling)) - & CANCELTYPE_BITMASK) == 0) - { - while (1) - { - int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, - cancelhandling - | CANCELTYPE_BITMASK, - cancelhandling); - if (__glibc_likely (curval == cancelhandling)) - /* Successfully replaced the value. */ - break; - - /* Prepare for the next round. */ - cancelhandling = curval; - } - - CANCELLATION_P (self); - } -} diff --git a/nptl/cleanup_defer_compat.c b/nptl/cleanup_defer_compat.c deleted file mode 100644 index 2705b4605e..0000000000 --- a/nptl/cleanup_defer_compat.c +++ /dev/null @@ -1,94 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" - - -void -_pthread_cleanup_push_defer (struct _pthread_cleanup_buffer *buffer, - void (*routine) (void *), void *arg) -{ - struct pthread *self = THREAD_SELF; - - buffer->__routine = routine; - buffer->__arg = arg; - buffer->__prev = THREAD_GETMEM (self, cleanup); - - int cancelhandling = THREAD_GETMEM (self, cancelhandling); - - /* Disable asynchronous cancellation for now. */ - if (__glibc_unlikely (cancelhandling & CANCELTYPE_BITMASK)) - while (1) - { - int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, - cancelhandling - & ~CANCELTYPE_BITMASK, - cancelhandling); - if (__glibc_likely (curval == cancelhandling)) - /* Successfully replaced the value. */ - break; - - /* Prepare for the next round. */ - cancelhandling = curval; - } - - buffer->__canceltype = (cancelhandling & CANCELTYPE_BITMASK - ? PTHREAD_CANCEL_ASYNCHRONOUS - : PTHREAD_CANCEL_DEFERRED); - - THREAD_SETMEM (self, cleanup, buffer); -} -strong_alias (_pthread_cleanup_push_defer, __pthread_cleanup_push_defer) - - -void -_pthread_cleanup_pop_restore (struct _pthread_cleanup_buffer *buffer, - int execute) -{ - struct pthread *self = THREAD_SELF; - - THREAD_SETMEM (self, cleanup, buffer->__prev); - - int cancelhandling; - if (__builtin_expect (buffer->__canceltype != PTHREAD_CANCEL_DEFERRED, 0) - && ((cancelhandling = THREAD_GETMEM (self, cancelhandling)) - & CANCELTYPE_BITMASK) == 0) - { - while (1) - { - int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, - cancelhandling - | CANCELTYPE_BITMASK, - cancelhandling); - if (__glibc_likely (curval == cancelhandling)) - /* Successfully replaced the value. */ - break; - - /* Prepare for the next round. */ - cancelhandling = curval; - } - - CANCELLATION_P (self); - } - - /* If necessary call the cleanup routine after we removed the - current cleanup block from the list. */ - if (execute) - buffer->__routine (buffer->__arg); -} -strong_alias (_pthread_cleanup_pop_restore, __pthread_cleanup_pop_restore) diff --git a/nptl/cleanup_routine.c b/nptl/cleanup_routine.c deleted file mode 100644 index aee26f46c6..0000000000 --- a/nptl/cleanup_routine.c +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> - - -void -__pthread_cleanup_routine (struct __pthread_cleanup_frame *f) -{ - if (f->__do_it) - f->__cancel_routine (f->__cancel_arg); -} diff --git a/nptl/cond-perf.c b/nptl/cond-perf.c deleted file mode 100644 index 9c9488e274..0000000000 --- a/nptl/cond-perf.c +++ /dev/null @@ -1,103 +0,0 @@ -#include <pthread.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <atomic.h> - -static pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t mut1 = PTHREAD_MUTEX_INITIALIZER; - -static pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t mut2 = PTHREAD_MUTEX_INITIALIZER; - -static bool last_round; -static int ntogo; -static bool alldone; - - -static void * -cons (void *arg) -{ - pthread_mutex_lock (&mut1); - - do - { - if (atomic_decrement_and_test (&ntogo)) - { - pthread_mutex_lock (&mut2); - alldone = true; - pthread_cond_signal (&cond2); - pthread_mutex_unlock (&mut2); - } - - pthread_cond_wait (&cond1, &mut1); - } - while (! last_round); - - pthread_mutex_unlock (&mut1); - - return NULL; -} - - -int -main (int argc, char *argv[]) -{ - int opt; - int err; - int nthreads = 10; - int nrounds = 100; - bool keeplock = false; - - while ((opt = getopt (argc, argv, "n:r:k")) != -1) - switch (opt) - { - case 'n': - nthreads = atol (optarg); - break; - case 'r': - nrounds = atol (optarg); - break; - case 'k': - keeplock = true; - break; - } - - ntogo = nthreads; - - pthread_t th[nthreads]; - int i; - for (i = 0; __builtin_expect (i < nthreads, 1); ++i) - if (__glibc_unlikely ((err = pthread_create (&th[i], NULL, cons, (void *) (long) i)) != 0)) - printf ("pthread_create: %s\n", strerror (err)); - - for (i = 0; __builtin_expect (i < nrounds, 1); ++i) - { - pthread_mutex_lock (&mut2); - while (! alldone) - pthread_cond_wait (&cond2, &mut2); - pthread_mutex_unlock (&mut2); - - pthread_mutex_lock (&mut1); - if (! keeplock) - pthread_mutex_unlock (&mut1); - - ntogo = nthreads; - alldone = false; - if (i + 1 >= nrounds) - last_round = true; - - pthread_cond_broadcast (&cond1); - - if (keeplock) - pthread_mutex_unlock (&mut1); - } - - for (i = 0; i < nthreads; ++i) - if ((err = pthread_join (th[i], NULL)) != 0) - printf ("pthread_create: %s\n", strerror (err)); - - return 0; -} diff --git a/nptl/createthread.c b/nptl/createthread.c deleted file mode 100644 index 6c67b7e74e..0000000000 --- a/nptl/createthread.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Low-level thread creation for NPTL. Stub version. - Copyright (C) 2014-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* See the comments in pthread_create.c for the requirements for these - two macros and the create_thread function. */ - -#define START_THREAD_DEFN \ - static void __attribute__ ((noreturn)) start_thread (void) -#define START_THREAD_SELF THREAD_SELF - -static int -create_thread (struct pthread *pd, const struct pthread_attr *attr, - bool *stopped_start, STACK_VARIABLES_PARMS, bool *thread_ran) -{ - /* If the implementation needs to do some tweaks to the thread after - it has been created at the OS level, it can set STOPPED_START here. */ - - pd->stopped_start = *stopped_start; - if (__glibc_unlikely (*stopped_start)) - /* See CONCURRENCY NOTES in nptl/pthread_create.c. */ - lll_lock (pd->lock, LLL_PRIVATE); - - return ENOSYS; - - /* It's started now, so if we fail below, we'll have to cancel it - and let it clean itself up. */ - *thread_ran = true; - - return 0; -} diff --git a/nptl/default-sched.h b/nptl/default-sched.h deleted file mode 100644 index 593f3b87ac..0000000000 --- a/nptl/default-sched.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Determine calling thread's scheduling parameters. Stub version. - Copyright (C) 2014-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#include <assert.h> - -/* This should fill in PD->schedpolicy if PD->flags does not contain - ATTR_FLAG_POLICY_SET, and set it; and PD->schedparam if PD->flags does - not contain ATTR_FLAG_SCHED_SET, and set it. It won't be called at all - if both bits are already set. */ - -static void -collect_default_sched (struct pthread *pd) -{ - assert ((pd->flags & (ATTR_FLAG_SCHED_SET | ATTR_FLAG_POLICY_SET)) != 0); - - /* The generic/stub version is a no-op rather than just using the - __sched_getscheduler and __sched_getparam functions so that there - won't be stub warnings for those functions just because pthread_create - was called without actually calling those. */ -} diff --git a/nptl/descr.h b/nptl/descr.h deleted file mode 100644 index c5ad0c8dba..0000000000 --- a/nptl/descr.h +++ /dev/null @@ -1,406 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _DESCR_H -#define _DESCR_H 1 - -#include <limits.h> -#include <sched.h> -#include <setjmp.h> -#include <stdbool.h> -#include <sys/types.h> -#include <hp-timing.h> -#include <list_t.h> -#include <lowlevellock.h> -#include <pthreaddef.h> -#include <dl-sysdep.h> -#include "../nptl_db/thread_db.h" -#include <tls.h> -#include <unwind.h> -#include <bits/types/res_state.h> -#include <kernel-features.h> - -#ifndef TCB_ALIGNMENT -# define TCB_ALIGNMENT sizeof (double) -#endif - - -/* We keep thread specific data in a special data structure, a two-level - array. The top-level array contains pointers to dynamically allocated - arrays of a certain number of data pointers. So we can implement a - sparse array. Each dynamic second-level array has - PTHREAD_KEY_2NDLEVEL_SIZE - entries. This value shouldn't be too large. */ -#define PTHREAD_KEY_2NDLEVEL_SIZE 32 - -/* We need to address PTHREAD_KEYS_MAX key with PTHREAD_KEY_2NDLEVEL_SIZE - keys in each subarray. */ -#define PTHREAD_KEY_1STLEVEL_SIZE \ - ((PTHREAD_KEYS_MAX + PTHREAD_KEY_2NDLEVEL_SIZE - 1) \ - / PTHREAD_KEY_2NDLEVEL_SIZE) - - - - -/* Internal version of the buffer to store cancellation handler - information. */ -struct pthread_unwind_buf -{ - struct - { - __jmp_buf jmp_buf; - int mask_was_saved; - } cancel_jmp_buf[1]; - - union - { - /* This is the placeholder of the public version. */ - void *pad[4]; - - struct - { - /* Pointer to the previous cleanup buffer. */ - struct pthread_unwind_buf *prev; - - /* Backward compatibility: state of the old-style cleanup - handler at the time of the previous new-style cleanup handler - installment. */ - struct _pthread_cleanup_buffer *cleanup; - - /* Cancellation type before the push call. */ - int canceltype; - } data; - } priv; -}; - - -/* Opcodes and data types for communication with the signal handler to - change user/group IDs. */ -struct xid_command -{ - int syscall_no; - long int id[3]; - volatile int cntr; - volatile int error; /* -1: no call yet, 0: success seen, >0: error seen. */ -}; - - -/* Data structure used by the kernel to find robust futexes. */ -struct robust_list_head -{ - void *list; - long int futex_offset; - void *list_op_pending; -}; - - -/* Data strcture used to handle thread priority protection. */ -struct priority_protection_data -{ - int priomax; - unsigned int priomap[]; -}; - - -/* Thread descriptor data structure. */ -struct pthread -{ - union - { -#if !TLS_DTV_AT_TP - /* This overlaps the TCB as used for TLS without threads (see tls.h). */ - tcbhead_t header; -#else - struct - { - /* multiple_threads is enabled either when the process has spawned at - least one thread or when a single-threaded process cancels itself. - This enables additional code to introduce locking before doing some - compare_and_exchange operations and also enable cancellation points. - The concepts of multiple threads and cancellation points ideally - should be separate, since it is not necessary for multiple threads to - have been created for cancellation points to be enabled, as is the - case is when single-threaded process cancels itself. - - Since enabling multiple_threads enables additional code in - cancellation points and compare_and_exchange operations, there is a - potential for an unneeded performance hit when it is enabled in a - single-threaded, self-canceling process. This is OK though, since a - single-threaded process will enable async cancellation only when it - looks to cancel itself and is hence going to end anyway. */ - int multiple_threads; - int gscope_flag; -# ifndef __ASSUME_PRIVATE_FUTEX - int private_futex; -# endif - } header; -#endif - - /* This extra padding has no special purpose, and this structure layout - is private and subject to change without affecting the official ABI. - We just have it here in case it might be convenient for some - implementation-specific instrumentation hack or suchlike. */ - void *__padding[24]; - }; - - /* This descriptor's link on the `stack_used' or `__stack_user' list. */ - list_t list; - - /* Thread ID - which is also a 'is this thread descriptor (and - therefore stack) used' flag. */ - pid_t tid; - - /* Ununsed. */ - pid_t pid_ununsed; - - /* List of robust mutexes the thread is holding. */ -#ifdef __PTHREAD_MUTEX_HAVE_PREV - void *robust_prev; - struct robust_list_head robust_head; - - /* The list above is strange. It is basically a double linked list - but the pointer to the next/previous element of the list points - in the middle of the object, the __next element. Whenever - casting to __pthread_list_t we need to adjust the pointer - first. - These operations are effectively concurrent code in that the thread - can get killed at any point in time and the kernel takes over. Thus, - the __next elements are a kind of concurrent list and we need to - enforce using compiler barriers that the individual operations happen - in such a way that the kernel always sees a consistent list. The - backward links (ie, the __prev elements) are not used by the kernel. - FIXME We should use relaxed MO atomic operations here and signal fences - because this kind of concurrency is similar to synchronizing with a - signal handler. */ -# define QUEUE_PTR_ADJUST (offsetof (__pthread_list_t, __next)) - -# define ENQUEUE_MUTEX_BOTH(mutex, val) \ - do { \ - __pthread_list_t *next = (__pthread_list_t *) \ - ((((uintptr_t) THREAD_GETMEM (THREAD_SELF, robust_head.list)) & ~1ul) \ - - QUEUE_PTR_ADJUST); \ - next->__prev = (void *) &mutex->__data.__list.__next; \ - mutex->__data.__list.__next = THREAD_GETMEM (THREAD_SELF, \ - robust_head.list); \ - mutex->__data.__list.__prev = (void *) &THREAD_SELF->robust_head; \ - /* Ensure that the new list entry is ready before we insert it. */ \ - __asm ("" ::: "memory"); \ - THREAD_SETMEM (THREAD_SELF, robust_head.list, \ - (void *) (((uintptr_t) &mutex->__data.__list.__next) \ - | val)); \ - } while (0) -# define DEQUEUE_MUTEX(mutex) \ - do { \ - __pthread_list_t *next = (__pthread_list_t *) \ - ((char *) (((uintptr_t) mutex->__data.__list.__next) & ~1ul) \ - - QUEUE_PTR_ADJUST); \ - next->__prev = mutex->__data.__list.__prev; \ - __pthread_list_t *prev = (__pthread_list_t *) \ - ((char *) (((uintptr_t) mutex->__data.__list.__prev) & ~1ul) \ - - QUEUE_PTR_ADJUST); \ - prev->__next = mutex->__data.__list.__next; \ - /* Ensure that we remove the entry from the list before we change the \ - __next pointer of the entry, which is read by the kernel. */ \ - __asm ("" ::: "memory"); \ - mutex->__data.__list.__prev = NULL; \ - mutex->__data.__list.__next = NULL; \ - } while (0) -#else - union - { - __pthread_slist_t robust_list; - struct robust_list_head robust_head; - }; - -# define ENQUEUE_MUTEX_BOTH(mutex, val) \ - do { \ - mutex->__data.__list.__next \ - = THREAD_GETMEM (THREAD_SELF, robust_list.__next); \ - /* Ensure that the new list entry is ready before we insert it. */ \ - __asm ("" ::: "memory"); \ - THREAD_SETMEM (THREAD_SELF, robust_list.__next, \ - (void *) (((uintptr_t) &mutex->__data.__list) | val)); \ - } while (0) -# define DEQUEUE_MUTEX(mutex) \ - do { \ - __pthread_slist_t *runp = (__pthread_slist_t *) \ - (((uintptr_t) THREAD_GETMEM (THREAD_SELF, robust_list.__next)) & ~1ul); \ - if (runp == &mutex->__data.__list) \ - THREAD_SETMEM (THREAD_SELF, robust_list.__next, runp->__next); \ - else \ - { \ - __pthread_slist_t *next = (__pthread_slist_t *) \ - (((uintptr_t) runp->__next) & ~1ul); \ - while (next != &mutex->__data.__list) \ - { \ - runp = next; \ - next = (__pthread_slist_t *) (((uintptr_t) runp->__next) & ~1ul); \ - } \ - \ - runp->__next = next->__next; \ - /* Ensure that we remove the entry from the list before we change the \ - __next pointer of the entry, which is read by the kernel. */ \ - __asm ("" ::: "memory"); \ - mutex->__data.__list.__next = NULL; \ - } \ - } while (0) -#endif -#define ENQUEUE_MUTEX(mutex) ENQUEUE_MUTEX_BOTH (mutex, 0) -#define ENQUEUE_MUTEX_PI(mutex) ENQUEUE_MUTEX_BOTH (mutex, 1) - - /* List of cleanup buffers. */ - struct _pthread_cleanup_buffer *cleanup; - - /* Unwind information. */ - struct pthread_unwind_buf *cleanup_jmp_buf; -#define HAVE_CLEANUP_JMP_BUF - - /* Flags determining processing of cancellation. */ - int cancelhandling; - /* Bit set if cancellation is disabled. */ -#define CANCELSTATE_BIT 0 -#define CANCELSTATE_BITMASK (0x01 << CANCELSTATE_BIT) - /* Bit set if asynchronous cancellation mode is selected. */ -#define CANCELTYPE_BIT 1 -#define CANCELTYPE_BITMASK (0x01 << CANCELTYPE_BIT) - /* Bit set if canceling has been initiated. */ -#define CANCELING_BIT 2 -#define CANCELING_BITMASK (0x01 << CANCELING_BIT) - /* Bit set if canceled. */ -#define CANCELED_BIT 3 -#define CANCELED_BITMASK (0x01 << CANCELED_BIT) - /* Bit set if thread is exiting. */ -#define EXITING_BIT 4 -#define EXITING_BITMASK (0x01 << EXITING_BIT) - /* Bit set if thread terminated and TCB is freed. */ -#define TERMINATED_BIT 5 -#define TERMINATED_BITMASK (0x01 << TERMINATED_BIT) - /* Bit set if thread is supposed to change XID. */ -#define SETXID_BIT 6 -#define SETXID_BITMASK (0x01 << SETXID_BIT) - /* Mask for the rest. Helps the compiler to optimize. */ -#define CANCEL_RESTMASK 0xffffff80 - -#define CANCEL_ENABLED_AND_CANCELED(value) \ - (((value) & (CANCELSTATE_BITMASK | CANCELED_BITMASK | EXITING_BITMASK \ - | CANCEL_RESTMASK | TERMINATED_BITMASK)) == CANCELED_BITMASK) -#define CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS(value) \ - (((value) & (CANCELSTATE_BITMASK | CANCELTYPE_BITMASK | CANCELED_BITMASK \ - | EXITING_BITMASK | CANCEL_RESTMASK | TERMINATED_BITMASK)) \ - == (CANCELTYPE_BITMASK | CANCELED_BITMASK)) - - /* Flags. Including those copied from the thread attribute. */ - int flags; - - /* We allocate one block of references here. This should be enough - to avoid allocating any memory dynamically for most applications. */ - struct pthread_key_data - { - /* Sequence number. We use uintptr_t to not require padding on - 32- and 64-bit machines. On 64-bit machines it helps to avoid - wrapping, too. */ - uintptr_t seq; - - /* Data pointer. */ - void *data; - } specific_1stblock[PTHREAD_KEY_2NDLEVEL_SIZE]; - - /* Two-level array for the thread-specific data. */ - struct pthread_key_data *specific[PTHREAD_KEY_1STLEVEL_SIZE]; - - /* Flag which is set when specific data is set. */ - bool specific_used; - - /* True if events must be reported. */ - bool report_events; - - /* True if the user provided the stack. */ - bool user_stack; - - /* True if thread must stop at startup time. */ - bool stopped_start; - - /* The parent's cancel handling at the time of the pthread_create - call. This might be needed to undo the effects of a cancellation. */ - int parent_cancelhandling; - - /* Lock to synchronize access to the descriptor. */ - int lock; - - /* Lock for synchronizing setxid calls. */ - unsigned int setxid_futex; - -#if HP_TIMING_AVAIL - /* Offset of the CPU clock at start thread start time. */ - hp_timing_t cpuclock_offset; -#endif - - /* If the thread waits to join another one the ID of the latter is - stored here. - - In case a thread is detached this field contains a pointer of the - TCB if the thread itself. This is something which cannot happen - in normal operation. */ - struct pthread *joinid; - /* Check whether a thread is detached. */ -#define IS_DETACHED(pd) ((pd)->joinid == (pd)) - - /* The result of the thread function. */ - void *result; - - /* Scheduling parameters for the new thread. */ - struct sched_param schedparam; - int schedpolicy; - - /* Start position of the code to be executed and the argument passed - to the function. */ - void *(*start_routine) (void *); - void *arg; - - /* Debug state. */ - td_eventbuf_t eventbuf; - /* Next descriptor with a pending event. */ - struct pthread *nextevent; - - /* Machine-specific unwind info. */ - struct _Unwind_Exception exc; - - /* If nonzero pointer to area allocated for the stack and its - size. */ - void *stackblock; - size_t stackblock_size; - /* Size of the included guard area. */ - size_t guardsize; - /* This is what the user specified and what we will report. */ - size_t reported_guardsize; - - /* Thread Priority Protection data. */ - struct priority_protection_data *tpp; - - /* Resolver state. */ - struct __res_state res; - - /* This member must be last. */ - char end_padding[]; - -#define PTHREAD_STRUCT_END_PADDING \ - (sizeof (struct pthread) - offsetof (struct pthread, end_padding)) -} __attribute ((aligned (TCB_ALIGNMENT))); - - -#endif /* descr.h */ diff --git a/nptl/eintr.c b/nptl/eintr.c deleted file mode 100644 index 073c8574c7..0000000000 --- a/nptl/eintr.c +++ /dev/null @@ -1,88 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <unistd.h> - - -static int the_sig; - - -static void -eintr_handler (int sig) -{ - if (sig != the_sig) - { - write (STDOUT_FILENO, "eintr_handler: signal number wrong\n", 35); - _exit (1); - } - write (STDOUT_FILENO, ".", 1); -} - - -static void * -eintr_source (void *arg) -{ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 500000 }; - - if (arg == NULL) - { - sigset_t ss; - sigemptyset (&ss); - sigaddset (&ss, the_sig); - pthread_sigmask (SIG_BLOCK, &ss, NULL); - } - - while (1) - { - if (arg != NULL) - pthread_kill (*(pthread_t *) arg, the_sig); - else - kill (getpid (), the_sig); - - nanosleep (&ts, NULL); - } - - /* NOTREACHED */ - return NULL; -} - - -static void -setup_eintr (int sig, pthread_t *thp) -{ - struct sigaction sa; - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - sa.sa_handler = eintr_handler; - if (sigaction (sig, &sa, NULL) != 0) - { - puts ("setup_eintr: sigaction failed"); - exit (1); - } - the_sig = sig; - - /* Create the thread which will fire off the signals. */ - pthread_t th; - if (pthread_create (&th, NULL, eintr_source, thp) != 0) - { - puts ("setup_eintr: pthread_create failed"); - exit (1); - } -} diff --git a/nptl/elision-conf.h b/nptl/elision-conf.h deleted file mode 100644 index 40a8c178f1..0000000000 --- a/nptl/elision-conf.h +++ /dev/null @@ -1 +0,0 @@ -/* empty */ diff --git a/nptl/errno-loc.c b/nptl/errno-loc.c deleted file mode 100644 index 712b2b119c..0000000000 --- a/nptl/errno-loc.c +++ /dev/null @@ -1 +0,0 @@ -#include "../csu/errno-loc.c" diff --git a/nptl/events.c b/nptl/events.c deleted file mode 100644 index 9938aa0b88..0000000000 --- a/nptl/events.c +++ /dev/null @@ -1,33 +0,0 @@ -/* Event functions used while debugging. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -/* The functions contained here do nothing, they just return. */ - -#include "pthreadP.h" - -void -__nptl_create_event (void) -{ -} -hidden_def (__nptl_create_event) - -void -__nptl_death_event (void) -{ -} -hidden_def (__nptl_death_event) diff --git a/nptl/forward.c b/nptl/forward.c deleted file mode 100644 index ac96765f29..0000000000 --- a/nptl/forward.c +++ /dev/null @@ -1,210 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <dlfcn.h> -#include <pthreadP.h> -#include <signal.h> -#include <stdlib.h> - -#include <shlib-compat.h> -#include <atomic.h> -#include <safe-fatal.h> - - -/* Pointers to the libc functions. */ -struct pthread_functions __libc_pthread_functions attribute_hidden; -int __libc_pthread_functions_init attribute_hidden; - - -#define FORWARD2(name, rettype, decl, params, defaction) \ -rettype \ -name decl \ -{ \ - if (!__libc_pthread_functions_init) \ - defaction; \ - \ - return PTHFCT_CALL (ptr_##name, params); \ -} - -/* Same as FORWARD2, only without return. */ -#define FORWARD_NORETURN(name, rettype, decl, params, defaction) \ -rettype \ -name decl \ -{ \ - if (!__libc_pthread_functions_init) \ - defaction; \ - \ - PTHFCT_CALL (ptr_##name, params); \ -} - -#define FORWARD(name, decl, params, defretval) \ - FORWARD2 (name, int, decl, params, return defretval) - - -FORWARD (pthread_attr_destroy, (pthread_attr_t *attr), (attr), 0) - -#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_1) -FORWARD (__pthread_attr_init_2_0, (pthread_attr_t *attr), (attr), 0) -compat_symbol (libc, __pthread_attr_init_2_0, pthread_attr_init, GLIBC_2_0); -#endif - -FORWARD (__pthread_attr_init_2_1, (pthread_attr_t *attr), (attr), 0) -versioned_symbol (libc, __pthread_attr_init_2_1, pthread_attr_init, GLIBC_2_1); - -FORWARD (pthread_attr_getdetachstate, - (const pthread_attr_t *attr, int *detachstate), (attr, detachstate), - 0) -FORWARD (pthread_attr_setdetachstate, (pthread_attr_t *attr, int detachstate), - (attr, detachstate), 0) - -FORWARD (pthread_attr_getinheritsched, - (const pthread_attr_t *attr, int *inherit), (attr, inherit), 0) -FORWARD (pthread_attr_setinheritsched, (pthread_attr_t *attr, int inherit), - (attr, inherit), 0) - -FORWARD (pthread_attr_getschedparam, - (const pthread_attr_t *attr, struct sched_param *param), - (attr, param), 0) -FORWARD (pthread_attr_setschedparam, - (pthread_attr_t *attr, const struct sched_param *param), - (attr, param), 0) - -FORWARD (pthread_attr_getschedpolicy, - (const pthread_attr_t *attr, int *policy), (attr, policy), 0) -FORWARD (pthread_attr_setschedpolicy, (pthread_attr_t *attr, int policy), - (attr, policy), 0) - -FORWARD (pthread_attr_getscope, - (const pthread_attr_t *attr, int *scope), (attr, scope), 0) -FORWARD (pthread_attr_setscope, (pthread_attr_t *attr, int scope), - (attr, scope), 0) - - -FORWARD (pthread_condattr_destroy, (pthread_condattr_t *attr), (attr), 0) -FORWARD (pthread_condattr_init, (pthread_condattr_t *attr), (attr), 0) - -#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3_2) -FORWARD2 (__pthread_cond_broadcast_2_0, int attribute_compat_text_section, - (pthread_cond_2_0_t *cond), (cond), return 0) -compat_symbol (libc, __pthread_cond_broadcast_2_0, pthread_cond_broadcast, - GLIBC_2_0); -#endif -FORWARD (__pthread_cond_broadcast, (pthread_cond_t *cond), (cond), 0) -versioned_symbol (libc, __pthread_cond_broadcast, pthread_cond_broadcast, - GLIBC_2_3_2); - -#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3_2) -FORWARD2 (__pthread_cond_destroy_2_0, int attribute_compat_text_section, - (pthread_cond_2_0_t *cond), (cond), return 0) -compat_symbol (libc, __pthread_cond_destroy_2_0, pthread_cond_destroy, - GLIBC_2_0); -#endif -FORWARD (__pthread_cond_destroy, (pthread_cond_t *cond), (cond), 0) -versioned_symbol (libc, __pthread_cond_destroy, pthread_cond_destroy, - GLIBC_2_3_2); - -#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3_2) -FORWARD2 (__pthread_cond_init_2_0, int attribute_compat_text_section, - (pthread_cond_2_0_t *cond, const pthread_condattr_t *cond_attr), - (cond, cond_attr), return 0) -compat_symbol (libc, __pthread_cond_init_2_0, pthread_cond_init, GLIBC_2_0); -#endif -FORWARD (__pthread_cond_init, - (pthread_cond_t *cond, const pthread_condattr_t *cond_attr), - (cond, cond_attr), 0) -versioned_symbol (libc, __pthread_cond_init, pthread_cond_init, GLIBC_2_3_2); - -#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3_2) -FORWARD2 (__pthread_cond_signal_2_0, int attribute_compat_text_section, - (pthread_cond_2_0_t *cond), (cond), return 0) -compat_symbol (libc, __pthread_cond_signal_2_0, pthread_cond_signal, - GLIBC_2_0); -#endif -FORWARD (__pthread_cond_signal, (pthread_cond_t *cond), (cond), 0) -versioned_symbol (libc, __pthread_cond_signal, pthread_cond_signal, - GLIBC_2_3_2); - -#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3_2) -FORWARD2 (__pthread_cond_wait_2_0, int attribute_compat_text_section, - (pthread_cond_2_0_t *cond, pthread_mutex_t *mutex), (cond, mutex), - return 0) -compat_symbol (libc, __pthread_cond_wait_2_0, pthread_cond_wait, - GLIBC_2_0); -#endif -FORWARD (__pthread_cond_wait, (pthread_cond_t *cond, pthread_mutex_t *mutex), - (cond, mutex), 0) -versioned_symbol (libc, __pthread_cond_wait, pthread_cond_wait, - GLIBC_2_3_2); - -#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3_2) -FORWARD2 (__pthread_cond_timedwait_2_0, int attribute_compat_text_section, - (pthread_cond_2_0_t *cond, pthread_mutex_t *mutex, - const struct timespec *abstime), (cond, mutex, abstime), - return 0) -compat_symbol (libc, __pthread_cond_timedwait_2_0, pthread_cond_timedwait, - GLIBC_2_0); -#endif -FORWARD (__pthread_cond_timedwait, - (pthread_cond_t *cond, pthread_mutex_t *mutex, - const struct timespec *abstime), (cond, mutex, abstime), 0) -versioned_symbol (libc, __pthread_cond_timedwait, pthread_cond_timedwait, - GLIBC_2_3_2); - - -FORWARD (pthread_equal, (pthread_t thread1, pthread_t thread2), - (thread1, thread2), 1) - - -FORWARD_NORETURN (__pthread_exit, void, (void *retval), (retval), - exit (EXIT_SUCCESS)) -strong_alias (__pthread_exit, pthread_exit); - - -FORWARD (pthread_getschedparam, - (pthread_t target_thread, int *policy, struct sched_param *param), - (target_thread, policy, param), 0) -FORWARD (pthread_setschedparam, - (pthread_t target_thread, int policy, - const struct sched_param *param), (target_thread, policy, param), 0) - - -FORWARD (pthread_mutex_destroy, (pthread_mutex_t *mutex), (mutex), 0) - -FORWARD (pthread_mutex_init, - (pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr), - (mutex, mutexattr), 0) - -FORWARD (pthread_mutex_lock, (pthread_mutex_t *mutex), (mutex), 0) - -FORWARD (pthread_mutex_unlock, (pthread_mutex_t *mutex), (mutex), 0) - - -FORWARD2 (pthread_self, pthread_t, (void), (), return 0) - - -FORWARD (__pthread_setcancelstate, (int state, int *oldstate), - (state, oldstate), 0) -strong_alias (__pthread_setcancelstate, pthread_setcancelstate) - -FORWARD (pthread_setcanceltype, (int type, int *oldtype), (type, oldtype), 0) - -FORWARD_NORETURN (__pthread_unwind, - void attribute_hidden __attribute ((noreturn)) - __cleanup_fct_attribute attribute_compat_text_section, - (__pthread_unwind_buf_t *buf), (buf), - __safe_fatal ()) diff --git a/nptl/herrno.c b/nptl/herrno.c deleted file mode 100644 index 824ac45d8c..0000000000 --- a/nptl/herrno.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <features.h> -#include <netdb.h> -#undef h_errno - -#include <tls.h> - -/* We need to have the error status variable of the resolver - accessible in the libc. */ -extern __thread int __h_errno; - - -/* When threaded, h_errno may be a per-thread variable. */ -int * -__h_errno_location (void) -{ - return &__h_errno; -} diff --git a/nptl/libc-cancellation.c b/nptl/libc-cancellation.c deleted file mode 100644 index cb675ce732..0000000000 --- a/nptl/libc-cancellation.c +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" - - -#define __pthread_enable_asynccancel __libc_enable_asynccancel -#define __pthread_disable_asynccancel __libc_disable_asynccancel -#include <nptl/cancellation.c> diff --git a/nptl/libc-cleanup.c b/nptl/libc-cleanup.c deleted file mode 100644 index fc19e683dd..0000000000 --- a/nptl/libc-cleanup.c +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" - - -void -__libc_cleanup_routine (struct __pthread_cleanup_frame *f) -{ - if (f->__do_it) - f->__cancel_routine (f->__cancel_arg); -} diff --git a/nptl/libc-lowlevellock.c b/nptl/libc-lowlevellock.c deleted file mode 100644 index 94855525f0..0000000000 --- a/nptl/libc-lowlevellock.c +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* No difference to lowlevellock.c, except we lose a couple of functions. */ -#include <lowlevellock.c> diff --git a/nptl/libc_multiple_threads.c b/nptl/libc_multiple_threads.c deleted file mode 100644 index ef6a4be183..0000000000 --- a/nptl/libc_multiple_threads.c +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthreadP.h> - -#if IS_IN (libc) -# ifndef TLS_MULTIPLE_THREADS_IN_TCB -/* Variable set to a nonzero value either if more than one thread runs or ran, - or if a single-threaded process is trying to cancel itself. See - nptl/descr.h for more context on the single-threaded process case. */ -int __libc_multiple_threads attribute_hidden; -# endif -#endif diff --git a/nptl/libc_pthread_init.c b/nptl/libc_pthread_init.c deleted file mode 100644 index 0db7a10893..0000000000 --- a/nptl/libc_pthread_init.c +++ /dev/null @@ -1,88 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <unistd.h> -#include <list.h> -#include <fork.h> -#include <dl-sysdep.h> -#include <tls.h> -#include <string.h> -#include <pthreadP.h> -#include <libc-lock.h> -#include <sysdep.h> -#include <ldsodefs.h> - - -unsigned long int *__fork_generation_pointer; - - -#ifdef TLS_MULTIPLE_THREADS_IN_TCB -void -#else -extern int __libc_multiple_threads attribute_hidden; - -int * -#endif -internal_function -__libc_pthread_init (unsigned long int *ptr, void (*reclaim) (void), - const struct pthread_functions *functions) -{ - /* Remember the pointer to the generation counter in libpthread. */ - __fork_generation_pointer = ptr; - - /* Called by a child after fork. */ - __register_atfork (NULL, NULL, reclaim, NULL); - -#ifdef SHARED - /* Copy the function pointers into an array in libc. This enables - access with just one memory reference but moreso, it prevents - hijacking the function pointers with just one pointer change. We - "encrypt" the function pointers since we cannot write-protect the - array easily enough. */ - union ptrhack - { - struct pthread_functions pf; -# define NPTRS (sizeof (struct pthread_functions) / sizeof (void *)) - void *parr[NPTRS]; - } __attribute__ ((may_alias)) const *src; - union ptrhack *dest; - - src = (const void *) functions; - dest = (void *) &__libc_pthread_functions; - - for (size_t cnt = 0; cnt < NPTRS; ++cnt) - { - void *p = src->parr[cnt]; - PTR_MANGLE (p); - dest->parr[cnt] = p; - } - __libc_pthread_functions_init = 1; -#endif - -#ifndef TLS_MULTIPLE_THREADS_IN_TCB - return &__libc_multiple_threads; -#endif -} - -#ifdef SHARED -libc_freeres_fn (freeres_libptread) -{ - if (__libc_pthread_functions_init) - PTHFCT_CALL (ptr_freeres, ()); -} -#endif diff --git a/nptl/lll_timedlock_wait.c b/nptl/lll_timedlock_wait.c deleted file mode 100644 index 604953c04c..0000000000 --- a/nptl/lll_timedlock_wait.c +++ /dev/null @@ -1,59 +0,0 @@ -/* Timed low level locking for pthread library. Generic futex-using version. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <atomic.h> -#include <errno.h> -#include <lowlevellock.h> -#include <sys/time.h> - - -int -__lll_timedlock_wait (int *futex, const struct timespec *abstime, int private) -{ - /* Reject invalid timeouts. */ - if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000) - return EINVAL; - - /* Try locking. */ - while (atomic_exchange_acq (futex, 2) != 0) - { - struct timeval tv; - - /* Get the current time. */ - (void) __gettimeofday (&tv, NULL); - - /* Compute relative timeout. */ - struct timespec rt; - rt.tv_sec = abstime->tv_sec - tv.tv_sec; - rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * 1000; - if (rt.tv_nsec < 0) - { - rt.tv_nsec += 1000000000; - --rt.tv_sec; - } - - if (rt.tv_sec < 0) - return ETIMEDOUT; - - /* If *futex == 2, wait until woken or timeout. */ - lll_futex_timed_wait (futex, 2, &rt, private); - } - - return 0; -} diff --git a/nptl/lll_timedwait_tid.c b/nptl/lll_timedwait_tid.c deleted file mode 100644 index e4c8de0f99..0000000000 --- a/nptl/lll_timedwait_tid.c +++ /dev/null @@ -1,70 +0,0 @@ -/* Timed waiting for thread death. Generic futex-using version. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <atomic.h> -#include <errno.h> -#include <lowlevellock.h> -#include <sys/time.h> - - -/* The kernel notifies a process which uses CLONE_CHILD_CLEARTID via futex - wake-up when the clone terminates. The memory location contains the - thread ID while the clone is running and is reset to zero by the kernel - afterwards. The kernel up to version 3.16.3 does not use the private futex - operations for futex wake-up when the clone terminates. */ -int -__lll_timedwait_tid (int *tidp, const struct timespec *abstime) -{ - int tid; - - if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000) - return EINVAL; - - /* Repeat until thread terminated. */ - while ((tid = *tidp) != 0) - { - struct timeval tv; - struct timespec rt; - - /* Get the current time. */ - (void) __gettimeofday (&tv, NULL); - - /* Compute relative timeout. */ - rt.tv_sec = abstime->tv_sec - tv.tv_sec; - rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * 1000; - if (rt.tv_nsec < 0) - { - rt.tv_nsec += 1000000000; - --rt.tv_sec; - } - - /* Already timed out? */ - if (rt.tv_sec < 0) - return ETIMEDOUT; - - /* If *tidp == tid, wait until thread terminates or the wait times out. - The kernel up to version 3.16.3 does not use the private futex - operations for futex wake-up when the clone terminates. - */ - if (lll_futex_timed_wait (tidp, tid, &rt, LLL_SHARED) == -ETIMEDOUT) - return ETIMEDOUT; - } - - return 0; -} diff --git a/nptl/lowlevellock.c b/nptl/lowlevellock.c deleted file mode 100644 index fc938768a5..0000000000 --- a/nptl/lowlevellock.c +++ /dev/null @@ -1,48 +0,0 @@ -/* low level locking for pthread library. Generic futex-using version. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <sysdep.h> -#include <lowlevellock.h> -#include <sys/time.h> -#include <atomic.h> - -void -__lll_lock_wait_private (int *futex) -{ - if (*futex == 2) - lll_futex_wait (futex, 2, LLL_PRIVATE); /* Wait if *futex == 2. */ - - while (atomic_exchange_acq (futex, 2) != 0) - lll_futex_wait (futex, 2, LLL_PRIVATE); /* Wait if *futex == 2. */ -} - - -/* This function doesn't get included in libc. */ -#if IS_IN (libpthread) -void -__lll_lock_wait (int *futex, int private) -{ - if (*futex == 2) - lll_futex_wait (futex, 2, private); /* Wait if *futex == 2. */ - - while (atomic_exchange_acq (futex, 2) != 0) - lll_futex_wait (futex, 2, private); /* Wait if *futex == 2. */ -} -#endif diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c deleted file mode 100644 index 29216077a2..0000000000 --- a/nptl/nptl-init.c +++ /dev/null @@ -1,480 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <limits.h> -#include <signal.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/param.h> -#include <sys/resource.h> -#include <pthreadP.h> -#include <atomic.h> -#include <ldsodefs.h> -#include <tls.h> -#include <list.h> -#include <fork.h> -#include <version.h> -#include <shlib-compat.h> -#include <smp.h> -#include <lowlevellock.h> -#include <futex-internal.h> -#include <kernel-features.h> -#include <libc-pointer-arith.h> -#include <pthread-pids.h> - -#ifndef TLS_MULTIPLE_THREADS_IN_TCB -/* Pointer to the corresponding variable in libc. */ -int *__libc_multiple_threads_ptr attribute_hidden; -#endif - -/* Size and alignment of static TLS block. */ -size_t __static_tls_size; -size_t __static_tls_align_m1; - -#ifndef __ASSUME_SET_ROBUST_LIST -/* Negative if we do not have the system call and we can use it. */ -int __set_robust_list_avail; -# define set_robust_list_not_avail() \ - __set_robust_list_avail = -1 -#else -# define set_robust_list_not_avail() do { } while (0) -#endif - -#ifndef __ASSUME_FUTEX_CLOCK_REALTIME -/* Nonzero if we do not have FUTEX_CLOCK_REALTIME. */ -int __have_futex_clock_realtime; -# define __set_futex_clock_realtime() \ - __have_futex_clock_realtime = 1 -#else -#define __set_futex_clock_realtime() do { } while (0) -#endif - -/* Version of the library, used in libthread_db to detect mismatches. */ -static const char nptl_version[] __attribute_used__ = VERSION; - - -#ifdef SHARED -static -#else -extern -#endif -void __nptl_set_robust (struct pthread *); - -#ifdef SHARED -static void nptl_freeres (void); - - -static const struct pthread_functions pthread_functions = - { - .ptr_pthread_attr_destroy = __pthread_attr_destroy, -# if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1) - .ptr___pthread_attr_init_2_0 = __pthread_attr_init_2_0, -# endif - .ptr___pthread_attr_init_2_1 = __pthread_attr_init_2_1, - .ptr_pthread_attr_getdetachstate = __pthread_attr_getdetachstate, - .ptr_pthread_attr_setdetachstate = __pthread_attr_setdetachstate, - .ptr_pthread_attr_getinheritsched = __pthread_attr_getinheritsched, - .ptr_pthread_attr_setinheritsched = __pthread_attr_setinheritsched, - .ptr_pthread_attr_getschedparam = __pthread_attr_getschedparam, - .ptr_pthread_attr_setschedparam = __pthread_attr_setschedparam, - .ptr_pthread_attr_getschedpolicy = __pthread_attr_getschedpolicy, - .ptr_pthread_attr_setschedpolicy = __pthread_attr_setschedpolicy, - .ptr_pthread_attr_getscope = __pthread_attr_getscope, - .ptr_pthread_attr_setscope = __pthread_attr_setscope, - .ptr_pthread_condattr_destroy = __pthread_condattr_destroy, - .ptr_pthread_condattr_init = __pthread_condattr_init, - .ptr___pthread_cond_broadcast = __pthread_cond_broadcast, - .ptr___pthread_cond_destroy = __pthread_cond_destroy, - .ptr___pthread_cond_init = __pthread_cond_init, - .ptr___pthread_cond_signal = __pthread_cond_signal, - .ptr___pthread_cond_wait = __pthread_cond_wait, - .ptr___pthread_cond_timedwait = __pthread_cond_timedwait, -# if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_3_2) - .ptr___pthread_cond_broadcast_2_0 = __pthread_cond_broadcast_2_0, - .ptr___pthread_cond_destroy_2_0 = __pthread_cond_destroy_2_0, - .ptr___pthread_cond_init_2_0 = __pthread_cond_init_2_0, - .ptr___pthread_cond_signal_2_0 = __pthread_cond_signal_2_0, - .ptr___pthread_cond_wait_2_0 = __pthread_cond_wait_2_0, - .ptr___pthread_cond_timedwait_2_0 = __pthread_cond_timedwait_2_0, -# endif - .ptr_pthread_equal = __pthread_equal, - .ptr___pthread_exit = __pthread_exit, - .ptr_pthread_getschedparam = __pthread_getschedparam, - .ptr_pthread_setschedparam = __pthread_setschedparam, - .ptr_pthread_mutex_destroy = __pthread_mutex_destroy, - .ptr_pthread_mutex_init = __pthread_mutex_init, - .ptr_pthread_mutex_lock = __pthread_mutex_lock, - .ptr_pthread_mutex_unlock = __pthread_mutex_unlock, - .ptr_pthread_self = __pthread_self, - .ptr___pthread_setcancelstate = __pthread_setcancelstate, - .ptr_pthread_setcanceltype = __pthread_setcanceltype, - .ptr___pthread_cleanup_upto = __pthread_cleanup_upto, - .ptr___pthread_once = __pthread_once, - .ptr___pthread_rwlock_rdlock = __pthread_rwlock_rdlock, - .ptr___pthread_rwlock_wrlock = __pthread_rwlock_wrlock, - .ptr___pthread_rwlock_unlock = __pthread_rwlock_unlock, - .ptr___pthread_key_create = __pthread_key_create, - .ptr___pthread_getspecific = __pthread_getspecific, - .ptr___pthread_setspecific = __pthread_setspecific, - .ptr__pthread_cleanup_push_defer = __pthread_cleanup_push_defer, - .ptr__pthread_cleanup_pop_restore = __pthread_cleanup_pop_restore, - .ptr_nthreads = &__nptl_nthreads, - .ptr___pthread_unwind = &__pthread_unwind, - .ptr__nptl_deallocate_tsd = __nptl_deallocate_tsd, -# ifdef SIGSETXID - .ptr__nptl_setxid = __nptl_setxid, -# endif - /* For now only the stack cache needs to be freed. */ - .ptr_freeres = nptl_freeres, - .ptr_set_robust = __nptl_set_robust - }; -# define ptr_pthread_functions &pthread_functions -#else -# define ptr_pthread_functions NULL -#endif - - -#ifdef SHARED -/* This function is called indirectly from the freeres code in libc. */ -static void -__libc_freeres_fn_section -nptl_freeres (void) -{ - __unwind_freeres (); - __free_stacks (0); -} - - -static -#endif -void -__nptl_set_robust (struct pthread *self) -{ -#ifdef __NR_set_robust_list - INTERNAL_SYSCALL_DECL (err); - INTERNAL_SYSCALL (set_robust_list, err, 2, &self->robust_head, - sizeof (struct robust_list_head)); -#endif -} - - -#ifdef SIGCANCEL -/* For asynchronous cancellation we use a signal. This is the handler. */ -static void -sigcancel_handler (int sig, siginfo_t *si, void *ctx) -{ - /* Safety check. It would be possible to call this function for - other signals and send a signal from another process. This is not - correct and might even be a security problem. Try to catch as - many incorrect invocations as possible. */ - if (sig != SIGCANCEL - || si->si_pid != __getpid() - || si->si_code != SI_TKILL) - return; - - struct pthread *self = THREAD_SELF; - - int oldval = THREAD_GETMEM (self, cancelhandling); - while (1) - { - /* We are canceled now. When canceled by another thread this flag - is already set but if the signal is directly send (internally or - from another process) is has to be done here. */ - int newval = oldval | CANCELING_BITMASK | CANCELED_BITMASK; - - if (oldval == newval || (oldval & EXITING_BITMASK) != 0) - /* Already canceled or exiting. */ - break; - - int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval, - oldval); - if (curval == oldval) - { - /* Set the return value. */ - THREAD_SETMEM (self, result, PTHREAD_CANCELED); - - /* Make sure asynchronous cancellation is still enabled. */ - if ((newval & CANCELTYPE_BITMASK) != 0) - /* Run the registered destructors and terminate the thread. */ - __do_cancel (); - - break; - } - - oldval = curval; - } -} -#endif - - -#ifdef SIGSETXID -struct xid_command *__xidcmd attribute_hidden; - -/* We use the SIGSETXID signal in the setuid, setgid, etc. implementations to - tell each thread to call the respective setxid syscall on itself. This is - the handler. */ -static void -sighandler_setxid (int sig, siginfo_t *si, void *ctx) -{ - int result; - - /* Safety check. It would be possible to call this function for - other signals and send a signal from another process. This is not - correct and might even be a security problem. Try to catch as - many incorrect invocations as possible. */ - if (sig != SIGSETXID - || si->si_pid != __getpid () - || si->si_code != SI_TKILL) - return; - - INTERNAL_SYSCALL_DECL (err); - result = INTERNAL_SYSCALL_NCS (__xidcmd->syscall_no, err, 3, __xidcmd->id[0], - __xidcmd->id[1], __xidcmd->id[2]); - int error = 0; - if (__glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (result, err))) - error = INTERNAL_SYSCALL_ERRNO (result, err); - __nptl_setxid_error (__xidcmd, error); - - /* Reset the SETXID flag. */ - struct pthread *self = THREAD_SELF; - int flags, newval; - do - { - flags = THREAD_GETMEM (self, cancelhandling); - newval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, - flags & ~SETXID_BITMASK, flags); - } - while (flags != newval); - - /* And release the futex. */ - self->setxid_futex = 1; - futex_wake (&self->setxid_futex, 1, FUTEX_PRIVATE); - - if (atomic_decrement_val (&__xidcmd->cntr) == 0) - futex_wake ((unsigned int *) &__xidcmd->cntr, 1, FUTEX_PRIVATE); -} -#endif - - -/* When using __thread for this, we do it in libc so as not - to give libpthread its own TLS segment just for this. */ -extern void **__libc_dl_error_tsd (void) __attribute__ ((const)); - - -/* This can be set by the debugger before initialization is complete. */ -static bool __nptl_initial_report_events __attribute_used__; - -void -__pthread_initialize_minimal_internal (void) -{ - /* Minimal initialization of the thread descriptor. */ - struct pthread *pd = THREAD_SELF; - __pthread_initialize_pids (pd); - THREAD_SETMEM (pd, specific[0], &pd->specific_1stblock[0]); - THREAD_SETMEM (pd, user_stack, true); - if (LLL_LOCK_INITIALIZER != 0) - THREAD_SETMEM (pd, lock, LLL_LOCK_INITIALIZER); -#if HP_TIMING_AVAIL - THREAD_SETMEM (pd, cpuclock_offset, GL(dl_cpuclock_offset)); -#endif - - /* Initialize the robust mutex data. */ - { -#ifdef __PTHREAD_MUTEX_HAVE_PREV - pd->robust_prev = &pd->robust_head; -#endif - pd->robust_head.list = &pd->robust_head; -#ifdef __NR_set_robust_list - pd->robust_head.futex_offset = (offsetof (pthread_mutex_t, __data.__lock) - - offsetof (pthread_mutex_t, - __data.__list.__next)); - INTERNAL_SYSCALL_DECL (err); - int res = INTERNAL_SYSCALL (set_robust_list, err, 2, &pd->robust_head, - sizeof (struct robust_list_head)); - if (INTERNAL_SYSCALL_ERROR_P (res, err)) -#endif - set_robust_list_not_avail (); - } - -#ifdef __NR_futex -# ifndef __ASSUME_PRIVATE_FUTEX - /* Private futexes are always used (at least internally) so that - doing the test once this early is beneficial. */ - { - int word = 0; - INTERNAL_SYSCALL_DECL (err); - word = INTERNAL_SYSCALL (futex, err, 3, &word, - FUTEX_WAKE | FUTEX_PRIVATE_FLAG, 1); - if (!INTERNAL_SYSCALL_ERROR_P (word, err)) - THREAD_SETMEM (pd, header.private_futex, FUTEX_PRIVATE_FLAG); - } - - /* Private futexes have been introduced earlier than the - FUTEX_CLOCK_REALTIME flag. We don't have to run the test if we - know the former are not supported. This also means we know the - kernel will return ENOSYS for unknown operations. */ - if (THREAD_GETMEM (pd, header.private_futex) != 0) -# endif -# ifndef __ASSUME_FUTEX_CLOCK_REALTIME - { - int word = 0; - /* NB: the syscall actually takes six parameters. The last is the - bit mask. But since we will not actually wait at all the value - is irrelevant. Given that passing six parameters is difficult - on some architectures we just pass whatever random value the - calling convention calls for to the kernel. It causes no harm. */ - INTERNAL_SYSCALL_DECL (err); - word = INTERNAL_SYSCALL (futex, err, 5, &word, - FUTEX_WAIT_BITSET | FUTEX_CLOCK_REALTIME - | FUTEX_PRIVATE_FLAG, 1, NULL, 0); - assert (INTERNAL_SYSCALL_ERROR_P (word, err)); - if (INTERNAL_SYSCALL_ERRNO (word, err) != ENOSYS) - __set_futex_clock_realtime (); - } -# endif -#endif - - /* Set initial thread's stack block from 0 up to __libc_stack_end. - It will be bigger than it actually is, but for unwind.c/pt-longjmp.c - purposes this is good enough. */ - THREAD_SETMEM (pd, stackblock_size, (size_t) __libc_stack_end); - - /* Initialize the list of all running threads with the main thread. */ - INIT_LIST_HEAD (&__stack_user); - list_add (&pd->list, &__stack_user); - - /* Before initializing __stack_user, the debugger could not find us and - had to set __nptl_initial_report_events. Propagate its setting. */ - THREAD_SETMEM (pd, report_events, __nptl_initial_report_events); - -#if defined SIGCANCEL || defined SIGSETXID - struct sigaction sa; - __sigemptyset (&sa.sa_mask); - -# ifdef SIGCANCEL - /* Install the cancellation signal handler. If for some reason we - cannot install the handler we do not abort. Maybe we should, but - it is only asynchronous cancellation which is affected. */ - sa.sa_sigaction = sigcancel_handler; - sa.sa_flags = SA_SIGINFO; - (void) __libc_sigaction (SIGCANCEL, &sa, NULL); -# endif - -# ifdef SIGSETXID - /* Install the handle to change the threads' uid/gid. */ - sa.sa_sigaction = sighandler_setxid; - sa.sa_flags = SA_SIGINFO | SA_RESTART; - (void) __libc_sigaction (SIGSETXID, &sa, NULL); -# endif - - /* The parent process might have left the signals blocked. Just in - case, unblock it. We reuse the signal mask in the sigaction - structure. It is already cleared. */ -# ifdef SIGCANCEL - __sigaddset (&sa.sa_mask, SIGCANCEL); -# endif -# ifdef SIGSETXID - __sigaddset (&sa.sa_mask, SIGSETXID); -# endif - { - INTERNAL_SYSCALL_DECL (err); - (void) INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_UNBLOCK, &sa.sa_mask, - NULL, _NSIG / 8); - } -#endif - - /* Get the size of the static and alignment requirements for the TLS - block. */ - size_t static_tls_align; - _dl_get_tls_static_info (&__static_tls_size, &static_tls_align); - - /* Make sure the size takes all the alignments into account. */ - if (STACK_ALIGN > static_tls_align) - static_tls_align = STACK_ALIGN; - __static_tls_align_m1 = static_tls_align - 1; - - __static_tls_size = roundup (__static_tls_size, static_tls_align); - - /* Determine the default allowed stack size. This is the size used - in case the user does not specify one. */ - struct rlimit limit; - if (__getrlimit (RLIMIT_STACK, &limit) != 0 - || limit.rlim_cur == RLIM_INFINITY) - /* The system limit is not usable. Use an architecture-specific - default. */ - limit.rlim_cur = ARCH_STACK_DEFAULT_SIZE; - else if (limit.rlim_cur < PTHREAD_STACK_MIN) - /* The system limit is unusably small. - Use the minimal size acceptable. */ - limit.rlim_cur = PTHREAD_STACK_MIN; - - /* Make sure it meets the minimum size that allocate_stack - (allocatestack.c) will demand, which depends on the page size. */ - const uintptr_t pagesz = GLRO(dl_pagesize); - const size_t minstack = pagesz + __static_tls_size + MINIMAL_REST_STACK; - if (limit.rlim_cur < minstack) - limit.rlim_cur = minstack; - - /* Round the resource limit up to page size. */ - limit.rlim_cur = ALIGN_UP (limit.rlim_cur, pagesz); - lll_lock (__default_pthread_attr_lock, LLL_PRIVATE); - __default_pthread_attr.stacksize = limit.rlim_cur; - __default_pthread_attr.guardsize = GLRO (dl_pagesize); - lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE); - -#ifdef SHARED - /* Make __rtld_lock_{,un}lock_recursive use pthread_mutex_{,un}lock, - keep the lock count from the ld.so implementation. */ - GL(dl_rtld_lock_recursive) = (void *) __pthread_mutex_lock; - GL(dl_rtld_unlock_recursive) = (void *) __pthread_mutex_unlock; - unsigned int rtld_lock_count = GL(dl_load_lock).mutex.__data.__count; - GL(dl_load_lock).mutex.__data.__count = 0; - while (rtld_lock_count-- > 0) - __pthread_mutex_lock (&GL(dl_load_lock).mutex); - - GL(dl_make_stack_executable_hook) = &__make_stacks_executable; -#endif - - GL(dl_init_static_tls) = &__pthread_init_static_tls; - - GL(dl_wait_lookup_done) = &__wait_lookup_done; - - /* Register the fork generation counter with the libc. */ -#ifndef TLS_MULTIPLE_THREADS_IN_TCB - __libc_multiple_threads_ptr = -#endif - __libc_pthread_init (&__fork_generation, __reclaim_stacks, - ptr_pthread_functions); - - /* Determine whether the machine is SMP or not. */ - __is_smp = is_smp_system (); -} -strong_alias (__pthread_initialize_minimal_internal, - __pthread_initialize_minimal) - - -size_t -__pthread_get_minstack (const pthread_attr_t *attr) -{ - struct pthread_attr *iattr = (struct pthread_attr *) attr; - - return (GLRO(dl_pagesize) + __static_tls_size + PTHREAD_STACK_MIN - + iattr->guardsize); -} diff --git a/nptl/nptl-printers.py b/nptl/nptl-printers.py deleted file mode 100644 index 572a25c32e..0000000000 --- a/nptl/nptl-printers.py +++ /dev/null @@ -1,594 +0,0 @@ -# Pretty printers for the NPTL lock types. -# -# Copyright (C) 2016-2017 Free Software Foundation, Inc. -# This file is part of the GNU C Library. -# -# The GNU C Library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# The GNU C Library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with the GNU C Library; if not, see -# <http://www.gnu.org/licenses/>. - -"""This file contains the gdb pretty printers for the following types: - - * pthread_mutex_t - * pthread_mutexattr_t - * pthread_cond_t - * pthread_condattr_t - * pthread_rwlock_t - * pthread_rwlockattr_t - -You can check which printers are registered and enabled by issuing the -'info pretty-printer' gdb command. Printers should trigger automatically when -trying to print a variable of one of the types mentioned above. -""" - -from __future__ import print_function - -import gdb -import gdb.printing -from nptl_lock_constants import * - -MUTEX_TYPES = { - PTHREAD_MUTEX_NORMAL: ('Type', 'Normal'), - PTHREAD_MUTEX_RECURSIVE: ('Type', 'Recursive'), - PTHREAD_MUTEX_ERRORCHECK: ('Type', 'Error check'), - PTHREAD_MUTEX_ADAPTIVE_NP: ('Type', 'Adaptive') -} - -class MutexPrinter(object): - """Pretty printer for pthread_mutex_t.""" - - def __init__(self, mutex): - """Initialize the printer's internal data structures. - - Args: - mutex: A gdb.value representing a pthread_mutex_t. - """ - - data = mutex['__data'] - self.lock = data['__lock'] - self.count = data['__count'] - self.owner = data['__owner'] - self.kind = data['__kind'] - self.values = [] - self.read_values() - - def to_string(self): - """gdb API function. - - This is called from gdb when we try to print a pthread_mutex_t. - """ - - return 'pthread_mutex_t' - - def children(self): - """gdb API function. - - This is called from gdb when we try to print a pthread_mutex_t. - """ - - return self.values - - def read_values(self): - """Read the mutex's info and store it in self.values. - - The data contained in self.values will be returned by the Iterator - created in self.children. - """ - - self.read_type() - self.read_status() - self.read_attributes() - self.read_misc_info() - - def read_type(self): - """Read the mutex's type.""" - - mutex_type = self.kind & PTHREAD_MUTEX_KIND_MASK - - # mutex_type must be casted to int because it's a gdb.Value - self.values.append(MUTEX_TYPES[int(mutex_type)]) - - def read_status(self): - """Read the mutex's status. - - Architectures that support lock elision might not record the mutex owner - ID in the __owner field. In that case, the owner will be reported as - "Unknown". - """ - - if self.kind == PTHREAD_MUTEX_DESTROYED: - self.values.append(('Status', 'Destroyed')) - elif self.kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP: - self.read_status_robust() - else: - self.read_status_no_robust() - - def read_status_robust(self): - """Read the status of a robust mutex. - - In glibc robust mutexes are implemented in a very different way than - non-robust ones. This method reads their locking status, - whether it may have waiters, their registered owner (if any), - whether the owner is alive or not, and the status of the state - they're protecting. - """ - - if self.lock == PTHREAD_MUTEX_UNLOCKED: - self.values.append(('Status', 'Not acquired')) - else: - if self.lock & FUTEX_WAITERS: - self.values.append(('Status', - 'Acquired, possibly with waiters')) - else: - self.values.append(('Status', - 'Acquired, possibly with no waiters')) - - if self.lock & FUTEX_OWNER_DIED: - self.values.append(('Owner ID', '%d (dead)' % self.owner)) - else: - self.values.append(('Owner ID', self.lock & FUTEX_TID_MASK)) - - if self.owner == PTHREAD_MUTEX_INCONSISTENT: - self.values.append(('State protected by this mutex', - 'Inconsistent')) - elif self.owner == PTHREAD_MUTEX_NOTRECOVERABLE: - self.values.append(('State protected by this mutex', - 'Not recoverable')) - - def read_status_no_robust(self): - """Read the status of a non-robust mutex. - - Read info on whether the mutex is acquired, if it may have waiters - and its owner (if any). - """ - - lock_value = self.lock - - if self.kind & PTHREAD_MUTEX_PRIO_PROTECT_NP: - lock_value &= ~(PTHREAD_MUTEX_PRIO_CEILING_MASK) - - if lock_value == PTHREAD_MUTEX_UNLOCKED: - self.values.append(('Status', 'Not acquired')) - else: - if self.kind & PTHREAD_MUTEX_PRIO_INHERIT_NP: - waiters = self.lock & FUTEX_WAITERS - owner = self.lock & FUTEX_TID_MASK - else: - # Mutex protocol is PP or none - waiters = (self.lock != PTHREAD_MUTEX_LOCKED_NO_WAITERS) - owner = self.owner - - if waiters: - self.values.append(('Status', - 'Acquired, possibly with waiters')) - else: - self.values.append(('Status', - 'Acquired, possibly with no waiters')) - - if self.owner != 0: - self.values.append(('Owner ID', owner)) - else: - # Owner isn't recorded, probably because lock elision - # is enabled. - self.values.append(('Owner ID', 'Unknown')) - - def read_attributes(self): - """Read the mutex's attributes.""" - - if self.kind != PTHREAD_MUTEX_DESTROYED: - if self.kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP: - self.values.append(('Robust', 'Yes')) - else: - self.values.append(('Robust', 'No')) - - # In glibc, robust mutexes always have their pshared flag set to - # 'shared' regardless of what the pshared flag of their - # mutexattr was. Therefore a robust mutex will act as shared - # even if it was initialized with a 'private' mutexattr. - if self.kind & PTHREAD_MUTEX_PSHARED_BIT: - self.values.append(('Shared', 'Yes')) - else: - self.values.append(('Shared', 'No')) - - if self.kind & PTHREAD_MUTEX_PRIO_INHERIT_NP: - self.values.append(('Protocol', 'Priority inherit')) - elif self.kind & PTHREAD_MUTEX_PRIO_PROTECT_NP: - prio_ceiling = ((self.lock & PTHREAD_MUTEX_PRIO_CEILING_MASK) - >> PTHREAD_MUTEX_PRIO_CEILING_SHIFT) - - self.values.append(('Protocol', 'Priority protect')) - self.values.append(('Priority ceiling', prio_ceiling)) - else: - # PTHREAD_PRIO_NONE - self.values.append(('Protocol', 'None')) - - def read_misc_info(self): - """Read miscellaneous info on the mutex. - - For now this reads the number of times a recursive mutex was acquired - by the same thread. - """ - - mutex_type = self.kind & PTHREAD_MUTEX_KIND_MASK - - if mutex_type == PTHREAD_MUTEX_RECURSIVE and self.count > 1: - self.values.append(('Times acquired by the owner', self.count)) - -class MutexAttributesPrinter(object): - """Pretty printer for pthread_mutexattr_t. - - In the NPTL this is a type that's always casted to struct pthread_mutexattr - which has a single 'mutexkind' field containing the actual attributes. - """ - - def __init__(self, mutexattr): - """Initialize the printer's internal data structures. - - Args: - mutexattr: A gdb.value representing a pthread_mutexattr_t. - """ - - self.values = [] - - try: - mutexattr_struct = gdb.lookup_type('struct pthread_mutexattr') - self.mutexattr = mutexattr.cast(mutexattr_struct)['mutexkind'] - self.read_values() - except gdb.error: - # libpthread doesn't have debug symbols, thus we can't find the - # real struct type. Just print the union members. - self.values.append(('__size', mutexattr['__size'])) - self.values.append(('__align', mutexattr['__align'])) - - def to_string(self): - """gdb API function. - - This is called from gdb when we try to print a pthread_mutexattr_t. - """ - - return 'pthread_mutexattr_t' - - def children(self): - """gdb API function. - - This is called from gdb when we try to print a pthread_mutexattr_t. - """ - - return self.values - - def read_values(self): - """Read the mutexattr's info and store it in self.values. - - The data contained in self.values will be returned by the Iterator - created in self.children. - """ - - mutexattr_type = (self.mutexattr - & ~PTHREAD_MUTEXATTR_FLAG_BITS - & ~PTHREAD_MUTEX_NO_ELISION_NP) - - # mutexattr_type must be casted to int because it's a gdb.Value - self.values.append(MUTEX_TYPES[int(mutexattr_type)]) - - if self.mutexattr & PTHREAD_MUTEXATTR_FLAG_ROBUST: - self.values.append(('Robust', 'Yes')) - else: - self.values.append(('Robust', 'No')) - - if self.mutexattr & PTHREAD_MUTEXATTR_FLAG_PSHARED: - self.values.append(('Shared', 'Yes')) - else: - self.values.append(('Shared', 'No')) - - protocol = ((self.mutexattr & PTHREAD_MUTEXATTR_PROTOCOL_MASK) >> - PTHREAD_MUTEXATTR_PROTOCOL_SHIFT) - - if protocol == PTHREAD_PRIO_NONE: - self.values.append(('Protocol', 'None')) - elif protocol == PTHREAD_PRIO_INHERIT: - self.values.append(('Protocol', 'Priority inherit')) - elif protocol == PTHREAD_PRIO_PROTECT: - self.values.append(('Protocol', 'Priority protect')) - -class ConditionVariablePrinter(object): - """Pretty printer for pthread_cond_t.""" - - def __init__(self, cond): - """Initialize the printer's internal data structures. - - Args: - cond: A gdb.value representing a pthread_cond_t. - """ - - data = cond['__data'] - self.wrefs = data['__wrefs'] - self.values = [] - - self.read_values() - - def to_string(self): - """gdb API function. - - This is called from gdb when we try to print a pthread_cond_t. - """ - - return 'pthread_cond_t' - - def children(self): - """gdb API function. - - This is called from gdb when we try to print a pthread_cond_t. - """ - - return self.values - - def read_values(self): - """Read the condvar's info and store it in self.values. - - The data contained in self.values will be returned by the Iterator - created in self.children. - """ - - self.read_status() - self.read_attributes() - - def read_status(self): - """Read the status of the condvar. - - This method reads whether the condvar is destroyed and how many threads - are waiting for it. - """ - - self.values.append(('Threads known to still execute a wait function', - self.wrefs >> PTHREAD_COND_WREFS_SHIFT)) - - def read_attributes(self): - """Read the condvar's attributes.""" - - if (self.wrefs & PTHREAD_COND_CLOCK_MONOTONIC_MASK) != 0: - self.values.append(('Clock ID', 'CLOCK_MONOTONIC')) - else: - self.values.append(('Clock ID', 'CLOCK_REALTIME')) - - if (self.wrefs & PTHREAD_COND_SHARED_MASK) != 0: - self.values.append(('Shared', 'Yes')) - else: - self.values.append(('Shared', 'No')) - -class ConditionVariableAttributesPrinter(object): - """Pretty printer for pthread_condattr_t. - - In the NPTL this is a type that's always casted to struct pthread_condattr, - which has a single 'value' field containing the actual attributes. - """ - - def __init__(self, condattr): - """Initialize the printer's internal data structures. - - Args: - condattr: A gdb.value representing a pthread_condattr_t. - """ - - self.values = [] - - try: - condattr_struct = gdb.lookup_type('struct pthread_condattr') - self.condattr = condattr.cast(condattr_struct)['value'] - self.read_values() - except gdb.error: - # libpthread doesn't have debug symbols, thus we can't find the - # real struct type. Just print the union members. - self.values.append(('__size', condattr['__size'])) - self.values.append(('__align', condattr['__align'])) - - def to_string(self): - """gdb API function. - - This is called from gdb when we try to print a pthread_condattr_t. - """ - - return 'pthread_condattr_t' - - def children(self): - """gdb API function. - - This is called from gdb when we try to print a pthread_condattr_t. - """ - - return self.values - - def read_values(self): - """Read the condattr's info and store it in self.values. - - The data contained in self.values will be returned by the Iterator - created in self.children. - """ - - clock_id = (self.condattr >> 1) & ((1 << COND_CLOCK_BITS) - 1) - - if clock_id != 0: - self.values.append(('Clock ID', 'CLOCK_MONOTONIC')) - else: - self.values.append(('Clock ID', 'CLOCK_REALTIME')) - - if self.condattr & 1: - self.values.append(('Shared', 'Yes')) - else: - self.values.append(('Shared', 'No')) - -class RWLockPrinter(object): - """Pretty printer for pthread_rwlock_t.""" - - def __init__(self, rwlock): - """Initialize the printer's internal data structures. - - Args: - rwlock: A gdb.value representing a pthread_rwlock_t. - """ - - data = rwlock['__data'] - self.readers = data['__readers'] - self.cur_writer = data['__cur_writer'] - self.shared = data['__shared'] - self.flags = data['__flags'] - self.values = [] - self.read_values() - - def to_string(self): - """gdb API function. - - This is called from gdb when we try to print a pthread_rwlock_t. - """ - - return 'pthread_rwlock_t' - - def children(self): - """gdb API function. - - This is called from gdb when we try to print a pthread_rwlock_t. - """ - - return self.values - - def read_values(self): - """Read the rwlock's info and store it in self.values. - - The data contained in self.values will be returned by the Iterator - created in self.children. - """ - - self.read_status() - self.read_attributes() - - def read_status(self): - """Read the status of the rwlock.""" - - if self.readers & PTHREAD_RWLOCK_WRPHASE: - if self.readers & PTHREAD_RWLOCK_WRLOCKED: - self.values.append(('Status', 'Acquired (Write)')) - self.values.append(('Writer ID', self.cur_writer)) - else: - self.values.append(('Status', 'Not acquired')) - else: - r = self.readers >> PTHREAD_RWLOCK_READER_SHIFT - if r > 0: - self.values.append(('Status', 'Acquired (Read)')) - self.values.append(('Readers', r)) - else: - self.values.append(('Status', 'Not acquired')) - - def read_attributes(self): - """Read the attributes of the rwlock.""" - - if self.shared: - self.values.append(('Shared', 'Yes')) - else: - self.values.append(('Shared', 'No')) - - if self.flags == PTHREAD_RWLOCK_PREFER_READER_NP: - self.values.append(('Prefers', 'Readers')) - elif self.flags == PTHREAD_RWLOCK_PREFER_WRITER_NP: - self.values.append(('Prefers', 'Writers')) - else: - self.values.append(('Prefers', 'Writers no recursive readers')) - -class RWLockAttributesPrinter(object): - """Pretty printer for pthread_rwlockattr_t. - - In the NPTL this is a type that's always casted to - struct pthread_rwlockattr, which has two fields ('lockkind' and 'pshared') - containing the actual attributes. - """ - - def __init__(self, rwlockattr): - """Initialize the printer's internal data structures. - - Args: - rwlockattr: A gdb.value representing a pthread_rwlockattr_t. - """ - - self.values = [] - - try: - rwlockattr_struct = gdb.lookup_type('struct pthread_rwlockattr') - self.rwlockattr = rwlockattr.cast(rwlockattr_struct) - self.read_values() - except gdb.error: - # libpthread doesn't have debug symbols, thus we can't find the - # real struct type. Just print the union members. - self.values.append(('__size', rwlockattr['__size'])) - self.values.append(('__align', rwlockattr['__align'])) - - def to_string(self): - """gdb API function. - - This is called from gdb when we try to print a pthread_rwlockattr_t. - """ - - return 'pthread_rwlockattr_t' - - def children(self): - """gdb API function. - - This is called from gdb when we try to print a pthread_rwlockattr_t. - """ - - return self.values - - def read_values(self): - """Read the rwlockattr's info and store it in self.values. - - The data contained in self.values will be returned by the Iterator - created in self.children. - """ - - rwlock_type = self.rwlockattr['lockkind'] - shared = self.rwlockattr['pshared'] - - if shared == PTHREAD_PROCESS_SHARED: - self.values.append(('Shared', 'Yes')) - else: - # PTHREAD_PROCESS_PRIVATE - self.values.append(('Shared', 'No')) - - if rwlock_type == PTHREAD_RWLOCK_PREFER_READER_NP: - self.values.append(('Prefers', 'Readers')) - elif rwlock_type == PTHREAD_RWLOCK_PREFER_WRITER_NP: - self.values.append(('Prefers', 'Writers')) - else: - self.values.append(('Prefers', 'Writers no recursive readers')) - -def register(objfile): - """Register the pretty printers within the given objfile.""" - - printer = gdb.printing.RegexpCollectionPrettyPrinter('glibc-pthread-locks') - - printer.add_printer('pthread_mutex_t', r'^pthread_mutex_t$', - MutexPrinter) - printer.add_printer('pthread_mutexattr_t', r'^pthread_mutexattr_t$', - MutexAttributesPrinter) - printer.add_printer('pthread_cond_t', r'^pthread_cond_t$', - ConditionVariablePrinter) - printer.add_printer('pthread_condattr_t', r'^pthread_condattr_t$', - ConditionVariableAttributesPrinter) - printer.add_printer('pthread_rwlock_t', r'^pthread_rwlock_t$', - RWLockPrinter) - printer.add_printer('pthread_rwlockattr_t', r'^pthread_rwlockattr_t$', - RWLockAttributesPrinter) - - if objfile == None: - objfile = gdb - - gdb.printing.register_pretty_printer(objfile, printer) - -register(gdb.current_objfile()) diff --git a/nptl/nptl_lock_constants.pysym b/nptl/nptl_lock_constants.pysym deleted file mode 100644 index ade4398e0c..0000000000 --- a/nptl/nptl_lock_constants.pysym +++ /dev/null @@ -1,67 +0,0 @@ -#include <pthreadP.h> - --- Mutex types -PTHREAD_MUTEX_KIND_MASK PTHREAD_MUTEX_KIND_MASK_NP -PTHREAD_MUTEX_NORMAL -PTHREAD_MUTEX_RECURSIVE PTHREAD_MUTEX_RECURSIVE_NP -PTHREAD_MUTEX_ERRORCHECK PTHREAD_MUTEX_ERRORCHECK_NP -PTHREAD_MUTEX_ADAPTIVE_NP - --- Mutex status --- These are hardcoded all over the code; there are no enums/macros for them. -PTHREAD_MUTEX_DESTROYED -1 -PTHREAD_MUTEX_UNLOCKED 0 -PTHREAD_MUTEX_LOCKED_NO_WAITERS 1 - --- For robust mutexes -PTHREAD_MUTEX_INCONSISTENT -PTHREAD_MUTEX_NOTRECOVERABLE -FUTEX_OWNER_DIED - --- For robust and PI mutexes -FUTEX_WAITERS -FUTEX_TID_MASK - --- Mutex attributes -PTHREAD_MUTEX_ROBUST_NORMAL_NP -PTHREAD_MUTEX_PRIO_INHERIT_NP -PTHREAD_MUTEX_PRIO_PROTECT_NP -PTHREAD_MUTEX_PSHARED_BIT -PTHREAD_MUTEX_PRIO_CEILING_SHIFT -PTHREAD_MUTEX_PRIO_CEILING_MASK - --- Mutex attribute flags -PTHREAD_MUTEXATTR_PROTOCOL_SHIFT -PTHREAD_MUTEXATTR_PROTOCOL_MASK -PTHREAD_MUTEXATTR_PRIO_CEILING_MASK -PTHREAD_MUTEXATTR_FLAG_ROBUST -PTHREAD_MUTEXATTR_FLAG_PSHARED -PTHREAD_MUTEXATTR_FLAG_BITS -PTHREAD_MUTEX_NO_ELISION_NP - --- Priority protocols -PTHREAD_PRIO_NONE -PTHREAD_PRIO_INHERIT -PTHREAD_PRIO_PROTECT - --- Condition variable --- FIXME Why do macros prefixed with __ cannot be used directly? -PTHREAD_COND_SHARED_MASK __PTHREAD_COND_SHARED_MASK -PTHREAD_COND_CLOCK_MONOTONIC_MASK __PTHREAD_COND_CLOCK_MONOTONIC_MASK -COND_CLOCK_BITS --- These values are hardcoded: -PTHREAD_COND_WREFS_SHIFT 3 - --- Rwlock attributes -PTHREAD_RWLOCK_PREFER_READER_NP -PTHREAD_RWLOCK_PREFER_WRITER_NP -PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP - --- Rwlock -PTHREAD_RWLOCK_WRPHASE -PTHREAD_RWLOCK_WRLOCKED -PTHREAD_RWLOCK_READER_SHIFT - --- 'Shared' attribute values -PTHREAD_PROCESS_PRIVATE -PTHREAD_PROCESS_SHARED diff --git a/nptl/old_pthread_atfork.c b/nptl/old_pthread_atfork.c deleted file mode 100644 index 23c8056eff..0000000000 --- a/nptl/old_pthread_atfork.c +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <shlib-compat.h> - -#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_3) -# define __pthread_atfork __dyn_pthread_atfork -# include "pthread_atfork.c" -# undef __pthread_atfork -compat_symbol (libpthread, __dyn_pthread_atfork, pthread_atfork, GLIBC_2_0); -#endif diff --git a/nptl/old_pthread_cond_broadcast.c b/nptl/old_pthread_cond_broadcast.c deleted file mode 100644 index 751ecfcd06..0000000000 --- a/nptl/old_pthread_cond_broadcast.c +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdlib.h> -#include "pthreadP.h" -#include <atomic.h> -#include <shlib-compat.h> - - -#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_3_2) -int -__pthread_cond_broadcast_2_0 (pthread_cond_2_0_t *cond) -{ - if (cond->cond == NULL) - { - pthread_cond_t *newcond; - -#if LLL_LOCK_INITIALIZER == 0 - newcond = (pthread_cond_t *) calloc (sizeof (pthread_cond_t), 1); - if (newcond == NULL) - return ENOMEM; -#else - newcond = (pthread_cond_t *) malloc (sizeof (pthread_cond_t)); - if (newcond == NULL) - return ENOMEM; - - /* Initialize the condvar. */ - (void) pthread_cond_init (newcond, NULL); -#endif - - if (atomic_compare_and_exchange_bool_acq (&cond->cond, newcond, NULL)) - /* Somebody else just initialized the condvar. */ - free (newcond); - } - - return __pthread_cond_broadcast (cond->cond); -} -compat_symbol (libpthread, __pthread_cond_broadcast_2_0, - pthread_cond_broadcast, GLIBC_2_0); -#endif diff --git a/nptl/old_pthread_cond_destroy.c b/nptl/old_pthread_cond_destroy.c deleted file mode 100644 index d955c488c5..0000000000 --- a/nptl/old_pthread_cond_destroy.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdlib.h> -#include "pthreadP.h" -#include <shlib-compat.h> - - -#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_3_2) -int -__pthread_cond_destroy_2_0 (pthread_cond_2_0_t *cond) -{ - /* Free the memory which was eventually allocated. */ - free (cond->cond); - - return 0; -} -compat_symbol (libpthread, __pthread_cond_destroy_2_0, pthread_cond_destroy, - GLIBC_2_0); -#endif diff --git a/nptl/old_pthread_cond_init.c b/nptl/old_pthread_cond_init.c deleted file mode 100644 index fe7f5c640b..0000000000 --- a/nptl/old_pthread_cond_init.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include "pthreadP.h" -#include <shlib-compat.h> - - -#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_3_2) -int -__pthread_cond_init_2_0 (pthread_cond_2_0_t *cond, - const pthread_condattr_t *cond_attr) -{ - struct pthread_condattr *icond_attr = (struct pthread_condattr *) cond_attr; - - /* The type of the first argument is actually that of the old, too - small pthread_cond_t. We use only the first word of it, as a - pointer. */ - cond->cond = NULL; - - /* We can't support PSHARED condvars in the old pthread_cond_* - functions and neither clocks other than CLOCK_REALTIME. */ - if (icond_attr != NULL && icond_attr->value) - return EINVAL; - - return 0; -} -compat_symbol (libpthread, __pthread_cond_init_2_0, pthread_cond_init, - GLIBC_2_0); -#endif diff --git a/nptl/old_pthread_cond_signal.c b/nptl/old_pthread_cond_signal.c deleted file mode 100644 index ae49f7ebe2..0000000000 --- a/nptl/old_pthread_cond_signal.c +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdlib.h> -#include "pthreadP.h" -#include <atomic.h> -#include <shlib-compat.h> - - -#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_3_2) -int -__pthread_cond_signal_2_0 (pthread_cond_2_0_t *cond) -{ - if (cond->cond == NULL) - { - pthread_cond_t *newcond; - -#if LLL_LOCK_INITIALIZER == 0 - newcond = (pthread_cond_t *) calloc (sizeof (pthread_cond_t), 1); - if (newcond == NULL) - return ENOMEM; -#else - newcond = (pthread_cond_t *) malloc (sizeof (pthread_cond_t)); - if (newcond == NULL) - return ENOMEM; - - /* Initialize the condvar. */ - (void) pthread_cond_init (newcond, NULL); -#endif - - if (atomic_compare_and_exchange_bool_acq (&cond->cond, newcond, NULL)) - /* Somebody else just initialized the condvar. */ - free (newcond); - } - - return __pthread_cond_signal (cond->cond); -} -compat_symbol (libpthread, __pthread_cond_signal_2_0, pthread_cond_signal, - GLIBC_2_0); -#endif diff --git a/nptl/old_pthread_cond_timedwait.c b/nptl/old_pthread_cond_timedwait.c deleted file mode 100644 index 43e8c8d4fe..0000000000 --- a/nptl/old_pthread_cond_timedwait.c +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdlib.h> -#include "pthreadP.h" -#include <atomic.h> -#include <shlib-compat.h> - - -#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_3_2) -int -__pthread_cond_timedwait_2_0 (pthread_cond_2_0_t *cond, pthread_mutex_t *mutex, - const struct timespec *abstime) -{ - if (cond->cond == NULL) - { - pthread_cond_t *newcond; - -#if LLL_LOCK_INITIALIZER == 0 - newcond = (pthread_cond_t *) calloc (sizeof (pthread_cond_t), 1); - if (newcond == NULL) - return ENOMEM; -#else - newcond = (pthread_cond_t *) malloc (sizeof (pthread_cond_t)); - if (newcond == NULL) - return ENOMEM; - - /* Initialize the condvar. */ - (void) pthread_cond_init (newcond, NULL); -#endif - - if (atomic_compare_and_exchange_bool_acq (&cond->cond, newcond, NULL)) - /* Somebody else just initialized the condvar. */ - free (newcond); - } - - return __pthread_cond_timedwait (cond->cond, mutex, abstime); -} -compat_symbol (libpthread, __pthread_cond_timedwait_2_0, - pthread_cond_timedwait, GLIBC_2_0); -#endif diff --git a/nptl/old_pthread_cond_wait.c b/nptl/old_pthread_cond_wait.c deleted file mode 100644 index 2e7d10e0c8..0000000000 --- a/nptl/old_pthread_cond_wait.c +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdlib.h> -#include "pthreadP.h" -#include <atomic.h> -#include <shlib-compat.h> - - -#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_3_2) -int -__pthread_cond_wait_2_0 (pthread_cond_2_0_t *cond, pthread_mutex_t *mutex) -{ - if (cond->cond == NULL) - { - pthread_cond_t *newcond; - -#if LLL_LOCK_INITIALIZER == 0 - newcond = (pthread_cond_t *) calloc (sizeof (pthread_cond_t), 1); - if (newcond == NULL) - return ENOMEM; -#else - newcond = (pthread_cond_t *) malloc (sizeof (pthread_cond_t)); - if (newcond == NULL) - return ENOMEM; - - /* Initialize the condvar. */ - (void) pthread_cond_init (newcond, NULL); -#endif - - if (atomic_compare_and_exchange_bool_acq (&cond->cond, newcond, NULL)) - /* Somebody else just initialized the condvar. */ - free (newcond); - } - - return __pthread_cond_wait (cond->cond, mutex); -} -compat_symbol (libpthread, __pthread_cond_wait_2_0, pthread_cond_wait, - GLIBC_2_0); -#endif diff --git a/nptl/perf.c b/nptl/perf.c deleted file mode 100644 index 79c6a527d9..0000000000 --- a/nptl/perf.c +++ /dev/null @@ -1,759 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define _GNU_SOURCE 1 -#include <argp.h> -#include <error.h> -#include <errno.h> -#include <fcntl.h> -#include <inttypes.h> -#include <limits.h> -#include <pthread.h> -#include <signal.h> -#include <stdbool.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <unistd.h> -#include <sys/param.h> -#include <sys/types.h> - -#ifndef MAX_THREADS -# define MAX_THREADS 100000 -#endif -#ifndef DEFAULT_THREADS -# define DEFAULT_THREADS 50 -#endif - - -#define OPT_TO_THREAD 300 -#define OPT_TO_PROCESS 301 -#define OPT_SYNC_SIGNAL 302 -#define OPT_SYNC_JOIN 303 -#define OPT_TOPLEVEL 304 - - -static const struct argp_option options[] = - { - { NULL, 0, NULL, 0, "\ -This is a test for threads so we allow ther user to selection the number of \ -threads which are used at any one time. Independently the total number of \ -rounds can be selected. This is the total number of threads which will have \ -run when the process terminates:" }, - { "threads", 't', "NUMBER", 0, "Number of threads used at once" }, - { "starts", 's', "NUMBER", 0, "Total number of working threads" }, - { "toplevel", OPT_TOPLEVEL, "NUMBER", 0, - "Number of toplevel threads which start the other threads; this \ -implies --sync-join" }, - - { NULL, 0, NULL, 0, "\ -Each thread can do one of two things: sleep or do work. The latter is 100% \ -CPU bound. The work load is the probability a thread does work. All values \ -from zero to 100 (inclusive) are valid. How often each thread repeats this \ -can be determined by the number of rounds. The work cost determines how long \ -each work session (not sleeping) takes. If it is zero a thread would \ -effectively nothing. By setting the number of rounds to zero the thread \ -does no work at all and pure thread creation times can be measured." }, - { "workload", 'w', "PERCENT", 0, "Percentage of time spent working" }, - { "workcost", 'c', "NUMBER", 0, - "Factor in the cost of each round of working" }, - { "rounds", 'r', "NUMBER", 0, "Number of rounds each thread runs" }, - - { NULL, 0, NULL, 0, "\ -There are a number of different methods how thread creation can be \ -synchronized. Synchronization is necessary since the number of concurrently \ -running threads is limited." }, - { "sync-signal", OPT_SYNC_SIGNAL, NULL, 0, - "Synchronize using a signal (default)" }, - { "sync-join", OPT_SYNC_JOIN, NULL, 0, "Synchronize using pthread_join" }, - - { NULL, 0, NULL, 0, "\ -One parameter for each threads execution is the size of the stack. If this \ -parameter is not used the system's default stack size is used. If many \ -threads are used the stack size should be chosen quite small." }, - { "stacksize", 'S', "BYTES", 0, "Size of threads stack" }, - { "guardsize", 'g', "BYTES", 0, - "Size of stack guard area; must fit into the stack" }, - - { NULL, 0, NULL, 0, "Signal options:" }, - { "to-thread", OPT_TO_THREAD, NULL, 0, "Send signal to main thread" }, - { "to-process", OPT_TO_PROCESS, NULL, 0, - "Send signal to process (default)" }, - - { NULL, 0, NULL, 0, "Administrative options:" }, - { "progress", 'p', NULL, 0, "Show signs of progress" }, - { "timing", 'T', NULL, 0, - "Measure time from startup to the last thread finishing" }, - { NULL, 0, NULL, 0, NULL } - }; - -/* Prototype for option handler. */ -static error_t parse_opt (int key, char *arg, struct argp_state *state); - -/* Data structure to communicate with argp functions. */ -static struct argp argp = -{ - options, parse_opt -}; - - -static unsigned long int threads = DEFAULT_THREADS; -static unsigned long int workload = 75; -static unsigned long int workcost = 20; -static unsigned long int rounds = 10; -static long int starts = 5000; -static unsigned long int stacksize; -static long int guardsize = -1; -static bool progress; -static bool timing; -static bool to_thread; -static unsigned long int toplevel = 1; - - -static long int running; -static pthread_mutex_t running_mutex = PTHREAD_MUTEX_INITIALIZER; - -static pid_t pid; -static pthread_t tmain; - -static clockid_t cl; -static struct timespec start_time; - - -static pthread_mutex_t sum_mutex = PTHREAD_MUTEX_INITIALIZER; -unsigned int sum; - -static enum - { - sync_signal, - sync_join - } -sync_method; - - -/* We use 64bit values for the times. */ -typedef unsigned long long int hp_timing_t; - - -/* Attributes for all created threads. */ -static pthread_attr_t attr; - - -static void * -work (void *arg) -{ - unsigned long int i; - unsigned int state = (unsigned long int) arg; - - for (i = 0; i < rounds; ++i) - { - /* Determine what to do. */ - unsigned int rnum; - - /* Uniform distribution. */ - do - rnum = rand_r (&state); - while (rnum >= UINT_MAX - (UINT_MAX % 100)); - - rnum %= 100; - - if (rnum < workload) - { - int j; - int a[4] = { i, rnum, i + rnum, rnum - i }; - - if (progress) - write (STDERR_FILENO, "c", 1); - - for (j = 0; j < workcost; ++j) - { - a[0] += a[3] >> 12; - a[1] += a[2] >> 20; - a[2] += a[1] ^ 0x3423423; - a[3] += a[0] - a[1]; - } - - pthread_mutex_lock (&sum_mutex); - sum += a[0] + a[1] + a[2] + a[3]; - pthread_mutex_unlock (&sum_mutex); - } - else - { - /* Just sleep. */ - struct timespec tv; - - tv.tv_sec = 0; - tv.tv_nsec = 10000000; - - if (progress) - write (STDERR_FILENO, "w", 1); - - nanosleep (&tv, NULL); - } - } - - return NULL; -} - - -static void * -thread_function (void *arg) -{ - work (arg); - - pthread_mutex_lock (&running_mutex); - if (--running <= 0 && starts <= 0) - { - /* We are done. */ - if (progress) - write (STDERR_FILENO, "\n", 1); - - if (timing) - { - struct timespec end_time; - - if (clock_gettime (cl, &end_time) == 0) - { - end_time.tv_sec -= start_time.tv_sec; - end_time.tv_nsec -= start_time.tv_nsec; - if (end_time.tv_nsec < 0) - { - end_time.tv_nsec += 1000000000; - --end_time.tv_sec; - } - - printf ("\nRuntime: %lu.%09lu seconds\n", - (unsigned long int) end_time.tv_sec, - (unsigned long int) end_time.tv_nsec); - } - } - - printf ("Result: %08x\n", sum); - - exit (0); - } - pthread_mutex_unlock (&running_mutex); - - if (sync_method == sync_signal) - { - if (to_thread) - /* This code sends a signal to the main thread. */ - pthread_kill (tmain, SIGUSR1); - else - /* Use this code to test sending a signal to the process. */ - kill (pid, SIGUSR1); - } - - if (progress) - write (STDERR_FILENO, "f", 1); - - return NULL; -} - - -struct start_info -{ - unsigned int starts; - unsigned int threads; -}; - - -static void * -start_threads (void *arg) -{ - struct start_info *si = arg; - unsigned int starts = si->starts; - pthread_t ths[si->threads]; - unsigned int state = starts; - unsigned int n; - unsigned int i = 0; - int err; - - if (progress) - write (STDERR_FILENO, "T", 1); - - memset (ths, '\0', sizeof (pthread_t) * si->threads); - - while (starts-- > 0) - { - if (ths[i] != 0) - { - /* Wait for the threads in the order they were created. */ - err = pthread_join (ths[i], NULL); - if (err != 0) - error (EXIT_FAILURE, err, "cannot join thread"); - - if (progress) - write (STDERR_FILENO, "f", 1); - } - - err = pthread_create (&ths[i], &attr, work, - (void *) (long) (rand_r (&state) + starts + i)); - - if (err != 0) - error (EXIT_FAILURE, err, "cannot start thread"); - - if (progress) - write (STDERR_FILENO, "t", 1); - - if (++i == si->threads) - i = 0; - } - - n = i; - do - { - if (ths[i] != 0) - { - err = pthread_join (ths[i], NULL); - if (err != 0) - error (EXIT_FAILURE, err, "cannot join thread"); - - if (progress) - write (STDERR_FILENO, "f", 1); - } - - if (++i == si->threads) - i = 0; - } - while (i != n); - - if (progress) - write (STDERR_FILENO, "F", 1); - - return NULL; -} - - -int -main (int argc, char *argv[]) -{ - int remaining; - sigset_t ss; - pthread_t th; - pthread_t *ths = NULL; - int empty = 0; - int last; - bool cont = true; - - /* Parse and process arguments. */ - argp_parse (&argp, argc, argv, 0, &remaining, NULL); - - if (sync_method == sync_join) - { - ths = (pthread_t *) calloc (threads, sizeof (pthread_t)); - if (ths == NULL) - error (EXIT_FAILURE, errno, - "cannot allocate memory for thread descriptor array"); - - last = threads; - } - else - { - ths = &th; - last = 1; - } - - if (toplevel > threads) - { - printf ("resetting number of toplevel threads to %lu to not surpass number to concurrent threads\n", - threads); - toplevel = threads; - } - - if (timing) - { - if (clock_getcpuclockid (0, &cl) != 0 - || clock_gettime (cl, &start_time) != 0) - timing = false; - } - - /* We need this later. */ - pid = getpid (); - tmain = pthread_self (); - - /* We use signal SIGUSR1 for communication between the threads and - the main thread. We only want sychronous notification. */ - if (sync_method == sync_signal) - { - sigemptyset (&ss); - sigaddset (&ss, SIGUSR1); - if (sigprocmask (SIG_BLOCK, &ss, NULL) != 0) - error (EXIT_FAILURE, errno, "cannot set signal mask"); - } - - /* Create the thread attributes. */ - pthread_attr_init (&attr); - - /* If the user provided a stack size use it. */ - if (stacksize != 0 - && pthread_attr_setstacksize (&attr, stacksize) != 0) - puts ("could not set stack size; will use default"); - /* And stack guard size. */ - if (guardsize != -1 - && pthread_attr_setguardsize (&attr, guardsize) != 0) - puts ("invalid stack guard size; will use default"); - - /* All threads are created detached if we are not using pthread_join - to synchronize. */ - if (sync_method != sync_join) - pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); - - if (sync_method == sync_signal) - { - while (1) - { - int err; - bool do_wait = false; - - pthread_mutex_lock (&running_mutex); - if (starts-- < 0) - cont = false; - else - do_wait = ++running >= threads && starts > 0; - - pthread_mutex_unlock (&running_mutex); - - if (! cont) - break; - - if (progress) - write (STDERR_FILENO, "t", 1); - - err = pthread_create (&ths[empty], &attr, thread_function, - (void *) starts); - if (err != 0) - error (EXIT_FAILURE, err, "cannot start thread %lu", starts); - - if (++empty == last) - empty = 0; - - if (do_wait) - sigwaitinfo (&ss, NULL); - } - - /* Do nothing anymore. On of the threads will terminate the program. */ - sigfillset (&ss); - sigdelset (&ss, SIGINT); - while (1) - sigsuspend (&ss); - } - else - { - pthread_t ths[toplevel]; - struct start_info si[toplevel]; - unsigned int i; - - for (i = 0; i < toplevel; ++i) - { - unsigned int child_starts = starts / (toplevel - i); - unsigned int child_threads = threads / (toplevel - i); - int err; - - si[i].starts = child_starts; - si[i].threads = child_threads; - - err = pthread_create (&ths[i], &attr, start_threads, &si[i]); - if (err != 0) - error (EXIT_FAILURE, err, "cannot start thread"); - - starts -= child_starts; - threads -= child_threads; - } - - for (i = 0; i < toplevel; ++i) - { - int err = pthread_join (ths[i], NULL); - - if (err != 0) - error (EXIT_FAILURE, err, "cannot join thread"); - } - - /* We are done. */ - if (progress) - write (STDERR_FILENO, "\n", 1); - - if (timing) - { - struct timespec end_time; - - if (clock_gettime (cl, &end_time) == 0) - { - end_time.tv_sec -= start_time.tv_sec; - end_time.tv_nsec -= start_time.tv_nsec; - if (end_time.tv_nsec < 0) - { - end_time.tv_nsec += 1000000000; - --end_time.tv_sec; - } - - printf ("\nRuntime: %lu.%09lu seconds\n", - (unsigned long int) end_time.tv_sec, - (unsigned long int) end_time.tv_nsec); - } - } - - printf ("Result: %08x\n", sum); - - exit (0); - } - - /* NOTREACHED */ - return 0; -} - - -/* Handle program arguments. */ -static error_t -parse_opt (int key, char *arg, struct argp_state *state) -{ - unsigned long int num; - long int snum; - - switch (key) - { - case 't': - num = strtoul (arg, NULL, 0); - if (num <= MAX_THREADS) - threads = num; - else - printf ("\ -number of threads limited to %u; recompile with a higher limit if necessary", - MAX_THREADS); - break; - - case 'w': - num = strtoul (arg, NULL, 0); - if (num <= 100) - workload = num; - else - puts ("workload must be between 0 and 100 percent"); - break; - - case 'c': - workcost = strtoul (arg, NULL, 0); - break; - - case 'r': - rounds = strtoul (arg, NULL, 0); - break; - - case 's': - starts = strtoul (arg, NULL, 0); - break; - - case 'S': - num = strtoul (arg, NULL, 0); - if (num >= PTHREAD_STACK_MIN) - stacksize = num; - else - printf ("minimum stack size is %d\n", PTHREAD_STACK_MIN); - break; - - case 'g': - snum = strtol (arg, NULL, 0); - if (snum < 0) - printf ("invalid guard size %s\n", arg); - else - guardsize = snum; - break; - - case 'p': - progress = true; - break; - - case 'T': - timing = true; - break; - - case OPT_TO_THREAD: - to_thread = true; - break; - - case OPT_TO_PROCESS: - to_thread = false; - break; - - case OPT_SYNC_SIGNAL: - sync_method = sync_signal; - break; - - case OPT_SYNC_JOIN: - sync_method = sync_join; - break; - - case OPT_TOPLEVEL: - num = strtoul (arg, NULL, 0); - if (num < MAX_THREADS) - toplevel = num; - else - printf ("\ -number of threads limited to %u; recompile with a higher limit if necessary", - MAX_THREADS); - sync_method = sync_join; - break; - - default: - return ARGP_ERR_UNKNOWN; - } - - return 0; -} - - -static hp_timing_t -get_clockfreq (void) -{ - /* We read the information from the /proc filesystem. It contains at - least one line like - cpu MHz : 497.840237 - or also - cpu MHz : 497.841 - We search for this line and convert the number in an integer. */ - static hp_timing_t result; - int fd; - - /* If this function was called before, we know the result. */ - if (result != 0) - return result; - - fd = open ("/proc/cpuinfo", O_RDONLY); - if (__glibc_likely (fd != -1)) - { - /* XXX AFAIK the /proc filesystem can generate "files" only up - to a size of 4096 bytes. */ - char buf[4096]; - ssize_t n; - - n = read (fd, buf, sizeof buf); - if (__builtin_expect (n, 1) > 0) - { - char *mhz = memmem (buf, n, "cpu MHz", 7); - - if (__glibc_likely (mhz != NULL)) - { - char *endp = buf + n; - int seen_decpoint = 0; - int ndigits = 0; - - /* Search for the beginning of the string. */ - while (mhz < endp && (*mhz < '0' || *mhz > '9') && *mhz != '\n') - ++mhz; - - while (mhz < endp && *mhz != '\n') - { - if (*mhz >= '0' && *mhz <= '9') - { - result *= 10; - result += *mhz - '0'; - if (seen_decpoint) - ++ndigits; - } - else if (*mhz == '.') - seen_decpoint = 1; - - ++mhz; - } - - /* Compensate for missing digits at the end. */ - while (ndigits++ < 6) - result *= 10; - } - } - - close (fd); - } - - return result; -} - - -int -clock_getcpuclockid (pid_t pid, clockid_t *clock_id) -{ - /* We don't allow any process ID but our own. */ - if (pid != 0 && pid != getpid ()) - return EPERM; - -#ifdef CLOCK_PROCESS_CPUTIME_ID - /* Store the number. */ - *clock_id = CLOCK_PROCESS_CPUTIME_ID; - - return 0; -#else - /* We don't have a timer for that. */ - return ENOENT; -#endif -} - - -#ifdef i386 -#define HP_TIMING_NOW(Var) __asm__ __volatile__ ("rdtsc" : "=A" (Var)) -#elif defined __x86_64__ -# define HP_TIMING_NOW(Var) \ - ({ unsigned int _hi, _lo; \ - asm volatile ("rdtsc" : "=a" (_lo), "=d" (_hi)); \ - (Var) = ((unsigned long long int) _hi << 32) | _lo; }) -#elif defined __ia64__ -#define HP_TIMING_NOW(Var) __asm__ __volatile__ ("mov %0=ar.itc" : "=r" (Var) : : "memory") -#else -#error "HP_TIMING_NOW missing" -#endif - -/* Get current value of CLOCK and store it in TP. */ -int -clock_gettime (clockid_t clock_id, struct timespec *tp) -{ - int retval = -1; - - switch (clock_id) - { - case CLOCK_PROCESS_CPUTIME_ID: - { - - static hp_timing_t freq; - hp_timing_t tsc; - - /* Get the current counter. */ - HP_TIMING_NOW (tsc); - - if (freq == 0) - { - freq = get_clockfreq (); - if (freq == 0) - return EINVAL; - } - - /* Compute the seconds. */ - tp->tv_sec = tsc / freq; - - /* And the nanoseconds. This computation should be stable until - we get machines with about 16GHz frequency. */ - tp->tv_nsec = ((tsc % freq) * UINT64_C (1000000000)) / freq; - - retval = 0; - } - break; - - default: - errno = EINVAL; - break; - } - - return retval; -} diff --git a/nptl/pt-allocrtsig.c b/nptl/pt-allocrtsig.c deleted file mode 100644 index e8861a8610..0000000000 --- a/nptl/pt-allocrtsig.c +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <signal.h> - - -/* These are defined in libc. We want to have only one definition - so we "forward" the calls. */ -extern int __libc_current_sigrtmin_private (void); -extern int __libc_current_sigrtmax_private (void); -extern int __libc_allocate_rtsig_private (int high); - - -/* We reserve __SIGRTMIN for use as the cancellation signal and - __SIGRTMIN+1 to handle setuid et.al. These signals are used - internally. */ -int -__libc_current_sigrtmin (void) -{ - return __libc_current_sigrtmin_private (); -} - - -int -__libc_current_sigrtmax (void) -{ - return __libc_current_sigrtmax_private (); -} - - -int -__libc_allocate_rtsig (int high) -{ - return __libc_allocate_rtsig_private (high); -} diff --git a/nptl/pt-cleanup.c b/nptl/pt-cleanup.c deleted file mode 100644 index ce2889df0a..0000000000 --- a/nptl/pt-cleanup.c +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <setjmp.h> -#include <stdlib.h> -#include "pthreadP.h" -#include <jmpbuf-unwind.h> - -void -__pthread_cleanup_upto (__jmp_buf target, char *targetframe) -{ - struct pthread *self = THREAD_SELF; - struct _pthread_cleanup_buffer *cbuf; - - /* Adjust all pointers used in comparisons, so that top of thread's - stack is at the top of address space. Without that, things break - if stack is allocated above the main stack. */ - uintptr_t adj = (uintptr_t) self->stackblock + self->stackblock_size; - uintptr_t targetframe_adj = (uintptr_t) targetframe - adj; - - for (cbuf = THREAD_GETMEM (self, cleanup); - cbuf != NULL && _JMPBUF_UNWINDS_ADJ (target, cbuf, adj); - cbuf = cbuf->__prev) - { -#if _STACK_GROWS_DOWN - if ((uintptr_t) cbuf - adj <= targetframe_adj) - { - cbuf = NULL; - break; - } -#elif _STACK_GROWS_UP - if ((uintptr_t) cbuf - adj >= targetframe_adj) - { - cbuf = NULL; - break; - } -#else -# error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP" -#endif - - /* Call the cleanup code. */ - cbuf->__routine (cbuf->__arg); - } - - THREAD_SETMEM (self, cleanup, cbuf); -} -hidden_def (__pthread_cleanup_upto) diff --git a/nptl/pt-crti.S b/nptl/pt-crti.S deleted file mode 100644 index d2371bc6ff..0000000000 --- a/nptl/pt-crti.S +++ /dev/null @@ -1,43 +0,0 @@ -/* Special .init and .fini section support for libpthread. - Copyright (C) 2012-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - In addition to the permissions in the GNU Lesser General Public - License, the Free Software Foundation gives you unlimited - permission to link the compiled version of this file with other - programs, and to distribute those programs without any restriction - coming from the use of this file. (The GNU Lesser General Public - License restrictions do apply in other respects; for example, they - cover modification of the file, and distribution when not linked - into another program.) - - Note that people who make modified versions of this file are not - obligated to grant this special exception for their modified - versions; it is their choice whether to do so. The GNU Lesser - General Public License gives permission to release a modified - version without this exception; this exception also makes it - possible to release a modified version which carries forward this - exception. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* Arrange for __pthread_initialize_minimal_internal to be called at - libpthread startup, instead of conditionally calling - __gmon_start__. */ - -#define PREINIT_FUNCTION __pthread_initialize_minimal_internal -#define PREINIT_FUNCTION_WEAK 0 - -#include <crti.S> diff --git a/nptl/pt-fork.c b/nptl/pt-fork.c deleted file mode 100644 index a1493a0159..0000000000 --- a/nptl/pt-fork.c +++ /dev/null @@ -1,49 +0,0 @@ -/* ABI compatibility for 'fork' symbol in libpthread ABI. - Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <unistd.h> -#include <shlib-compat.h> - -/* libpthread once had its own fork, though there was no apparent reason - for it. There is no use in having a separate symbol in libpthread, but - the historical ABI requires it. For static linking, there is no need to - provide anything here--the libc version will be linked in. For shared - library ABI compatibility, there must be __fork and fork symbols in - libpthread.so. - - With an IFUNC resolver, it would be possible to avoid the - indirection, but the IFUNC resolver might run before the - __libc_fork symbol has been relocated, in which case the IFUNC - resolver would not be able to provide the correct address. */ - -#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_22) - -static pid_t __attribute__ ((used)) -fork_compat (void) -{ - return __libc_fork (); -} - -strong_alias (fork_compat, fork_alias) -compat_symbol (libpthread, fork_alias, fork, GLIBC_2_0); - -strong_alias (fork_compat, __fork_alias) -compat_symbol (libpthread, __fork_alias, __fork, GLIBC_2_0); - -#endif diff --git a/nptl/pt-interp.c b/nptl/pt-interp.c deleted file mode 100644 index ecf1fe70df..0000000000 --- a/nptl/pt-interp.c +++ /dev/null @@ -1 +0,0 @@ -#include <elf/interp.c> diff --git a/nptl/pt-longjmp.c b/nptl/pt-longjmp.c deleted file mode 100644 index 2ef757e687..0000000000 --- a/nptl/pt-longjmp.c +++ /dev/null @@ -1,60 +0,0 @@ -/* ABI compatibility for 'longjmp' and 'siglongjmp' symbols in libpthread ABI. - Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <setjmp.h> -#include <shlib-compat.h> - -/* libpthread once had its own longjmp (and siglongjmp alias), though there - was no apparent reason for it. There is no use in having a separate - symbol in libpthread, but the historical ABI requires it. For static - linking, there is no need to provide anything here--the libc version - will be linked in. For shared library ABI compatibility, there must be - longjmp and siglongjmp symbols in libpthread.so; so we define them using - IFUNC to redirect to the libc function. */ - -#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_22) - -# if HAVE_IFUNC - -# undef INIT_ARCH -# define INIT_ARCH() -# define DEFINE_LONGJMP(name) libc_ifunc (name, &__libc_longjmp) - -extern __typeof(longjmp) longjmp_ifunc; -extern __typeof(siglongjmp) siglongjmp_ifunc; - -# else /* !HAVE_IFUNC */ - -static void __attribute__ ((noreturn, used)) -longjmp_compat (jmp_buf env, int val) -{ - __libc_longjmp (env, val); -} - -# define DEFINE_LONGJMP(name) strong_alias (longjmp_compat, name) - -# endif /* HAVE_IFUNC */ - -DEFINE_LONGJMP (longjmp_ifunc) -compat_symbol (libpthread, longjmp_ifunc, longjmp, GLIBC_2_0); - -strong_alias (longjmp_ifunc, siglongjmp_ifunc) -compat_symbol (libpthread, siglongjmp_ifunc, siglongjmp, GLIBC_2_0); - -#endif diff --git a/nptl/pt-raise.c b/nptl/pt-raise.c deleted file mode 100644 index 3a197051fe..0000000000 --- a/nptl/pt-raise.c +++ /dev/null @@ -1,29 +0,0 @@ -/* ISO C raise function for libpthread. - Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> - - -int -raise (int sig) -{ - /* This is what POSIX says must happen. */ - return pthread_kill (pthread_self (), sig); -} diff --git a/nptl/pt-system.c b/nptl/pt-system.c deleted file mode 100644 index f8ca6ba0d9..0000000000 --- a/nptl/pt-system.c +++ /dev/null @@ -1,53 +0,0 @@ -/* ABI compatibility for 'system' symbol in libpthread ABI. - Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdlib.h> -#include <shlib-compat.h> - -/* libpthread once had its own 'system', though there was no apparent - reason for it. There is no use in having a separate symbol in - libpthread, but the historical ABI requires it. For static linking, - there is no need to provide anything here--the libc version will be - linked in. For shared library ABI compatibility, there must be a - 'system' symbol in libpthread.so; so we define it using IFUNC to - redirect to the libc function. */ - -#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_22) - -# if HAVE_IFUNC - -extern __typeof(system) system_ifunc; -# undef INIT_ARCH -# define INIT_ARCH() -libc_ifunc (system_ifunc, &__libc_system) - -# else /* !HAVE_IFUNC */ - -static int __attribute__ ((used)) -system_compat (const char *line) -{ - return __libc_system (line); -} -strong_alias (system_compat, system_ifunc) - -# endif /* HAVE_IFUNC */ - -compat_symbol (libpthread, system_ifunc, system, GLIBC_2_0); - -#endif diff --git a/nptl/pt-vfork.c b/nptl/pt-vfork.c deleted file mode 100644 index 0e82330858..0000000000 --- a/nptl/pt-vfork.c +++ /dev/null @@ -1,65 +0,0 @@ -/* vfork ABI-compatibility entry points for libpthread. - Copyright (C) 2014-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <unistd.h> -#include <shlib-compat.h> - -/* libpthread used to have its own vfork implementation that differed - from libc's only in having a pointless micro-optimization. There - is no longer any use to having a separate copy in libpthread, but - the historical ABI requires it. For static linking, there is no - need to provide anything here--the libc version will be linked in. - For shared library ABI compatibility, there must be __vfork and - vfork symbols in libpthread.so; so we define them using IFUNC to - redirect to the libc function. */ - -/* Note! If the architecture doesn't support IFUNC, then we need an - alternate target-specific mechanism to implement this. So we just - assume IFUNC here and require that the target override this file - if necessary. - - If the architecture can assume all supported versions of gcc will - produce a tail-call to __libc_vfork, consider including the version - in sysdeps/unix/sysv/linux/aarch64/pt-vfork.c. */ - -#if !HAVE_IFUNC -# error "must write pt-vfork for this machine or get IFUNC support" -#endif - -#if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \ - || SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)) - -extern __typeof (vfork) __libc_vfork; /* Defined in libc. */ - -# undef INIT_ARCH -# define INIT_ARCH() -# define DEFINE_VFORK(name) libc_ifunc (name, &__libc_vfork) - -#endif - -#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) -extern __typeof(vfork) vfork_ifunc; -DEFINE_VFORK (vfork_ifunc) -compat_symbol (libpthread, vfork_ifunc, vfork, GLIBC_2_0); -#endif - -#if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20) -extern __typeof(vfork) __vfork_ifunc; -DEFINE_VFORK (__vfork_ifunc) -compat_symbol (libpthread, __vfork_ifunc, __vfork, GLIBC_2_1_2); -#endif diff --git a/nptl/pthread-errnos.sym b/nptl/pthread-errnos.sym deleted file mode 100644 index 0975b7a373..0000000000 --- a/nptl/pthread-errnos.sym +++ /dev/null @@ -1,13 +0,0 @@ -#include <errno.h> - --- These errno codes are used by some assembly code. - -EAGAIN EAGAIN -EBUSY EBUSY -EDEADLK EDEADLK -EINTR EINTR -EINVAL EINVAL -ENOSYS ENOSYS -EOVERFLOW EOVERFLOW -ETIMEDOUT ETIMEDOUT -EWOULDBLOCK EWOULDBLOCK diff --git a/nptl/pthread-pi-defines.sym b/nptl/pthread-pi-defines.sym deleted file mode 100644 index 0ac51dba98..0000000000 --- a/nptl/pthread-pi-defines.sym +++ /dev/null @@ -1,9 +0,0 @@ -#include <pthreadP.h> - --- These PI macros are used by assembly code. - -MUTEX_KIND offsetof (pthread_mutex_t, __data.__kind) -ROBUST_BIT PTHREAD_MUTEX_ROBUST_NORMAL_NP -PI_BIT PTHREAD_MUTEX_PRIO_INHERIT_NP -PS_BIT PTHREAD_MUTEX_PSHARED_BIT -TID_MASK FUTEX_TID_MASK diff --git a/nptl/pthread-pids.h b/nptl/pthread-pids.h deleted file mode 100644 index a67575b016..0000000000 --- a/nptl/pthread-pids.h +++ /dev/null @@ -1,29 +0,0 @@ -/* Initialize pid and tid fields of struct pthread. Stub version. - Copyright (C) 2015-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthreadP.h> - -/* Initialize PD->pid and PD->tid for the initial thread. If there is - setup required to arrange that __exit_thread causes PD->tid to be - cleared and futex-woken, then this function should do that as well. */ -static inline void -__pthread_initialize_pids (struct pthread *pd) -{ -#error "sysdeps pthread-pids.h file required" - pd->pid = pd->tid = -1; -} diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h deleted file mode 100644 index 7fc1e50f78..0000000000 --- a/nptl/pthreadP.h +++ /dev/null @@ -1,641 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _PTHREADP_H -#define _PTHREADP_H 1 - -#include <pthread.h> -#include <setjmp.h> -#include <stdbool.h> -#include <sys/syscall.h> -#include "descr.h" -#include <tls.h> -#include <lowlevellock.h> -#include <stackinfo.h> -#include <internaltypes.h> -#include <pthread-functions.h> -#include <atomic.h> -#include <kernel-features.h> -#include <errno.h> -#include <nptl-signals.h> - - -/* Atomic operations on TLS memory. */ -#ifndef THREAD_ATOMIC_CMPXCHG_VAL -# define THREAD_ATOMIC_CMPXCHG_VAL(descr, member, new, old) \ - atomic_compare_and_exchange_val_acq (&(descr)->member, new, old) -#endif - -#ifndef THREAD_ATOMIC_BIT_SET -# define THREAD_ATOMIC_BIT_SET(descr, member, bit) \ - atomic_bit_set (&(descr)->member, bit) -#endif - - -/* Adaptive mutex definitions. */ -#ifndef MAX_ADAPTIVE_COUNT -# define MAX_ADAPTIVE_COUNT 100 -#endif - - -/* Magic cookie representing robust mutex with dead owner. */ -#define PTHREAD_MUTEX_INCONSISTENT INT_MAX -/* Magic cookie representing not recoverable robust mutex. */ -#define PTHREAD_MUTEX_NOTRECOVERABLE (INT_MAX - 1) - - -/* Internal mutex type value. */ -enum -{ - PTHREAD_MUTEX_KIND_MASK_NP = 3, - - PTHREAD_MUTEX_ELISION_NP = 256, - PTHREAD_MUTEX_NO_ELISION_NP = 512, - - PTHREAD_MUTEX_ROBUST_NORMAL_NP = 16, - PTHREAD_MUTEX_ROBUST_RECURSIVE_NP - = PTHREAD_MUTEX_ROBUST_NORMAL_NP | PTHREAD_MUTEX_RECURSIVE_NP, - PTHREAD_MUTEX_ROBUST_ERRORCHECK_NP - = PTHREAD_MUTEX_ROBUST_NORMAL_NP | PTHREAD_MUTEX_ERRORCHECK_NP, - PTHREAD_MUTEX_ROBUST_ADAPTIVE_NP - = PTHREAD_MUTEX_ROBUST_NORMAL_NP | PTHREAD_MUTEX_ADAPTIVE_NP, - PTHREAD_MUTEX_PRIO_INHERIT_NP = 32, - PTHREAD_MUTEX_PI_NORMAL_NP - = PTHREAD_MUTEX_PRIO_INHERIT_NP | PTHREAD_MUTEX_NORMAL, - PTHREAD_MUTEX_PI_RECURSIVE_NP - = PTHREAD_MUTEX_PRIO_INHERIT_NP | PTHREAD_MUTEX_RECURSIVE_NP, - PTHREAD_MUTEX_PI_ERRORCHECK_NP - = PTHREAD_MUTEX_PRIO_INHERIT_NP | PTHREAD_MUTEX_ERRORCHECK_NP, - PTHREAD_MUTEX_PI_ADAPTIVE_NP - = PTHREAD_MUTEX_PRIO_INHERIT_NP | PTHREAD_MUTEX_ADAPTIVE_NP, - PTHREAD_MUTEX_PI_ROBUST_NORMAL_NP - = PTHREAD_MUTEX_PRIO_INHERIT_NP | PTHREAD_MUTEX_ROBUST_NORMAL_NP, - PTHREAD_MUTEX_PI_ROBUST_RECURSIVE_NP - = PTHREAD_MUTEX_PRIO_INHERIT_NP | PTHREAD_MUTEX_ROBUST_RECURSIVE_NP, - PTHREAD_MUTEX_PI_ROBUST_ERRORCHECK_NP - = PTHREAD_MUTEX_PRIO_INHERIT_NP | PTHREAD_MUTEX_ROBUST_ERRORCHECK_NP, - PTHREAD_MUTEX_PI_ROBUST_ADAPTIVE_NP - = PTHREAD_MUTEX_PRIO_INHERIT_NP | PTHREAD_MUTEX_ROBUST_ADAPTIVE_NP, - PTHREAD_MUTEX_PRIO_PROTECT_NP = 64, - PTHREAD_MUTEX_PP_NORMAL_NP - = PTHREAD_MUTEX_PRIO_PROTECT_NP | PTHREAD_MUTEX_NORMAL, - PTHREAD_MUTEX_PP_RECURSIVE_NP - = PTHREAD_MUTEX_PRIO_PROTECT_NP | PTHREAD_MUTEX_RECURSIVE_NP, - PTHREAD_MUTEX_PP_ERRORCHECK_NP - = PTHREAD_MUTEX_PRIO_PROTECT_NP | PTHREAD_MUTEX_ERRORCHECK_NP, - PTHREAD_MUTEX_PP_ADAPTIVE_NP - = PTHREAD_MUTEX_PRIO_PROTECT_NP | PTHREAD_MUTEX_ADAPTIVE_NP, - PTHREAD_MUTEX_ELISION_FLAGS_NP - = PTHREAD_MUTEX_ELISION_NP | PTHREAD_MUTEX_NO_ELISION_NP, - - PTHREAD_MUTEX_TIMED_ELISION_NP = - PTHREAD_MUTEX_TIMED_NP | PTHREAD_MUTEX_ELISION_NP, - PTHREAD_MUTEX_TIMED_NO_ELISION_NP = - PTHREAD_MUTEX_TIMED_NP | PTHREAD_MUTEX_NO_ELISION_NP, -}; -#define PTHREAD_MUTEX_PSHARED_BIT 128 - -#define PTHREAD_MUTEX_TYPE(m) \ - ((m)->__data.__kind & 127) -/* Don't include NO_ELISION, as that type is always the same - as the underlying lock type. */ -#define PTHREAD_MUTEX_TYPE_ELISION(m) \ - ((m)->__data.__kind & (127|PTHREAD_MUTEX_ELISION_NP)) - -#if LLL_PRIVATE == 0 && LLL_SHARED == 128 -# define PTHREAD_MUTEX_PSHARED(m) \ - ((m)->__data.__kind & 128) -#else -# define PTHREAD_MUTEX_PSHARED(m) \ - (((m)->__data.__kind & 128) ? LLL_SHARED : LLL_PRIVATE) -#endif - -/* The kernel when waking robust mutexes on exit never uses - FUTEX_PRIVATE_FLAG FUTEX_WAKE. */ -#define PTHREAD_ROBUST_MUTEX_PSHARED(m) LLL_SHARED - -/* Ceiling in __data.__lock. __data.__lock is signed, so don't - use the MSB bit in there, but in the mask also include that bit, - so that the compiler can optimize & PTHREAD_MUTEX_PRIO_CEILING_MASK - masking if the value is then shifted down by - PTHREAD_MUTEX_PRIO_CEILING_SHIFT. */ -#define PTHREAD_MUTEX_PRIO_CEILING_SHIFT 19 -#define PTHREAD_MUTEX_PRIO_CEILING_MASK 0xfff80000 - - -/* Flags in mutex attr. */ -#define PTHREAD_MUTEXATTR_PROTOCOL_SHIFT 28 -#define PTHREAD_MUTEXATTR_PROTOCOL_MASK 0x30000000 -#define PTHREAD_MUTEXATTR_PRIO_CEILING_SHIFT 12 -#define PTHREAD_MUTEXATTR_PRIO_CEILING_MASK 0x00fff000 -#define PTHREAD_MUTEXATTR_FLAG_ROBUST 0x40000000 -#define PTHREAD_MUTEXATTR_FLAG_PSHARED 0x80000000 -#define PTHREAD_MUTEXATTR_FLAG_BITS \ - (PTHREAD_MUTEXATTR_FLAG_ROBUST | PTHREAD_MUTEXATTR_FLAG_PSHARED \ - | PTHREAD_MUTEXATTR_PROTOCOL_MASK | PTHREAD_MUTEXATTR_PRIO_CEILING_MASK) - - -/* For the following, see pthread_rwlock_common.c. */ -#define PTHREAD_RWLOCK_WRPHASE 1 -#define PTHREAD_RWLOCK_WRLOCKED 2 -#define PTHREAD_RWLOCK_RWAITING 4 -#define PTHREAD_RWLOCK_READER_SHIFT 3 -#define PTHREAD_RWLOCK_READER_OVERFLOW ((unsigned int) 1 \ - << (sizeof (unsigned int) * 8 - 1)) -#define PTHREAD_RWLOCK_WRHANDOVER ((unsigned int) 1 \ - << (sizeof (unsigned int) * 8 - 1)) -#define PTHREAD_RWLOCK_FUTEX_USED 2 - - -/* Bits used in robust mutex implementation. */ -#define FUTEX_WAITERS 0x80000000 -#define FUTEX_OWNER_DIED 0x40000000 -#define FUTEX_TID_MASK 0x3fffffff - - -/* pthread_once definitions. See __pthread_once for how these are used. */ -#define __PTHREAD_ONCE_INPROGRESS 1 -#define __PTHREAD_ONCE_DONE 2 -#define __PTHREAD_ONCE_FORK_GEN_INCR 4 - - -/* Condition variable definitions. See __pthread_cond_wait_common. - Need to be defined here so there is one place from which - nptl_lock_constants can grab them. */ -#define __PTHREAD_COND_CLOCK_MONOTONIC_MASK 2 -#define __PTHREAD_COND_SHARED_MASK 1 - - -/* Internal variables. */ - - -/* Default pthread attributes. */ -extern struct pthread_attr __default_pthread_attr attribute_hidden; -extern int __default_pthread_attr_lock attribute_hidden; - -/* Size and alignment of static TLS block. */ -extern size_t __static_tls_size attribute_hidden; -extern size_t __static_tls_align_m1 attribute_hidden; - -/* Flag whether the machine is SMP or not. */ -extern int __is_smp attribute_hidden; - -/* Thread descriptor handling. */ -extern list_t __stack_user; -hidden_proto (__stack_user) - -/* Attribute handling. */ -extern struct pthread_attr *__attr_list attribute_hidden; -extern int __attr_list_lock attribute_hidden; - -/* Concurrency handling. */ -extern int __concurrency_level attribute_hidden; - -/* Thread-local data key handling. */ -extern struct pthread_key_struct __pthread_keys[PTHREAD_KEYS_MAX]; -hidden_proto (__pthread_keys) - -/* Number of threads running. */ -extern unsigned int __nptl_nthreads attribute_hidden; - -#ifndef __ASSUME_SET_ROBUST_LIST -/* Negative if we do not have the system call and we can use it. */ -extern int __set_robust_list_avail attribute_hidden; -#endif - -/* Thread Priority Protection. */ -extern int __sched_fifo_min_prio attribute_hidden; -extern int __sched_fifo_max_prio attribute_hidden; -extern void __init_sched_fifo_prio (void) attribute_hidden; -extern int __pthread_tpp_change_priority (int prev_prio, int new_prio) - attribute_hidden; -extern int __pthread_current_priority (void) attribute_hidden; - -/* The library can run in debugging mode where it performs a lot more - tests. */ -extern int __pthread_debug attribute_hidden; -/** For now disable debugging support. */ -#if 0 -# define DEBUGGING_P __builtin_expect (__pthread_debug, 0) -# define INVALID_TD_P(pd) (DEBUGGING_P && __find_in_stack_list (pd) == NULL) -# define INVALID_NOT_TERMINATED_TD_P(pd) INVALID_TD_P (pd) -#else -# define DEBUGGING_P 0 -/* Simplified test. This will not catch all invalid descriptors but - is better than nothing. And if the test triggers the thread - descriptor is guaranteed to be invalid. */ -# define INVALID_TD_P(pd) __builtin_expect ((pd)->tid <= 0, 0) -# define INVALID_NOT_TERMINATED_TD_P(pd) __builtin_expect ((pd)->tid < 0, 0) -#endif - - -/* Cancellation test. */ -#define CANCELLATION_P(self) \ - do { \ - int cancelhandling = THREAD_GETMEM (self, cancelhandling); \ - if (CANCEL_ENABLED_AND_CANCELED (cancelhandling)) \ - { \ - THREAD_SETMEM (self, result, PTHREAD_CANCELED); \ - __do_cancel (); \ - } \ - } while (0) - - -extern void __pthread_unwind (__pthread_unwind_buf_t *__buf) - __cleanup_fct_attribute __attribute ((__noreturn__)) -#if !defined SHARED && !IS_IN (libpthread) - weak_function -#endif - ; -extern void __pthread_unwind_next (__pthread_unwind_buf_t *__buf) - __cleanup_fct_attribute __attribute ((__noreturn__)) -#ifndef SHARED - weak_function -#endif - ; -extern void __pthread_register_cancel (__pthread_unwind_buf_t *__buf) - __cleanup_fct_attribute; -extern void __pthread_unregister_cancel (__pthread_unwind_buf_t *__buf) - __cleanup_fct_attribute; -#if IS_IN (libpthread) -hidden_proto (__pthread_unwind) -hidden_proto (__pthread_unwind_next) -hidden_proto (__pthread_register_cancel) -hidden_proto (__pthread_unregister_cancel) -# ifdef SHARED -extern void attribute_hidden pthread_cancel_init (void); -extern void __unwind_freeres (void); -# endif -#endif - - -/* Called when a thread reacts on a cancellation request. */ -static inline void -__attribute ((noreturn, always_inline)) -__do_cancel (void) -{ - struct pthread *self = THREAD_SELF; - - /* Make sure we get no more cancellations. */ - THREAD_ATOMIC_BIT_SET (self, cancelhandling, EXITING_BIT); - - __pthread_unwind ((__pthread_unwind_buf_t *) - THREAD_GETMEM (self, cleanup_jmp_buf)); -} - - -/* Set cancellation mode to asynchronous. */ -#define CANCEL_ASYNC() \ - __pthread_enable_asynccancel () -/* Reset to previous cancellation mode. */ -#define CANCEL_RESET(oldtype) \ - __pthread_disable_asynccancel (oldtype) - -#if IS_IN (libc) -/* Same as CANCEL_ASYNC, but for use in libc.so. */ -# define LIBC_CANCEL_ASYNC() \ - __libc_enable_asynccancel () -/* Same as CANCEL_RESET, but for use in libc.so. */ -# define LIBC_CANCEL_RESET(oldtype) \ - __libc_disable_asynccancel (oldtype) -# define LIBC_CANCEL_HANDLED() \ - __asm (".globl " __SYMBOL_PREFIX "__libc_enable_asynccancel"); \ - __asm (".globl " __SYMBOL_PREFIX "__libc_disable_asynccancel") -#elif IS_IN (libpthread) -# define LIBC_CANCEL_ASYNC() CANCEL_ASYNC () -# define LIBC_CANCEL_RESET(val) CANCEL_RESET (val) -# define LIBC_CANCEL_HANDLED() \ - __asm (".globl " __SYMBOL_PREFIX "__pthread_enable_asynccancel"); \ - __asm (".globl " __SYMBOL_PREFIX "__pthread_disable_asynccancel") -#elif IS_IN (librt) -# define LIBC_CANCEL_ASYNC() \ - __librt_enable_asynccancel () -# define LIBC_CANCEL_RESET(val) \ - __librt_disable_asynccancel (val) -# define LIBC_CANCEL_HANDLED() \ - __asm (".globl " __SYMBOL_PREFIX "__librt_enable_asynccancel"); \ - __asm (".globl " __SYMBOL_PREFIX "__librt_disable_asynccancel") -#else -# define LIBC_CANCEL_ASYNC() 0 /* Just a dummy value. */ -# define LIBC_CANCEL_RESET(val) ((void)(val)) /* Nothing, but evaluate it. */ -# define LIBC_CANCEL_HANDLED() /* Nothing. */ -#endif - - -/* Internal prototypes. */ - -/* Thread list handling. */ -extern struct pthread *__find_in_stack_list (struct pthread *pd) - attribute_hidden internal_function; - -/* Deallocate a thread's stack after optionally making sure the thread - descriptor is still valid. */ -extern void __free_tcb (struct pthread *pd) attribute_hidden internal_function; - -/* Free allocated stack. */ -extern void __deallocate_stack (struct pthread *pd) - attribute_hidden internal_function; - -/* Mark all the stacks except for the current one as available. This - function also re-initializes the lock for the stack cache. */ -extern void __reclaim_stacks (void) attribute_hidden; - -/* Make all threads's stacks executable. */ -extern int __make_stacks_executable (void **stack_endp) - internal_function attribute_hidden; - -/* longjmp handling. */ -extern void __pthread_cleanup_upto (__jmp_buf target, char *targetframe); -#if IS_IN (libpthread) -hidden_proto (__pthread_cleanup_upto) -#endif - - -/* Functions with versioned interfaces. */ -extern int __pthread_create_2_1 (pthread_t *newthread, - const pthread_attr_t *attr, - void *(*start_routine) (void *), void *arg); -extern int __pthread_create_2_0 (pthread_t *newthread, - const pthread_attr_t *attr, - void *(*start_routine) (void *), void *arg); -extern int __pthread_attr_init_2_1 (pthread_attr_t *attr); -extern int __pthread_attr_init_2_0 (pthread_attr_t *attr); - - -/* Event handlers for libthread_db interface. */ -extern void __nptl_create_event (void); -extern void __nptl_death_event (void); -hidden_proto (__nptl_create_event) -hidden_proto (__nptl_death_event) - -/* Register the generation counter in the libpthread with the libc. */ -#ifdef TLS_MULTIPLE_THREADS_IN_TCB -extern void __libc_pthread_init (unsigned long int *ptr, - void (*reclaim) (void), - const struct pthread_functions *functions) - internal_function; -#else -extern int *__libc_pthread_init (unsigned long int *ptr, - void (*reclaim) (void), - const struct pthread_functions *functions) - internal_function; - -/* Variable set to a nonzero value either if more than one thread runs or ran, - or if a single-threaded process is trying to cancel itself. See - nptl/descr.h for more context on the single-threaded process case. */ -extern int __pthread_multiple_threads attribute_hidden; -/* Pointer to the corresponding variable in libc. */ -extern int *__libc_multiple_threads_ptr attribute_hidden; -#endif - -/* Find a thread given its TID. */ -extern struct pthread *__find_thread_by_id (pid_t tid) attribute_hidden -#ifdef SHARED -; -#else -weak_function; -#define __find_thread_by_id(tid) \ - (__find_thread_by_id ? (__find_thread_by_id) (tid) : (struct pthread *) NULL) -#endif - -extern void __pthread_init_static_tls (struct link_map *) attribute_hidden; - -extern size_t __pthread_get_minstack (const pthread_attr_t *attr); - -/* Namespace save aliases. */ -extern int __pthread_getschedparam (pthread_t thread_id, int *policy, - struct sched_param *param); -extern int __pthread_setschedparam (pthread_t thread_id, int policy, - const struct sched_param *param); -extern int __pthread_setcancelstate (int state, int *oldstate); -extern int __pthread_mutex_init (pthread_mutex_t *__mutex, - const pthread_mutexattr_t *__mutexattr); -extern int __pthread_mutex_destroy (pthread_mutex_t *__mutex); -extern int __pthread_mutex_trylock (pthread_mutex_t *_mutex); -extern int __pthread_mutex_lock (pthread_mutex_t *__mutex); -extern int __pthread_mutex_cond_lock (pthread_mutex_t *__mutex) - attribute_hidden internal_function; -extern void __pthread_mutex_cond_lock_adjust (pthread_mutex_t *__mutex) - attribute_hidden internal_function; -extern int __pthread_mutex_unlock (pthread_mutex_t *__mutex); -extern int __pthread_mutex_unlock_usercnt (pthread_mutex_t *__mutex, - int __decr) - attribute_hidden internal_function; -extern int __pthread_mutexattr_init (pthread_mutexattr_t *attr); -extern int __pthread_mutexattr_destroy (pthread_mutexattr_t *attr); -extern int __pthread_mutexattr_settype (pthread_mutexattr_t *attr, int kind); -extern int __pthread_attr_destroy (pthread_attr_t *attr); -extern int __pthread_attr_getdetachstate (const pthread_attr_t *attr, - int *detachstate); -extern int __pthread_attr_setdetachstate (pthread_attr_t *attr, - int detachstate); -extern int __pthread_attr_getinheritsched (const pthread_attr_t *attr, - int *inherit); -extern int __pthread_attr_setinheritsched (pthread_attr_t *attr, int inherit); -extern int __pthread_attr_getschedparam (const pthread_attr_t *attr, - struct sched_param *param); -extern int __pthread_attr_setschedparam (pthread_attr_t *attr, - const struct sched_param *param); -extern int __pthread_attr_getschedpolicy (const pthread_attr_t *attr, - int *policy); -extern int __pthread_attr_setschedpolicy (pthread_attr_t *attr, int policy); -extern int __pthread_attr_getscope (const pthread_attr_t *attr, int *scope); -extern int __pthread_attr_setscope (pthread_attr_t *attr, int scope); -extern int __pthread_attr_getstackaddr (const pthread_attr_t *__restrict - __attr, void **__restrict __stackaddr); -extern int __pthread_attr_setstackaddr (pthread_attr_t *__attr, - void *__stackaddr); -extern int __pthread_attr_getstacksize (const pthread_attr_t *__restrict - __attr, - size_t *__restrict __stacksize); -extern int __pthread_attr_setstacksize (pthread_attr_t *__attr, - size_t __stacksize); -extern int __pthread_attr_getstack (const pthread_attr_t *__restrict __attr, - void **__restrict __stackaddr, - size_t *__restrict __stacksize); -extern int __pthread_attr_setstack (pthread_attr_t *__attr, void *__stackaddr, - size_t __stacksize); -extern int __pthread_rwlock_init (pthread_rwlock_t *__restrict __rwlock, - const pthread_rwlockattr_t *__restrict - __attr); -extern int __pthread_rwlock_destroy (pthread_rwlock_t *__rwlock); -extern int __pthread_rwlock_rdlock (pthread_rwlock_t *__rwlock); -extern int __pthread_rwlock_tryrdlock (pthread_rwlock_t *__rwlock); -extern int __pthread_rwlock_wrlock (pthread_rwlock_t *__rwlock); -extern int __pthread_rwlock_trywrlock (pthread_rwlock_t *__rwlock); -extern int __pthread_rwlock_unlock (pthread_rwlock_t *__rwlock); -extern int __pthread_cond_broadcast (pthread_cond_t *cond); -extern int __pthread_cond_destroy (pthread_cond_t *cond); -extern int __pthread_cond_init (pthread_cond_t *cond, - const pthread_condattr_t *cond_attr); -extern int __pthread_cond_signal (pthread_cond_t *cond); -extern int __pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex); -extern int __pthread_cond_timedwait (pthread_cond_t *cond, - pthread_mutex_t *mutex, - const struct timespec *abstime); -extern int __pthread_condattr_destroy (pthread_condattr_t *attr); -extern int __pthread_condattr_init (pthread_condattr_t *attr); -extern int __pthread_key_create (pthread_key_t *key, void (*destr) (void *)); -extern void *__pthread_getspecific (pthread_key_t key); -extern int __pthread_setspecific (pthread_key_t key, const void *value); -extern int __pthread_once (pthread_once_t *once_control, - void (*init_routine) (void)); -extern int __pthread_atfork (void (*prepare) (void), void (*parent) (void), - void (*child) (void)); -extern pthread_t __pthread_self (void); -extern int __pthread_equal (pthread_t thread1, pthread_t thread2); -extern int __pthread_kill (pthread_t threadid, int signo); -extern void __pthread_exit (void *value) __attribute__ ((__noreturn__)); -extern int __pthread_setcanceltype (int type, int *oldtype); -extern int __pthread_enable_asynccancel (void) attribute_hidden; -extern void __pthread_disable_asynccancel (int oldtype) - internal_function attribute_hidden; -extern void __pthread_testcancel (void); - -#if IS_IN (libpthread) -hidden_proto (__pthread_mutex_init) -hidden_proto (__pthread_mutex_destroy) -hidden_proto (__pthread_mutex_lock) -hidden_proto (__pthread_mutex_unlock) -hidden_proto (__pthread_rwlock_rdlock) -hidden_proto (__pthread_rwlock_wrlock) -hidden_proto (__pthread_rwlock_unlock) -hidden_proto (__pthread_key_create) -hidden_proto (__pthread_getspecific) -hidden_proto (__pthread_setspecific) -hidden_proto (__pthread_once) -hidden_proto (__pthread_setcancelstate) -hidden_proto (__pthread_testcancel) -#endif - -extern int __pthread_cond_broadcast_2_0 (pthread_cond_2_0_t *cond); -extern int __pthread_cond_destroy_2_0 (pthread_cond_2_0_t *cond); -extern int __pthread_cond_init_2_0 (pthread_cond_2_0_t *cond, - const pthread_condattr_t *cond_attr); -extern int __pthread_cond_signal_2_0 (pthread_cond_2_0_t *cond); -extern int __pthread_cond_timedwait_2_0 (pthread_cond_2_0_t *cond, - pthread_mutex_t *mutex, - const struct timespec *abstime); -extern int __pthread_cond_wait_2_0 (pthread_cond_2_0_t *cond, - pthread_mutex_t *mutex); - -extern int __pthread_getaffinity_np (pthread_t th, size_t cpusetsize, - cpu_set_t *cpuset); - -/* The two functions are in libc.so and not exported. */ -extern int __libc_enable_asynccancel (void) attribute_hidden; -extern void __libc_disable_asynccancel (int oldtype) - internal_function attribute_hidden; - - -/* The two functions are in librt.so and not exported. */ -extern int __librt_enable_asynccancel (void) attribute_hidden; -extern void __librt_disable_asynccancel (int oldtype) - internal_function attribute_hidden; - -#if IS_IN (libpthread) -/* Special versions which use non-exported functions. */ -extern void __pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer, - void (*routine) (void *), void *arg) - attribute_hidden; - -/* Replace cleanup macros defined in <pthread.h> with internal - versions that don't depend on unwind info and better support - cancellation. */ -# undef pthread_cleanup_push -# define pthread_cleanup_push(routine,arg) \ - { struct _pthread_cleanup_buffer _buffer; \ - __pthread_cleanup_push (&_buffer, (routine), (arg)); - -extern void __pthread_cleanup_pop (struct _pthread_cleanup_buffer *buffer, - int execute) attribute_hidden; -# undef pthread_cleanup_pop -# define pthread_cleanup_pop(execute) \ - __pthread_cleanup_pop (&_buffer, (execute)); } -#endif - -extern void __pthread_cleanup_push_defer (struct _pthread_cleanup_buffer *buffer, - void (*routine) (void *), void *arg); -extern void __pthread_cleanup_pop_restore (struct _pthread_cleanup_buffer *buffer, - int execute); - -/* Old cleanup interfaces, still used in libc.so. */ -extern void _pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer, - void (*routine) (void *), void *arg); -extern void _pthread_cleanup_pop (struct _pthread_cleanup_buffer *buffer, - int execute); -extern void _pthread_cleanup_push_defer (struct _pthread_cleanup_buffer *buffer, - void (*routine) (void *), void *arg); -extern void _pthread_cleanup_pop_restore (struct _pthread_cleanup_buffer *buffer, - int execute); - -extern void __nptl_deallocate_tsd (void) attribute_hidden; - -extern void __nptl_setxid_error (struct xid_command *cmdp, int error) - attribute_hidden; -extern int __nptl_setxid (struct xid_command *cmdp) attribute_hidden; -#ifndef SHARED -extern void __nptl_set_robust (struct pthread *self); -#endif - -extern void __free_stacks (size_t limit) attribute_hidden; - -extern void __wait_lookup_done (void) attribute_hidden; - -#ifdef SHARED -# define PTHREAD_STATIC_FN_REQUIRE(name) -#else -# define PTHREAD_STATIC_FN_REQUIRE(name) __asm (".globl " #name); -#endif - -/* Returns 0 if POL is a valid scheduling policy. */ -static inline int -check_sched_policy_attr (int pol) -{ - if (pol == SCHED_OTHER || pol == SCHED_FIFO || pol == SCHED_RR) - return 0; - - return EINVAL; -} - -/* Returns 0 if PR is within the accepted range of priority values for - the scheduling policy POL or EINVAL otherwise. */ -static inline int -check_sched_priority_attr (int pr, int pol) -{ - int min = __sched_get_priority_min (pol); - int max = __sched_get_priority_max (pol); - - if (min >= 0 && max >= 0 && pr >= min && pr <= max) - return 0; - - return EINVAL; -} - -/* Returns 0 if ST is a valid stack size for a thread stack and EINVAL - otherwise. */ -static inline int -check_stacksize_attr (size_t st) -{ - if (st >= PTHREAD_STACK_MIN) - return 0; - - return EINVAL; -} - -#endif /* pthreadP.h */ diff --git a/nptl/pthread_atfork.c b/nptl/pthread_atfork.c deleted file mode 100644 index dc2ea07887..0000000000 --- a/nptl/pthread_atfork.c +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - In addition to the permissions in the GNU Lesser General Public - License, the Free Software Foundation gives you unlimited - permission to link the compiled version of this file with other - programs, and to distribute those programs without any restriction - coming from the use of this file. (The GNU Lesser General Public - License restrictions do apply in other respects; for example, they - cover modification of the file, and distribution when not linked - into another program.) - - Note that people who make modified versions of this file are not - obligated to grant this special exception for their modified - versions; it is their choice whether to do so. The GNU Lesser - General Public License gives permission to release a modified - version without this exception; this exception also makes it - possible to release a modified version which carries forward this - exception. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" -#include <fork.h> - -/* This is defined by newer gcc version unique for each module. */ -extern void *__dso_handle __attribute__ ((__weak__, - __visibility__ ("hidden"))); - - -/* Hide the symbol so that no definition but the one locally in the - executable or DSO is used. */ -int -#ifndef __pthread_atfork -/* Don't mark the compatibility function as hidden. */ -attribute_hidden -#endif -__pthread_atfork (void (*prepare) (void), void (*parent) (void), - void (*child) (void)) -{ - return __register_atfork (prepare, parent, child, - &__dso_handle == NULL ? NULL : __dso_handle); -} -#ifndef __pthread_atfork -extern int pthread_atfork (void (*prepare) (void), void (*parent) (void), - void (*child) (void)) attribute_hidden; -strong_alias (__pthread_atfork, pthread_atfork) -#endif diff --git a/nptl/pthread_attr_destroy.c b/nptl/pthread_attr_destroy.c deleted file mode 100644 index a9ce51edd4..0000000000 --- a/nptl/pthread_attr_destroy.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <string.h> -#include <unistd.h> -#include "pthreadP.h" -#include <shlib-compat.h> - -int -__pthread_attr_destroy (pthread_attr_t *attr) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - -#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1) - /* In old struct pthread_attr, neither next nor cpuset are - present. */ - if (__builtin_expect ((iattr->flags & ATTR_FLAG_OLDATTR), 0) == 0) -#endif - /* The affinity CPU set might be allocated dynamically. */ - free (iattr->cpuset); - - return 0; -} -strong_alias (__pthread_attr_destroy, pthread_attr_destroy) diff --git a/nptl/pthread_attr_getaffinity.c b/nptl/pthread_attr_getaffinity.c deleted file mode 100644 index b9d041ac60..0000000000 --- a/nptl/pthread_attr_getaffinity.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <pthreadP.h> -#include <string.h> -#include <sysdep.h> -#include <sys/types.h> -#include <sys/param.h> -#include <shlib-compat.h> - - -int -__pthread_attr_getaffinity_new (const pthread_attr_t *attr, size_t cpusetsize, - cpu_set_t *cpuset) -{ - const struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (const struct pthread_attr *) attr; - - if (iattr->cpuset != NULL) - { - /* Check whether there are any bits set beyond the limits - the user requested. */ - for (size_t cnt = cpusetsize; cnt < iattr->cpusetsize; ++cnt) - if (((char *) iattr->cpuset)[cnt] != 0) - return EINVAL; - - /* Copy over the cpuset from the thread attribute object. Limit the copy - to the minimum of the source and destination sizes to prevent a buffer - overrun. If the destination is larger, fill the remaining space with - zeroes. */ - void *p = mempcpy (cpuset, iattr->cpuset, - MIN (iattr->cpusetsize, cpusetsize)); - if (cpusetsize > iattr->cpusetsize) - memset (p, '\0', cpusetsize - iattr->cpusetsize); - } - else - /* We have no information. */ - memset (cpuset, -1, cpusetsize); - - return 0; -} -versioned_symbol (libpthread, __pthread_attr_getaffinity_new, - pthread_attr_getaffinity_np, GLIBC_2_3_4); - - -#if SHLIB_COMPAT (libpthread, GLIBC_2_3_3, GLIBC_2_3_4) -int -__pthread_attr_getaffinity_old (const pthread_attr_t *attr, cpu_set_t *cpuset) -{ - /* The old interface by default assumed a 1024 processor bitmap. */ - return __pthread_attr_getaffinity_new (attr, 128, cpuset); -} -compat_symbol (libpthread, __pthread_attr_getaffinity_old, - pthread_attr_getaffinity_np, GLIBC_2_3_3); -#endif diff --git a/nptl/pthread_attr_getdetachstate.c b/nptl/pthread_attr_getdetachstate.c deleted file mode 100644 index 803a553bdc..0000000000 --- a/nptl/pthread_attr_getdetachstate.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include "pthreadP.h" - - -int -__pthread_attr_getdetachstate (const pthread_attr_t *attr, int *detachstate) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - *detachstate = (iattr->flags & ATTR_FLAG_DETACHSTATE - ? PTHREAD_CREATE_DETACHED : PTHREAD_CREATE_JOINABLE); - - return 0; -} -strong_alias (__pthread_attr_getdetachstate, pthread_attr_getdetachstate) diff --git a/nptl/pthread_attr_getguardsize.c b/nptl/pthread_attr_getguardsize.c deleted file mode 100644 index b71be6c74e..0000000000 --- a/nptl/pthread_attr_getguardsize.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include "pthreadP.h" - - -int -pthread_attr_getguardsize (const pthread_attr_t *attr, size_t *guardsize) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - *guardsize = iattr->guardsize; - - return 0; -} diff --git a/nptl/pthread_attr_getinheritsched.c b/nptl/pthread_attr_getinheritsched.c deleted file mode 100644 index 2dec2302d6..0000000000 --- a/nptl/pthread_attr_getinheritsched.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include "pthreadP.h" - - -int -__pthread_attr_getinheritsched (const pthread_attr_t *attr, int *inherit) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - /* Store the current values. */ - *inherit = (iattr->flags & ATTR_FLAG_NOTINHERITSCHED - ? PTHREAD_EXPLICIT_SCHED : PTHREAD_INHERIT_SCHED); - - return 0; -} -strong_alias (__pthread_attr_getinheritsched, pthread_attr_getinheritsched) diff --git a/nptl/pthread_attr_getschedparam.c b/nptl/pthread_attr_getschedparam.c deleted file mode 100644 index 34f94089fe..0000000000 --- a/nptl/pthread_attr_getschedparam.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <string.h> -#include "pthreadP.h" - - -int -__pthread_attr_getschedparam (const pthread_attr_t *attr, - struct sched_param *param) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - /* Copy the current values. */ - memcpy (param, &iattr->schedparam, sizeof (struct sched_param)); - - return 0; -} -strong_alias (__pthread_attr_getschedparam, pthread_attr_getschedparam) diff --git a/nptl/pthread_attr_getschedpolicy.c b/nptl/pthread_attr_getschedpolicy.c deleted file mode 100644 index 65ed4176c7..0000000000 --- a/nptl/pthread_attr_getschedpolicy.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include "pthreadP.h" - - -int -__pthread_attr_getschedpolicy (const pthread_attr_t *attr, int *policy) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - /* Store the current values. */ - *policy = iattr->schedpolicy; - - return 0; -} -strong_alias (__pthread_attr_getschedpolicy, pthread_attr_getschedpolicy) diff --git a/nptl/pthread_attr_getscope.c b/nptl/pthread_attr_getscope.c deleted file mode 100644 index 7b36d6ad64..0000000000 --- a/nptl/pthread_attr_getscope.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include "pthreadP.h" - - -int -__pthread_attr_getscope (const pthread_attr_t *attr, int *scope) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - /* Store the current values. */ - *scope = (iattr->flags & ATTR_FLAG_SCOPEPROCESS - ? PTHREAD_SCOPE_PROCESS : PTHREAD_SCOPE_SYSTEM); - - return 0; -} -strong_alias (__pthread_attr_getscope, pthread_attr_getscope) diff --git a/nptl/pthread_attr_getstack.c b/nptl/pthread_attr_getstack.c deleted file mode 100644 index 79c78c63ea..0000000000 --- a/nptl/pthread_attr_getstack.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include "pthreadP.h" - - -int -__pthread_attr_getstack (const pthread_attr_t *attr, void **stackaddr, - size_t *stacksize) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - /* Store the result. */ -#if _STACK_GROWS_DOWN - *stackaddr = (char *) iattr->stackaddr - iattr->stacksize; -#else - *stackaddr = (char *) iattr->stackaddr; -#endif - *stacksize = iattr->stacksize; - - return 0; -} -strong_alias (__pthread_attr_getstack, pthread_attr_getstack) diff --git a/nptl/pthread_attr_getstackaddr.c b/nptl/pthread_attr_getstackaddr.c deleted file mode 100644 index 69f0a7d97e..0000000000 --- a/nptl/pthread_attr_getstackaddr.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include "pthreadP.h" - - -int -__pthread_attr_getstackaddr (const pthread_attr_t *attr, void **stackaddr) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - /* Some code assumes this function to work even if no stack address - has been set. Let them figure it out for themselves what the - value means. Simply store the result. */ - *stackaddr = iattr->stackaddr; - - return 0; -} -strong_alias (__pthread_attr_getstackaddr, pthread_attr_getstackaddr) - -link_warning (pthread_attr_getstackaddr, - "the use of `pthread_attr_getstackaddr' is deprecated, use `pthread_attr_getstack'") diff --git a/nptl/pthread_attr_getstacksize.c b/nptl/pthread_attr_getstacksize.c deleted file mode 100644 index 9f24d4df39..0000000000 --- a/nptl/pthread_attr_getstacksize.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include "pthreadP.h" - - -int -__pthread_attr_getstacksize (const pthread_attr_t *attr, size_t *stacksize) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - size_t size = iattr->stacksize; - - /* If the user has not set a stack size we return what the system - will use as the default. */ - if (size == 0) - { - lll_lock (__default_pthread_attr_lock, LLL_PRIVATE); - size = __default_pthread_attr.stacksize; - lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE); - } - *stacksize = size; - - return 0; -} -strong_alias (__pthread_attr_getstacksize, pthread_attr_getstacksize) diff --git a/nptl/pthread_attr_init.c b/nptl/pthread_attr_init.c deleted file mode 100644 index 77998ea9ac..0000000000 --- a/nptl/pthread_attr_init.c +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <string.h> -#include <unistd.h> -#include "pthreadP.h" - -#include <shlib-compat.h> - - -struct pthread_attr *__attr_list; -int __attr_list_lock = LLL_LOCK_INITIALIZER; - - -int -__pthread_attr_init_2_1 (pthread_attr_t *attr) -{ - struct pthread_attr *iattr; - - /* Many elements are initialized to zero so let us do it all at - once. This also takes care of clearing the bytes which are not - internally used. */ - memset (attr, '\0', __SIZEOF_PTHREAD_ATTR_T); - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - /* Default guard size specified by the standard. */ - iattr->guardsize = __getpagesize (); - - return 0; -} -versioned_symbol (libpthread, __pthread_attr_init_2_1, pthread_attr_init, - GLIBC_2_1); - - -#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1) -int -__pthread_attr_init_2_0 (pthread_attr_t *attr) -{ - /* This code is specific to the old LinuxThread code which has a too - small pthread_attr_t definition. The struct looked like - this: */ - struct old_attr - { - int detachstate; - int schedpolicy; - struct sched_param schedparam; - int inheritsched; - int scope; - }; - struct pthread_attr *iattr; - - /* Many elements are initialized to zero so let us do it all at - once. This also takes care of clearing the bytes which are not - internally used. */ - memset (attr, '\0', sizeof (struct old_attr)); - - iattr = (struct pthread_attr *) attr; - iattr->flags |= ATTR_FLAG_OLDATTR; - - /* We cannot enqueue the attribute because that member is not in the - old attribute structure. */ - return 0; -} -compat_symbol (libpthread, __pthread_attr_init_2_0, pthread_attr_init, - GLIBC_2_0); -#endif diff --git a/nptl/pthread_attr_setaffinity.c b/nptl/pthread_attr_setaffinity.c deleted file mode 100644 index 497512eb9c..0000000000 --- a/nptl/pthread_attr_setaffinity.c +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <limits.h> -#include <stdlib.h> -#include <string.h> -#include <pthreadP.h> -#include <shlib-compat.h> - - -int -__pthread_attr_setaffinity_new (pthread_attr_t *attr, size_t cpusetsize, - const cpu_set_t *cpuset) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - if (cpuset == NULL || cpusetsize == 0) - { - free (iattr->cpuset); - iattr->cpuset = NULL; - iattr->cpusetsize = 0; - } - else - { - if (iattr->cpusetsize != cpusetsize) - { - void *newp = (cpu_set_t *) realloc (iattr->cpuset, cpusetsize); - if (newp == NULL) - return ENOMEM; - - iattr->cpuset = newp; - iattr->cpusetsize = cpusetsize; - } - - memcpy (iattr->cpuset, cpuset, cpusetsize); - } - - return 0; -} -versioned_symbol (libpthread, __pthread_attr_setaffinity_new, - pthread_attr_setaffinity_np, GLIBC_2_3_4); - - -#if SHLIB_COMPAT (libpthread, GLIBC_2_3_3, GLIBC_2_3_4) -int -__pthread_attr_setaffinity_old (pthread_attr_t *attr, cpu_set_t *cpuset) -{ - /* The old interface by default assumed a 1024 processor bitmap. */ - return __pthread_attr_setaffinity_new (attr, 128, cpuset); -} -compat_symbol (libpthread, __pthread_attr_setaffinity_old, - pthread_attr_setaffinity_np, GLIBC_2_3_3); -#endif diff --git a/nptl/pthread_attr_setdetachstate.c b/nptl/pthread_attr_setdetachstate.c deleted file mode 100644 index c6fb1bfc93..0000000000 --- a/nptl/pthread_attr_setdetachstate.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include "pthreadP.h" - - -int -__pthread_attr_setdetachstate (pthread_attr_t *attr, int detachstate) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - /* Catch invalid values. */ - if (detachstate != PTHREAD_CREATE_DETACHED - && __builtin_expect (detachstate != PTHREAD_CREATE_JOINABLE, 0)) - return EINVAL; - - /* Set the flag. It is nonzero if threads are created detached. */ - if (detachstate == PTHREAD_CREATE_DETACHED) - iattr->flags |= ATTR_FLAG_DETACHSTATE; - else - iattr->flags &= ~ATTR_FLAG_DETACHSTATE; - - return 0; -} -strong_alias (__pthread_attr_setdetachstate, pthread_attr_setdetachstate) diff --git a/nptl/pthread_attr_setguardsize.c b/nptl/pthread_attr_setguardsize.c deleted file mode 100644 index 3927793da5..0000000000 --- a/nptl/pthread_attr_setguardsize.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include "pthreadP.h" - - -int -pthread_attr_setguardsize (pthread_attr_t *attr, size_t guardsize) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - /* Note that we don't round the value here. The standard requires - that subsequent pthread_attr_getguardsize calls return the value - set by the user. */ - iattr->guardsize = guardsize; - - return 0; -} diff --git a/nptl/pthread_attr_setinheritsched.c b/nptl/pthread_attr_setinheritsched.c deleted file mode 100644 index 69a6335d25..0000000000 --- a/nptl/pthread_attr_setinheritsched.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include "pthreadP.h" - - -int -__pthread_attr_setinheritsched (pthread_attr_t *attr, int inherit) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - /* Catch invalid values. */ - if (inherit != PTHREAD_INHERIT_SCHED && inherit != PTHREAD_EXPLICIT_SCHED) - return EINVAL; - - /* Store the new values. */ - if (inherit != PTHREAD_INHERIT_SCHED) - iattr->flags |= ATTR_FLAG_NOTINHERITSCHED; - else - iattr->flags &= ~ATTR_FLAG_NOTINHERITSCHED; - - return 0; -} -strong_alias (__pthread_attr_setinheritsched, pthread_attr_setinheritsched) diff --git a/nptl/pthread_attr_setschedparam.c b/nptl/pthread_attr_setschedparam.c deleted file mode 100644 index e38d1d8f0c..0000000000 --- a/nptl/pthread_attr_setschedparam.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <string.h> -#include "pthreadP.h" - - -int -__pthread_attr_setschedparam (pthread_attr_t *attr, - const struct sched_param *param) -{ - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - struct pthread_attr *iattr = (struct pthread_attr *) attr; - - int ret = check_sched_priority_attr (param->sched_priority, - iattr->schedpolicy); - if (ret) - return ret; - - /* Copy the new values. */ - memcpy (&iattr->schedparam, param, sizeof (struct sched_param)); - - /* Remember we set the value. */ - iattr->flags |= ATTR_FLAG_SCHED_SET; - - return 0; -} -strong_alias (__pthread_attr_setschedparam, pthread_attr_setschedparam) diff --git a/nptl/pthread_attr_setschedpolicy.c b/nptl/pthread_attr_setschedpolicy.c deleted file mode 100644 index 868696d950..0000000000 --- a/nptl/pthread_attr_setschedpolicy.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include "pthreadP.h" - - -int -__pthread_attr_setschedpolicy (pthread_attr_t *attr, int policy) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - /* Catch invalid values. */ - int ret = check_sched_policy_attr (policy); - if (ret) - return ret; - - /* Store the new values. */ - iattr->schedpolicy = policy; - - /* Remember we set the value. */ - iattr->flags |= ATTR_FLAG_POLICY_SET; - - return 0; -} -strong_alias (__pthread_attr_setschedpolicy, pthread_attr_setschedpolicy) diff --git a/nptl/pthread_attr_setscope.c b/nptl/pthread_attr_setscope.c deleted file mode 100644 index e0fd1dd9bd..0000000000 --- a/nptl/pthread_attr_setscope.c +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include "pthreadP.h" - - -int -__pthread_attr_setscope (pthread_attr_t *attr, int scope) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - /* Catch invalid values. */ - switch (scope) - { - case PTHREAD_SCOPE_SYSTEM: - iattr->flags &= ~ATTR_FLAG_SCOPEPROCESS; - break; - - case PTHREAD_SCOPE_PROCESS: - return ENOTSUP; - - default: - return EINVAL; - } - - return 0; -} -strong_alias (__pthread_attr_setscope, pthread_attr_setscope) diff --git a/nptl/pthread_attr_setstack.c b/nptl/pthread_attr_setstack.c deleted file mode 100644 index e4f8b2956f..0000000000 --- a/nptl/pthread_attr_setstack.c +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <limits.h> -#include "pthreadP.h" - - -#ifndef NEW_VERNUM -# define NEW_VERNUM GLIBC_2_3_3 -#endif - - -int -__pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr, - size_t stacksize) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - /* Catch invalid sizes. */ - int ret = check_stacksize_attr (stacksize); - if (ret) - return ret; - -#ifdef EXTRA_PARAM_CHECKS - EXTRA_PARAM_CHECKS; -#endif - - iattr->stacksize = stacksize; -#if _STACK_GROWS_DOWN - iattr->stackaddr = (char *) stackaddr + stacksize; -#else - iattr->stackaddr = (char *) stackaddr; -#endif - iattr->flags |= ATTR_FLAG_STACKADDR; - - return 0; -} - -#if PTHREAD_STACK_MIN == 16384 -strong_alias (__pthread_attr_setstack, pthread_attr_setstack) -#else -# include <shlib-compat.h> -versioned_symbol (libpthread, __pthread_attr_setstack, pthread_attr_setstack, - NEW_VERNUM); - -# if SHLIB_COMPAT(libpthread, GLIBC_2_2, NEW_VERNUM) - -int -__old_pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr, - size_t stacksize) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - /* Catch invalid sizes. */ - if (stacksize < 16384) - return EINVAL; - -# ifdef EXTRA_PARAM_CHECKS - EXTRA_PARAM_CHECKS; -# endif - - iattr->stacksize = stacksize; -#if _STACK_GROWS_DOWN - iattr->stackaddr = (char *) stackaddr + stacksize; -#else - iattr->stackaddr = (char *) stackaddr; -#endif - iattr->flags |= ATTR_FLAG_STACKADDR; - - return 0; -} - -compat_symbol (libpthread, __old_pthread_attr_setstack, pthread_attr_setstack, - GLIBC_2_2); -# endif - -#endif diff --git a/nptl/pthread_attr_setstackaddr.c b/nptl/pthread_attr_setstackaddr.c deleted file mode 100644 index ac16f941c6..0000000000 --- a/nptl/pthread_attr_setstackaddr.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include "pthreadP.h" - - -int -__pthread_attr_setstackaddr (pthread_attr_t *attr, void *stackaddr) -{ - struct pthread_attr *iattr; - -#ifdef EXTRA_PARAM_CHECKS - EXTRA_PARAM_CHECKS; -#endif - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - iattr->stackaddr = stackaddr; - iattr->flags |= ATTR_FLAG_STACKADDR; - - return 0; -} -strong_alias (__pthread_attr_setstackaddr, pthread_attr_setstackaddr) - -link_warning (pthread_attr_setstackaddr, - "the use of `pthread_attr_setstackaddr' is deprecated, use `pthread_attr_setstack'") diff --git a/nptl/pthread_attr_setstacksize.c b/nptl/pthread_attr_setstacksize.c deleted file mode 100644 index 4c0abace90..0000000000 --- a/nptl/pthread_attr_setstacksize.c +++ /dev/null @@ -1,81 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <limits.h> -#include "pthreadP.h" - -#ifndef NEW_VERNUM -# define NEW_VERNUM GLIBC_2_3_3 -#endif - - -int -__pthread_attr_setstacksize (pthread_attr_t *attr, size_t stacksize) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - /* Catch invalid sizes. */ - int ret = check_stacksize_attr (stacksize); - if (ret) - return ret; - - iattr->stacksize = stacksize; - - return 0; -} - -#if PTHREAD_STACK_MIN == 16384 -strong_alias (__pthread_attr_setstacksize, pthread_attr_setstacksize) -#else -# include <shlib-compat.h> -versioned_symbol (libpthread, __pthread_attr_setstacksize, - pthread_attr_setstacksize, NEW_VERNUM); - -# if SHLIB_COMPAT(libpthread, GLIBC_2_1, NEW_VERNUM) - -int -__old_pthread_attr_setstacksize (pthread_attr_t *attr, size_t stacksize) -{ - struct pthread_attr *iattr; - - assert (sizeof (*attr) >= sizeof (struct pthread_attr)); - iattr = (struct pthread_attr *) attr; - - /* Catch invalid sizes. */ - if (stacksize < 16384) - return EINVAL; - -# ifdef STACKSIZE_ADJUST - STACKSIZE_ADJUST; -# endif - - iattr->stacksize = stacksize; - - return 0; -} - -compat_symbol (libpthread, __old_pthread_attr_setstacksize, - pthread_attr_setstacksize, GLIBC_2_1); -# endif - -#endif diff --git a/nptl/pthread_barrier_destroy.c b/nptl/pthread_barrier_destroy.c deleted file mode 100644 index e79232bd8f..0000000000 --- a/nptl/pthread_barrier_destroy.c +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include "pthreadP.h" -#include <atomic.h> -#include <futex-internal.h> - - -int -pthread_barrier_destroy (pthread_barrier_t *barrier) -{ - struct pthread_barrier *bar = (struct pthread_barrier *) barrier; - - /* Destroying a barrier is only allowed if no thread is blocked on it. - Thus, there is no unfinished round, and all modifications to IN will - have happened before us (either because the calling thread took part - in the most recent round and thus synchronized-with all other threads - entering, or the program ensured this through other synchronization). - We must wait until all threads that entered so far have confirmed that - they have exited as well. To get the notification, pretend that we have - reached the reset threshold. */ - unsigned int count = bar->count; - unsigned int max_in_before_reset = BARRIER_IN_THRESHOLD - - BARRIER_IN_THRESHOLD % count; - /* Relaxed MO sufficient because the program must have ensured that all - modifications happen-before this load (see above). */ - unsigned int in = atomic_load_relaxed (&bar->in); - /* Trigger reset. The required acquire MO is below. */ - if (atomic_fetch_add_relaxed (&bar->out, max_in_before_reset - in) < in) - { - /* Not all threads confirmed yet that they have exited, so another - thread will perform a reset. Wait until that has happened. */ - while (in != 0) - { - futex_wait_simple (&bar->in, in, bar->shared); - in = atomic_load_relaxed (&bar->in); - } - } - /* We must ensure that memory reuse happens after all prior use of the - barrier (specifically, synchronize-with the reset of the barrier or the - confirmation of threads leaving the barrier). */ - atomic_thread_fence_acquire (); - - return 0; -} diff --git a/nptl/pthread_barrier_init.c b/nptl/pthread_barrier_init.c deleted file mode 100644 index 9c851fbb32..0000000000 --- a/nptl/pthread_barrier_init.c +++ /dev/null @@ -1,60 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include "pthreadP.h" -#include <futex-internal.h> -#include <kernel-features.h> - - -static const struct pthread_barrierattr default_barrierattr = - { - .pshared = PTHREAD_PROCESS_PRIVATE - }; - - -int -__pthread_barrier_init (pthread_barrier_t *barrier, - const pthread_barrierattr_t *attr, unsigned int count) -{ - struct pthread_barrier *ibarrier; - - /* XXX EINVAL is not specified by POSIX as a possible error code for COUNT - being too large. See pthread_barrier_wait for the reason for the - comparison with BARRIER_IN_THRESHOLD. */ - if (__glibc_unlikely (count == 0 || count >= BARRIER_IN_THRESHOLD)) - return EINVAL; - - const struct pthread_barrierattr *iattr - = (attr != NULL - ? (struct pthread_barrierattr *) attr - : &default_barrierattr); - - ibarrier = (struct pthread_barrier *) barrier; - - /* Initialize the individual fields. */ - ibarrier->in = 0; - ibarrier->out = 0; - ibarrier->count = count; - ibarrier->current_round = 0; - ibarrier->shared = (iattr->pshared == PTHREAD_PROCESS_PRIVATE - ? FUTEX_PRIVATE : FUTEX_SHARED); - - return 0; -} -weak_alias (__pthread_barrier_init, pthread_barrier_init) diff --git a/nptl/pthread_barrier_wait.c b/nptl/pthread_barrier_wait.c deleted file mode 100644 index 1dcedb4ed5..0000000000 --- a/nptl/pthread_barrier_wait.c +++ /dev/null @@ -1,223 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <sysdep.h> -#include <futex-internal.h> -#include <pthreadP.h> - - -/* Wait on the barrier. - - In each round, we wait for a fixed number of threads to enter the barrier - (COUNT). Once that has happened, exactly these threads are allowed to - leave the barrier. Note that POSIX does not require that only COUNT - threads can attempt to block using the barrier concurrently. - - We count the number of threads that have entered (IN). Each thread - increments IN when entering, thus getting a position in the sequence of - threads that are or have been waiting (starting with 1, so the position - is the number of threads that have entered so far including the current - thread). - CURRENT_ROUND designates the most recent thread whose round has been - detected as complete. When a thread detects that enough threads have - entered to make a round complete, it finishes this round by effectively - adding COUNT to CURRENT_ROUND atomically. Threads that believe that their - round is not complete yet wait until CURRENT_ROUND is not smaller than - their position anymore. - - A barrier can be destroyed as soon as no threads are blocked on the - barrier. This is already the case if just one thread from the last round - has stopped waiting and returned to the caller; the assumption is that - all threads from the round are unblocked atomically, even though they may - return at different times from the respective calls to - pthread_barrier_wait). Thus, a valid call to pthread_barrier_destroy can - be concurrent with other threads still figuring out that their round has - been completed. Therefore, threads need to confirm that they have left - the barrier by incrementing OUT, and pthread_barrier_destroy needs to wait - until OUT equals IN. - - To avoid an ABA issue for futex_wait on CURRENT_ROUND and for archs with - 32b-only atomics, we additionally reset the barrier when IN reaches - a threshold to avoid overflow. We assume that the total number of threads - is less than UINT_MAX/2, and set the threshold accordingly so that we can - use a simple atomic_fetch_add on IN instead of a CAS when entering. The - threshold is always set to the end of a round, so all threads that have - entered are either pre-reset threads or post-reset threads (i.e., have a - position larger than the threshold). - Pre-reset threads just run the algorithm explained above. Post-reset - threads wait until IN is reset to a pre-threshold value. - When the last pre-reset thread leaves the barrier (i.e., OUT equals the - threshold), it resets the barrier to its initial state. Other (post-reset) - threads wait for the reset to have finished by waiting until IN is less - than the threshold and then restart by trying to enter the barrier again. - - We reuse the reset mechanism in pthread_barrier_destroy to get notified - when all threads have left the barrier: We trigger an artificial reset and - wait for the last pre-reset thread to finish reset, thus notifying the - thread that is about to destroy the barrier. - - Blocking using futexes is straightforward: pre-reset threads wait for - completion of their round using CURRENT_ROUND as futex word, and post-reset - threads and pthread_barrier_destroy use IN as futex word. - - Further notes: - * It is not simple to let some of the post-reset threads help with the - reset because of the ABA issues that arise; therefore, we simply make - the last thread to leave responsible for the reset. - * POSIX leaves it unspecified whether a signal handler running in a thread - that has been unblocked (because its round is complete) can stall all - other threads and prevent them from returning from the barrier. In this - implementation, other threads will return. However, - pthread_barrier_destroy will of course wait for the signal handler thread - to confirm that it left the barrier. - - TODO We should add spinning with back-off. Once we do that, we could also - try to avoid the futex_wake syscall when a round is detected as finished. - If we do not spin, it is quite likely that at least some other threads will - have called futex_wait already. */ -int -__pthread_barrier_wait (pthread_barrier_t *barrier) -{ - struct pthread_barrier *bar = (struct pthread_barrier *) barrier; - - /* How many threads entered so far, including ourself. */ - unsigned int i; - - reset_restart: - /* Try to enter the barrier. We need acquire MO to (1) ensure that if we - observe that our round can be completed (see below for our attempt to do - so), all pre-barrier-entry effects of all threads in our round happen - before us completing the round, and (2) to make our use of the barrier - happen after a potential reset. We need release MO to make sure that our - pre-barrier-entry effects happen before threads in this round leaving the - barrier. */ - i = atomic_fetch_add_acq_rel (&bar->in, 1) + 1; - /* These loads are after the fetch_add so that we're less likely to first - pull in the cache line as shared. */ - unsigned int count = bar->count; - /* This is the number of threads that can enter before we need to reset. - Always at the end of a round. */ - unsigned int max_in_before_reset = BARRIER_IN_THRESHOLD - - BARRIER_IN_THRESHOLD % count; - - if (i > max_in_before_reset) - { - /* We're in a reset round. Just wait for a reset to finish; do not - help finishing previous rounds because this could happen - concurrently with a reset. */ - while (i > max_in_before_reset) - { - futex_wait_simple (&bar->in, i, bar->shared); - /* Relaxed MO is fine here because we just need an indication for - when we should retry to enter (which will use acquire MO, see - above). */ - i = atomic_load_relaxed (&bar->in); - } - goto reset_restart; - } - - /* Look at the current round. At this point, we are just interested in - whether we can complete rounds, based on the information we obtained - through our acquire-MO load of IN. Nonetheless, if we notice that - our round has been completed using this load, we use the acquire-MO - fence below to make sure that all pre-barrier-entry effects of all - threads in our round happen before us leaving the barrier. Therefore, - relaxed MO is sufficient. */ - unsigned cr = atomic_load_relaxed (&bar->current_round); - - /* Try to finish previous rounds and/or the current round. We simply - consider just our position here and do not try to do the work of threads - that entered more recently. */ - while (cr + count <= i) - { - /* Calculate the new current round based on how many threads entered. - NEWCR must be larger than CR because CR+COUNT ends a round. */ - unsigned int newcr = i - i % count; - /* Try to complete previous and/or the current round. We need release - MO to propagate the happens-before that we observed through reading - with acquire MO from IN to other threads. If the CAS fails, it - is like the relaxed-MO load of CURRENT_ROUND above. */ - if (atomic_compare_exchange_weak_release (&bar->current_round, &cr, - newcr)) - { - /* Update CR with the modification we just did. */ - cr = newcr; - /* Wake threads belonging to the rounds we just finished. We may - wake more threads than necessary if more than COUNT threads try - to block concurrently on the barrier, but this is not a typical - use of barriers. - Note that we can still access SHARED because we haven't yet - confirmed to have left the barrier. */ - futex_wake (&bar->current_round, INT_MAX, bar->shared); - /* We did as much as we could based on our position. If we advanced - the current round to a round sufficient for us, do not wait for - that to happen and skip the acquire fence (we already - synchronize-with all other threads in our round through the - initial acquire MO fetch_add of IN. */ - if (i <= cr) - goto ready_to_leave; - else - break; - } - } - - /* Wait until the current round is more recent than the round we are in. */ - while (i > cr) - { - /* Wait for the current round to finish. */ - futex_wait_simple (&bar->current_round, cr, bar->shared); - /* See the fence below. */ - cr = atomic_load_relaxed (&bar->current_round); - } - - /* Our round finished. Use the acquire MO fence to synchronize-with the - thread that finished the round, either through the initial load of - CURRENT_ROUND above or a failed CAS in the loop above. */ - atomic_thread_fence_acquire (); - - /* Now signal that we left. */ - unsigned int o; - ready_to_leave: - /* We need release MO here so that our use of the barrier happens before - reset or memory reuse after pthread_barrier_destroy. */ - o = atomic_fetch_add_release (&bar->out, 1) + 1; - if (o == max_in_before_reset) - { - /* Perform a reset if we are the last pre-reset thread leaving. All - other threads accessing the barrier are post-reset threads and are - incrementing or spinning on IN. Thus, resetting IN as the last step - of reset ensures that the reset is not concurrent with actual use of - the barrier. We need the acquire MO fence so that the reset happens - after use of the barrier by all earlier pre-reset threads. */ - atomic_thread_fence_acquire (); - atomic_store_relaxed (&bar->current_round, 0); - atomic_store_relaxed (&bar->out, 0); - /* When destroying the barrier, we wait for a reset to happen. Thus, - we must load SHARED now so that this happens before the barrier is - destroyed. */ - int shared = bar->shared; - atomic_store_release (&bar->in, 0); - futex_wake (&bar->in, INT_MAX, shared); - - } - - /* Return a special value for exactly one thread per round. */ - return i % count == 0 ? PTHREAD_BARRIER_SERIAL_THREAD : 0; -} -weak_alias (__pthread_barrier_wait, pthread_barrier_wait) diff --git a/nptl/pthread_barrierattr_destroy.c b/nptl/pthread_barrierattr_destroy.c deleted file mode 100644 index 7da043b35d..0000000000 --- a/nptl/pthread_barrierattr_destroy.c +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" - - -int -pthread_barrierattr_destroy (pthread_barrierattr_t *attr) -{ - /* Nothing to do. */ - - return 0; -} diff --git a/nptl/pthread_barrierattr_getpshared.c b/nptl/pthread_barrierattr_getpshared.c deleted file mode 100644 index 62dc9bf0b0..0000000000 --- a/nptl/pthread_barrierattr_getpshared.c +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" - - -int -pthread_barrierattr_getpshared (const pthread_barrierattr_t *attr, - int *pshared) -{ - *pshared = ((const struct pthread_barrierattr *) attr)->pshared; - - return 0; -} diff --git a/nptl/pthread_barrierattr_init.c b/nptl/pthread_barrierattr_init.c deleted file mode 100644 index 796652ebe2..0000000000 --- a/nptl/pthread_barrierattr_init.c +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" - - -int -pthread_barrierattr_init (pthread_barrierattr_t *attr) -{ - ((struct pthread_barrierattr *) attr)->pshared = PTHREAD_PROCESS_PRIVATE; - - return 0; -} diff --git a/nptl/pthread_barrierattr_setpshared.c b/nptl/pthread_barrierattr_setpshared.c deleted file mode 100644 index 19604b4736..0000000000 --- a/nptl/pthread_barrierattr_setpshared.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include "pthreadP.h" -#include <futex-internal.h> - - -int -pthread_barrierattr_setpshared (pthread_barrierattr_t *attr, int pshared) -{ - int err = futex_supports_pshared (pshared); - if (err != 0) - return err; - - ((struct pthread_barrierattr *) attr)->pshared = pshared; - - return 0; -} diff --git a/nptl/pthread_cancel.c b/nptl/pthread_cancel.c deleted file mode 100644 index 231a58df18..0000000000 --- a/nptl/pthread_cancel.c +++ /dev/null @@ -1,103 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <signal.h> -#include <stdlib.h> -#include "pthreadP.h" -#include <atomic.h> -#include <sysdep.h> -#include <unistd.h> - -int -pthread_cancel (pthread_t th) -{ - volatile struct pthread *pd = (volatile struct pthread *) th; - - /* Make sure the descriptor is valid. */ - if (INVALID_TD_P (pd)) - /* Not a valid thread handle. */ - return ESRCH; - -#ifdef SHARED - pthread_cancel_init (); -#endif - int result = 0; - int oldval; - int newval; - do - { - again: - oldval = pd->cancelhandling; - newval = oldval | CANCELING_BITMASK | CANCELED_BITMASK; - - /* Avoid doing unnecessary work. The atomic operation can - potentially be expensive if the bug has to be locked and - remote cache lines have to be invalidated. */ - if (oldval == newval) - break; - - /* If the cancellation is handled asynchronously just send a - signal. We avoid this if possible since it's more - expensive. */ - if (CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS (newval)) - { - /* Mark the cancellation as "in progress". */ - if (atomic_compare_and_exchange_bool_acq (&pd->cancelhandling, - oldval | CANCELING_BITMASK, - oldval)) - goto again; - -#ifdef SIGCANCEL - /* The cancellation handler will take care of marking the - thread as canceled. */ - pid_t pid = getpid (); - - INTERNAL_SYSCALL_DECL (err); - int val = INTERNAL_SYSCALL_CALL (tgkill, err, pid, pd->tid, - SIGCANCEL); - if (INTERNAL_SYSCALL_ERROR_P (val, err)) - result = INTERNAL_SYSCALL_ERRNO (val, err); -#else - /* It should be impossible to get here at all, since - pthread_setcanceltype should never have allowed - PTHREAD_CANCEL_ASYNCHRONOUS to be set. */ - abort (); -#endif - - break; - } - - /* A single-threaded process should be able to kill itself, since - there is nothing in the POSIX specification that says that it - cannot. So we set multiple_threads to true so that cancellation - points get executed. */ - THREAD_SETMEM (THREAD_SELF, header.multiple_threads, 1); -#ifndef TLS_MULTIPLE_THREADS_IN_TCB - __pthread_multiple_threads = *__libc_multiple_threads_ptr = 1; -#endif - } - /* Mark the thread as canceled. This has to be done - atomically since other bits could be modified as well. */ - while (atomic_compare_and_exchange_bool_acq (&pd->cancelhandling, newval, - oldval)); - - return result; -} - -PTHREAD_STATIC_FN_REQUIRE (pthread_create) diff --git a/nptl/pthread_clock_gettime.c b/nptl/pthread_clock_gettime.c deleted file mode 100644 index c9abb61540..0000000000 --- a/nptl/pthread_clock_gettime.c +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (C) 2001-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdlib.h> -#include <time.h> -#include "pthreadP.h" - - -#if HP_TIMING_AVAIL -int -__pthread_clock_gettime (clockid_t clock_id, hp_timing_t freq, - struct timespec *tp) -{ - hp_timing_t tsc; - - /* Get the current counter. */ - HP_TIMING_NOW (tsc); - - /* This is the ID of the thread we are looking for. */ - pid_t tid = ((unsigned int) clock_id) >> CLOCK_IDFIELD_SIZE; - - /* Compute the offset since the start time of the process. */ - if (tid == 0 || tid == THREAD_GETMEM (THREAD_SELF, tid)) - /* Our own clock. */ - tsc -= THREAD_GETMEM (THREAD_SELF, cpuclock_offset); - else - { - /* This is more complicated. We have to locate the thread based - on the ID. This means walking the list of existing - threads. */ - struct pthread *thread = __find_thread_by_id (tid); - if (thread == NULL) - { - __set_errno (EINVAL); - return -1; - } - - /* There is a race here. The thread might terminate and the stack - become unusable. But this is the user's problem. */ - tsc -= thread->cpuclock_offset; - } - - /* Compute the seconds. */ - tp->tv_sec = tsc / freq; - - /* And the nanoseconds. This computation should be stable until - we get machines with about 16GHz frequency. */ - tp->tv_nsec = ((tsc % freq) * 1000000000ull) / freq; - - return 0; -} -#endif diff --git a/nptl/pthread_clock_settime.c b/nptl/pthread_clock_settime.c deleted file mode 100644 index f2722d9635..0000000000 --- a/nptl/pthread_clock_settime.c +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (C) 2001-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdlib.h> -#include <time.h> -#include "pthreadP.h" - - -#if HP_TIMING_AVAIL -int -__pthread_clock_settime (clockid_t clock_id, hp_timing_t offset) -{ - /* This is the ID of the thread we are looking for. */ - pid_t tid = ((unsigned int) clock_id) >> CLOCK_IDFIELD_SIZE; - - /* Compute the offset since the start time of the process. */ - if (tid == 0 || tid == THREAD_GETMEM (THREAD_SELF, tid)) - /* Our own clock. */ - THREAD_SETMEM (THREAD_SELF, cpuclock_offset, offset); - else - { - /* This is more complicated. We have to locate the thread based - on the ID. This means walking the list of existing - threads. */ - struct pthread *thread = __find_thread_by_id (tid); - if (thread == NULL) - { - __set_errno (EINVAL); - return -1; - } - - /* There is a race here. The thread might terminate and the stack - become unusable. But this is the user's problem. */ - thread->cpuclock_offset = offset; - } - - return 0; -} -#endif diff --git a/nptl/pthread_cond_broadcast.c b/nptl/pthread_cond_broadcast.c deleted file mode 100644 index be69451767..0000000000 --- a/nptl/pthread_cond_broadcast.c +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <endian.h> -#include <errno.h> -#include <sysdep.h> -#include <futex-internal.h> -#include <pthread.h> -#include <pthreadP.h> -#include <stap-probe.h> -#include <atomic.h> - -#include <shlib-compat.h> - -#include "pthread_cond_common.c" - - -/* We do the following steps from __pthread_cond_signal in one critical - section: (1) signal all waiters in G1, (2) close G1 so that it can become - the new G2 and make G2 the new G1, and (3) signal all waiters in the new - G1. We don't need to do all these steps if there are no waiters in G1 - and/or G2. See __pthread_cond_signal for further details. */ -int -__pthread_cond_broadcast (pthread_cond_t *cond) -{ - LIBC_PROBE (cond_broadcast, 1, cond); - - unsigned int wrefs = atomic_load_relaxed (&cond->__data.__wrefs); - if (wrefs >> 3 == 0) - return 0; - int private = __condvar_get_private (wrefs); - - __condvar_acquire_lock (cond, private); - - unsigned long long int wseq = __condvar_load_wseq_relaxed (cond); - unsigned int g2 = wseq & 1; - unsigned int g1 = g2 ^ 1; - wseq >>= 1; - bool do_futex_wake = false; - - /* Step (1): signal all waiters remaining in G1. */ - if (cond->__data.__g_size[g1] != 0) - { - /* Add as many signals as the remaining size of the group. */ - atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, - cond->__data.__g_size[g1] << 1); - cond->__data.__g_size[g1] = 0; - - /* We need to wake G1 waiters before we quiesce G1 below. */ - /* TODO Only set it if there are indeed futex waiters. We could - also try to move this out of the critical section in cases when - G2 is empty (and we don't need to quiesce). */ - futex_wake (cond->__data.__g_signals + g1, INT_MAX, private); - } - - /* G1 is complete. Step (2) is next unless there are no waiters in G2, in - which case we can stop. */ - if (__condvar_quiesce_and_switch_g1 (cond, wseq, &g1, private)) - { - /* Step (3): Send signals to all waiters in the old G2 / new G1. */ - atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, - cond->__data.__g_size[g1] << 1); - cond->__data.__g_size[g1] = 0; - /* TODO Only set it if there are indeed futex waiters. */ - do_futex_wake = true; - } - - __condvar_release_lock (cond, private); - - if (do_futex_wake) - futex_wake (cond->__data.__g_signals + g1, INT_MAX, private); - - return 0; -} - -versioned_symbol (libpthread, __pthread_cond_broadcast, pthread_cond_broadcast, - GLIBC_2_3_2); diff --git a/nptl/pthread_cond_common.c b/nptl/pthread_cond_common.c deleted file mode 100644 index ffbbde4106..0000000000 --- a/nptl/pthread_cond_common.c +++ /dev/null @@ -1,465 +0,0 @@ -/* pthread_cond_common -- shared code for condition variable. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <atomic.h> -#include <stdint.h> -#include <pthread.h> - -/* We need 3 least-significant bits on __wrefs for something else. */ -#define __PTHREAD_COND_MAX_GROUP_SIZE ((unsigned) 1 << 29) - -#if __HAVE_64B_ATOMICS == 1 - -static uint64_t __attribute__ ((unused)) -__condvar_load_wseq_relaxed (pthread_cond_t *cond) -{ - return atomic_load_relaxed (&cond->__data.__wseq); -} - -static uint64_t __attribute__ ((unused)) -__condvar_fetch_add_wseq_acquire (pthread_cond_t *cond, unsigned int val) -{ - return atomic_fetch_add_acquire (&cond->__data.__wseq, val); -} - -static uint64_t __attribute__ ((unused)) -__condvar_fetch_xor_wseq_release (pthread_cond_t *cond, unsigned int val) -{ - return atomic_fetch_xor_release (&cond->__data.__wseq, val); -} - -static uint64_t __attribute__ ((unused)) -__condvar_load_g1_start_relaxed (pthread_cond_t *cond) -{ - return atomic_load_relaxed (&cond->__data.__g1_start); -} - -static void __attribute__ ((unused)) -__condvar_add_g1_start_relaxed (pthread_cond_t *cond, unsigned int val) -{ - atomic_store_relaxed (&cond->__data.__g1_start, - atomic_load_relaxed (&cond->__data.__g1_start) + val); -} - -#else - -/* We use two 64b counters: __wseq and __g1_start. They are monotonically - increasing and single-writer-multiple-readers counters, so we can implement - load, fetch-and-add, and fetch-and-xor operations even when we just have - 32b atomics. Values we add or xor are less than or equal to 1<<31 (*), - so we only have to make overflow-and-addition atomic wrt. to concurrent - load operations and xor operations. To do that, we split each counter into - two 32b values of which we reserve the MSB of each to represent an - overflow from the lower-order half to the higher-order half. - - In the common case, the state is (higher-order / lower-order half, and . is - basically concatenation of the bits): - 0.h / 0.l = h.l - - When we add a value of x that overflows (i.e., 0.l + x == 1.L), we run the - following steps S1-S4 (the values these represent are on the right-hand - side): - S1: 0.h / 1.L == (h+1).L - S2: 1.(h+1) / 1.L == (h+1).L - S3: 1.(h+1) / 0.L == (h+1).L - S4: 0.(h+1) / 0.L == (h+1).L - If the LSB of the higher-order half is set, readers will ignore the - overflow bit in the lower-order half. - - To get an atomic snapshot in load operations, we exploit that the - higher-order half is monotonically increasing; if we load a value V from - it, then read the lower-order half, and then read the higher-order half - again and see the same value V, we know that both halves have existed in - the sequence of values the full counter had. This is similar to the - validated reads in the time-based STMs in GCC's libitm (e.g., - method_ml_wt). - - The xor operation needs to be an atomic read-modify-write. The write - itself is not an issue as it affects just the lower-order half but not bits - used in the add operation. To make the full fetch-and-xor atomic, we - exploit that concurrently, the value can increase by at most 1<<31 (*): The - xor operation is only called while having acquired the lock, so not more - than __PTHREAD_COND_MAX_GROUP_SIZE waiters can enter concurrently and thus - increment __wseq. Therefore, if the xor operation observes a value of - __wseq, then the value it applies the modification to later on can be - derived (see below). - - One benefit of this scheme is that this makes load operations - obstruction-free because unlike if we would just lock the counter, readers - can almost always interpret a snapshot of each halves. Readers can be - forced to read a new snapshot when the read is concurrent with an overflow. - However, overflows will happen infrequently, so load operations are - practically lock-free. - - (*) The highest value we add is __PTHREAD_COND_MAX_GROUP_SIZE << 2 to - __g1_start (the two extra bits are for the lock in the two LSBs of - __g1_start). */ - -typedef struct -{ - unsigned int low; - unsigned int high; -} _condvar_lohi; - -static uint64_t -__condvar_fetch_add_64_relaxed (_condvar_lohi *lh, unsigned int op) -{ - /* S1. Note that this is an atomic read-modify-write so it extends the - release sequence of release MO store at S3. */ - unsigned int l = atomic_fetch_add_relaxed (&lh->low, op); - unsigned int h = atomic_load_relaxed (&lh->high); - uint64_t result = ((uint64_t) h << 31) | l; - l += op; - if ((l >> 31) > 0) - { - /* Overflow. Need to increment higher-order half. Note that all - add operations are ordered in happens-before. */ - h++; - /* S2. Release MO to synchronize with the loads of the higher-order half - in the load operation. See __condvar_load_64_relaxed. */ - atomic_store_release (&lh->high, h | ((unsigned int) 1 << 31)); - l ^= (unsigned int) 1 << 31; - /* S3. See __condvar_load_64_relaxed. */ - atomic_store_release (&lh->low, l); - /* S4. Likewise. */ - atomic_store_release (&lh->high, h); - } - return result; -} - -static uint64_t -__condvar_load_64_relaxed (_condvar_lohi *lh) -{ - unsigned int h, l, h2; - do - { - /* This load and the second one below to the same location read from the - stores in the overflow handling of the add operation or the - initializing stores (which is a simple special case because - initialization always completely happens before further use). - Because no two stores to the higher-order half write the same value, - the loop ensures that if we continue to use the snapshot, this load - and the second one read from the same store operation. All candidate - store operations have release MO. - If we read from S2 in the first load, then we will see the value of - S1 on the next load (because we synchronize with S2), or a value - later in modification order. We correctly ignore the lower-half's - overflow bit in this case. If we read from S4, then we will see the - value of S3 in the next load (or a later value), which does not have - the overflow bit set anymore. - */ - h = atomic_load_acquire (&lh->high); - /* This will read from the release sequence of S3 (i.e, either the S3 - store or the read-modify-writes at S1 following S3 in modification - order). Thus, the read synchronizes with S3, and the following load - of the higher-order half will read from the matching S2 (or a later - value). - Thus, if we read a lower-half value here that already overflowed and - belongs to an increased higher-order half value, we will see the - latter and h and h2 will not be equal. */ - l = atomic_load_acquire (&lh->low); - /* See above. */ - h2 = atomic_load_relaxed (&lh->high); - } - while (h != h2); - if (((l >> 31) > 0) && ((h >> 31) > 0)) - l ^= (unsigned int) 1 << 31; - return ((uint64_t) (h & ~((unsigned int) 1 << 31)) << 31) + l; -} - -static uint64_t __attribute__ ((unused)) -__condvar_load_wseq_relaxed (pthread_cond_t *cond) -{ - return __condvar_load_64_relaxed ((_condvar_lohi *) &cond->__data.__wseq32); -} - -static uint64_t __attribute__ ((unused)) -__condvar_fetch_add_wseq_acquire (pthread_cond_t *cond, unsigned int val) -{ - uint64_t r = __condvar_fetch_add_64_relaxed - ((_condvar_lohi *) &cond->__data.__wseq32, val); - atomic_thread_fence_acquire (); - return r; -} - -static uint64_t __attribute__ ((unused)) -__condvar_fetch_xor_wseq_release (pthread_cond_t *cond, unsigned int val) -{ - _condvar_lohi *lh = (_condvar_lohi *) &cond->__data.__wseq32; - /* First, get the current value. See __condvar_load_64_relaxed. */ - unsigned int h, l, h2; - do - { - h = atomic_load_acquire (&lh->high); - l = atomic_load_acquire (&lh->low); - h2 = atomic_load_relaxed (&lh->high); - } - while (h != h2); - if (((l >> 31) > 0) && ((h >> 31) == 0)) - h++; - h &= ~((unsigned int) 1 << 31); - l &= ~((unsigned int) 1 << 31); - - /* Now modify. Due to the coherence rules, the prior load will read a value - earlier in modification order than the following fetch-xor. - This uses release MO to make the full operation have release semantics - (all other operations access the lower-order half). */ - unsigned int l2 = atomic_fetch_xor_release (&lh->low, val) - & ~((unsigned int) 1 << 31); - if (l2 < l) - /* The lower-order half overflowed in the meantime. This happened exactly - once due to the limit on concurrent waiters (see above). */ - h++; - return ((uint64_t) h << 31) + l2; -} - -static uint64_t __attribute__ ((unused)) -__condvar_load_g1_start_relaxed (pthread_cond_t *cond) -{ - return __condvar_load_64_relaxed - ((_condvar_lohi *) &cond->__data.__g1_start32); -} - -static void __attribute__ ((unused)) -__condvar_add_g1_start_relaxed (pthread_cond_t *cond, unsigned int val) -{ - ignore_value (__condvar_fetch_add_64_relaxed - ((_condvar_lohi *) &cond->__data.__g1_start32, val)); -} - -#endif /* !__HAVE_64B_ATOMICS */ - - -/* The lock that signalers use. See pthread_cond_wait_common for uses. - The lock is our normal three-state lock: not acquired (0) / acquired (1) / - acquired-with-futex_wake-request (2). However, we need to preserve the - other bits in the unsigned int used for the lock, and therefore it is a - little more complex. */ -static void __attribute__ ((unused)) -__condvar_acquire_lock (pthread_cond_t *cond, int private) -{ - unsigned int s = atomic_load_relaxed (&cond->__data.__g1_orig_size); - while ((s & 3) == 0) - { - if (atomic_compare_exchange_weak_acquire (&cond->__data.__g1_orig_size, - &s, s | 1)) - return; - /* TODO Spinning and back-off. */ - } - /* We can't change from not acquired to acquired, so try to change to - acquired-with-futex-wake-request and do a futex wait if we cannot change - from not acquired. */ - while (1) - { - while ((s & 3) != 2) - { - if (atomic_compare_exchange_weak_acquire - (&cond->__data.__g1_orig_size, &s, (s & ~(unsigned int) 3) | 2)) - { - if ((s & 3) == 0) - return; - break; - } - /* TODO Back off. */ - } - futex_wait_simple (&cond->__data.__g1_orig_size, - (s & ~(unsigned int) 3) | 2, private); - /* Reload so we see a recent value. */ - s = atomic_load_relaxed (&cond->__data.__g1_orig_size); - } -} - -/* See __condvar_acquire_lock. */ -static void __attribute__ ((unused)) -__condvar_release_lock (pthread_cond_t *cond, int private) -{ - if ((atomic_fetch_and_release (&cond->__data.__g1_orig_size, - ~(unsigned int) 3) & 3) - == 2) - futex_wake (&cond->__data.__g1_orig_size, 1, private); -} - -/* Only use this when having acquired the lock. */ -static unsigned int __attribute__ ((unused)) -__condvar_get_orig_size (pthread_cond_t *cond) -{ - return atomic_load_relaxed (&cond->__data.__g1_orig_size) >> 2; -} - -/* Only use this when having acquired the lock. */ -static void __attribute__ ((unused)) -__condvar_set_orig_size (pthread_cond_t *cond, unsigned int size) -{ - /* We have acquired the lock, but might get one concurrent update due to a - lock state change from acquired to acquired-with-futex_wake-request. - The store with relaxed MO is fine because there will be no further - changes to the lock bits nor the size, and we will subsequently release - the lock with release MO. */ - unsigned int s; - s = (atomic_load_relaxed (&cond->__data.__g1_orig_size) & 3) - | (size << 2); - if ((atomic_exchange_relaxed (&cond->__data.__g1_orig_size, s) & 3) - != (s & 3)) - atomic_store_relaxed (&cond->__data.__g1_orig_size, (size << 2) | 2); -} - -/* Returns FUTEX_SHARED or FUTEX_PRIVATE based on the provided __wrefs - value. */ -static int __attribute__ ((unused)) -__condvar_get_private (int flags) -{ - if ((flags & __PTHREAD_COND_SHARED_MASK) == 0) - return FUTEX_PRIVATE; - else - return FUTEX_SHARED; -} - -/* This closes G1 (whose index is in G1INDEX), waits for all futex waiters to - leave G1, converts G1 into a fresh G2, and then switches group roles so that - the former G2 becomes the new G1 ending at the current __wseq value when we - eventually make the switch (WSEQ is just an observation of __wseq by the - signaler). - If G2 is empty, it will not switch groups because then it would create an - empty G1 which would require switching groups again on the next signal. - Returns false iff groups were not switched because G2 was empty. */ -static bool __attribute__ ((unused)) -__condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq, - unsigned int *g1index, int private) -{ - const unsigned int maxspin = 0; - unsigned int g1 = *g1index; - - /* If there is no waiter in G2, we don't do anything. The expression may - look odd but remember that __g_size might hold a negative value, so - putting the expression this way avoids relying on implementation-defined - behavior. - Note that this works correctly for a zero-initialized condvar too. */ - unsigned int old_orig_size = __condvar_get_orig_size (cond); - uint64_t old_g1_start = __condvar_load_g1_start_relaxed (cond) >> 1; - if (((unsigned) (wseq - old_g1_start - old_orig_size) - + cond->__data.__g_size[g1 ^ 1]) == 0) - return false; - - /* Now try to close and quiesce G1. We have to consider the following kinds - of waiters: - * Waiters from less recent groups than G1 are not affected because - nothing will change for them apart from __g1_start getting larger. - * New waiters arriving concurrently with the group switching will all go - into G2 until we atomically make the switch. Waiters existing in G2 - are not affected. - * Waiters in G1 will be closed out immediately by setting a flag in - __g_signals, which will prevent waiters from blocking using a futex on - __g_signals and also notifies them that the group is closed. As a - result, they will eventually remove their group reference, allowing us - to close switch group roles. */ - - /* First, set the closed flag on __g_signals. This tells waiters that are - about to wait that they shouldn't do that anymore. This basically - serves as an advance notificaton of the upcoming change to __g1_start; - waiters interpret it as if __g1_start was larger than their waiter - sequence position. This allows us to change __g1_start after waiting - for all existing waiters with group references to leave, which in turn - makes recovery after stealing a signal simpler because it then can be - skipped if __g1_start indicates that the group is closed (otherwise, - we would have to recover always because waiters don't know how big their - groups are). Relaxed MO is fine. */ - atomic_fetch_or_relaxed (cond->__data.__g_signals + g1, 1); - - /* Wait until there are no group references anymore. The fetch-or operation - injects us into the modification order of __g_refs; release MO ensures - that waiters incrementing __g_refs after our fetch-or see the previous - changes to __g_signals and to __g1_start that had to happen before we can - switch this G1 and alias with an older group (we have two groups, so - aliasing requires switching group roles twice). Note that nobody else - can have set the wake-request flag, so we do not have to act upon it. - - Also note that it is harmless if older waiters or waiters from this G1 - get a group reference after we have quiesced the group because it will - remain closed for them either because of the closed flag in __g_signals - or the later update to __g1_start. New waiters will never arrive here - but instead continue to go into the still current G2. */ - unsigned r = atomic_fetch_or_release (cond->__data.__g_refs + g1, 0); - while ((r >> 1) > 0) - { - for (unsigned int spin = maxspin; ((r >> 1) > 0) && (spin > 0); spin--) - { - /* TODO Back off. */ - r = atomic_load_relaxed (cond->__data.__g_refs + g1); - } - if ((r >> 1) > 0) - { - /* There is still a waiter after spinning. Set the wake-request - flag and block. Relaxed MO is fine because this is just about - this futex word. */ - r = atomic_fetch_or_relaxed (cond->__data.__g_refs + g1, 1); - - if ((r >> 1) > 0) - futex_wait_simple (cond->__data.__g_refs + g1, r, private); - /* Reload here so we eventually see the most recent value even if we - do not spin. */ - r = atomic_load_relaxed (cond->__data.__g_refs + g1); - } - } - /* Acquire MO so that we synchronize with the release operation that waiters - use to decrement __g_refs and thus happen after the waiters we waited - for. */ - atomic_thread_fence_acquire (); - - /* Update __g1_start, which finishes closing this group. The value we add - will never be negative because old_orig_size can only be zero when we - switch groups the first time after a condvar was initialized, in which - case G1 will be at index 1 and we will add a value of 1. See above for - why this takes place after waiting for quiescence of the group. - Relaxed MO is fine because the change comes with no additional - constraints that others would have to observe. */ - __condvar_add_g1_start_relaxed (cond, - (old_orig_size << 1) + (g1 == 1 ? 1 : - 1)); - - /* Now reopen the group, thus enabling waiters to again block using the - futex controlled by __g_signals. Release MO so that observers that see - no signals (and thus can block) also see the write __g1_start and thus - that this is now a new group (see __pthread_cond_wait_common for the - matching acquire MO loads). */ - atomic_store_release (cond->__data.__g_signals + g1, 0); - - /* At this point, the old G1 is now a valid new G2 (but not in use yet). - No old waiter can neither grab a signal nor acquire a reference without - noticing that __g1_start is larger. - We can now publish the group switch by flipping the G2 index in __wseq. - Release MO so that this synchronizes with the acquire MO operation - waiters use to obtain a position in the waiter sequence. */ - wseq = __condvar_fetch_xor_wseq_release (cond, 1) >> 1; - g1 ^= 1; - *g1index ^= 1; - - /* These values are just observed by signalers, and thus protected by the - lock. */ - unsigned int orig_size = wseq - (old_g1_start + old_orig_size); - __condvar_set_orig_size (cond, orig_size); - /* Use and addition to not loose track of cancellations in what was - previously G2. */ - cond->__data.__g_size[g1] += orig_size; - - /* The new G1's size may be zero because of cancellations during its time - as G2. If this happens, there are no waiters that have to receive a - signal, so we do not need to add any and return false. */ - if (cond->__data.__g_size[g1] == 0) - return false; - - return true; -} diff --git a/nptl/pthread_cond_destroy.c b/nptl/pthread_cond_destroy.c deleted file mode 100644 index fc65dca78c..0000000000 --- a/nptl/pthread_cond_destroy.c +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <shlib-compat.h> -#include "pthreadP.h" -#include <stap-probe.h> -#include <atomic.h> -#include <futex-internal.h> - -#include "pthread_cond_common.c" - -/* See __pthread_cond_wait for a high-level description of the algorithm. - - A correct program must make sure that no waiters are blocked on the condvar - when it is destroyed, and that there are no concurrent signals or - broadcasts. To wake waiters reliably, the program must signal or - broadcast while holding the mutex or after having held the mutex. It must - also ensure that no signal or broadcast are still pending to unblock - waiters; IOW, because waiters can wake up spuriously, the program must - effectively ensure that destruction happens after the execution of those - signal or broadcast calls. - Thus, we can assume that all waiters that are still accessing the condvar - have been woken. We wait until they have confirmed to have woken up by - decrementing __wrefs. */ -int -__pthread_cond_destroy (pthread_cond_t *cond) -{ - LIBC_PROBE (cond_destroy, 1, cond); - - /* Set the wake request flag. We could also spin, but destruction that is - concurrent with still-active waiters is probably neither common nor - performance critical. Acquire MO to synchronize with waiters confirming - that they finished. */ - unsigned int wrefs = atomic_fetch_or_acquire (&cond->__data.__wrefs, 4); - int private = __condvar_get_private (wrefs); - while (wrefs >> 3 != 0) - { - futex_wait_simple (&cond->__data.__wrefs, wrefs, private); - /* See above. */ - wrefs = atomic_load_acquire (&cond->__data.__wrefs); - } - /* The memory the condvar occupies can now be reused. */ - return 0; -} -versioned_symbol (libpthread, __pthread_cond_destroy, - pthread_cond_destroy, GLIBC_2_3_2); diff --git a/nptl/pthread_cond_init.c b/nptl/pthread_cond_init.c deleted file mode 100644 index 0387f00ad0..0000000000 --- a/nptl/pthread_cond_init.c +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <shlib-compat.h> -#include "pthreadP.h" -#include <stap-probe.h> -#include <string.h> - - -/* See __pthread_cond_wait for details. */ -int -__pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *cond_attr) -{ - struct pthread_condattr *icond_attr = (struct pthread_condattr *) cond_attr; - - memset (cond, 0, sizeof (pthread_cond_t)); - - /* Update the pretty printers if the internal representation of icond_attr - is changed. */ - - /* Iff not equal to ~0l, this is a PTHREAD_PROCESS_PRIVATE condvar. */ - if (icond_attr != NULL && (icond_attr->value & 1) != 0) - cond->__data.__wrefs |= __PTHREAD_COND_SHARED_MASK; - int clockid = (icond_attr != NULL - ? ((icond_attr->value >> 1) & ((1 << COND_CLOCK_BITS) - 1)) - : CLOCK_REALTIME); - /* If 0, CLOCK_REALTIME is used; CLOCK_MONOTONIC otherwise. */ - if (clockid != CLOCK_REALTIME) - cond->__data.__wrefs |= __PTHREAD_COND_CLOCK_MONOTONIC_MASK; - - LIBC_PROBE (cond_init, 2, cond, cond_attr); - - return 0; -} -versioned_symbol (libpthread, __pthread_cond_init, - pthread_cond_init, GLIBC_2_3_2); diff --git a/nptl/pthread_cond_signal.c b/nptl/pthread_cond_signal.c deleted file mode 100644 index db0698c66c..0000000000 --- a/nptl/pthread_cond_signal.c +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <endian.h> -#include <errno.h> -#include <sysdep.h> -#include <futex-internal.h> -#include <pthread.h> -#include <pthreadP.h> -#include <atomic.h> -#include <stdint.h> - -#include <shlib-compat.h> -#include <stap-probe.h> - -#include "pthread_cond_common.c" - -/* See __pthread_cond_wait for a high-level description of the algorithm. */ -int -__pthread_cond_signal (pthread_cond_t *cond) -{ - LIBC_PROBE (cond_signal, 1, cond); - - /* First check whether there are waiters. Relaxed MO is fine for that for - the same reasons that relaxed MO is fine when observing __wseq (see - below). */ - unsigned int wrefs = atomic_load_relaxed (&cond->__data.__wrefs); - if (wrefs >> 3 == 0) - return 0; - int private = __condvar_get_private (wrefs); - - __condvar_acquire_lock (cond, private); - - /* Load the waiter sequence number, which represents our relative ordering - to any waiters. Relaxed MO is sufficient for that because: - 1) We can pick any position that is allowed by external happens-before - constraints. In particular, if another __pthread_cond_wait call - happened before us, this waiter must be eligible for being woken by - us. The only way do establish such a happens-before is by signaling - while having acquired the mutex associated with the condvar and - ensuring that the signal's critical section happens after the waiter. - Thus, the mutex ensures that we see that waiter's __wseq increase. - 2) Once we pick a position, we do not need to communicate this to the - program via a happens-before that we set up: First, any wake-up could - be a spurious wake-up, so the program must not interpret a wake-up as - an indication that the waiter happened before a particular signal; - second, a program cannot detect whether a waiter has not yet been - woken (i.e., it cannot distinguish between a non-woken waiter and one - that has been woken but hasn't resumed execution yet), and thus it - cannot try to deduce that a signal happened before a particular - waiter. */ - unsigned long long int wseq = __condvar_load_wseq_relaxed (cond); - unsigned int g1 = (wseq & 1) ^ 1; - wseq >>= 1; - bool do_futex_wake = false; - - /* If G1 is still receiving signals, we put the signal there. If not, we - check if G2 has waiters, and if so, quiesce and switch G1 to the former - G2; if this results in a new G1 with waiters (G2 might have cancellations - already, see __condvar_quiesce_and_switch_g1), we put the signal in the - new G1. */ - if ((cond->__data.__g_size[g1] != 0) - || __condvar_quiesce_and_switch_g1 (cond, wseq, &g1, private)) - { - /* Add a signal. Relaxed MO is fine because signaling does not need to - establish a happens-before relation (see above). We do not mask the - release-MO store when initializing a group in - __condvar_quiesce_and_switch_g1 because we use an atomic - read-modify-write and thus extend that store's release sequence. */ - atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, 2); - cond->__data.__g_size[g1]--; - /* TODO Only set it if there are indeed futex waiters. */ - do_futex_wake = true; - } - - __condvar_release_lock (cond, private); - - if (do_futex_wake) - futex_wake (cond->__data.__g_signals + g1, 1, private); - - return 0; -} - -versioned_symbol (libpthread, __pthread_cond_signal, pthread_cond_signal, - GLIBC_2_3_2); diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c deleted file mode 100644 index 7812b94a3a..0000000000 --- a/nptl/pthread_cond_wait.c +++ /dev/null @@ -1,673 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <endian.h> -#include <errno.h> -#include <sysdep.h> -#include <futex-internal.h> -#include <pthread.h> -#include <pthreadP.h> -#include <sys/time.h> -#include <atomic.h> -#include <stdint.h> -#include <stdbool.h> - -#include <shlib-compat.h> -#include <stap-probe.h> -#include <time.h> - -#include "pthread_cond_common.c" - - -struct _condvar_cleanup_buffer -{ - uint64_t wseq; - pthread_cond_t *cond; - pthread_mutex_t *mutex; - int private; -}; - - -/* Decrease the waiter reference count. */ -static void -__condvar_confirm_wakeup (pthread_cond_t *cond, int private) -{ - /* If destruction is pending (i.e., the wake-request flag is nonzero) and we - are the last waiter (prior value of __wrefs was 1 << 3), then wake any - threads waiting in pthread_cond_destroy. Release MO to synchronize with - these threads. Don't bother clearing the wake-up request flag. */ - if ((atomic_fetch_add_release (&cond->__data.__wrefs, -8) >> 2) == 3) - futex_wake (&cond->__data.__wrefs, INT_MAX, private); -} - - -/* Cancel waiting after having registered as a waiter previously. SEQ is our - position and G is our group index. - The goal of cancellation is to make our group smaller if that is still - possible. If we are in a closed group, this is not possible anymore; in - this case, we need to send a replacement signal for the one we effectively - consumed because the signal should have gotten consumed by another waiter - instead; we must not both cancel waiting and consume a signal. - - Must not be called while still holding a reference on the group. - - Returns true iff we consumed a signal. - - On some kind of timeouts, we may be able to pretend that a signal we - effectively consumed happened before the timeout (i.e., similarly to first - spinning on signals before actually checking whether the timeout has - passed already). Doing this would allow us to skip sending a replacement - signal, but this case might happen rarely because the end of the timeout - must race with someone else sending a signal. Therefore, we don't bother - trying to optimize this. */ -static void -__condvar_cancel_waiting (pthread_cond_t *cond, uint64_t seq, unsigned int g, - int private) -{ - bool consumed_signal = false; - - /* No deadlock with group switching is possible here because we have do - not hold a reference on the group. */ - __condvar_acquire_lock (cond, private); - - uint64_t g1_start = __condvar_load_g1_start_relaxed (cond) >> 1; - if (g1_start > seq) - { - /* Our group is closed, so someone provided enough signals for it. - Thus, we effectively consumed a signal. */ - consumed_signal = true; - } - else - { - if (g1_start + __condvar_get_orig_size (cond) <= seq) - { - /* We are in the current G2 and thus cannot have consumed a signal. - Reduce its effective size or handle overflow. Remember that in - G2, unsigned int size is zero or a negative value. */ - if (cond->__data.__g_size[g] + __PTHREAD_COND_MAX_GROUP_SIZE > 0) - { - cond->__data.__g_size[g]--; - } - else - { - /* Cancellations would overflow the maximum group size. Just - wake up everyone spuriously to create a clean state. This - also means we do not consume a signal someone else sent. */ - __condvar_release_lock (cond, private); - __pthread_cond_broadcast (cond); - return; - } - } - else - { - /* We are in current G1. If the group's size is zero, someone put - a signal in the group that nobody else but us can consume. */ - if (cond->__data.__g_size[g] == 0) - consumed_signal = true; - else - { - /* Otherwise, we decrease the size of the group. This is - equivalent to atomically putting in a signal just for us and - consuming it right away. We do not consume a signal sent - by someone else. We also cannot have consumed a futex - wake-up because if we were cancelled or timed out in a futex - call, the futex will wake another waiter. */ - cond->__data.__g_size[g]--; - } - } - } - - __condvar_release_lock (cond, private); - - if (consumed_signal) - { - /* We effectively consumed a signal even though we didn't want to. - Therefore, we need to send a replacement signal. - If we would want to optimize this, we could do what - pthread_cond_signal does right in the critical section above. */ - __pthread_cond_signal (cond); - } -} - -/* Wake up any signalers that might be waiting. */ -static void -__condvar_dec_grefs (pthread_cond_t *cond, unsigned int g, int private) -{ - /* Release MO to synchronize-with the acquire load in - __condvar_quiesce_and_switch_g1. */ - if (atomic_fetch_add_release (cond->__data.__g_refs + g, -2) == 3) - { - /* Clear the wake-up request flag before waking up. We do not need more - than relaxed MO and it doesn't matter if we apply this for an aliased - group because we wake all futex waiters right after clearing the - flag. */ - atomic_fetch_and_relaxed (cond->__data.__g_refs + g, ~(unsigned int) 1); - futex_wake (cond->__data.__g_refs + g, INT_MAX, private); - } -} - -/* Clean-up for cancellation of waiters waiting for normal signals. We cancel - our registration as a waiter, confirm we have woken up, and re-acquire the - mutex. */ -static void -__condvar_cleanup_waiting (void *arg) -{ - struct _condvar_cleanup_buffer *cbuffer = - (struct _condvar_cleanup_buffer *) arg; - pthread_cond_t *cond = cbuffer->cond; - unsigned g = cbuffer->wseq & 1; - - __condvar_dec_grefs (cond, g, cbuffer->private); - - __condvar_cancel_waiting (cond, cbuffer->wseq >> 1, g, cbuffer->private); - /* FIXME With the current cancellation implementation, it is possible that - a thread is cancelled after it has returned from a syscall. This could - result in a cancelled waiter consuming a futex wake-up that is then - causing another waiter in the same group to not wake up. To work around - this issue until we have fixed cancellation, just add a futex wake-up - conservatively. */ - futex_wake (cond->__data.__g_signals + g, 1, cbuffer->private); - - __condvar_confirm_wakeup (cond, cbuffer->private); - - /* XXX If locking the mutex fails, should we just stop execution? This - might be better than silently ignoring the error. */ - __pthread_mutex_cond_lock (cbuffer->mutex); -} - -/* This condvar implementation guarantees that all calls to signal and - broadcast and all of the three virtually atomic parts of each call to wait - (i.e., (1) releasing the mutex and blocking, (2) unblocking, and (3) re- - acquiring the mutex) happen in some total order that is consistent with the - happens-before relations in the calling program. However, this order does - not necessarily result in additional happens-before relations being - established (which aligns well with spurious wake-ups being allowed). - - All waiters acquire a certain position in a 64b waiter sequence (__wseq). - This sequence determines which waiters are allowed to consume signals. - A broadcast is equal to sending as many signals as are unblocked waiters. - When a signal arrives, it samples the current value of __wseq with a - relaxed-MO load (i.e., the position the next waiter would get). (This is - sufficient because it is consistent with happens-before; the caller can - enforce stronger ordering constraints by calling signal while holding the - mutex.) Only waiters with a position less than the __wseq value observed - by the signal are eligible to consume this signal. - - This would be straight-forward to implement if waiters would just spin but - we need to let them block using futexes. Futexes give no guarantee of - waking in FIFO order, so we cannot reliably wake eligible waiters if we - just use a single futex. Also, futex words are 32b in size, but we need - to distinguish more than 1<<32 states because we need to represent the - order of wake-up (and thus which waiters are eligible to consume signals); - blocking in a futex is not atomic with a waiter determining its position in - the waiter sequence, so we need the futex word to reliably notify waiters - that they should not attempt to block anymore because they have been - already signaled in the meantime. While an ABA issue on a 32b value will - be rare, ignoring it when we are aware of it is not the right thing to do - either. - - Therefore, we use a 64b counter to represent the waiter sequence (on - architectures which only support 32b atomics, we use a few bits less). - To deal with the blocking using futexes, we maintain two groups of waiters: - * Group G1 consists of waiters that are all eligible to consume signals; - incoming signals will always signal waiters in this group until all - waiters in G1 have been signaled. - * Group G2 consists of waiters that arrive when a G1 is present and still - contains waiters that have not been signaled. When all waiters in G1 - are signaled and a new signal arrives, the new signal will convert G2 - into the new G1 and create a new G2 for future waiters. - - We cannot allocate new memory because of process-shared condvars, so we - have just two slots of groups that change their role between G1 and G2. - Each has a separate futex word, a number of signals available for - consumption, a size (number of waiters in the group that have not been - signaled), and a reference count. - - The group reference count is used to maintain the number of waiters that - are using the group's futex. Before a group can change its role, the - reference count must show that no waiters are using the futex anymore; this - prevents ABA issues on the futex word. - - To represent which intervals in the waiter sequence the groups cover (and - thus also which group slot contains G1 or G2), we use a 64b counter to - designate the start position of G1 (inclusive), and a single bit in the - waiter sequence counter to represent which group slot currently contains - G2. This allows us to switch group roles atomically wrt. waiters obtaining - a position in the waiter sequence. The G1 start position allows waiters to - figure out whether they are in a group that has already been completely - signaled (i.e., if the current G1 starts at a later position that the - waiter's position). Waiters cannot determine whether they are currently - in G2 or G1 -- but they do not have too because all they are interested in - is whether there are available signals, and they always start in G2 (whose - group slot they know because of the bit in the waiter sequence. Signalers - will simply fill the right group until it is completely signaled and can - be closed (they do not switch group roles until they really have to to - decrease the likelihood of having to wait for waiters still holding a - reference on the now-closed G1). - - Signalers maintain the initial size of G1 to be able to determine where - G2 starts (G2 is always open-ended until it becomes G1). They track the - remaining size of a group; when waiters cancel waiting (due to PThreads - cancellation or timeouts), they will decrease this remaining size as well. - - To implement condvar destruction requirements (i.e., that - pthread_cond_destroy can be called as soon as all waiters have been - signaled), waiters increment a reference count before starting to wait and - decrement it after they stopped waiting but right before they acquire the - mutex associated with the condvar. - - pthread_cond_t thus consists of the following (bits that are used for - flags and are not part of the primary value of each field but necessary - to make some things atomic or because there was no space for them - elsewhere in the data structure): - - __wseq: Waiter sequence counter - * LSB is index of current G2. - * Waiters fetch-add while having acquire the mutex associated with the - condvar. Signalers load it and fetch-xor it concurrently. - __g1_start: Starting position of G1 (inclusive) - * LSB is index of current G2. - * Modified by signalers while having acquired the condvar-internal lock - and observed concurrently by waiters. - __g1_orig_size: Initial size of G1 - * The two least-significant bits represent the condvar-internal lock. - * Only accessed while having acquired the condvar-internal lock. - __wrefs: Waiter reference counter. - * Bit 2 is true if waiters should run futex_wake when they remove the - last reference. pthread_cond_destroy uses this as futex word. - * Bit 1 is the clock ID (0 == CLOCK_REALTIME, 1 == CLOCK_MONOTONIC). - * Bit 0 is true iff this is a process-shared condvar. - * Simple reference count used by both waiters and pthread_cond_destroy. - (If the format of __wrefs is changed, update nptl_lock_constants.pysym - and the pretty printers.) - For each of the two groups, we have: - __g_refs: Futex waiter reference count. - * LSB is true if waiters should run futex_wake when they remove the - last reference. - * Reference count used by waiters concurrently with signalers that have - acquired the condvar-internal lock. - __g_signals: The number of signals that can still be consumed. - * Used as a futex word by waiters. Used concurrently by waiters and - signalers. - * LSB is true iff this group has been completely signaled (i.e., it is - closed). - __g_size: Waiters remaining in this group (i.e., which have not been - signaled yet. - * Accessed by signalers and waiters that cancel waiting (both do so only - when having acquired the condvar-internal lock. - * The size of G2 is always zero because it cannot be determined until - the group becomes G1. - * Although this is of unsigned type, we rely on using unsigned overflow - rules to make this hold effectively negative values too (in - particular, when waiters in G2 cancel waiting). - - A PTHREAD_COND_INITIALIZER condvar has all fields set to zero, which yields - a condvar that has G2 starting at position 0 and a G1 that is closed. - - Because waiters do not claim ownership of a group right when obtaining a - position in __wseq but only reference count the group when using futexes - to block, it can happen that a group gets closed before a waiter can - increment the reference count. Therefore, waiters have to check whether - their group is already closed using __g1_start. They also have to perform - this check when spinning when trying to grab a signal from __g_signals. - Note that for these checks, using relaxed MO to load __g1_start is - sufficient because if a waiter can see a sufficiently large value, it could - have also consume a signal in the waiters group. - - Waiters try to grab a signal from __g_signals without holding a reference - count, which can lead to stealing a signal from a more recent group after - their own group was already closed. They cannot always detect whether they - in fact did because they do not know when they stole, but they can - conservatively add a signal back to the group they stole from; if they - did so unnecessarily, all that happens is a spurious wake-up. To make this - even less likely, __g1_start contains the index of the current g2 too, - which allows waiters to check if there aliasing on the group slots; if - there wasn't, they didn't steal from the current G1, which means that the - G1 they stole from must have been already closed and they do not need to - fix anything. - - It is essential that the last field in pthread_cond_t is __g_signals[1]: - The previous condvar used a pointer-sized field in pthread_cond_t, so a - PTHREAD_COND_INITIALIZER from that condvar implementation might only - initialize 4 bytes to zero instead of the 8 bytes we need (i.e., 44 bytes - in total instead of the 48 we need). __g_signals[1] is not accessed before - the first group switch (G2 starts at index 0), which will set its value to - zero after a harmless fetch-or whose return value is ignored. This - effectively completes initialization. - - - Limitations: - * This condvar isn't designed to allow for more than - __PTHREAD_COND_MAX_GROUP_SIZE * (1 << 31) calls to __pthread_cond_wait. - * More than __PTHREAD_COND_MAX_GROUP_SIZE concurrent waiters are not - supported. - * Beyond what is allowed as errors by POSIX or documented, we can also - return the following errors: - * EPERM if MUTEX is a recursive mutex and the caller doesn't own it. - * EOWNERDEAD or ENOTRECOVERABLE when using robust mutexes. Unlike - for other errors, this can happen when we re-acquire the mutex; this - isn't allowed by POSIX (which requires all errors to virtually happen - before we release the mutex or change the condvar state), but there's - nothing we can do really. - * When using PTHREAD_MUTEX_PP_* mutexes, we can also return all errors - returned by __pthread_tpp_change_priority. We will already have - released the mutex in such cases, so the caller cannot expect to own - MUTEX. - - Other notes: - * Instead of the normal mutex unlock / lock functions, we use - __pthread_mutex_unlock_usercnt(m, 0) / __pthread_mutex_cond_lock(m) - because those will not change the mutex-internal users count, so that it - can be detected when a condvar is still associated with a particular - mutex because there is a waiter blocked on this condvar using this mutex. -*/ -static __always_inline int -__pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex, - const struct timespec *abstime) -{ - const int maxspin = 0; - int err; - int result = 0; - - LIBC_PROBE (cond_wait, 2, cond, mutex); - - /* Acquire a position (SEQ) in the waiter sequence (WSEQ). We use an - atomic operation because signals and broadcasts may update the group - switch without acquiring the mutex. We do not need release MO here - because we do not need to establish any happens-before relation with - signalers (see __pthread_cond_signal); modification order alone - establishes a total order of waiters/signals. We do need acquire MO - to synchronize with group reinitialization in - __condvar_quiesce_and_switch_g1. */ - uint64_t wseq = __condvar_fetch_add_wseq_acquire (cond, 2); - /* Find our group's index. We always go into what was G2 when we acquired - our position. */ - unsigned int g = wseq & 1; - uint64_t seq = wseq >> 1; - - /* Increase the waiter reference count. Relaxed MO is sufficient because - we only need to synchronize when decrementing the reference count. */ - unsigned int flags = atomic_fetch_add_relaxed (&cond->__data.__wrefs, 8); - int private = __condvar_get_private (flags); - - /* Now that we are registered as a waiter, we can release the mutex. - Waiting on the condvar must be atomic with releasing the mutex, so if - the mutex is used to establish a happens-before relation with any - signaler, the waiter must be visible to the latter; thus, we release the - mutex after registering as waiter. - If releasing the mutex fails, we just cancel our registration as a - waiter and confirm that we have woken up. */ - err = __pthread_mutex_unlock_usercnt (mutex, 0); - if (__glibc_unlikely (err != 0)) - { - __condvar_cancel_waiting (cond, seq, g, private); - __condvar_confirm_wakeup (cond, private); - return err; - } - - /* Now wait until a signal is available in our group or it is closed. - Acquire MO so that if we observe a value of zero written after group - switching in __condvar_quiesce_and_switch_g1, we synchronize with that - store and will see the prior update of __g1_start done while switching - groups too. */ - unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g); - - do - { - while (1) - { - /* Spin-wait first. - Note that spinning first without checking whether a timeout - passed might lead to what looks like a spurious wake-up even - though we should return ETIMEDOUT (e.g., if the caller provides - an absolute timeout that is clearly in the past). However, - (1) spurious wake-ups are allowed, (2) it seems unlikely that a - user will (ab)use pthread_cond_wait as a check for whether a - point in time is in the past, and (3) spinning first without - having to compare against the current time seems to be the right - choice from a performance perspective for most use cases. */ - unsigned int spin = maxspin; - while (signals == 0 && spin > 0) - { - /* Check that we are not spinning on a group that's already - closed. */ - if (seq < (__condvar_load_g1_start_relaxed (cond) >> 1)) - goto done; - - /* TODO Back off. */ - - /* Reload signals. See above for MO. */ - signals = atomic_load_acquire (cond->__data.__g_signals + g); - spin--; - } - - /* If our group will be closed as indicated by the flag on signals, - don't bother grabbing a signal. */ - if (signals & 1) - goto done; - - /* If there is an available signal, don't block. */ - if (signals != 0) - break; - - /* No signals available after spinning, so prepare to block. - We first acquire a group reference and use acquire MO for that so - that we synchronize with the dummy read-modify-write in - __condvar_quiesce_and_switch_g1 if we read from that. In turn, - in this case this will make us see the closed flag on __g_signals - that designates a concurrent attempt to reuse the group's slot. - We use acquire MO for the __g_signals check to make the - __g1_start check work (see spinning above). - Note that the group reference acquisition will not mask the - release MO when decrementing the reference count because we use - an atomic read-modify-write operation and thus extend the release - sequence. */ - atomic_fetch_add_acquire (cond->__data.__g_refs + g, 2); - if (((atomic_load_acquire (cond->__data.__g_signals + g) & 1) != 0) - || (seq < (__condvar_load_g1_start_relaxed (cond) >> 1))) - { - /* Our group is closed. Wake up any signalers that might be - waiting. */ - __condvar_dec_grefs (cond, g, private); - goto done; - } - - // Now block. - struct _pthread_cleanup_buffer buffer; - struct _condvar_cleanup_buffer cbuffer; - cbuffer.wseq = wseq; - cbuffer.cond = cond; - cbuffer.mutex = mutex; - cbuffer.private = private; - __pthread_cleanup_push (&buffer, __condvar_cleanup_waiting, &cbuffer); - - if (abstime == NULL) - { - /* Block without a timeout. */ - err = futex_wait_cancelable ( - cond->__data.__g_signals + g, 0, private); - } - else - { - /* Block, but with a timeout. - Work around the fact that the kernel rejects negative timeout - values despite them being valid. */ - if (__glibc_unlikely (abstime->tv_sec < 0)) - err = ETIMEDOUT; - - else if ((flags & __PTHREAD_COND_CLOCK_MONOTONIC_MASK) != 0) - { - /* CLOCK_MONOTONIC is requested. */ - struct timespec rt; - if (__clock_gettime (CLOCK_MONOTONIC, &rt) != 0) - __libc_fatal ("clock_gettime does not support " - "CLOCK_MONOTONIC"); - /* Convert the absolute timeout value to a relative - timeout. */ - rt.tv_sec = abstime->tv_sec - rt.tv_sec; - rt.tv_nsec = abstime->tv_nsec - rt.tv_nsec; - if (rt.tv_nsec < 0) - { - rt.tv_nsec += 1000000000; - --rt.tv_sec; - } - /* Did we already time out? */ - if (__glibc_unlikely (rt.tv_sec < 0)) - err = ETIMEDOUT; - else - err = futex_reltimed_wait_cancelable - (cond->__data.__g_signals + g, 0, &rt, private); - } - else - { - /* Use CLOCK_REALTIME. */ - err = futex_abstimed_wait_cancelable - (cond->__data.__g_signals + g, 0, abstime, private); - } - } - - __pthread_cleanup_pop (&buffer, 0); - - if (__glibc_unlikely (err == ETIMEDOUT)) - { - __condvar_dec_grefs (cond, g, private); - /* If we timed out, we effectively cancel waiting. Note that - we have decremented __g_refs before cancellation, so that a - deadlock between waiting for quiescence of our group in - __condvar_quiesce_and_switch_g1 and us trying to acquire - the lock during cancellation is not possible. */ - __condvar_cancel_waiting (cond, seq, g, private); - result = ETIMEDOUT; - goto done; - } - else - __condvar_dec_grefs (cond, g, private); - - /* Reload signals. See above for MO. */ - signals = atomic_load_acquire (cond->__data.__g_signals + g); - } - - } - /* Try to grab a signal. Use acquire MO so that we see an up-to-date value - of __g1_start below (see spinning above for a similar case). In - particular, if we steal from a more recent group, we will also see a - more recent __g1_start below. */ - while (!atomic_compare_exchange_weak_acquire (cond->__data.__g_signals + g, - &signals, signals - 2)); - - /* We consumed a signal but we could have consumed from a more recent group - that aliased with ours due to being in the same group slot. If this - might be the case our group must be closed as visible through - __g1_start. */ - uint64_t g1_start = __condvar_load_g1_start_relaxed (cond); - if (seq < (g1_start >> 1)) - { - /* We potentially stole a signal from a more recent group but we do not - know which group we really consumed from. - We do not care about groups older than current G1 because they are - closed; we could have stolen from these, but then we just add a - spurious wake-up for the current groups. - We will never steal a signal from current G2 that was really intended - for G2 because G2 never receives signals (until it becomes G1). We - could have stolen a signal from G2 that was conservatively added by a - previous waiter that also thought it stole a signal -- but given that - that signal was added unnecessarily, it's not a problem if we steal - it. - Thus, the remaining case is that we could have stolen from the current - G1, where "current" means the __g1_start value we observed. However, - if the current G1 does not have the same slot index as we do, we did - not steal from it and do not need to undo that. This is the reason - for putting a bit with G2's index into__g1_start as well. */ - if (((g1_start & 1) ^ 1) == g) - { - /* We have to conservatively undo our potential mistake of stealing - a signal. We can stop trying to do that when the current G1 - changes because other spinning waiters will notice this too and - __condvar_quiesce_and_switch_g1 has checked that there are no - futex waiters anymore before switching G1. - Relaxed MO is fine for the __g1_start load because we need to - merely be able to observe this fact and not have to observe - something else as well. - ??? Would it help to spin for a little while to see whether the - current G1 gets closed? This might be worthwhile if the group is - small or close to being closed. */ - unsigned int s = atomic_load_relaxed (cond->__data.__g_signals + g); - while (__condvar_load_g1_start_relaxed (cond) == g1_start) - { - /* Try to add a signal. We don't need to acquire the lock - because at worst we can cause a spurious wake-up. If the - group is in the process of being closed (LSB is true), this - has an effect similar to us adding a signal. */ - if (((s & 1) != 0) - || atomic_compare_exchange_weak_relaxed - (cond->__data.__g_signals + g, &s, s + 2)) - { - /* If we added a signal, we also need to add a wake-up on - the futex. We also need to do that if we skipped adding - a signal because the group is being closed because - while __condvar_quiesce_and_switch_g1 could have closed - the group, it might stil be waiting for futex waiters to - leave (and one of those waiters might be the one we stole - the signal from, which cause it to block using the - futex). */ - futex_wake (cond->__data.__g_signals + g, 1, private); - break; - } - /* TODO Back off. */ - } - } - } - - done: - - /* Confirm that we have been woken. We do that before acquiring the mutex - to allow for execution of pthread_cond_destroy while having acquired the - mutex. */ - __condvar_confirm_wakeup (cond, private); - - /* Woken up; now re-acquire the mutex. If this doesn't fail, return RESULT, - which is set to ETIMEDOUT if a timeout occured, or zero otherwise. */ - err = __pthread_mutex_cond_lock (mutex); - /* XXX Abort on errors that are disallowed by POSIX? */ - return (err != 0) ? err : result; -} - - -/* See __pthread_cond_wait_common. */ -int -__pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex) -{ - return __pthread_cond_wait_common (cond, mutex, NULL); -} - -/* See __pthread_cond_wait_common. */ -int -__pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex, - const struct timespec *abstime) -{ - /* Check parameter validity. This should also tell the compiler that - it can assume that abstime is not NULL. */ - if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000) - return EINVAL; - return __pthread_cond_wait_common (cond, mutex, abstime); -} - -versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait, - GLIBC_2_3_2); -versioned_symbol (libpthread, __pthread_cond_timedwait, pthread_cond_timedwait, - GLIBC_2_3_2); diff --git a/nptl/pthread_condattr_destroy.c b/nptl/pthread_condattr_destroy.c deleted file mode 100644 index 3dffac1b23..0000000000 --- a/nptl/pthread_condattr_destroy.c +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" - - -int -__pthread_condattr_destroy (pthread_condattr_t *attr) -{ - /* Nothing to be done. */ - return 0; -} -strong_alias (__pthread_condattr_destroy, pthread_condattr_destroy) diff --git a/nptl/pthread_condattr_getclock.c b/nptl/pthread_condattr_getclock.c deleted file mode 100644 index 96026e8ac5..0000000000 --- a/nptl/pthread_condattr_getclock.c +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" - - -int -pthread_condattr_getclock (const pthread_condattr_t *attr, clockid_t *clock_id) -{ - *clock_id = (((((const struct pthread_condattr *) attr)->value) >> 1) - & ((1 << COND_CLOCK_BITS) - 1)); - return 0; -} diff --git a/nptl/pthread_condattr_getpshared.c b/nptl/pthread_condattr_getpshared.c deleted file mode 100644 index 00186e0c94..0000000000 --- a/nptl/pthread_condattr_getpshared.c +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" - - -int -pthread_condattr_getpshared (const pthread_condattr_t *attr, int *pshared) -{ - *pshared = (((const struct pthread_condattr *) attr)->value & 1 - ? PTHREAD_PROCESS_SHARED : PTHREAD_PROCESS_PRIVATE); - - return 0; -} diff --git a/nptl/pthread_condattr_init.c b/nptl/pthread_condattr_init.c deleted file mode 100644 index 47bcc8bfde..0000000000 --- a/nptl/pthread_condattr_init.c +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include "pthreadP.h" - - -int -__pthread_condattr_init (pthread_condattr_t *attr) -{ - struct pthread_condattr *iattr = (struct pthread_condattr *) attr; - /* Default is not pshared and CLOCK_REALTIME. */ - iattr-> value = CLOCK_REALTIME << 1; - - return 0; -} -strong_alias (__pthread_condattr_init, pthread_condattr_init) diff --git a/nptl/pthread_condattr_setclock.c b/nptl/pthread_condattr_setclock.c deleted file mode 100644 index cd94171002..0000000000 --- a/nptl/pthread_condattr_setclock.c +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <futex-internal.h> -#include <time.h> -#include <sysdep.h> -#include "pthreadP.h" - - -int -pthread_condattr_setclock (pthread_condattr_t *attr, clockid_t clock_id) -{ - /* Only a few clocks are allowed. */ - if (clock_id != CLOCK_MONOTONIC && clock_id != CLOCK_REALTIME) - /* If more clocks are allowed some day the storing of the clock ID - in the pthread_cond_t structure needs to be adjusted. */ - return EINVAL; - - /* If we do not support waiting using CLOCK_MONOTONIC, return an error. */ - if (clock_id == CLOCK_MONOTONIC - && !futex_supports_exact_relative_timeouts()) - return ENOTSUP; - - /* Make sure the value fits in the bits we reserved. */ - assert (clock_id < (1 << COND_CLOCK_BITS)); - - int *valuep = &((struct pthread_condattr *) attr)->value; - - *valuep = ((*valuep & ~(((1 << COND_CLOCK_BITS) - 1) << 1)) - | (clock_id << 1)); - - return 0; -} diff --git a/nptl/pthread_condattr_setpshared.c b/nptl/pthread_condattr_setpshared.c deleted file mode 100644 index 132c356790..0000000000 --- a/nptl/pthread_condattr_setpshared.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthreadP.h> -#include <futex-internal.h> - -int -pthread_condattr_setpshared (pthread_condattr_t *attr, int pshared) -{ - int err = futex_supports_pshared (pshared); - if (err != 0) - return err; - - int *valuep = &((struct pthread_condattr *) attr)->value; - - *valuep = (*valuep & ~1) | (pshared != PTHREAD_PROCESS_PRIVATE); - - return 0; -} diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c deleted file mode 100644 index c7d1b8f413..0000000000 --- a/nptl/pthread_create.c +++ /dev/null @@ -1,933 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <ctype.h> -#include <errno.h> -#include <stdbool.h> -#include <stdlib.h> -#include <string.h> -#include <stdint.h> -#include "pthreadP.h" -#include <hp-timing.h> -#include <ldsodefs.h> -#include <atomic.h> -#include <libc-internal.h> -#include <resolv.h> -#include <kernel-features.h> -#include <exit-thread.h> -#include <default-sched.h> -#include <futex-internal.h> - -#include <shlib-compat.h> - -#include <stap-probe.h> - - -/* Nozero if debugging mode is enabled. */ -int __pthread_debug; - -/* Globally enabled events. */ -static td_thr_events_t __nptl_threads_events __attribute_used__; - -/* Pointer to descriptor with the last event. */ -static struct pthread *__nptl_last_event __attribute_used__; - -/* Number of threads running. */ -unsigned int __nptl_nthreads = 1; - - -/* Code to allocate and deallocate a stack. */ -#include "allocatestack.c" - -/* CONCURRENCY NOTES: - - Understanding who is the owner of the 'struct pthread' or 'PD' - (refers to the value of the 'struct pthread *pd' function argument) - is critically important in determining exactly which operations are - allowed and which are not and when, particularly when it comes to the - implementation of pthread_create, pthread_join, pthread_detach, and - other functions which all operate on PD. - - The owner of PD is responsible for freeing the final resources - associated with PD, and may examine the memory underlying PD at any - point in time until it frees it back to the OS or to reuse by the - runtime. - - The thread which calls pthread_create is called the creating thread. - The creating thread begins as the owner of PD. - - During startup the new thread may examine PD in coordination with the - owner thread (which may be itself). - - The four cases of ownership transfer are: - - (1) Ownership of PD is released to the process (all threads may use it) - after the new thread starts in a joinable state - i.e. pthread_create returns a usable pthread_t. - - (2) Ownership of PD is released to the new thread starting in a detached - state. - - (3) Ownership of PD is dynamically released to a running thread via - pthread_detach. - - (4) Ownership of PD is acquired by the thread which calls pthread_join. - - Implementation notes: - - The PD->stopped_start and thread_ran variables are used to determine - exactly which of the four ownership states we are in and therefore - what actions can be taken. For example after (2) we cannot read or - write from PD anymore since the thread may no longer exist and the - memory may be unmapped. - - It is important to point out that PD->lock is being used both - similar to a one-shot semaphore and subsequently as a mutex. The - lock is taken in the parent to force the child to wait, and then the - child releases the lock. However, this semaphore-like effect is used - only for synchronizing the parent and child. After startup the lock - is used like a mutex to create a critical section during which a - single owner modifies the thread parameters. - - The most complicated cases happen during thread startup: - - (a) If the created thread is in a detached (PTHREAD_CREATE_DETACHED), - or joinable (default PTHREAD_CREATE_JOINABLE) state and - STOPPED_START is true, then the creating thread has ownership of - PD until the PD->lock is released by pthread_create. If any - errors occur we are in states (c), (d), or (e) below. - - (b) If the created thread is in a detached state - (PTHREAD_CREATED_DETACHED), and STOPPED_START is false, then the - creating thread has ownership of PD until it invokes the OS - kernel's thread creation routine. If this routine returns - without error, then the created thread owns PD; otherwise, see - (c) and (e) below. - - (c) If the detached thread setup failed and THREAD_RAN is true, then - the creating thread releases ownership to the new thread by - sending a cancellation signal. All threads set THREAD_RAN to - true as quickly as possible after returning from the OS kernel's - thread creation routine. - - (d) If the joinable thread setup failed and THREAD_RAN is true, then - then the creating thread retains ownership of PD and must cleanup - state. Ownership cannot be released to the process via the - return of pthread_create since a non-zero result entails PD is - undefined and therefore cannot be joined to free the resources. - We privately call pthread_join on the thread to finish handling - the resource shutdown (Or at least we should, see bug 19511). - - (e) If the thread creation failed and THREAD_RAN is false, then the - creating thread retains ownership of PD and must cleanup state. - No waiting for the new thread is required because it never - started. - - The nptl_db interface: - - The interface with nptl_db requires that we enqueue PD into a linked - list and then call a function which the debugger will trap. The PD - will then be dequeued and control returned to the thread. The caller - at the time must have ownership of PD and such ownership remains - after control returns to thread. The enqueued PD is removed from the - linked list by the nptl_db callback td_thr_event_getmsg. The debugger - must ensure that the thread does not resume execution, otherwise - ownership of PD may be lost and examining PD will not be possible. - - Note that the GNU Debugger as of (December 10th 2015) commit - c2c2a31fdb228d41ce3db62b268efea04bd39c18 no longer uses - td_thr_event_getmsg and several other related nptl_db interfaces. The - principal reason for this is that nptl_db does not support non-stop - mode where other threads can run concurrently and modify runtime - structures currently in use by the debugger and the nptl_db - interface. - - Axioms: - - * The create_thread function can never set stopped_start to false. - * The created thread can read stopped_start but never write to it. - * The variable thread_ran is set some time after the OS thread - creation routine returns, how much time after the thread is created - is unspecified, but it should be as quickly as possible. - -*/ - -/* CREATE THREAD NOTES: - - createthread.c defines the create_thread function, and two macros: - START_THREAD_DEFN and START_THREAD_SELF (see below). - - create_thread must initialize PD->stopped_start. It should be true - if the STOPPED_START parameter is true, or if create_thread needs the - new thread to synchronize at startup for some other implementation - reason. If STOPPED_START will be true, then create_thread is obliged - to lock PD->lock before starting the thread. Then pthread_create - unlocks PD->lock which synchronizes-with START_THREAD_DEFN in the - child thread which does an acquire/release of PD->lock as the last - action before calling the user entry point. The goal of all of this - is to ensure that the required initial thread attributes are applied - (by the creating thread) before the new thread runs user code. Note - that the the functions pthread_getschedparam, pthread_setschedparam, - pthread_setschedprio, __pthread_tpp_change_priority, and - __pthread_current_priority reuse the same lock, PD->lock, for a - similar purpose e.g. synchronizing the setting of similar thread - attributes. These functions are never called before the thread is - created, so don't participate in startup syncronization, but given - that the lock is present already and in the unlocked state, reusing - it saves space. - - The return value is zero for success or an errno code for failure. - If the return value is ENOMEM, that will be translated to EAGAIN, - so create_thread need not do that. On failure, *THREAD_RAN should - be set to true iff the thread actually started up and then got - canceled before calling user code (*PD->start_routine). */ -static int create_thread (struct pthread *pd, const struct pthread_attr *attr, - bool *stopped_start, STACK_VARIABLES_PARMS, - bool *thread_ran); - -#include <createthread.c> - - -struct pthread * -internal_function -__find_in_stack_list (struct pthread *pd) -{ - list_t *entry; - struct pthread *result = NULL; - - lll_lock (stack_cache_lock, LLL_PRIVATE); - - list_for_each (entry, &stack_used) - { - struct pthread *curp; - - curp = list_entry (entry, struct pthread, list); - if (curp == pd) - { - result = curp; - break; - } - } - - if (result == NULL) - list_for_each (entry, &__stack_user) - { - struct pthread *curp; - - curp = list_entry (entry, struct pthread, list); - if (curp == pd) - { - result = curp; - break; - } - } - - lll_unlock (stack_cache_lock, LLL_PRIVATE); - - return result; -} - - -/* Deallocate POSIX thread-local-storage. */ -void -attribute_hidden -__nptl_deallocate_tsd (void) -{ - struct pthread *self = THREAD_SELF; - - /* Maybe no data was ever allocated. This happens often so we have - a flag for this. */ - if (THREAD_GETMEM (self, specific_used)) - { - size_t round; - size_t cnt; - - round = 0; - do - { - size_t idx; - - /* So far no new nonzero data entry. */ - THREAD_SETMEM (self, specific_used, false); - - for (cnt = idx = 0; cnt < PTHREAD_KEY_1STLEVEL_SIZE; ++cnt) - { - struct pthread_key_data *level2; - - level2 = THREAD_GETMEM_NC (self, specific, cnt); - - if (level2 != NULL) - { - size_t inner; - - for (inner = 0; inner < PTHREAD_KEY_2NDLEVEL_SIZE; - ++inner, ++idx) - { - void *data = level2[inner].data; - - if (data != NULL) - { - /* Always clear the data. */ - level2[inner].data = NULL; - - /* Make sure the data corresponds to a valid - key. This test fails if the key was - deallocated and also if it was - re-allocated. It is the user's - responsibility to free the memory in this - case. */ - if (level2[inner].seq - == __pthread_keys[idx].seq - /* It is not necessary to register a destructor - function. */ - && __pthread_keys[idx].destr != NULL) - /* Call the user-provided destructor. */ - __pthread_keys[idx].destr (data); - } - } - } - else - idx += PTHREAD_KEY_1STLEVEL_SIZE; - } - - if (THREAD_GETMEM (self, specific_used) == 0) - /* No data has been modified. */ - goto just_free; - } - /* We only repeat the process a fixed number of times. */ - while (__builtin_expect (++round < PTHREAD_DESTRUCTOR_ITERATIONS, 0)); - - /* Just clear the memory of the first block for reuse. */ - memset (&THREAD_SELF->specific_1stblock, '\0', - sizeof (self->specific_1stblock)); - - just_free: - /* Free the memory for the other blocks. */ - for (cnt = 1; cnt < PTHREAD_KEY_1STLEVEL_SIZE; ++cnt) - { - struct pthread_key_data *level2; - - level2 = THREAD_GETMEM_NC (self, specific, cnt); - if (level2 != NULL) - { - /* The first block is allocated as part of the thread - descriptor. */ - free (level2); - THREAD_SETMEM_NC (self, specific, cnt, NULL); - } - } - - THREAD_SETMEM (self, specific_used, false); - } -} - - -/* Deallocate a thread's stack after optionally making sure the thread - descriptor is still valid. */ -void -internal_function -__free_tcb (struct pthread *pd) -{ - /* The thread is exiting now. */ - if (__builtin_expect (atomic_bit_test_set (&pd->cancelhandling, - TERMINATED_BIT) == 0, 1)) - { - /* Remove the descriptor from the list. */ - if (DEBUGGING_P && __find_in_stack_list (pd) == NULL) - /* Something is really wrong. The descriptor for a still - running thread is gone. */ - abort (); - - /* Free TPP data. */ - if (__glibc_unlikely (pd->tpp != NULL)) - { - struct priority_protection_data *tpp = pd->tpp; - - pd->tpp = NULL; - free (tpp); - } - - /* Queue the stack memory block for reuse and exit the process. The - kernel will signal via writing to the address returned by - QUEUE-STACK when the stack is available. */ - __deallocate_stack (pd); - } -} - - -/* Local function to start thread and handle cleanup. - createthread.c defines the macro START_THREAD_DEFN to the - declaration that its create_thread function will refer to, and - START_THREAD_SELF to the expression to optimally deliver the new - thread's THREAD_SELF value. */ -START_THREAD_DEFN -{ - struct pthread *pd = START_THREAD_SELF; - -#if HP_TIMING_AVAIL - /* Remember the time when the thread was started. */ - hp_timing_t now; - HP_TIMING_NOW (now); - THREAD_SETMEM (pd, cpuclock_offset, now); -#endif - - /* Initialize resolver state pointer. */ - __resp = &pd->res; - - /* Initialize pointers to locale data. */ - __ctype_init (); - - /* Allow setxid from now onwards. */ - if (__glibc_unlikely (atomic_exchange_acq (&pd->setxid_futex, 0) == -2)) - futex_wake (&pd->setxid_futex, 1, FUTEX_PRIVATE); - -#ifdef __NR_set_robust_list -# ifndef __ASSUME_SET_ROBUST_LIST - if (__set_robust_list_avail >= 0) -# endif - { - INTERNAL_SYSCALL_DECL (err); - /* This call should never fail because the initial call in init.c - succeeded. */ - INTERNAL_SYSCALL (set_robust_list, err, 2, &pd->robust_head, - sizeof (struct robust_list_head)); - } -#endif - -#ifdef SIGCANCEL - /* If the parent was running cancellation handlers while creating - the thread the new thread inherited the signal mask. Reset the - cancellation signal mask. */ - if (__glibc_unlikely (pd->parent_cancelhandling & CANCELING_BITMASK)) - { - INTERNAL_SYSCALL_DECL (err); - sigset_t mask; - __sigemptyset (&mask); - __sigaddset (&mask, SIGCANCEL); - (void) INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_UNBLOCK, &mask, - NULL, _NSIG / 8); - } -#endif - - /* This is where the try/finally block should be created. For - compilers without that support we do use setjmp. */ - struct pthread_unwind_buf unwind_buf; - - /* No previous handlers. */ - unwind_buf.priv.data.prev = NULL; - unwind_buf.priv.data.cleanup = NULL; - - int not_first_call; - not_first_call = setjmp ((struct __jmp_buf_tag *) unwind_buf.cancel_jmp_buf); - if (__glibc_likely (! not_first_call)) - { - /* Store the new cleanup handler info. */ - THREAD_SETMEM (pd, cleanup_jmp_buf, &unwind_buf); - - /* We are either in (a) or (b), and in either case we either own - PD already (2) or are about to own PD (1), and so our only - restriction would be that we can't free PD until we know we - have ownership (see CONCURRENCY NOTES above). */ - if (__glibc_unlikely (pd->stopped_start)) - { - int oldtype = CANCEL_ASYNC (); - - /* Get the lock the parent locked to force synchronization. */ - lll_lock (pd->lock, LLL_PRIVATE); - - /* We have ownership of PD now. */ - - /* And give it up right away. */ - lll_unlock (pd->lock, LLL_PRIVATE); - - CANCEL_RESET (oldtype); - } - - LIBC_PROBE (pthread_start, 3, (pthread_t) pd, pd->start_routine, pd->arg); - - /* Run the code the user provided. */ - THREAD_SETMEM (pd, result, pd->start_routine (pd->arg)); - } - - /* Call destructors for the thread_local TLS variables. */ -#ifndef SHARED - if (&__call_tls_dtors != NULL) -#endif - __call_tls_dtors (); - - /* Run the destructor for the thread-local data. */ - __nptl_deallocate_tsd (); - - /* Clean up any state libc stored in thread-local variables. */ - __libc_thread_freeres (); - - /* If this is the last thread we terminate the process now. We - do not notify the debugger, it might just irritate it if there - is no thread left. */ - if (__glibc_unlikely (atomic_decrement_and_test (&__nptl_nthreads))) - /* This was the last thread. */ - exit (0); - - /* Report the death of the thread if this is wanted. */ - if (__glibc_unlikely (pd->report_events)) - { - /* See whether TD_DEATH is in any of the mask. */ - const int idx = __td_eventword (TD_DEATH); - const uint32_t mask = __td_eventmask (TD_DEATH); - - if ((mask & (__nptl_threads_events.event_bits[idx] - | pd->eventbuf.eventmask.event_bits[idx])) != 0) - { - /* Yep, we have to signal the death. Add the descriptor to - the list but only if it is not already on it. */ - if (pd->nextevent == NULL) - { - pd->eventbuf.eventnum = TD_DEATH; - pd->eventbuf.eventdata = pd; - - do - pd->nextevent = __nptl_last_event; - while (atomic_compare_and_exchange_bool_acq (&__nptl_last_event, - pd, pd->nextevent)); - } - - /* Now call the function which signals the event. See - CONCURRENCY NOTES for the nptl_db interface comments. */ - __nptl_death_event (); - } - } - - /* The thread is exiting now. Don't set this bit until after we've hit - the event-reporting breakpoint, so that td_thr_get_info on us while at - the breakpoint reports TD_THR_RUN state rather than TD_THR_ZOMBIE. */ - atomic_bit_set (&pd->cancelhandling, EXITING_BIT); - -#ifndef __ASSUME_SET_ROBUST_LIST - /* If this thread has any robust mutexes locked, handle them now. */ -# ifdef __PTHREAD_MUTEX_HAVE_PREV - void *robust = pd->robust_head.list; -# else - __pthread_slist_t *robust = pd->robust_list.__next; -# endif - /* We let the kernel do the notification if it is able to do so. - If we have to do it here there for sure are no PI mutexes involved - since the kernel support for them is even more recent. */ - if (__set_robust_list_avail < 0 - && __builtin_expect (robust != (void *) &pd->robust_head, 0)) - { - do - { - struct __pthread_mutex_s *this = (struct __pthread_mutex_s *) - ((char *) robust - offsetof (struct __pthread_mutex_s, - __list.__next)); - robust = *((void **) robust); - -# ifdef __PTHREAD_MUTEX_HAVE_PREV - this->__list.__prev = NULL; -# endif - this->__list.__next = NULL; - - atomic_or (&this->__lock, FUTEX_OWNER_DIED); - futex_wake ((unsigned int *) &this->__lock, 1, - /* XYZ */ FUTEX_SHARED); - } - while (robust != (void *) &pd->robust_head); - } -#endif - - /* Mark the memory of the stack as usable to the kernel. We free - everything except for the space used for the TCB itself. */ - size_t pagesize_m1 = __getpagesize () - 1; -#ifdef _STACK_GROWS_DOWN - char *sp = CURRENT_STACK_FRAME; - size_t freesize = (sp - (char *) pd->stackblock) & ~pagesize_m1; - assert (freesize < pd->stackblock_size); - if (freesize > PTHREAD_STACK_MIN) - __madvise (pd->stackblock, freesize - PTHREAD_STACK_MIN, MADV_DONTNEED); -#else - /* Page aligned start of memory to free (higher than or equal - to current sp plus the minimum stack size). */ - void *freeblock = (void*)((size_t)(CURRENT_STACK_FRAME - + PTHREAD_STACK_MIN - + pagesize_m1) - & ~pagesize_m1); - char *free_end = (char *) (((uintptr_t) pd - pd->guardsize) & ~pagesize_m1); - /* Is there any space to free? */ - if (free_end > (char *)freeblock) - { - size_t freesize = (size_t)(free_end - (char *)freeblock); - assert (freesize < pd->stackblock_size); - __madvise (freeblock, freesize, MADV_DONTNEED); - } -#endif - - /* If the thread is detached free the TCB. */ - if (IS_DETACHED (pd)) - /* Free the TCB. */ - __free_tcb (pd); - else if (__glibc_unlikely (pd->cancelhandling & SETXID_BITMASK)) - { - /* Some other thread might call any of the setXid functions and expect - us to reply. In this case wait until we did that. */ - do - /* XXX This differs from the typical futex_wait_simple pattern in that - the futex_wait condition (setxid_futex) is different from the - condition used in the surrounding loop (cancelhandling). We need - to check and document why this is correct. */ - futex_wait_simple (&pd->setxid_futex, 0, FUTEX_PRIVATE); - while (pd->cancelhandling & SETXID_BITMASK); - - /* Reset the value so that the stack can be reused. */ - pd->setxid_futex = 0; - } - - /* We cannot call '_exit' here. '_exit' will terminate the process. - - The 'exit' implementation in the kernel will signal when the - process is really dead since 'clone' got passed the CLONE_CHILD_CLEARTID - flag. The 'tid' field in the TCB will be set to zero. - - The exit code is zero since in case all threads exit by calling - 'pthread_exit' the exit status must be 0 (zero). */ - __exit_thread (); - - /* NOTREACHED */ -} - - -/* Return true iff obliged to report TD_CREATE events. */ -static bool -report_thread_creation (struct pthread *pd) -{ - if (__glibc_unlikely (THREAD_GETMEM (THREAD_SELF, report_events))) - { - /* The parent thread is supposed to report events. - Check whether the TD_CREATE event is needed, too. */ - const size_t idx = __td_eventword (TD_CREATE); - const uint32_t mask = __td_eventmask (TD_CREATE); - - return ((mask & (__nptl_threads_events.event_bits[idx] - | pd->eventbuf.eventmask.event_bits[idx])) != 0); - } - return false; -} - - -int -__pthread_create_2_1 (pthread_t *newthread, const pthread_attr_t *attr, - void *(*start_routine) (void *), void *arg) -{ - STACK_VARIABLES; - - const struct pthread_attr *iattr = (struct pthread_attr *) attr; - struct pthread_attr default_attr; - bool free_cpuset = false; - if (iattr == NULL) - { - lll_lock (__default_pthread_attr_lock, LLL_PRIVATE); - default_attr = __default_pthread_attr; - size_t cpusetsize = default_attr.cpusetsize; - if (cpusetsize > 0) - { - cpu_set_t *cpuset; - if (__glibc_likely (__libc_use_alloca (cpusetsize))) - cpuset = __alloca (cpusetsize); - else - { - cpuset = malloc (cpusetsize); - if (cpuset == NULL) - { - lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE); - return ENOMEM; - } - free_cpuset = true; - } - memcpy (cpuset, default_attr.cpuset, cpusetsize); - default_attr.cpuset = cpuset; - } - lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE); - iattr = &default_attr; - } - - struct pthread *pd = NULL; - int err = ALLOCATE_STACK (iattr, &pd); - int retval = 0; - - if (__glibc_unlikely (err != 0)) - /* Something went wrong. Maybe a parameter of the attributes is - invalid or we could not allocate memory. Note we have to - translate error codes. */ - { - retval = err == ENOMEM ? EAGAIN : err; - goto out; - } - - - /* Initialize the TCB. All initializations with zero should be - performed in 'get_cached_stack'. This way we avoid doing this if - the stack freshly allocated with 'mmap'. */ - -#if TLS_TCB_AT_TP - /* Reference to the TCB itself. */ - pd->header.self = pd; - - /* Self-reference for TLS. */ - pd->header.tcb = pd; -#endif - - /* Store the address of the start routine and the parameter. Since - we do not start the function directly the stillborn thread will - get the information from its thread descriptor. */ - pd->start_routine = start_routine; - pd->arg = arg; - - /* Copy the thread attribute flags. */ - struct pthread *self = THREAD_SELF; - pd->flags = ((iattr->flags & ~(ATTR_FLAG_SCHED_SET | ATTR_FLAG_POLICY_SET)) - | (self->flags & (ATTR_FLAG_SCHED_SET | ATTR_FLAG_POLICY_SET))); - - /* Initialize the field for the ID of the thread which is waiting - for us. This is a self-reference in case the thread is created - detached. */ - pd->joinid = iattr->flags & ATTR_FLAG_DETACHSTATE ? pd : NULL; - - /* The debug events are inherited from the parent. */ - pd->eventbuf = self->eventbuf; - - - /* Copy the parent's scheduling parameters. The flags will say what - is valid and what is not. */ - pd->schedpolicy = self->schedpolicy; - pd->schedparam = self->schedparam; - - /* Copy the stack guard canary. */ -#ifdef THREAD_COPY_STACK_GUARD - THREAD_COPY_STACK_GUARD (pd); -#endif - - /* Copy the pointer guard value. */ -#ifdef THREAD_COPY_POINTER_GUARD - THREAD_COPY_POINTER_GUARD (pd); -#endif - - /* Verify the sysinfo bits were copied in allocate_stack if needed. */ -#ifdef NEED_DL_SYSINFO - CHECK_THREAD_SYSINFO (pd); -#endif - - /* Inform start_thread (above) about cancellation state that might - translate into inherited signal state. */ - pd->parent_cancelhandling = THREAD_GETMEM (THREAD_SELF, cancelhandling); - - /* Determine scheduling parameters for the thread. */ - if (__builtin_expect ((iattr->flags & ATTR_FLAG_NOTINHERITSCHED) != 0, 0) - && (iattr->flags & (ATTR_FLAG_SCHED_SET | ATTR_FLAG_POLICY_SET)) != 0) - { - /* Use the scheduling parameters the user provided. */ - if (iattr->flags & ATTR_FLAG_POLICY_SET) - { - pd->schedpolicy = iattr->schedpolicy; - pd->flags |= ATTR_FLAG_POLICY_SET; - } - if (iattr->flags & ATTR_FLAG_SCHED_SET) - { - /* The values were validated in pthread_attr_setschedparam. */ - pd->schedparam = iattr->schedparam; - pd->flags |= ATTR_FLAG_SCHED_SET; - } - - if ((pd->flags & (ATTR_FLAG_SCHED_SET | ATTR_FLAG_POLICY_SET)) - != (ATTR_FLAG_SCHED_SET | ATTR_FLAG_POLICY_SET)) - collect_default_sched (pd); - } - - /* Pass the descriptor to the caller. */ - *newthread = (pthread_t) pd; - - LIBC_PROBE (pthread_create, 4, newthread, attr, start_routine, arg); - - /* One more thread. We cannot have the thread do this itself, since it - might exist but not have been scheduled yet by the time we've returned - and need to check the value to behave correctly. We must do it before - creating the thread, in case it does get scheduled first and then - might mistakenly think it was the only thread. In the failure case, - we momentarily store a false value; this doesn't matter because there - is no kosher thing a signal handler interrupting us right here can do - that cares whether the thread count is correct. */ - atomic_increment (&__nptl_nthreads); - - /* Our local value of stopped_start and thread_ran can be accessed at - any time. The PD->stopped_start may only be accessed if we have - ownership of PD (see CONCURRENCY NOTES above). */ - bool stopped_start = false; bool thread_ran = false; - - /* Start the thread. */ - if (__glibc_unlikely (report_thread_creation (pd))) - { - stopped_start = true; - - /* We always create the thread stopped at startup so we can - notify the debugger. */ - retval = create_thread (pd, iattr, &stopped_start, - STACK_VARIABLES_ARGS, &thread_ran); - if (retval == 0) - { - /* We retain ownership of PD until (a) (see CONCURRENCY NOTES - above). */ - - /* Assert stopped_start is true in both our local copy and the - PD copy. */ - assert (stopped_start); - assert (pd->stopped_start); - - /* Now fill in the information about the new thread in - the newly created thread's data structure. We cannot let - the new thread do this since we don't know whether it was - already scheduled when we send the event. */ - pd->eventbuf.eventnum = TD_CREATE; - pd->eventbuf.eventdata = pd; - - /* Enqueue the descriptor. */ - do - pd->nextevent = __nptl_last_event; - while (atomic_compare_and_exchange_bool_acq (&__nptl_last_event, - pd, pd->nextevent) - != 0); - - /* Now call the function which signals the event. See - CONCURRENCY NOTES for the nptl_db interface comments. */ - __nptl_create_event (); - } - } - else - retval = create_thread (pd, iattr, &stopped_start, - STACK_VARIABLES_ARGS, &thread_ran); - - if (__glibc_unlikely (retval != 0)) - { - if (thread_ran) - /* State (c) or (d) and we may not have PD ownership (see - CONCURRENCY NOTES above). We can assert that STOPPED_START - must have been true because thread creation didn't fail, but - thread attribute setting did. */ - /* See bug 19511 which explains why doing nothing here is a - resource leak for a joinable thread. */ - assert (stopped_start); - else - { - /* State (e) and we have ownership of PD (see CONCURRENCY - NOTES above). */ - - /* Oops, we lied for a second. */ - atomic_decrement (&__nptl_nthreads); - - /* Perhaps a thread wants to change the IDs and is waiting for this - stillborn thread. */ - if (__glibc_unlikely (atomic_exchange_acq (&pd->setxid_futex, 0) - == -2)) - futex_wake (&pd->setxid_futex, 1, FUTEX_PRIVATE); - - /* Free the resources. */ - __deallocate_stack (pd); - } - - /* We have to translate error codes. */ - if (retval == ENOMEM) - retval = EAGAIN; - } - else - { - /* We don't know if we have PD ownership. Once we check the local - stopped_start we'll know if we're in state (a) or (b) (see - CONCURRENCY NOTES above). */ - if (stopped_start) - /* State (a), we own PD. The thread blocked on this lock either - because we're doing TD_CREATE event reporting, or for some - other reason that create_thread chose. Now let it run - free. */ - lll_unlock (pd->lock, LLL_PRIVATE); - - /* We now have for sure more than one thread. The main thread might - not yet have the flag set. No need to set the global variable - again if this is what we use. */ - THREAD_SETMEM (THREAD_SELF, header.multiple_threads, 1); - } - - out: - if (__glibc_unlikely (free_cpuset)) - free (default_attr.cpuset); - - return retval; -} -versioned_symbol (libpthread, __pthread_create_2_1, pthread_create, GLIBC_2_1); - - -#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1) -int -__pthread_create_2_0 (pthread_t *newthread, const pthread_attr_t *attr, - void *(*start_routine) (void *), void *arg) -{ - /* The ATTR attribute is not really of type `pthread_attr_t *'. It has - the old size and access to the new members might crash the program. - We convert the struct now. */ - struct pthread_attr new_attr; - - if (attr != NULL) - { - struct pthread_attr *iattr = (struct pthread_attr *) attr; - size_t ps = __getpagesize (); - - /* Copy values from the user-provided attributes. */ - new_attr.schedparam = iattr->schedparam; - new_attr.schedpolicy = iattr->schedpolicy; - new_attr.flags = iattr->flags; - - /* Fill in default values for the fields not present in the old - implementation. */ - new_attr.guardsize = ps; - new_attr.stackaddr = NULL; - new_attr.stacksize = 0; - new_attr.cpuset = NULL; - - /* We will pass this value on to the real implementation. */ - attr = (pthread_attr_t *) &new_attr; - } - - return __pthread_create_2_1 (newthread, attr, start_routine, arg); -} -compat_symbol (libpthread, __pthread_create_2_0, pthread_create, - GLIBC_2_0); -#endif - -/* Information for libthread_db. */ - -#include "../nptl_db/db_info.c" - -/* If pthread_create is present, libgcc_eh.a and libsupc++.a expects some other POSIX thread - functions to be present as well. */ -PTHREAD_STATIC_FN_REQUIRE (pthread_mutex_lock) -PTHREAD_STATIC_FN_REQUIRE (pthread_mutex_trylock) -PTHREAD_STATIC_FN_REQUIRE (pthread_mutex_unlock) - -PTHREAD_STATIC_FN_REQUIRE (pthread_once) -PTHREAD_STATIC_FN_REQUIRE (pthread_cancel) - -PTHREAD_STATIC_FN_REQUIRE (pthread_key_create) -PTHREAD_STATIC_FN_REQUIRE (pthread_key_delete) -PTHREAD_STATIC_FN_REQUIRE (pthread_setspecific) -PTHREAD_STATIC_FN_REQUIRE (pthread_getspecific) diff --git a/nptl/pthread_detach.c b/nptl/pthread_detach.c deleted file mode 100644 index 8a2e943523..0000000000 --- a/nptl/pthread_detach.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include "pthreadP.h" -#include <atomic.h> - - -int -pthread_detach (pthread_t th) -{ - struct pthread *pd = (struct pthread *) th; - - /* Make sure the descriptor is valid. */ - if (INVALID_NOT_TERMINATED_TD_P (pd)) - /* Not a valid thread handle. */ - return ESRCH; - - int result = 0; - - /* Mark the thread as detached. */ - if (atomic_compare_and_exchange_bool_acq (&pd->joinid, pd, NULL)) - { - /* There are two possibilities here. First, the thread might - already be detached. In this case we return EINVAL. - Otherwise there might already be a waiter. The standard does - not mention what happens in this case. */ - if (IS_DETACHED (pd)) - result = EINVAL; - } - else - /* Check whether the thread terminated meanwhile. In this case we - will just free the TCB. */ - if ((pd->cancelhandling & EXITING_BITMASK) != 0) - /* Note that the code in __free_tcb makes sure each thread - control block is freed only once. */ - __free_tcb (pd); - - return result; -} diff --git a/nptl/pthread_equal.c b/nptl/pthread_equal.c deleted file mode 100644 index e304add047..0000000000 --- a/nptl/pthread_equal.c +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" - - -int -__pthread_equal (pthread_t thread1, pthread_t thread2) -{ - return thread1 == thread2; -} -strong_alias (__pthread_equal, pthread_equal) diff --git a/nptl/pthread_exit.c b/nptl/pthread_exit.c deleted file mode 100644 index dffab0961a..0000000000 --- a/nptl/pthread_exit.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdlib.h> -#include "pthreadP.h" - - -void -__pthread_exit (void *value) -{ - THREAD_SETMEM (THREAD_SELF, result, value); - - __do_cancel (); -} -strong_alias (__pthread_exit, pthread_exit) - -/* After a thread terminates, __libc_start_main decrements - __nptl_nthreads defined in pthread_create.c. */ -PTHREAD_STATIC_FN_REQUIRE (pthread_create) diff --git a/nptl/pthread_getaffinity.c b/nptl/pthread_getaffinity.c deleted file mode 100644 index fca4bbc563..0000000000 --- a/nptl/pthread_getaffinity.c +++ /dev/null @@ -1,32 +0,0 @@ -/* Get the processor affinity of a thread. Stub version. - Copyright (C) 2014-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthreadP.h> - -int -__pthread_getaffinity_np (pthread_t th, size_t cpusetsize, cpu_set_t *cpuset) -{ - const struct pthread *pd = (const struct pthread *) th; - - if (INVALID_TD_P (pd)) - return ESRCH; - - return ENOSYS; -} -weak_alias (__pthread_getaffinity_np, pthread_getaffinity_np) -stub_warning (pthread_getaffinity_np) diff --git a/nptl/pthread_getattr_default_np.c b/nptl/pthread_getattr_default_np.c deleted file mode 100644 index 771c06b386..0000000000 --- a/nptl/pthread_getattr_default_np.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Get the default attributes used by pthread_create in the process. - Copyright (C) 2013-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdlib.h> -#include <pthreadP.h> -#include <assert.h> - -int -pthread_getattr_default_np (pthread_attr_t *out) -{ - struct pthread_attr *real_out; - - assert (sizeof (*out) >= sizeof (struct pthread_attr)); - real_out = (struct pthread_attr *) out; - - lll_lock (__default_pthread_attr_lock, LLL_PRIVATE); - *real_out = __default_pthread_attr; - lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE); - - return 0; -} diff --git a/nptl/pthread_getattr_np.c b/nptl/pthread_getattr_np.c deleted file mode 100644 index 06093b3d92..0000000000 --- a/nptl/pthread_getattr_np.c +++ /dev/null @@ -1,207 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <inttypes.h> -#include <stdio.h> -#include <stdio_ext.h> -#include <stdlib.h> -#include <string.h> -#include <sys/resource.h> -#include "pthreadP.h" -#include <lowlevellock.h> -#include <ldsodefs.h> - - -int -pthread_getattr_np (pthread_t thread_id, pthread_attr_t *attr) -{ - struct pthread *thread = (struct pthread *) thread_id; - struct pthread_attr *iattr = (struct pthread_attr *) attr; - int ret = 0; - - lll_lock (thread->lock, LLL_PRIVATE); - - /* The thread library is responsible for keeping the values in the - thread desriptor up-to-date in case the user changes them. */ - memcpy (&iattr->schedparam, &thread->schedparam, - sizeof (struct sched_param)); - iattr->schedpolicy = thread->schedpolicy; - - /* Clear the flags work. */ - iattr->flags = thread->flags; - - /* The thread might be detached by now. */ - if (IS_DETACHED (thread)) - iattr->flags |= ATTR_FLAG_DETACHSTATE; - - /* This is the guardsize after adjusting it. */ - iattr->guardsize = thread->reported_guardsize; - - /* The sizes are subject to alignment. */ - if (__glibc_likely (thread->stackblock != NULL)) - { - iattr->stacksize = thread->stackblock_size; -#if _STACK_GROWS_DOWN - iattr->stackaddr = (char *) thread->stackblock + iattr->stacksize; -#else - iattr->stackaddr = (char *) thread->stackblock; -#endif - } - else - { - /* No stack information available. This must be for the initial - thread. Get the info in some magical way. */ - - /* Stack size limit. */ - struct rlimit rl; - - /* The safest way to get the top of the stack is to read - /proc/self/maps and locate the line into which - __libc_stack_end falls. */ - FILE *fp = fopen ("/proc/self/maps", "rce"); - if (fp == NULL) - ret = errno; - /* We need the limit of the stack in any case. */ - else - { - if (getrlimit (RLIMIT_STACK, &rl) != 0) - ret = errno; - else - { - /* We consider the main process stack to have ended with - the page containing __libc_stack_end. There is stuff below - it in the stack too, like the program arguments, environment - variables and auxv info, but we ignore those pages when - returning size so that the output is consistent when the - stack is marked executable due to a loaded DSO requiring - it. */ - void *stack_end = (void *) ((uintptr_t) __libc_stack_end - & -(uintptr_t) GLRO(dl_pagesize)); -#if _STACK_GROWS_DOWN - stack_end += GLRO(dl_pagesize); -#endif - /* We need no locking. */ - __fsetlocking (fp, FSETLOCKING_BYCALLER); - - /* Until we found an entry (which should always be the case) - mark the result as a failure. */ - ret = ENOENT; - - char *line = NULL; - size_t linelen = 0; -#if _STACK_GROWS_DOWN - uintptr_t last_to = 0; -#endif - - while (! feof_unlocked (fp)) - { - if (__getdelim (&line, &linelen, '\n', fp) <= 0) - break; - - uintptr_t from; - uintptr_t to; - if (sscanf (line, "%" SCNxPTR "-%" SCNxPTR, &from, &to) != 2) - continue; - if (from <= (uintptr_t) __libc_stack_end - && (uintptr_t) __libc_stack_end < to) - { - /* Found the entry. Now we have the info we need. */ - iattr->stackaddr = stack_end; - iattr->stacksize = - rl.rlim_cur - (size_t) (to - (uintptr_t) stack_end); - - /* Cut it down to align it to page size since otherwise we - risk going beyond rlimit when the kernel rounds up the - stack extension request. */ - iattr->stacksize = (iattr->stacksize - & -(intptr_t) GLRO(dl_pagesize)); -#if _STACK_GROWS_DOWN - /* The limit might be too high. */ - if ((size_t) iattr->stacksize - > (size_t) iattr->stackaddr - last_to) - iattr->stacksize = (size_t) iattr->stackaddr - last_to; -#else - /* The limit might be too high. */ - if ((size_t) iattr->stacksize - > to - (size_t) iattr->stackaddr) - iattr->stacksize = to - (size_t) iattr->stackaddr; -#endif - /* We succeed and no need to look further. */ - ret = 0; - break; - } -#if _STACK_GROWS_DOWN - last_to = to; -#endif - } - - free (line); - } - - fclose (fp); - } - } - - iattr->flags |= ATTR_FLAG_STACKADDR; - - if (ret == 0) - { - size_t size = 16; - cpu_set_t *cpuset = NULL; - - do - { - size <<= 1; - - void *newp = realloc (cpuset, size); - if (newp == NULL) - { - ret = ENOMEM; - break; - } - cpuset = (cpu_set_t *) newp; - - ret = __pthread_getaffinity_np (thread_id, size, cpuset); - } - /* Pick some ridiculous upper limit. Is 8 million CPUs enough? */ - while (ret == EINVAL && size < 1024 * 1024); - - if (ret == 0) - { - iattr->cpuset = cpuset; - iattr->cpusetsize = size; - } - else - { - free (cpuset); - if (ret == ENOSYS) - { - /* There is no such functionality. */ - ret = 0; - iattr->cpuset = NULL; - iattr->cpusetsize = 0; - } - } - } - - lll_unlock (thread->lock, LLL_PRIVATE); - - return ret; -} diff --git a/nptl/pthread_getconcurrency.c b/nptl/pthread_getconcurrency.c deleted file mode 100644 index 471ad55ea0..0000000000 --- a/nptl/pthread_getconcurrency.c +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" - - -int -pthread_getconcurrency (void) -{ - return __concurrency_level; -} diff --git a/nptl/pthread_getcpuclockid.c b/nptl/pthread_getcpuclockid.c deleted file mode 100644 index c80835b9ad..0000000000 --- a/nptl/pthread_getcpuclockid.c +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (C) 2000-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthreadP.h> -#include <sys/time.h> -#include <tls.h> - - -int -pthread_getcpuclockid (pthread_t threadid, clockid_t *clockid) -{ - struct pthread *pd = (struct pthread *) threadid; - - /* Make sure the descriptor is valid. */ - if (INVALID_TD_P (pd)) - /* Not a valid thread handle. */ - return ESRCH; - -#ifdef CLOCK_THREAD_CPUTIME_ID - /* We need to store the thread ID in the CLOCKID variable together - with a number identifying the clock. We reserve the low 3 bits - for the clock ID and the rest for the thread ID. This is - problematic if the thread ID is too large. But 29 bits should be - fine. - - If some day more clock IDs are needed the ID part can be - enlarged. The IDs are entirely internal. */ - if (pd->tid >= 1 << (8 * sizeof (*clockid) - CLOCK_IDFIELD_SIZE)) - return ERANGE; - - /* Store the number. */ - *clockid = CLOCK_THREAD_CPUTIME_ID | (pd->tid << CLOCK_IDFIELD_SIZE); - - return 0; -#else - /* We don't have a timer for that. */ - return ENOENT; -#endif -} diff --git a/nptl/pthread_getname.c b/nptl/pthread_getname.c deleted file mode 100644 index 00ac9ad4a7..0000000000 --- a/nptl/pthread_getname.c +++ /dev/null @@ -1,32 +0,0 @@ -/* pthread_getname_np -- Get thread name. Stub version. - Copyright (C) 2014-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthreadP.h> - -int -pthread_getname_np (pthread_t th, char *buf, size_t len) -{ - const struct pthread *pd = (const struct pthread *) th; - - if (INVALID_TD_P (pd)) - return ESRCH; - - return ENOSYS; -} -stub_warning (pthread_getname_np) diff --git a/nptl/pthread_getschedparam.c b/nptl/pthread_getschedparam.c deleted file mode 100644 index 9914b9d71f..0000000000 --- a/nptl/pthread_getschedparam.c +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <string.h> -#include "pthreadP.h" -#include <lowlevellock.h> - - -int -__pthread_getschedparam (pthread_t threadid, int *policy, - struct sched_param *param) -{ - struct pthread *pd = (struct pthread *) threadid; - - /* Make sure the descriptor is valid. */ - if (INVALID_TD_P (pd)) - /* Not a valid thread handle. */ - return ESRCH; - - int result = 0; - - /* See CREATE THREAD NOTES in nptl/pthread_create.c. */ - lll_lock (pd->lock, LLL_PRIVATE); - - /* The library is responsible for maintaining the values at all - times. If the user uses an interface other than - pthread_setschedparam to modify the scheduler setting it is not - the library's problem. In case the descriptor's values have - not yet been retrieved do it now. */ - if ((pd->flags & ATTR_FLAG_SCHED_SET) == 0) - { - if (__sched_getparam (pd->tid, &pd->schedparam) != 0) - result = 1; - else - pd->flags |= ATTR_FLAG_SCHED_SET; - } - - if ((pd->flags & ATTR_FLAG_POLICY_SET) == 0) - { - pd->schedpolicy = __sched_getscheduler (pd->tid); - if (pd->schedpolicy == -1) - result = 1; - else - pd->flags |= ATTR_FLAG_POLICY_SET; - } - - if (result == 0) - { - *policy = pd->schedpolicy; - memcpy (param, &pd->schedparam, sizeof (struct sched_param)); - } - - lll_unlock (pd->lock, LLL_PRIVATE); - - return result; -} -strong_alias (__pthread_getschedparam, pthread_getschedparam) diff --git a/nptl/pthread_getspecific.c b/nptl/pthread_getspecific.c deleted file mode 100644 index ddedcf2a76..0000000000 --- a/nptl/pthread_getspecific.c +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdlib.h> -#include "pthreadP.h" - - -void * -__pthread_getspecific (pthread_key_t key) -{ - struct pthread_key_data *data; - - /* Special case access to the first 2nd-level block. This is the - usual case. */ - if (__glibc_likely (key < PTHREAD_KEY_2NDLEVEL_SIZE)) - data = &THREAD_SELF->specific_1stblock[key]; - else - { - /* Verify the key is sane. */ - if (key >= PTHREAD_KEYS_MAX) - /* Not valid. */ - return NULL; - - unsigned int idx1st = key / PTHREAD_KEY_2NDLEVEL_SIZE; - unsigned int idx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE; - - /* If the sequence number doesn't match or the key cannot be defined - for this thread since the second level array is not allocated - return NULL, too. */ - struct pthread_key_data *level2 = THREAD_GETMEM_NC (THREAD_SELF, - specific, idx1st); - if (level2 == NULL) - /* Not allocated, therefore no data. */ - return NULL; - - /* There is data. */ - data = &level2[idx2nd]; - } - - void *result = data->data; - if (result != NULL) - { - uintptr_t seq = data->seq; - - if (__glibc_unlikely (seq != __pthread_keys[key].seq)) - result = data->data = NULL; - } - - return result; -} -strong_alias (__pthread_getspecific, pthread_getspecific) -hidden_def (__pthread_getspecific) diff --git a/nptl/pthread_join.c b/nptl/pthread_join.c deleted file mode 100644 index 0192f69a55..0000000000 --- a/nptl/pthread_join.c +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdlib.h> - -#include <atomic.h> -#include "pthreadP.h" - -#include <stap-probe.h> - - -static void -cleanup (void *arg) -{ - /* If we already changed the waiter ID, reset it. The call cannot - fail for any reason but the thread not having done that yet so - there is no reason for a loop. */ - (void) atomic_compare_and_exchange_bool_acq ((struct pthread **) arg, NULL, - THREAD_SELF); -} - - -int -pthread_join (pthread_t threadid, void **thread_return) -{ - struct pthread *pd = (struct pthread *) threadid; - - /* Make sure the descriptor is valid. */ - if (INVALID_NOT_TERMINATED_TD_P (pd)) - /* Not a valid thread handle. */ - return ESRCH; - - /* Is the thread joinable?. */ - if (IS_DETACHED (pd)) - /* We cannot wait for the thread. */ - return EINVAL; - - struct pthread *self = THREAD_SELF; - int result = 0; - - LIBC_PROBE (pthread_join, 1, threadid); - - /* During the wait we change to asynchronous cancellation. If we - are canceled the thread we are waiting for must be marked as - un-wait-ed for again. */ - pthread_cleanup_push (cleanup, &pd->joinid); - - /* Switch to asynchronous cancellation. */ - int oldtype = CANCEL_ASYNC (); - - if ((pd == self - || (self->joinid == pd - && (pd->cancelhandling - & (CANCELING_BITMASK | CANCELED_BITMASK | EXITING_BITMASK - | TERMINATED_BITMASK)) == 0)) - && !CANCEL_ENABLED_AND_CANCELED (self->cancelhandling)) - /* This is a deadlock situation. The threads are waiting for each - other to finish. Note that this is a "may" error. To be 100% - sure we catch this error we would have to lock the data - structures but it is not necessary. In the unlikely case that - two threads are really caught in this situation they will - deadlock. It is the programmer's problem to figure this - out. */ - result = EDEADLK; - /* Wait for the thread to finish. If it is already locked something - is wrong. There can only be one waiter. */ - else if (__builtin_expect (atomic_compare_and_exchange_bool_acq (&pd->joinid, - self, - NULL), 0)) - /* There is already somebody waiting for the thread. */ - result = EINVAL; - else - /* Wait for the child. */ - lll_wait_tid (pd->tid); - - - /* Restore cancellation mode. */ - CANCEL_RESET (oldtype); - - /* Remove the handler. */ - pthread_cleanup_pop (0); - - - if (__glibc_likely (result == 0)) - { - /* We mark the thread as terminated and as joined. */ - pd->tid = -1; - - /* Store the return value if the caller is interested. */ - if (thread_return != NULL) - *thread_return = pd->result; - - - /* Free the TCB. */ - __free_tcb (pd); - } - - LIBC_PROBE (pthread_join_ret, 3, threadid, result, pd->result); - - return result; -} diff --git a/nptl/pthread_key_create.c b/nptl/pthread_key_create.c deleted file mode 100644 index 4f51c76767..0000000000 --- a/nptl/pthread_key_create.c +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include "pthreadP.h" -#include <atomic.h> - - -int -__pthread_key_create (pthread_key_t *key, void (*destr) (void *)) -{ - /* Find a slot in __pthread_keys which is unused. */ - for (size_t cnt = 0; cnt < PTHREAD_KEYS_MAX; ++cnt) - { - uintptr_t seq = __pthread_keys[cnt].seq; - - if (KEY_UNUSED (seq) && KEY_USABLE (seq) - /* We found an unused slot. Try to allocate it. */ - && ! atomic_compare_and_exchange_bool_acq (&__pthread_keys[cnt].seq, - seq + 1, seq)) - { - /* Remember the destructor. */ - __pthread_keys[cnt].destr = destr; - - /* Return the key to the caller. */ - *key = cnt; - - /* The call succeeded. */ - return 0; - } - } - - return EAGAIN; -} -strong_alias (__pthread_key_create, pthread_key_create) -hidden_def (__pthread_key_create) diff --git a/nptl/pthread_key_delete.c b/nptl/pthread_key_delete.c deleted file mode 100644 index 605f93b871..0000000000 --- a/nptl/pthread_key_delete.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include "pthreadP.h" -#include <atomic.h> - - -int -pthread_key_delete (pthread_key_t key) -{ - int result = EINVAL; - - if (__glibc_likely (key < PTHREAD_KEYS_MAX)) - { - unsigned int seq = __pthread_keys[key].seq; - - if (__builtin_expect (! KEY_UNUSED (seq), 1) - && ! atomic_compare_and_exchange_bool_acq (&__pthread_keys[key].seq, - seq + 1, seq)) - /* We deleted a valid key. */ - result = 0; - } - - return result; -} diff --git a/nptl/pthread_kill.c b/nptl/pthread_kill.c deleted file mode 100644 index c3cc50fd32..0000000000 --- a/nptl/pthread_kill.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Send a signal to a specific pthread. Stub version. - Copyright (C) 2014-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <signal.h> -#include <pthreadP.h> - - -int -__pthread_kill (pthread_t threadid, int signo) -{ - struct pthread *pd = (struct pthread *) threadid; - - /* Make sure the descriptor is valid. */ - if (DEBUGGING_P && INVALID_TD_P (pd)) - /* Not a valid thread handle. */ - return ESRCH; - - return ENOSYS; -} -strong_alias (__pthread_kill, pthread_kill) - -stub_warning (pthread_kill) diff --git a/nptl/pthread_kill_other_threads.c b/nptl/pthread_kill_other_threads.c deleted file mode 100644 index d342bdb6a1..0000000000 --- a/nptl/pthread_kill_other_threads.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <shlib-compat.h> - - -#ifdef SHARED -/* This function does not serve a useful purpose in the thread library - implementation anymore. It used to be necessary when then kernel - could not shut down "processes" but this is not the case anymore. - - We could theoretically provide an equivalent implementation but - this is not necessary since the kernel already does a much better - job than we ever could. */ -void -__pthread_kill_other_threads_np (void) -{ -} -compat_symbol (libpthread, __pthread_kill_other_threads_np, - pthread_kill_other_threads_np, GLIBC_2_0); -#endif diff --git a/nptl/pthread_mutex_cond_lock.c b/nptl/pthread_mutex_cond_lock.c deleted file mode 100644 index bd7149ef1d..0000000000 --- a/nptl/pthread_mutex_cond_lock.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <pthreadP.h> - -#define LLL_MUTEX_LOCK(mutex) \ - lll_cond_lock ((mutex)->__data.__lock, PTHREAD_MUTEX_PSHARED (mutex)) - -/* Not actually elided so far. Needed? */ -#define LLL_MUTEX_LOCK_ELISION(mutex) \ - ({ lll_cond_lock ((mutex)->__data.__lock, PTHREAD_MUTEX_PSHARED (mutex)); 0; }) - -#define LLL_MUTEX_TRYLOCK(mutex) \ - lll_cond_trylock ((mutex)->__data.__lock) -#define LLL_MUTEX_TRYLOCK_ELISION(mutex) LLL_MUTEX_TRYLOCK(mutex) - -/* We need to assume that there are other threads blocked on the futex. - See __pthread_mutex_lock_full for further details. */ -#define LLL_ROBUST_MUTEX_LOCK_MODIFIER FUTEX_WAITERS -#define __pthread_mutex_lock internal_function __pthread_mutex_cond_lock -#define __pthread_mutex_lock_full __pthread_mutex_cond_lock_full -#define NO_INCR - -#include <nptl/pthread_mutex_lock.c> diff --git a/nptl/pthread_mutex_consistent.c b/nptl/pthread_mutex_consistent.c deleted file mode 100644 index 859c495524..0000000000 --- a/nptl/pthread_mutex_consistent.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (C) 2005-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2005. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthreadP.h> - - -int -pthread_mutex_consistent (pthread_mutex_t *mutex) -{ - /* Test whether this is a robust mutex with a dead owner. */ - if ((mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP) == 0 - || mutex->__data.__owner != PTHREAD_MUTEX_INCONSISTENT) - return EINVAL; - - mutex->__data.__owner = THREAD_GETMEM (THREAD_SELF, tid); - - return 0; -} -weak_alias (pthread_mutex_consistent, pthread_mutex_consistent_np) diff --git a/nptl/pthread_mutex_destroy.c b/nptl/pthread_mutex_destroy.c deleted file mode 100644 index a3008321bd..0000000000 --- a/nptl/pthread_mutex_destroy.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include "pthreadP.h" - -#include <stap-probe.h> - - -int -__pthread_mutex_destroy (pthread_mutex_t *mutex) -{ - LIBC_PROBE (mutex_destroy, 1, mutex); - - if ((mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP) == 0 - && mutex->__data.__nusers != 0) - return EBUSY; - - /* Set to an invalid value. */ - mutex->__data.__kind = -1; - - return 0; -} -strong_alias (__pthread_mutex_destroy, pthread_mutex_destroy) -hidden_def (__pthread_mutex_destroy) diff --git a/nptl/pthread_mutex_getprioceiling.c b/nptl/pthread_mutex_getprioceiling.c deleted file mode 100644 index 44b147f148..0000000000 --- a/nptl/pthread_mutex_getprioceiling.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Get current priority ceiling of pthread_mutex_t. - Copyright (C) 2006-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2006. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthreadP.h> - - -int -pthread_mutex_getprioceiling (const pthread_mutex_t *mutex, int *prioceiling) -{ - if (__builtin_expect ((mutex->__data.__kind - & PTHREAD_MUTEX_PRIO_PROTECT_NP) == 0, 0)) - return EINVAL; - - *prioceiling = (mutex->__data.__lock & PTHREAD_MUTEX_PRIO_CEILING_MASK) - >> PTHREAD_MUTEX_PRIO_CEILING_SHIFT; - - return 0; -} diff --git a/nptl/pthread_mutex_init.c b/nptl/pthread_mutex_init.c deleted file mode 100644 index 138e144155..0000000000 --- a/nptl/pthread_mutex_init.c +++ /dev/null @@ -1,148 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <stdbool.h> -#include <string.h> -#include <kernel-features.h> -#include "pthreadP.h" -#include <atomic.h> - -#include <stap-probe.h> - -static const struct pthread_mutexattr default_mutexattr = - { - /* Default is a normal mutex, not shared between processes. */ - .mutexkind = PTHREAD_MUTEX_NORMAL - }; - - -static bool -prio_inherit_missing (void) -{ -#ifdef __NR_futex - static int tpi_supported; - if (__glibc_unlikely (tpi_supported == 0)) - { - int lock = 0; - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (futex, err, 4, &lock, FUTEX_UNLOCK_PI, 0, 0); - assert (INTERNAL_SYSCALL_ERROR_P (ret, err)); - tpi_supported = INTERNAL_SYSCALL_ERRNO (ret, err) == ENOSYS ? -1 : 1; - } - return __glibc_unlikely (tpi_supported < 0); -#endif - return true; -} - -int -__pthread_mutex_init (pthread_mutex_t *mutex, - const pthread_mutexattr_t *mutexattr) -{ - const struct pthread_mutexattr *imutexattr; - - assert (sizeof (pthread_mutex_t) <= __SIZEOF_PTHREAD_MUTEX_T); - - imutexattr = ((const struct pthread_mutexattr *) mutexattr - ?: &default_mutexattr); - - /* Sanity checks. */ - switch (__builtin_expect (imutexattr->mutexkind - & PTHREAD_MUTEXATTR_PROTOCOL_MASK, - PTHREAD_PRIO_NONE - << PTHREAD_MUTEXATTR_PROTOCOL_SHIFT)) - { - case PTHREAD_PRIO_NONE << PTHREAD_MUTEXATTR_PROTOCOL_SHIFT: - break; - - case PTHREAD_PRIO_INHERIT << PTHREAD_MUTEXATTR_PROTOCOL_SHIFT: - if (__glibc_unlikely (prio_inherit_missing ())) - return ENOTSUP; - break; - - default: - /* XXX: For now we don't support robust priority protected mutexes. */ - if (imutexattr->mutexkind & PTHREAD_MUTEXATTR_FLAG_ROBUST) - return ENOTSUP; - break; - } - - /* Clear the whole variable. */ - memset (mutex, '\0', __SIZEOF_PTHREAD_MUTEX_T); - - /* Copy the values from the attribute. */ - mutex->__data.__kind = imutexattr->mutexkind & ~PTHREAD_MUTEXATTR_FLAG_BITS; - - if ((imutexattr->mutexkind & PTHREAD_MUTEXATTR_FLAG_ROBUST) != 0) - { -#ifndef __ASSUME_SET_ROBUST_LIST - if ((imutexattr->mutexkind & PTHREAD_MUTEXATTR_FLAG_PSHARED) != 0 - && __set_robust_list_avail < 0) - return ENOTSUP; -#endif - - mutex->__data.__kind |= PTHREAD_MUTEX_ROBUST_NORMAL_NP; - } - - switch (imutexattr->mutexkind & PTHREAD_MUTEXATTR_PROTOCOL_MASK) - { - case PTHREAD_PRIO_INHERIT << PTHREAD_MUTEXATTR_PROTOCOL_SHIFT: - mutex->__data.__kind |= PTHREAD_MUTEX_PRIO_INHERIT_NP; - break; - - case PTHREAD_PRIO_PROTECT << PTHREAD_MUTEXATTR_PROTOCOL_SHIFT: - mutex->__data.__kind |= PTHREAD_MUTEX_PRIO_PROTECT_NP; - - int ceiling = (imutexattr->mutexkind - & PTHREAD_MUTEXATTR_PRIO_CEILING_MASK) - >> PTHREAD_MUTEXATTR_PRIO_CEILING_SHIFT; - if (! ceiling) - { - /* See __init_sched_fifo_prio. */ - if (atomic_load_relaxed (&__sched_fifo_min_prio) == -1) - __init_sched_fifo_prio (); - if (ceiling < atomic_load_relaxed (&__sched_fifo_min_prio)) - ceiling = atomic_load_relaxed (&__sched_fifo_min_prio); - } - mutex->__data.__lock = ceiling << PTHREAD_MUTEX_PRIO_CEILING_SHIFT; - break; - - default: - break; - } - - /* The kernel when waking robust mutexes on exit never uses - FUTEX_PRIVATE_FLAG FUTEX_WAKE. */ - if ((imutexattr->mutexkind & (PTHREAD_MUTEXATTR_FLAG_PSHARED - | PTHREAD_MUTEXATTR_FLAG_ROBUST)) != 0) - mutex->__data.__kind |= PTHREAD_MUTEX_PSHARED_BIT; - - /* Default values: mutex not used yet. */ - // mutex->__count = 0; already done by memset - // mutex->__owner = 0; already done by memset - // mutex->__nusers = 0; already done by memset - // mutex->__spins = 0; already done by memset - // mutex->__next = NULL; already done by memset - - LIBC_PROBE (mutex_init, 1, mutex); - - return 0; -} -strong_alias (__pthread_mutex_init, pthread_mutex_init) -hidden_def (__pthread_mutex_init) diff --git a/nptl/pthread_mutex_lock.c b/nptl/pthread_mutex_lock.c deleted file mode 100644 index dc9ca4c476..0000000000 --- a/nptl/pthread_mutex_lock.c +++ /dev/null @@ -1,621 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/param.h> -#include <not-cancel.h> -#include "pthreadP.h" -#include <atomic.h> -#include <lowlevellock.h> -#include <stap-probe.h> - -#ifndef lll_lock_elision -#define lll_lock_elision(lock, try_lock, private) ({ \ - lll_lock (lock, private); 0; }) -#endif - -#ifndef lll_trylock_elision -#define lll_trylock_elision(a,t) lll_trylock(a) -#endif - -/* Some of the following definitions differ when pthread_mutex_cond_lock.c - includes this file. */ -#ifndef LLL_MUTEX_LOCK -# define LLL_MUTEX_LOCK(mutex) \ - lll_lock ((mutex)->__data.__lock, PTHREAD_MUTEX_PSHARED (mutex)) -# define LLL_MUTEX_TRYLOCK(mutex) \ - lll_trylock ((mutex)->__data.__lock) -# define LLL_ROBUST_MUTEX_LOCK_MODIFIER 0 -# define LLL_MUTEX_LOCK_ELISION(mutex) \ - lll_lock_elision ((mutex)->__data.__lock, (mutex)->__data.__elision, \ - PTHREAD_MUTEX_PSHARED (mutex)) -# define LLL_MUTEX_TRYLOCK_ELISION(mutex) \ - lll_trylock_elision((mutex)->__data.__lock, (mutex)->__data.__elision, \ - PTHREAD_MUTEX_PSHARED (mutex)) -#endif - -#ifndef FORCE_ELISION -#define FORCE_ELISION(m, s) -#endif - -static int __pthread_mutex_lock_full (pthread_mutex_t *mutex) - __attribute_noinline__; - -int -__pthread_mutex_lock (pthread_mutex_t *mutex) -{ - assert (sizeof (mutex->__size) >= sizeof (mutex->__data)); - - unsigned int type = PTHREAD_MUTEX_TYPE_ELISION (mutex); - - LIBC_PROBE (mutex_entry, 1, mutex); - - if (__builtin_expect (type & ~(PTHREAD_MUTEX_KIND_MASK_NP - | PTHREAD_MUTEX_ELISION_FLAGS_NP), 0)) - return __pthread_mutex_lock_full (mutex); - - if (__glibc_likely (type == PTHREAD_MUTEX_TIMED_NP)) - { - FORCE_ELISION (mutex, goto elision); - simple: - /* Normal mutex. */ - LLL_MUTEX_LOCK (mutex); - assert (mutex->__data.__owner == 0); - } -#ifdef HAVE_ELISION - else if (__glibc_likely (type == PTHREAD_MUTEX_TIMED_ELISION_NP)) - { - elision: __attribute__((unused)) - /* This case can never happen on a system without elision, - as the mutex type initialization functions will not - allow to set the elision flags. */ - /* Don't record owner or users for elision case. This is a - tail call. */ - return LLL_MUTEX_LOCK_ELISION (mutex); - } -#endif - else if (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex) - == PTHREAD_MUTEX_RECURSIVE_NP, 1)) - { - /* Recursive mutex. */ - pid_t id = THREAD_GETMEM (THREAD_SELF, tid); - - /* Check whether we already hold the mutex. */ - if (mutex->__data.__owner == id) - { - /* Just bump the counter. */ - if (__glibc_unlikely (mutex->__data.__count + 1 == 0)) - /* Overflow of the counter. */ - return EAGAIN; - - ++mutex->__data.__count; - - return 0; - } - - /* We have to get the mutex. */ - LLL_MUTEX_LOCK (mutex); - - assert (mutex->__data.__owner == 0); - mutex->__data.__count = 1; - } - else if (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex) - == PTHREAD_MUTEX_ADAPTIVE_NP, 1)) - { - if (! __is_smp) - goto simple; - - if (LLL_MUTEX_TRYLOCK (mutex) != 0) - { - int cnt = 0; - int max_cnt = MIN (MAX_ADAPTIVE_COUNT, - mutex->__data.__spins * 2 + 10); - do - { - if (cnt++ >= max_cnt) - { - LLL_MUTEX_LOCK (mutex); - break; - } - atomic_spin_nop (); - } - while (LLL_MUTEX_TRYLOCK (mutex) != 0); - - mutex->__data.__spins += (cnt - mutex->__data.__spins) / 8; - } - assert (mutex->__data.__owner == 0); - } - else - { - pid_t id = THREAD_GETMEM (THREAD_SELF, tid); - assert (PTHREAD_MUTEX_TYPE (mutex) == PTHREAD_MUTEX_ERRORCHECK_NP); - /* Check whether we already hold the mutex. */ - if (__glibc_unlikely (mutex->__data.__owner == id)) - return EDEADLK; - goto simple; - } - - pid_t id = THREAD_GETMEM (THREAD_SELF, tid); - - /* Record the ownership. */ - mutex->__data.__owner = id; -#ifndef NO_INCR - ++mutex->__data.__nusers; -#endif - - LIBC_PROBE (mutex_acquired, 1, mutex); - - return 0; -} - -static int -__pthread_mutex_lock_full (pthread_mutex_t *mutex) -{ - int oldval; - pid_t id = THREAD_GETMEM (THREAD_SELF, tid); - - switch (PTHREAD_MUTEX_TYPE (mutex)) - { - case PTHREAD_MUTEX_ROBUST_RECURSIVE_NP: - case PTHREAD_MUTEX_ROBUST_ERRORCHECK_NP: - case PTHREAD_MUTEX_ROBUST_NORMAL_NP: - case PTHREAD_MUTEX_ROBUST_ADAPTIVE_NP: - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, - &mutex->__data.__list.__next); - /* We need to set op_pending before starting the operation. Also - see comments at ENQUEUE_MUTEX. */ - __asm ("" ::: "memory"); - - oldval = mutex->__data.__lock; - /* This is set to FUTEX_WAITERS iff we might have shared the - FUTEX_WAITERS flag with other threads, and therefore need to keep it - set to avoid lost wake-ups. We have the same requirement in the - simple mutex algorithm. - We start with value zero for a normal mutex, and FUTEX_WAITERS if we - are building the special case mutexes for use from within condition - variables. */ - unsigned int assume_other_futex_waiters = LLL_ROBUST_MUTEX_LOCK_MODIFIER; - while (1) - { - /* Try to acquire the lock through a CAS from 0 (not acquired) to - our TID | assume_other_futex_waiters. */ - if (__glibc_likely ((oldval == 0) - && (atomic_compare_and_exchange_bool_acq - (&mutex->__data.__lock, - id | assume_other_futex_waiters, 0) == 0))) - break; - - if ((oldval & FUTEX_OWNER_DIED) != 0) - { - /* The previous owner died. Try locking the mutex. */ - int newval = id; -#ifdef NO_INCR - /* We are not taking assume_other_futex_waiters into accoount - here simply because we'll set FUTEX_WAITERS anyway. */ - newval |= FUTEX_WAITERS; -#else - newval |= (oldval & FUTEX_WAITERS) | assume_other_futex_waiters; -#endif - - newval - = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - newval, oldval); - - if (newval != oldval) - { - oldval = newval; - continue; - } - - /* We got the mutex. */ - mutex->__data.__count = 1; - /* But it is inconsistent unless marked otherwise. */ - mutex->__data.__owner = PTHREAD_MUTEX_INCONSISTENT; - - /* We must not enqueue the mutex before we have acquired it. - Also see comments at ENQUEUE_MUTEX. */ - __asm ("" ::: "memory"); - ENQUEUE_MUTEX (mutex); - /* We need to clear op_pending after we enqueue the mutex. */ - __asm ("" ::: "memory"); - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - - /* Note that we deliberately exit here. If we fall - through to the end of the function __nusers would be - incremented which is not correct because the old - owner has to be discounted. If we are not supposed - to increment __nusers we actually have to decrement - it here. */ -#ifdef NO_INCR - --mutex->__data.__nusers; -#endif - - return EOWNERDEAD; - } - - /* Check whether we already hold the mutex. */ - if (__glibc_unlikely ((oldval & FUTEX_TID_MASK) == id)) - { - int kind = PTHREAD_MUTEX_TYPE (mutex); - if (kind == PTHREAD_MUTEX_ROBUST_ERRORCHECK_NP) - { - /* We do not need to ensure ordering wrt another memory - access. Also see comments at ENQUEUE_MUTEX. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, - NULL); - return EDEADLK; - } - - if (kind == PTHREAD_MUTEX_ROBUST_RECURSIVE_NP) - { - /* We do not need to ensure ordering wrt another memory - access. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, - NULL); - - /* Just bump the counter. */ - if (__glibc_unlikely (mutex->__data.__count + 1 == 0)) - /* Overflow of the counter. */ - return EAGAIN; - - ++mutex->__data.__count; - - return 0; - } - } - - /* We cannot acquire the mutex nor has its owner died. Thus, try - to block using futexes. Set FUTEX_WAITERS if necessary so that - other threads are aware that there are potentially threads - blocked on the futex. Restart if oldval changed in the - meantime. */ - if ((oldval & FUTEX_WAITERS) == 0) - { - if (atomic_compare_and_exchange_bool_acq (&mutex->__data.__lock, - oldval | FUTEX_WAITERS, - oldval) - != 0) - { - oldval = mutex->__data.__lock; - continue; - } - oldval |= FUTEX_WAITERS; - } - - /* It is now possible that we share the FUTEX_WAITERS flag with - another thread; therefore, update assume_other_futex_waiters so - that we do not forget about this when handling other cases - above and thus do not cause lost wake-ups. */ - assume_other_futex_waiters |= FUTEX_WAITERS; - - /* Block using the futex and reload current lock value. */ - lll_futex_wait (&mutex->__data.__lock, oldval, - PTHREAD_ROBUST_MUTEX_PSHARED (mutex)); - oldval = mutex->__data.__lock; - } - - /* We have acquired the mutex; check if it is still consistent. */ - if (__builtin_expect (mutex->__data.__owner - == PTHREAD_MUTEX_NOTRECOVERABLE, 0)) - { - /* This mutex is now not recoverable. */ - mutex->__data.__count = 0; - int private = PTHREAD_ROBUST_MUTEX_PSHARED (mutex); - lll_unlock (mutex->__data.__lock, private); - /* FIXME This violates the mutex destruction requirements. See - __pthread_mutex_unlock_full. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - return ENOTRECOVERABLE; - } - - mutex->__data.__count = 1; - /* We must not enqueue the mutex before we have acquired it. - Also see comments at ENQUEUE_MUTEX. */ - __asm ("" ::: "memory"); - ENQUEUE_MUTEX (mutex); - /* We need to clear op_pending after we enqueue the mutex. */ - __asm ("" ::: "memory"); - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - break; - - /* The PI support requires the Linux futex system call. If that's not - available, pthread_mutex_init should never have allowed the type to - be set. So it will get the default case for an invalid type. */ -#ifdef __NR_futex - case PTHREAD_MUTEX_PI_RECURSIVE_NP: - case PTHREAD_MUTEX_PI_ERRORCHECK_NP: - case PTHREAD_MUTEX_PI_NORMAL_NP: - case PTHREAD_MUTEX_PI_ADAPTIVE_NP: - case PTHREAD_MUTEX_PI_ROBUST_RECURSIVE_NP: - case PTHREAD_MUTEX_PI_ROBUST_ERRORCHECK_NP: - case PTHREAD_MUTEX_PI_ROBUST_NORMAL_NP: - case PTHREAD_MUTEX_PI_ROBUST_ADAPTIVE_NP: - { - int kind = mutex->__data.__kind & PTHREAD_MUTEX_KIND_MASK_NP; - int robust = mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP; - - if (robust) - { - /* Note: robust PI futexes are signaled by setting bit 0. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, - (void *) (((uintptr_t) &mutex->__data.__list.__next) - | 1)); - /* We need to set op_pending before starting the operation. Also - see comments at ENQUEUE_MUTEX. */ - __asm ("" ::: "memory"); - } - - oldval = mutex->__data.__lock; - - /* Check whether we already hold the mutex. */ - if (__glibc_unlikely ((oldval & FUTEX_TID_MASK) == id)) - { - if (kind == PTHREAD_MUTEX_ERRORCHECK_NP) - { - /* We do not need to ensure ordering wrt another memory - access. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - return EDEADLK; - } - - if (kind == PTHREAD_MUTEX_RECURSIVE_NP) - { - /* We do not need to ensure ordering wrt another memory - access. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - - /* Just bump the counter. */ - if (__glibc_unlikely (mutex->__data.__count + 1 == 0)) - /* Overflow of the counter. */ - return EAGAIN; - - ++mutex->__data.__count; - - return 0; - } - } - - int newval = id; -# ifdef NO_INCR - newval |= FUTEX_WAITERS; -# endif - oldval = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - newval, 0); - - if (oldval != 0) - { - /* The mutex is locked. The kernel will now take care of - everything. */ - int private = (robust - ? PTHREAD_ROBUST_MUTEX_PSHARED (mutex) - : PTHREAD_MUTEX_PSHARED (mutex)); - INTERNAL_SYSCALL_DECL (__err); - int e = INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock, - __lll_private_flag (FUTEX_LOCK_PI, - private), 1, 0); - - if (INTERNAL_SYSCALL_ERROR_P (e, __err) - && (INTERNAL_SYSCALL_ERRNO (e, __err) == ESRCH - || INTERNAL_SYSCALL_ERRNO (e, __err) == EDEADLK)) - { - assert (INTERNAL_SYSCALL_ERRNO (e, __err) != EDEADLK - || (kind != PTHREAD_MUTEX_ERRORCHECK_NP - && kind != PTHREAD_MUTEX_RECURSIVE_NP)); - /* ESRCH can happen only for non-robust PI mutexes where - the owner of the lock died. */ - assert (INTERNAL_SYSCALL_ERRNO (e, __err) != ESRCH || !robust); - - /* Delay the thread indefinitely. */ - while (1) - pause_not_cancel (); - } - - oldval = mutex->__data.__lock; - - assert (robust || (oldval & FUTEX_OWNER_DIED) == 0); - } - - if (__glibc_unlikely (oldval & FUTEX_OWNER_DIED)) - { - atomic_and (&mutex->__data.__lock, ~FUTEX_OWNER_DIED); - - /* We got the mutex. */ - mutex->__data.__count = 1; - /* But it is inconsistent unless marked otherwise. */ - mutex->__data.__owner = PTHREAD_MUTEX_INCONSISTENT; - - /* We must not enqueue the mutex before we have acquired it. - Also see comments at ENQUEUE_MUTEX. */ - __asm ("" ::: "memory"); - ENQUEUE_MUTEX_PI (mutex); - /* We need to clear op_pending after we enqueue the mutex. */ - __asm ("" ::: "memory"); - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - - /* Note that we deliberately exit here. If we fall - through to the end of the function __nusers would be - incremented which is not correct because the old owner - has to be discounted. If we are not supposed to - increment __nusers we actually have to decrement it here. */ -# ifdef NO_INCR - --mutex->__data.__nusers; -# endif - - return EOWNERDEAD; - } - - if (robust - && __builtin_expect (mutex->__data.__owner - == PTHREAD_MUTEX_NOTRECOVERABLE, 0)) - { - /* This mutex is now not recoverable. */ - mutex->__data.__count = 0; - - INTERNAL_SYSCALL_DECL (__err); - INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock, - __lll_private_flag (FUTEX_UNLOCK_PI, - PTHREAD_ROBUST_MUTEX_PSHARED (mutex)), - 0, 0); - - /* To the kernel, this will be visible after the kernel has - acquired the mutex in the syscall. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - return ENOTRECOVERABLE; - } - - mutex->__data.__count = 1; - if (robust) - { - /* We must not enqueue the mutex before we have acquired it. - Also see comments at ENQUEUE_MUTEX. */ - __asm ("" ::: "memory"); - ENQUEUE_MUTEX_PI (mutex); - /* We need to clear op_pending after we enqueue the mutex. */ - __asm ("" ::: "memory"); - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - } - } - break; -#endif /* __NR_futex. */ - - case PTHREAD_MUTEX_PP_RECURSIVE_NP: - case PTHREAD_MUTEX_PP_ERRORCHECK_NP: - case PTHREAD_MUTEX_PP_NORMAL_NP: - case PTHREAD_MUTEX_PP_ADAPTIVE_NP: - { - int kind = mutex->__data.__kind & PTHREAD_MUTEX_KIND_MASK_NP; - - oldval = mutex->__data.__lock; - - /* Check whether we already hold the mutex. */ - if (mutex->__data.__owner == id) - { - if (kind == PTHREAD_MUTEX_ERRORCHECK_NP) - return EDEADLK; - - if (kind == PTHREAD_MUTEX_RECURSIVE_NP) - { - /* Just bump the counter. */ - if (__glibc_unlikely (mutex->__data.__count + 1 == 0)) - /* Overflow of the counter. */ - return EAGAIN; - - ++mutex->__data.__count; - - return 0; - } - } - - int oldprio = -1, ceilval; - do - { - int ceiling = (oldval & PTHREAD_MUTEX_PRIO_CEILING_MASK) - >> PTHREAD_MUTEX_PRIO_CEILING_SHIFT; - - if (__pthread_current_priority () > ceiling) - { - if (oldprio != -1) - __pthread_tpp_change_priority (oldprio, -1); - return EINVAL; - } - - int retval = __pthread_tpp_change_priority (oldprio, ceiling); - if (retval) - return retval; - - ceilval = ceiling << PTHREAD_MUTEX_PRIO_CEILING_SHIFT; - oldprio = ceiling; - - oldval - = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, -#ifdef NO_INCR - ceilval | 2, -#else - ceilval | 1, -#endif - ceilval); - - if (oldval == ceilval) - break; - - do - { - oldval - = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - ceilval | 2, - ceilval | 1); - - if ((oldval & PTHREAD_MUTEX_PRIO_CEILING_MASK) != ceilval) - break; - - if (oldval != ceilval) - lll_futex_wait (&mutex->__data.__lock, ceilval | 2, - PTHREAD_MUTEX_PSHARED (mutex)); - } - while (atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - ceilval | 2, ceilval) - != ceilval); - } - while ((oldval & PTHREAD_MUTEX_PRIO_CEILING_MASK) != ceilval); - - assert (mutex->__data.__owner == 0); - mutex->__data.__count = 1; - } - break; - - default: - /* Correct code cannot set any other type. */ - return EINVAL; - } - - /* Record the ownership. */ - mutex->__data.__owner = id; -#ifndef NO_INCR - ++mutex->__data.__nusers; -#endif - - LIBC_PROBE (mutex_acquired, 1, mutex); - - return 0; -} -#ifndef __pthread_mutex_lock -strong_alias (__pthread_mutex_lock, pthread_mutex_lock) -hidden_def (__pthread_mutex_lock) -#endif - - -#ifdef NO_INCR -void -internal_function -__pthread_mutex_cond_lock_adjust (pthread_mutex_t *mutex) -{ - assert ((mutex->__data.__kind & PTHREAD_MUTEX_PRIO_INHERIT_NP) != 0); - assert ((mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP) == 0); - assert ((mutex->__data.__kind & PTHREAD_MUTEX_PSHARED_BIT) == 0); - - /* Record the ownership. */ - pid_t id = THREAD_GETMEM (THREAD_SELF, tid); - mutex->__data.__owner = id; - - if (mutex->__data.__kind == PTHREAD_MUTEX_PI_RECURSIVE_NP) - ++mutex->__data.__count; -} -#endif diff --git a/nptl/pthread_mutex_setprioceiling.c b/nptl/pthread_mutex_setprioceiling.c deleted file mode 100644 index 18b0763ba1..0000000000 --- a/nptl/pthread_mutex_setprioceiling.c +++ /dev/null @@ -1,121 +0,0 @@ -/* Set current priority ceiling of pthread_mutex_t. - Copyright (C) 2006-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2006. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdbool.h> -#include <errno.h> -#include <pthreadP.h> -#include <atomic.h> - - -int -pthread_mutex_setprioceiling (pthread_mutex_t *mutex, int prioceiling, - int *old_ceiling) -{ - /* The low bits of __kind aren't ever changed after pthread_mutex_init, - so we don't need a lock yet. */ - if ((mutex->__data.__kind & PTHREAD_MUTEX_PRIO_PROTECT_NP) == 0) - return EINVAL; - - /* See __init_sched_fifo_prio. */ - if (atomic_load_relaxed (&__sched_fifo_min_prio) == -1 - || atomic_load_relaxed (&__sched_fifo_max_prio) == -1) - __init_sched_fifo_prio (); - - if (__glibc_unlikely (prioceiling - < atomic_load_relaxed (&__sched_fifo_min_prio)) - || __glibc_unlikely (prioceiling - > atomic_load_relaxed (&__sched_fifo_max_prio)) - || __glibc_unlikely ((prioceiling - & (PTHREAD_MUTEXATTR_PRIO_CEILING_MASK - >> PTHREAD_MUTEXATTR_PRIO_CEILING_SHIFT)) - != prioceiling)) - return EINVAL; - - /* Check whether we already hold the mutex. */ - bool locked = false; - int kind = PTHREAD_MUTEX_TYPE (mutex); - if (mutex->__data.__owner == THREAD_GETMEM (THREAD_SELF, tid)) - { - if (kind == PTHREAD_MUTEX_PP_ERRORCHECK_NP) - return EDEADLK; - - if (kind == PTHREAD_MUTEX_PP_RECURSIVE_NP) - locked = true; - } - - int oldval = mutex->__data.__lock; - if (! locked) - do - { - /* Need to lock the mutex, but without obeying the priority - protect protocol. */ - int ceilval = (oldval & PTHREAD_MUTEX_PRIO_CEILING_MASK); - - oldval = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - ceilval | 1, ceilval); - if (oldval == ceilval) - break; - - do - { - oldval - = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - ceilval | 2, - ceilval | 1); - - if ((oldval & PTHREAD_MUTEX_PRIO_CEILING_MASK) != ceilval) - break; - - if (oldval != ceilval) - lll_futex_wait (&mutex->__data.__lock, ceilval | 2, - PTHREAD_MUTEX_PSHARED (mutex)); - } - while (atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - ceilval | 2, ceilval) - != ceilval); - - if ((oldval & PTHREAD_MUTEX_PRIO_CEILING_MASK) != ceilval) - continue; - } - while (0); - - int oldprio = (oldval & PTHREAD_MUTEX_PRIO_CEILING_MASK) - >> PTHREAD_MUTEX_PRIO_CEILING_SHIFT; - if (locked) - { - int ret = __pthread_tpp_change_priority (oldprio, prioceiling); - if (ret) - return ret; - } - - if (old_ceiling != NULL) - *old_ceiling = oldprio; - - int newlock = 0; - if (locked) - newlock = (mutex->__data.__lock & ~PTHREAD_MUTEX_PRIO_CEILING_MASK); - mutex->__data.__lock = newlock - | (prioceiling << PTHREAD_MUTEX_PRIO_CEILING_SHIFT); - atomic_full_barrier (); - - lll_futex_wake (&mutex->__data.__lock, INT_MAX, - PTHREAD_MUTEX_PSHARED (mutex)); - - return 0; -} diff --git a/nptl/pthread_mutex_timedlock.c b/nptl/pthread_mutex_timedlock.c deleted file mode 100644 index a4beb7b0dc..0000000000 --- a/nptl/pthread_mutex_timedlock.c +++ /dev/null @@ -1,636 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <time.h> -#include <sys/param.h> -#include <sys/time.h> -#include "pthreadP.h" -#include <atomic.h> -#include <lowlevellock.h> -#include <not-cancel.h> - -#include <stap-probe.h> - -#ifndef lll_timedlock_elision -#define lll_timedlock_elision(a,dummy,b,c) lll_timedlock(a, b, c) -#endif - -#ifndef lll_trylock_elision -#define lll_trylock_elision(a,t) lll_trylock(a) -#endif - -#ifndef FORCE_ELISION -#define FORCE_ELISION(m, s) -#endif - -int -pthread_mutex_timedlock (pthread_mutex_t *mutex, - const struct timespec *abstime) -{ - int oldval; - pid_t id = THREAD_GETMEM (THREAD_SELF, tid); - int result = 0; - - LIBC_PROBE (mutex_timedlock_entry, 2, mutex, abstime); - - /* We must not check ABSTIME here. If the thread does not block - abstime must not be checked for a valid value. */ - - switch (__builtin_expect (PTHREAD_MUTEX_TYPE_ELISION (mutex), - PTHREAD_MUTEX_TIMED_NP)) - { - /* Recursive mutex. */ - case PTHREAD_MUTEX_RECURSIVE_NP|PTHREAD_MUTEX_ELISION_NP: - case PTHREAD_MUTEX_RECURSIVE_NP: - /* Check whether we already hold the mutex. */ - if (mutex->__data.__owner == id) - { - /* Just bump the counter. */ - if (__glibc_unlikely (mutex->__data.__count + 1 == 0)) - /* Overflow of the counter. */ - return EAGAIN; - - ++mutex->__data.__count; - - goto out; - } - - /* We have to get the mutex. */ - result = lll_timedlock (mutex->__data.__lock, abstime, - PTHREAD_MUTEX_PSHARED (mutex)); - - if (result != 0) - goto out; - - /* Only locked once so far. */ - mutex->__data.__count = 1; - break; - - /* Error checking mutex. */ - case PTHREAD_MUTEX_ERRORCHECK_NP: - /* Check whether we already hold the mutex. */ - if (__glibc_unlikely (mutex->__data.__owner == id)) - return EDEADLK; - - /* Don't do lock elision on an error checking mutex. */ - goto simple; - - case PTHREAD_MUTEX_TIMED_NP: - FORCE_ELISION (mutex, goto elision); - simple: - /* Normal mutex. */ - result = lll_timedlock (mutex->__data.__lock, abstime, - PTHREAD_MUTEX_PSHARED (mutex)); - break; - - case PTHREAD_MUTEX_TIMED_ELISION_NP: - elision: __attribute__((unused)) - /* Don't record ownership */ - return lll_timedlock_elision (mutex->__data.__lock, - mutex->__data.__spins, - abstime, - PTHREAD_MUTEX_PSHARED (mutex)); - - - case PTHREAD_MUTEX_ADAPTIVE_NP: - if (! __is_smp) - goto simple; - - if (lll_trylock (mutex->__data.__lock) != 0) - { - int cnt = 0; - int max_cnt = MIN (MAX_ADAPTIVE_COUNT, - mutex->__data.__spins * 2 + 10); - do - { - if (cnt++ >= max_cnt) - { - result = lll_timedlock (mutex->__data.__lock, abstime, - PTHREAD_MUTEX_PSHARED (mutex)); - break; - } - atomic_spin_nop (); - } - while (lll_trylock (mutex->__data.__lock) != 0); - - mutex->__data.__spins += (cnt - mutex->__data.__spins) / 8; - } - break; - - case PTHREAD_MUTEX_ROBUST_RECURSIVE_NP: - case PTHREAD_MUTEX_ROBUST_ERRORCHECK_NP: - case PTHREAD_MUTEX_ROBUST_NORMAL_NP: - case PTHREAD_MUTEX_ROBUST_ADAPTIVE_NP: - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, - &mutex->__data.__list.__next); - /* We need to set op_pending before starting the operation. Also - see comments at ENQUEUE_MUTEX. */ - __asm ("" ::: "memory"); - - oldval = mutex->__data.__lock; - /* This is set to FUTEX_WAITERS iff we might have shared the - FUTEX_WAITERS flag with other threads, and therefore need to keep it - set to avoid lost wake-ups. We have the same requirement in the - simple mutex algorithm. */ - unsigned int assume_other_futex_waiters = 0; - while (1) - { - /* Try to acquire the lock through a CAS from 0 (not acquired) to - our TID | assume_other_futex_waiters. */ - if (__glibc_likely ((oldval == 0) - && (atomic_compare_and_exchange_bool_acq - (&mutex->__data.__lock, - id | assume_other_futex_waiters, 0) == 0))) - break; - - if ((oldval & FUTEX_OWNER_DIED) != 0) - { - /* The previous owner died. Try locking the mutex. */ - int newval = id | (oldval & FUTEX_WAITERS) - | assume_other_futex_waiters; - - newval - = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - newval, oldval); - if (newval != oldval) - { - oldval = newval; - continue; - } - - /* We got the mutex. */ - mutex->__data.__count = 1; - /* But it is inconsistent unless marked otherwise. */ - mutex->__data.__owner = PTHREAD_MUTEX_INCONSISTENT; - - /* We must not enqueue the mutex before we have acquired it. - Also see comments at ENQUEUE_MUTEX. */ - __asm ("" ::: "memory"); - ENQUEUE_MUTEX (mutex); - /* We need to clear op_pending after we enqueue the mutex. */ - __asm ("" ::: "memory"); - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - - /* Note that we deliberately exit here. If we fall - through to the end of the function __nusers would be - incremented which is not correct because the old - owner has to be discounted. */ - return EOWNERDEAD; - } - - /* Check whether we already hold the mutex. */ - if (__glibc_unlikely ((oldval & FUTEX_TID_MASK) == id)) - { - int kind = PTHREAD_MUTEX_TYPE (mutex); - if (kind == PTHREAD_MUTEX_ROBUST_ERRORCHECK_NP) - { - /* We do not need to ensure ordering wrt another memory - access. Also see comments at ENQUEUE_MUTEX. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, - NULL); - return EDEADLK; - } - - if (kind == PTHREAD_MUTEX_ROBUST_RECURSIVE_NP) - { - /* We do not need to ensure ordering wrt another memory - access. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, - NULL); - - /* Just bump the counter. */ - if (__glibc_unlikely (mutex->__data.__count + 1 == 0)) - /* Overflow of the counter. */ - return EAGAIN; - - ++mutex->__data.__count; - - LIBC_PROBE (mutex_timedlock_acquired, 1, mutex); - - return 0; - } - } - - /* We are about to block; check whether the timeout is invalid. */ - if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000) - return EINVAL; - /* Work around the fact that the kernel rejects negative timeout - values despite them being valid. */ - if (__glibc_unlikely (abstime->tv_sec < 0)) - return ETIMEDOUT; -#if (!defined __ASSUME_FUTEX_CLOCK_REALTIME \ - || !defined lll_futex_timed_wait_bitset) - struct timeval tv; - struct timespec rt; - - /* Get the current time. */ - (void) __gettimeofday (&tv, NULL); - - /* Compute relative timeout. */ - rt.tv_sec = abstime->tv_sec - tv.tv_sec; - rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * 1000; - if (rt.tv_nsec < 0) - { - rt.tv_nsec += 1000000000; - --rt.tv_sec; - } - - /* Already timed out? */ - if (rt.tv_sec < 0) - return ETIMEDOUT; -#endif - - /* We cannot acquire the mutex nor has its owner died. Thus, try - to block using futexes. Set FUTEX_WAITERS if necessary so that - other threads are aware that there are potentially threads - blocked on the futex. Restart if oldval changed in the - meantime. */ - if ((oldval & FUTEX_WAITERS) == 0) - { - if (atomic_compare_and_exchange_bool_acq (&mutex->__data.__lock, - oldval | FUTEX_WAITERS, - oldval) - != 0) - { - oldval = mutex->__data.__lock; - continue; - } - oldval |= FUTEX_WAITERS; - } - - /* It is now possible that we share the FUTEX_WAITERS flag with - another thread; therefore, update assume_other_futex_waiters so - that we do not forget about this when handling other cases - above and thus do not cause lost wake-ups. */ - assume_other_futex_waiters |= FUTEX_WAITERS; - - /* Block using the futex. */ -#if (!defined __ASSUME_FUTEX_CLOCK_REALTIME \ - || !defined lll_futex_timed_wait_bitset) - lll_futex_timed wait (&mutex->__data.__lock, oldval, - &rt, PTHREAD_ROBUST_MUTEX_PSHARED (mutex)); -#else - int err = lll_futex_timed_wait_bitset (&mutex->__data.__lock, - oldval, abstime, FUTEX_CLOCK_REALTIME, - PTHREAD_ROBUST_MUTEX_PSHARED (mutex)); - /* The futex call timed out. */ - if (err == -ETIMEDOUT) - return -err; -#endif - /* Reload current lock value. */ - oldval = mutex->__data.__lock; - } - - /* We have acquired the mutex; check if it is still consistent. */ - if (__builtin_expect (mutex->__data.__owner - == PTHREAD_MUTEX_NOTRECOVERABLE, 0)) - { - /* This mutex is now not recoverable. */ - mutex->__data.__count = 0; - int private = PTHREAD_ROBUST_MUTEX_PSHARED (mutex); - lll_unlock (mutex->__data.__lock, private); - /* FIXME This violates the mutex destruction requirements. See - __pthread_mutex_unlock_full. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - return ENOTRECOVERABLE; - } - - mutex->__data.__count = 1; - /* We must not enqueue the mutex before we have acquired it. - Also see comments at ENQUEUE_MUTEX. */ - __asm ("" ::: "memory"); - ENQUEUE_MUTEX (mutex); - /* We need to clear op_pending after we enqueue the mutex. */ - __asm ("" ::: "memory"); - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - break; - - /* The PI support requires the Linux futex system call. If that's not - available, pthread_mutex_init should never have allowed the type to - be set. So it will get the default case for an invalid type. */ -#ifdef __NR_futex - case PTHREAD_MUTEX_PI_RECURSIVE_NP: - case PTHREAD_MUTEX_PI_ERRORCHECK_NP: - case PTHREAD_MUTEX_PI_NORMAL_NP: - case PTHREAD_MUTEX_PI_ADAPTIVE_NP: - case PTHREAD_MUTEX_PI_ROBUST_RECURSIVE_NP: - case PTHREAD_MUTEX_PI_ROBUST_ERRORCHECK_NP: - case PTHREAD_MUTEX_PI_ROBUST_NORMAL_NP: - case PTHREAD_MUTEX_PI_ROBUST_ADAPTIVE_NP: - { - int kind = mutex->__data.__kind & PTHREAD_MUTEX_KIND_MASK_NP; - int robust = mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP; - - if (robust) - { - /* Note: robust PI futexes are signaled by setting bit 0. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, - (void *) (((uintptr_t) &mutex->__data.__list.__next) - | 1)); - /* We need to set op_pending before starting the operation. Also - see comments at ENQUEUE_MUTEX. */ - __asm ("" ::: "memory"); - } - - oldval = mutex->__data.__lock; - - /* Check whether we already hold the mutex. */ - if (__glibc_unlikely ((oldval & FUTEX_TID_MASK) == id)) - { - if (kind == PTHREAD_MUTEX_ERRORCHECK_NP) - { - /* We do not need to ensure ordering wrt another memory - access. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - return EDEADLK; - } - - if (kind == PTHREAD_MUTEX_RECURSIVE_NP) - { - /* We do not need to ensure ordering wrt another memory - access. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - - /* Just bump the counter. */ - if (__glibc_unlikely (mutex->__data.__count + 1 == 0)) - /* Overflow of the counter. */ - return EAGAIN; - - ++mutex->__data.__count; - - LIBC_PROBE (mutex_timedlock_acquired, 1, mutex); - - return 0; - } - } - - oldval = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - id, 0); - - if (oldval != 0) - { - /* The mutex is locked. The kernel will now take care of - everything. The timeout value must be a relative value. - Convert it. */ - int private = (robust - ? PTHREAD_ROBUST_MUTEX_PSHARED (mutex) - : PTHREAD_MUTEX_PSHARED (mutex)); - INTERNAL_SYSCALL_DECL (__err); - - int e = INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock, - __lll_private_flag (FUTEX_LOCK_PI, - private), 1, - abstime); - if (INTERNAL_SYSCALL_ERROR_P (e, __err)) - { - if (INTERNAL_SYSCALL_ERRNO (e, __err) == ETIMEDOUT) - return ETIMEDOUT; - - if (INTERNAL_SYSCALL_ERRNO (e, __err) == ESRCH - || INTERNAL_SYSCALL_ERRNO (e, __err) == EDEADLK) - { - assert (INTERNAL_SYSCALL_ERRNO (e, __err) != EDEADLK - || (kind != PTHREAD_MUTEX_ERRORCHECK_NP - && kind != PTHREAD_MUTEX_RECURSIVE_NP)); - /* ESRCH can happen only for non-robust PI mutexes where - the owner of the lock died. */ - assert (INTERNAL_SYSCALL_ERRNO (e, __err) != ESRCH - || !robust); - - /* Delay the thread until the timeout is reached. - Then return ETIMEDOUT. */ - struct timespec reltime; - struct timespec now; - - INTERNAL_SYSCALL (clock_gettime, __err, 2, CLOCK_REALTIME, - &now); - reltime.tv_sec = abstime->tv_sec - now.tv_sec; - reltime.tv_nsec = abstime->tv_nsec - now.tv_nsec; - if (reltime.tv_nsec < 0) - { - reltime.tv_nsec += 1000000000; - --reltime.tv_sec; - } - if (reltime.tv_sec >= 0) - while (nanosleep_not_cancel (&reltime, &reltime) != 0) - continue; - - return ETIMEDOUT; - } - - return INTERNAL_SYSCALL_ERRNO (e, __err); - } - - oldval = mutex->__data.__lock; - - assert (robust || (oldval & FUTEX_OWNER_DIED) == 0); - } - - if (__glibc_unlikely (oldval & FUTEX_OWNER_DIED)) - { - atomic_and (&mutex->__data.__lock, ~FUTEX_OWNER_DIED); - - /* We got the mutex. */ - mutex->__data.__count = 1; - /* But it is inconsistent unless marked otherwise. */ - mutex->__data.__owner = PTHREAD_MUTEX_INCONSISTENT; - - /* We must not enqueue the mutex before we have acquired it. - Also see comments at ENQUEUE_MUTEX. */ - __asm ("" ::: "memory"); - ENQUEUE_MUTEX_PI (mutex); - /* We need to clear op_pending after we enqueue the mutex. */ - __asm ("" ::: "memory"); - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - - /* Note that we deliberately exit here. If we fall - through to the end of the function __nusers would be - incremented which is not correct because the old owner - has to be discounted. */ - return EOWNERDEAD; - } - - if (robust - && __builtin_expect (mutex->__data.__owner - == PTHREAD_MUTEX_NOTRECOVERABLE, 0)) - { - /* This mutex is now not recoverable. */ - mutex->__data.__count = 0; - - INTERNAL_SYSCALL_DECL (__err); - INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock, - __lll_private_flag (FUTEX_UNLOCK_PI, - PTHREAD_ROBUST_MUTEX_PSHARED (mutex)), - 0, 0); - - /* To the kernel, this will be visible after the kernel has - acquired the mutex in the syscall. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - return ENOTRECOVERABLE; - } - - mutex->__data.__count = 1; - if (robust) - { - /* We must not enqueue the mutex before we have acquired it. - Also see comments at ENQUEUE_MUTEX. */ - __asm ("" ::: "memory"); - ENQUEUE_MUTEX_PI (mutex); - /* We need to clear op_pending after we enqueue the mutex. */ - __asm ("" ::: "memory"); - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - } - } - break; -#endif /* __NR_futex. */ - - case PTHREAD_MUTEX_PP_RECURSIVE_NP: - case PTHREAD_MUTEX_PP_ERRORCHECK_NP: - case PTHREAD_MUTEX_PP_NORMAL_NP: - case PTHREAD_MUTEX_PP_ADAPTIVE_NP: - { - int kind = mutex->__data.__kind & PTHREAD_MUTEX_KIND_MASK_NP; - - oldval = mutex->__data.__lock; - - /* Check whether we already hold the mutex. */ - if (mutex->__data.__owner == id) - { - if (kind == PTHREAD_MUTEX_ERRORCHECK_NP) - return EDEADLK; - - if (kind == PTHREAD_MUTEX_RECURSIVE_NP) - { - /* Just bump the counter. */ - if (__glibc_unlikely (mutex->__data.__count + 1 == 0)) - /* Overflow of the counter. */ - return EAGAIN; - - ++mutex->__data.__count; - - LIBC_PROBE (mutex_timedlock_acquired, 1, mutex); - - return 0; - } - } - - int oldprio = -1, ceilval; - do - { - int ceiling = (oldval & PTHREAD_MUTEX_PRIO_CEILING_MASK) - >> PTHREAD_MUTEX_PRIO_CEILING_SHIFT; - - if (__pthread_current_priority () > ceiling) - { - result = EINVAL; - failpp: - if (oldprio != -1) - __pthread_tpp_change_priority (oldprio, -1); - return result; - } - - result = __pthread_tpp_change_priority (oldprio, ceiling); - if (result) - return result; - - ceilval = ceiling << PTHREAD_MUTEX_PRIO_CEILING_SHIFT; - oldprio = ceiling; - - oldval - = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - ceilval | 1, ceilval); - - if (oldval == ceilval) - break; - - do - { - oldval - = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - ceilval | 2, - ceilval | 1); - - if ((oldval & PTHREAD_MUTEX_PRIO_CEILING_MASK) != ceilval) - break; - - if (oldval != ceilval) - { - /* Reject invalid timeouts. */ - if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000) - { - result = EINVAL; - goto failpp; - } - - struct timeval tv; - struct timespec rt; - - /* Get the current time. */ - (void) __gettimeofday (&tv, NULL); - - /* Compute relative timeout. */ - rt.tv_sec = abstime->tv_sec - tv.tv_sec; - rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * 1000; - if (rt.tv_nsec < 0) - { - rt.tv_nsec += 1000000000; - --rt.tv_sec; - } - - /* Already timed out? */ - if (rt.tv_sec < 0) - { - result = ETIMEDOUT; - goto failpp; - } - - lll_futex_timed_wait (&mutex->__data.__lock, - ceilval | 2, &rt, - PTHREAD_MUTEX_PSHARED (mutex)); - } - } - while (atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - ceilval | 2, ceilval) - != ceilval); - } - while ((oldval & PTHREAD_MUTEX_PRIO_CEILING_MASK) != ceilval); - - assert (mutex->__data.__owner == 0); - mutex->__data.__count = 1; - } - break; - - default: - /* Correct code cannot set any other type. */ - return EINVAL; - } - - if (result == 0) - { - /* Record the ownership. */ - mutex->__data.__owner = id; - ++mutex->__data.__nusers; - - LIBC_PROBE (mutex_timedlock_acquired, 1, mutex); - } - - out: - return result; -} diff --git a/nptl/pthread_mutex_trylock.c b/nptl/pthread_mutex_trylock.c deleted file mode 100644 index e514997be8..0000000000 --- a/nptl/pthread_mutex_trylock.c +++ /dev/null @@ -1,408 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <stdlib.h> -#include "pthreadP.h" -#include <lowlevellock.h> - -#ifndef lll_trylock_elision -#define lll_trylock_elision(a,t) lll_trylock(a) -#endif - -#ifndef FORCE_ELISION -#define FORCE_ELISION(m, s) -#endif - -int -__pthread_mutex_trylock (pthread_mutex_t *mutex) -{ - int oldval; - pid_t id = THREAD_GETMEM (THREAD_SELF, tid); - - switch (__builtin_expect (PTHREAD_MUTEX_TYPE_ELISION (mutex), - PTHREAD_MUTEX_TIMED_NP)) - { - /* Recursive mutex. */ - case PTHREAD_MUTEX_RECURSIVE_NP|PTHREAD_MUTEX_ELISION_NP: - case PTHREAD_MUTEX_RECURSIVE_NP: - /* Check whether we already hold the mutex. */ - if (mutex->__data.__owner == id) - { - /* Just bump the counter. */ - if (__glibc_unlikely (mutex->__data.__count + 1 == 0)) - /* Overflow of the counter. */ - return EAGAIN; - - ++mutex->__data.__count; - return 0; - } - - if (lll_trylock (mutex->__data.__lock) == 0) - { - /* Record the ownership. */ - mutex->__data.__owner = id; - mutex->__data.__count = 1; - ++mutex->__data.__nusers; - return 0; - } - break; - - case PTHREAD_MUTEX_TIMED_ELISION_NP: - elision: __attribute__((unused)) - if (lll_trylock_elision (mutex->__data.__lock, - mutex->__data.__elision) != 0) - break; - /* Don't record the ownership. */ - return 0; - - case PTHREAD_MUTEX_TIMED_NP: - FORCE_ELISION (mutex, goto elision); - /*FALL THROUGH*/ - case PTHREAD_MUTEX_ADAPTIVE_NP: - case PTHREAD_MUTEX_ERRORCHECK_NP: - if (lll_trylock (mutex->__data.__lock) != 0) - break; - - /* Record the ownership. */ - mutex->__data.__owner = id; - ++mutex->__data.__nusers; - - return 0; - - case PTHREAD_MUTEX_ROBUST_RECURSIVE_NP: - case PTHREAD_MUTEX_ROBUST_ERRORCHECK_NP: - case PTHREAD_MUTEX_ROBUST_NORMAL_NP: - case PTHREAD_MUTEX_ROBUST_ADAPTIVE_NP: - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, - &mutex->__data.__list.__next); - - oldval = mutex->__data.__lock; - do - { - again: - if ((oldval & FUTEX_OWNER_DIED) != 0) - { - /* The previous owner died. Try locking the mutex. */ - int newval = id | (oldval & FUTEX_WAITERS); - - newval - = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - newval, oldval); - - if (newval != oldval) - { - oldval = newval; - goto again; - } - - /* We got the mutex. */ - mutex->__data.__count = 1; - /* But it is inconsistent unless marked otherwise. */ - mutex->__data.__owner = PTHREAD_MUTEX_INCONSISTENT; - - ENQUEUE_MUTEX (mutex); - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - - /* Note that we deliberately exist here. If we fall - through to the end of the function __nusers would be - incremented which is not correct because the old - owner has to be discounted. */ - return EOWNERDEAD; - } - - /* Check whether we already hold the mutex. */ - if (__glibc_unlikely ((oldval & FUTEX_TID_MASK) == id)) - { - int kind = PTHREAD_MUTEX_TYPE (mutex); - if (kind == PTHREAD_MUTEX_ROBUST_ERRORCHECK_NP) - { - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, - NULL); - return EDEADLK; - } - - if (kind == PTHREAD_MUTEX_ROBUST_RECURSIVE_NP) - { - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, - NULL); - - /* Just bump the counter. */ - if (__glibc_unlikely (mutex->__data.__count + 1 == 0)) - /* Overflow of the counter. */ - return EAGAIN; - - ++mutex->__data.__count; - - return 0; - } - } - - oldval = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - id, 0); - if (oldval != 0 && (oldval & FUTEX_OWNER_DIED) == 0) - { - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - - return EBUSY; - } - - if (__builtin_expect (mutex->__data.__owner - == PTHREAD_MUTEX_NOTRECOVERABLE, 0)) - { - /* This mutex is now not recoverable. */ - mutex->__data.__count = 0; - if (oldval == id) - lll_unlock (mutex->__data.__lock, - PTHREAD_ROBUST_MUTEX_PSHARED (mutex)); - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - return ENOTRECOVERABLE; - } - } - while ((oldval & FUTEX_OWNER_DIED) != 0); - - ENQUEUE_MUTEX (mutex); - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - - mutex->__data.__owner = id; - ++mutex->__data.__nusers; - mutex->__data.__count = 1; - - return 0; - - /* The PI support requires the Linux futex system call. If that's not - available, pthread_mutex_init should never have allowed the type to - be set. So it will get the default case for an invalid type. */ -#ifdef __NR_futex - case PTHREAD_MUTEX_PI_RECURSIVE_NP: - case PTHREAD_MUTEX_PI_ERRORCHECK_NP: - case PTHREAD_MUTEX_PI_NORMAL_NP: - case PTHREAD_MUTEX_PI_ADAPTIVE_NP: - case PTHREAD_MUTEX_PI_ROBUST_RECURSIVE_NP: - case PTHREAD_MUTEX_PI_ROBUST_ERRORCHECK_NP: - case PTHREAD_MUTEX_PI_ROBUST_NORMAL_NP: - case PTHREAD_MUTEX_PI_ROBUST_ADAPTIVE_NP: - { - int kind = mutex->__data.__kind & PTHREAD_MUTEX_KIND_MASK_NP; - int robust = mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP; - - if (robust) - /* Note: robust PI futexes are signaled by setting bit 0. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, - (void *) (((uintptr_t) &mutex->__data.__list.__next) - | 1)); - - oldval = mutex->__data.__lock; - - /* Check whether we already hold the mutex. */ - if (__glibc_unlikely ((oldval & FUTEX_TID_MASK) == id)) - { - if (kind == PTHREAD_MUTEX_ERRORCHECK_NP) - { - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - return EDEADLK; - } - - if (kind == PTHREAD_MUTEX_RECURSIVE_NP) - { - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - - /* Just bump the counter. */ - if (__glibc_unlikely (mutex->__data.__count + 1 == 0)) - /* Overflow of the counter. */ - return EAGAIN; - - ++mutex->__data.__count; - - return 0; - } - } - - oldval - = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - id, 0); - - if (oldval != 0) - { - if ((oldval & FUTEX_OWNER_DIED) == 0) - { - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - - return EBUSY; - } - - assert (robust); - - /* The mutex owner died. The kernel will now take care of - everything. */ - int private = (robust - ? PTHREAD_ROBUST_MUTEX_PSHARED (mutex) - : PTHREAD_MUTEX_PSHARED (mutex)); - INTERNAL_SYSCALL_DECL (__err); - int e = INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock, - __lll_private_flag (FUTEX_TRYLOCK_PI, - private), 0, 0); - - if (INTERNAL_SYSCALL_ERROR_P (e, __err) - && INTERNAL_SYSCALL_ERRNO (e, __err) == EWOULDBLOCK) - { - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - - return EBUSY; - } - - oldval = mutex->__data.__lock; - } - - if (__glibc_unlikely (oldval & FUTEX_OWNER_DIED)) - { - atomic_and (&mutex->__data.__lock, ~FUTEX_OWNER_DIED); - - /* We got the mutex. */ - mutex->__data.__count = 1; - /* But it is inconsistent unless marked otherwise. */ - mutex->__data.__owner = PTHREAD_MUTEX_INCONSISTENT; - - ENQUEUE_MUTEX (mutex); - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - - /* Note that we deliberately exit here. If we fall - through to the end of the function __nusers would be - incremented which is not correct because the old owner - has to be discounted. */ - return EOWNERDEAD; - } - - if (robust - && __builtin_expect (mutex->__data.__owner - == PTHREAD_MUTEX_NOTRECOVERABLE, 0)) - { - /* This mutex is now not recoverable. */ - mutex->__data.__count = 0; - - INTERNAL_SYSCALL_DECL (__err); - INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock, - __lll_private_flag (FUTEX_UNLOCK_PI, - PTHREAD_ROBUST_MUTEX_PSHARED (mutex)), - 0, 0); - - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - return ENOTRECOVERABLE; - } - - if (robust) - { - ENQUEUE_MUTEX_PI (mutex); - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - } - - mutex->__data.__owner = id; - ++mutex->__data.__nusers; - mutex->__data.__count = 1; - - return 0; - } -#endif /* __NR_futex. */ - - case PTHREAD_MUTEX_PP_RECURSIVE_NP: - case PTHREAD_MUTEX_PP_ERRORCHECK_NP: - case PTHREAD_MUTEX_PP_NORMAL_NP: - case PTHREAD_MUTEX_PP_ADAPTIVE_NP: - { - int kind = mutex->__data.__kind & PTHREAD_MUTEX_KIND_MASK_NP; - - oldval = mutex->__data.__lock; - - /* Check whether we already hold the mutex. */ - if (mutex->__data.__owner == id) - { - if (kind == PTHREAD_MUTEX_ERRORCHECK_NP) - return EDEADLK; - - if (kind == PTHREAD_MUTEX_RECURSIVE_NP) - { - /* Just bump the counter. */ - if (__glibc_unlikely (mutex->__data.__count + 1 == 0)) - /* Overflow of the counter. */ - return EAGAIN; - - ++mutex->__data.__count; - - return 0; - } - } - - int oldprio = -1, ceilval; - do - { - int ceiling = (oldval & PTHREAD_MUTEX_PRIO_CEILING_MASK) - >> PTHREAD_MUTEX_PRIO_CEILING_SHIFT; - - if (__pthread_current_priority () > ceiling) - { - if (oldprio != -1) - __pthread_tpp_change_priority (oldprio, -1); - return EINVAL; - } - - int retval = __pthread_tpp_change_priority (oldprio, ceiling); - if (retval) - return retval; - - ceilval = ceiling << PTHREAD_MUTEX_PRIO_CEILING_SHIFT; - oldprio = ceiling; - - oldval - = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, - ceilval | 1, ceilval); - - if (oldval == ceilval) - break; - } - while ((oldval & PTHREAD_MUTEX_PRIO_CEILING_MASK) != ceilval); - - if (oldval != ceilval) - { - __pthread_tpp_change_priority (oldprio, -1); - break; - } - - assert (mutex->__data.__owner == 0); - /* Record the ownership. */ - mutex->__data.__owner = id; - ++mutex->__data.__nusers; - mutex->__data.__count = 1; - - return 0; - } - break; - - default: - /* Correct code cannot set any other type. */ - return EINVAL; - } - - return EBUSY; -} - -#ifndef __pthread_mutex_trylock -#ifndef pthread_mutex_trylock -strong_alias (__pthread_mutex_trylock, pthread_mutex_trylock) -#endif -#endif diff --git a/nptl/pthread_mutex_unlock.c b/nptl/pthread_mutex_unlock.c deleted file mode 100644 index f701d4e274..0000000000 --- a/nptl/pthread_mutex_unlock.c +++ /dev/null @@ -1,350 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <stdlib.h> -#include "pthreadP.h" -#include <lowlevellock.h> -#include <stap-probe.h> - -#ifndef lll_unlock_elision -#define lll_unlock_elision(a,b,c) ({ lll_unlock (a,c); 0; }) -#endif - -static int -internal_function -__pthread_mutex_unlock_full (pthread_mutex_t *mutex, int decr) - __attribute_noinline__; - -int -internal_function attribute_hidden -__pthread_mutex_unlock_usercnt (pthread_mutex_t *mutex, int decr) -{ - int type = PTHREAD_MUTEX_TYPE_ELISION (mutex); - if (__builtin_expect (type & - ~(PTHREAD_MUTEX_KIND_MASK_NP|PTHREAD_MUTEX_ELISION_FLAGS_NP), 0)) - return __pthread_mutex_unlock_full (mutex, decr); - - if (__builtin_expect (type, PTHREAD_MUTEX_TIMED_NP) - == PTHREAD_MUTEX_TIMED_NP) - { - /* Always reset the owner field. */ - normal: - mutex->__data.__owner = 0; - if (decr) - /* One less user. */ - --mutex->__data.__nusers; - - /* Unlock. */ - lll_unlock (mutex->__data.__lock, PTHREAD_MUTEX_PSHARED (mutex)); - - LIBC_PROBE (mutex_release, 1, mutex); - - return 0; - } - else if (__glibc_likely (type == PTHREAD_MUTEX_TIMED_ELISION_NP)) - { - /* Don't reset the owner/users fields for elision. */ - return lll_unlock_elision (mutex->__data.__lock, mutex->__data.__elision, - PTHREAD_MUTEX_PSHARED (mutex)); - } - else if (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex) - == PTHREAD_MUTEX_RECURSIVE_NP, 1)) - { - /* Recursive mutex. */ - if (mutex->__data.__owner != THREAD_GETMEM (THREAD_SELF, tid)) - return EPERM; - - if (--mutex->__data.__count != 0) - /* We still hold the mutex. */ - return 0; - goto normal; - } - else if (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex) - == PTHREAD_MUTEX_ADAPTIVE_NP, 1)) - goto normal; - else - { - /* Error checking mutex. */ - assert (type == PTHREAD_MUTEX_ERRORCHECK_NP); - if (mutex->__data.__owner != THREAD_GETMEM (THREAD_SELF, tid) - || ! lll_islocked (mutex->__data.__lock)) - return EPERM; - goto normal; - } -} - - -static int -internal_function -__pthread_mutex_unlock_full (pthread_mutex_t *mutex, int decr) -{ - int newowner = 0; - int private; - - switch (PTHREAD_MUTEX_TYPE (mutex)) - { - case PTHREAD_MUTEX_ROBUST_RECURSIVE_NP: - /* Recursive mutex. */ - if ((mutex->__data.__lock & FUTEX_TID_MASK) - == THREAD_GETMEM (THREAD_SELF, tid) - && __builtin_expect (mutex->__data.__owner - == PTHREAD_MUTEX_INCONSISTENT, 0)) - { - if (--mutex->__data.__count != 0) - /* We still hold the mutex. */ - return ENOTRECOVERABLE; - - goto notrecoverable; - } - - if (mutex->__data.__owner != THREAD_GETMEM (THREAD_SELF, tid)) - return EPERM; - - if (--mutex->__data.__count != 0) - /* We still hold the mutex. */ - return 0; - - goto robust; - - case PTHREAD_MUTEX_ROBUST_ERRORCHECK_NP: - case PTHREAD_MUTEX_ROBUST_NORMAL_NP: - case PTHREAD_MUTEX_ROBUST_ADAPTIVE_NP: - if ((mutex->__data.__lock & FUTEX_TID_MASK) - != THREAD_GETMEM (THREAD_SELF, tid) - || ! lll_islocked (mutex->__data.__lock)) - return EPERM; - - /* If the previous owner died and the caller did not succeed in - making the state consistent, mark the mutex as unrecoverable - and make all waiters. */ - if (__builtin_expect (mutex->__data.__owner - == PTHREAD_MUTEX_INCONSISTENT, 0)) - notrecoverable: - newowner = PTHREAD_MUTEX_NOTRECOVERABLE; - - robust: - /* Remove mutex from the list. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, - &mutex->__data.__list.__next); - /* We must set op_pending before we dequeue the mutex. Also see - comments at ENQUEUE_MUTEX. */ - __asm ("" ::: "memory"); - DEQUEUE_MUTEX (mutex); - - mutex->__data.__owner = newowner; - if (decr) - /* One less user. */ - --mutex->__data.__nusers; - - /* Unlock by setting the lock to 0 (not acquired); if the lock had - FUTEX_WAITERS set previously, then wake any waiters. - The unlock operation must be the last access to the mutex to not - violate the mutex destruction requirements (see __lll_unlock). */ - private = PTHREAD_ROBUST_MUTEX_PSHARED (mutex); - if (__glibc_unlikely ((atomic_exchange_rel (&mutex->__data.__lock, 0) - & FUTEX_WAITERS) != 0)) - lll_futex_wake (&mutex->__data.__lock, 1, private); - - /* We must clear op_pending after we release the mutex. - FIXME However, this violates the mutex destruction requirements - because another thread could acquire the mutex, destroy it, and - reuse the memory for something else; then, if this thread crashes, - and the memory happens to have a value equal to the TID, the kernel - will believe it is still related to the mutex (which has been - destroyed already) and will modify some other random object. */ - __asm ("" ::: "memory"); - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - break; - - /* The PI support requires the Linux futex system call. If that's not - available, pthread_mutex_init should never have allowed the type to - be set. So it will get the default case for an invalid type. */ -#ifdef __NR_futex - case PTHREAD_MUTEX_PI_RECURSIVE_NP: - /* Recursive mutex. */ - if (mutex->__data.__owner != THREAD_GETMEM (THREAD_SELF, tid)) - return EPERM; - - if (--mutex->__data.__count != 0) - /* We still hold the mutex. */ - return 0; - goto continue_pi_non_robust; - - case PTHREAD_MUTEX_PI_ROBUST_RECURSIVE_NP: - /* Recursive mutex. */ - if ((mutex->__data.__lock & FUTEX_TID_MASK) - == THREAD_GETMEM (THREAD_SELF, tid) - && __builtin_expect (mutex->__data.__owner - == PTHREAD_MUTEX_INCONSISTENT, 0)) - { - if (--mutex->__data.__count != 0) - /* We still hold the mutex. */ - return ENOTRECOVERABLE; - - goto pi_notrecoverable; - } - - if (mutex->__data.__owner != THREAD_GETMEM (THREAD_SELF, tid)) - return EPERM; - - if (--mutex->__data.__count != 0) - /* We still hold the mutex. */ - return 0; - - goto continue_pi_robust; - - case PTHREAD_MUTEX_PI_ERRORCHECK_NP: - case PTHREAD_MUTEX_PI_NORMAL_NP: - case PTHREAD_MUTEX_PI_ADAPTIVE_NP: - case PTHREAD_MUTEX_PI_ROBUST_ERRORCHECK_NP: - case PTHREAD_MUTEX_PI_ROBUST_NORMAL_NP: - case PTHREAD_MUTEX_PI_ROBUST_ADAPTIVE_NP: - if ((mutex->__data.__lock & FUTEX_TID_MASK) - != THREAD_GETMEM (THREAD_SELF, tid) - || ! lll_islocked (mutex->__data.__lock)) - return EPERM; - - /* If the previous owner died and the caller did not succeed in - making the state consistent, mark the mutex as unrecoverable - and make all waiters. */ - if ((mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP) != 0 - && __builtin_expect (mutex->__data.__owner - == PTHREAD_MUTEX_INCONSISTENT, 0)) - pi_notrecoverable: - newowner = PTHREAD_MUTEX_NOTRECOVERABLE; - - if ((mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP) != 0) - { - continue_pi_robust: - /* Remove mutex from the list. - Note: robust PI futexes are signaled by setting bit 0. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, - (void *) (((uintptr_t) &mutex->__data.__list.__next) - | 1)); - /* We must set op_pending before we dequeue the mutex. Also see - comments at ENQUEUE_MUTEX. */ - __asm ("" ::: "memory"); - DEQUEUE_MUTEX (mutex); - } - - continue_pi_non_robust: - mutex->__data.__owner = newowner; - if (decr) - /* One less user. */ - --mutex->__data.__nusers; - - /* Unlock. Load all necessary mutex data before releasing the mutex - to not violate the mutex destruction requirements (see - lll_unlock). */ - int robust = mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP; - private = (robust - ? PTHREAD_ROBUST_MUTEX_PSHARED (mutex) - : PTHREAD_MUTEX_PSHARED (mutex)); - /* Unlock the mutex using a CAS unless there are futex waiters or our - TID is not the value of __lock anymore, in which case we let the - kernel take care of the situation. Use release MO in the CAS to - synchronize with acquire MO in lock acquisitions. */ - int l = atomic_load_relaxed (&mutex->__data.__lock); - do - { - if (((l & FUTEX_WAITERS) != 0) - || (l != THREAD_GETMEM (THREAD_SELF, tid))) - { - INTERNAL_SYSCALL_DECL (__err); - INTERNAL_SYSCALL (futex, __err, 2, &mutex->__data.__lock, - __lll_private_flag (FUTEX_UNLOCK_PI, private)); - break; - } - } - while (!atomic_compare_exchange_weak_release (&mutex->__data.__lock, - &l, 0)); - - /* This happens after the kernel releases the mutex but violates the - mutex destruction requirements; see comments in the code handling - PTHREAD_MUTEX_ROBUST_NORMAL_NP. */ - THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); - break; -#endif /* __NR_futex. */ - - case PTHREAD_MUTEX_PP_RECURSIVE_NP: - /* Recursive mutex. */ - if (mutex->__data.__owner != THREAD_GETMEM (THREAD_SELF, tid)) - return EPERM; - - if (--mutex->__data.__count != 0) - /* We still hold the mutex. */ - return 0; - goto pp; - - case PTHREAD_MUTEX_PP_ERRORCHECK_NP: - /* Error checking mutex. */ - if (mutex->__data.__owner != THREAD_GETMEM (THREAD_SELF, tid) - || (mutex->__data.__lock & ~ PTHREAD_MUTEX_PRIO_CEILING_MASK) == 0) - return EPERM; - /* FALLTHROUGH */ - - case PTHREAD_MUTEX_PP_NORMAL_NP: - case PTHREAD_MUTEX_PP_ADAPTIVE_NP: - /* Always reset the owner field. */ - pp: - mutex->__data.__owner = 0; - - if (decr) - /* One less user. */ - --mutex->__data.__nusers; - - /* Unlock. Use release MO in the CAS to synchronize with acquire MO in - lock acquisitions. */ - int newval; - int oldval = atomic_load_relaxed (&mutex->__data.__lock); - do - { - newval = oldval & PTHREAD_MUTEX_PRIO_CEILING_MASK; - } - while (!atomic_compare_exchange_weak_release (&mutex->__data.__lock, - &oldval, newval)); - - if ((oldval & ~PTHREAD_MUTEX_PRIO_CEILING_MASK) > 1) - lll_futex_wake (&mutex->__data.__lock, 1, - PTHREAD_MUTEX_PSHARED (mutex)); - - int oldprio = newval >> PTHREAD_MUTEX_PRIO_CEILING_SHIFT; - - LIBC_PROBE (mutex_release, 1, mutex); - - return __pthread_tpp_change_priority (oldprio, -1); - - default: - /* Correct code cannot set any other type. */ - return EINVAL; - } - - LIBC_PROBE (mutex_release, 1, mutex); - return 0; -} - - -int -__pthread_mutex_unlock (pthread_mutex_t *mutex) -{ - return __pthread_mutex_unlock_usercnt (mutex, 1); -} -strong_alias (__pthread_mutex_unlock, pthread_mutex_unlock) -hidden_def (__pthread_mutex_unlock) diff --git a/nptl/pthread_mutexattr_destroy.c b/nptl/pthread_mutexattr_destroy.c deleted file mode 100644 index 3dd2d6c580..0000000000 --- a/nptl/pthread_mutexattr_destroy.c +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthreadP.h> - - -int -__pthread_mutexattr_destroy (pthread_mutexattr_t *attr) -{ - return 0; -} -strong_alias (__pthread_mutexattr_destroy, pthread_mutexattr_destroy) diff --git a/nptl/pthread_mutexattr_getprioceiling.c b/nptl/pthread_mutexattr_getprioceiling.c deleted file mode 100644 index 7d3944d25f..0000000000 --- a/nptl/pthread_mutexattr_getprioceiling.c +++ /dev/null @@ -1,48 +0,0 @@ -/* Get priority ceiling setting from pthread_mutexattr_t. - Copyright (C) 2006-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2006. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthreadP.h> -#include <atomic.h> - - -int -pthread_mutexattr_getprioceiling (const pthread_mutexattr_t *attr, - int *prioceiling) -{ - const struct pthread_mutexattr *iattr; - int ceiling; - - iattr = (const struct pthread_mutexattr *) attr; - - ceiling = ((iattr->mutexkind & PTHREAD_MUTEXATTR_PRIO_CEILING_MASK) - >> PTHREAD_MUTEXATTR_PRIO_CEILING_SHIFT); - - if (! ceiling) - { - /* See __init_sched_fifo_prio. */ - if (atomic_load_relaxed (&__sched_fifo_min_prio) == -1) - __init_sched_fifo_prio (); - if (ceiling < atomic_load_relaxed (&__sched_fifo_min_prio)) - ceiling = atomic_load_relaxed (&__sched_fifo_min_prio); - } - - *prioceiling = ceiling; - - return 0; -} diff --git a/nptl/pthread_mutexattr_getprotocol.c b/nptl/pthread_mutexattr_getprotocol.c deleted file mode 100644 index d5856ac14f..0000000000 --- a/nptl/pthread_mutexattr_getprotocol.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Get priority protocol setting from pthread_mutexattr_t. - Copyright (C) 2006-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2006. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthreadP.h> - - -int -pthread_mutexattr_getprotocol (const pthread_mutexattr_t *attr, int *protocol) -{ - const struct pthread_mutexattr *iattr; - - iattr = (const struct pthread_mutexattr *) attr; - - *protocol = ((iattr->mutexkind & PTHREAD_MUTEXATTR_PROTOCOL_MASK) - >> PTHREAD_MUTEXATTR_PROTOCOL_SHIFT); - - return 0; -} diff --git a/nptl/pthread_mutexattr_getpshared.c b/nptl/pthread_mutexattr_getpshared.c deleted file mode 100644 index 793c349cbd..0000000000 --- a/nptl/pthread_mutexattr_getpshared.c +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthreadP.h> - - -int -pthread_mutexattr_getpshared (const pthread_mutexattr_t *attr, int *pshared) -{ - const struct pthread_mutexattr *iattr; - - iattr = (const struct pthread_mutexattr *) attr; - - *pshared = ((iattr->mutexkind & PTHREAD_MUTEXATTR_FLAG_PSHARED) != 0 - ? PTHREAD_PROCESS_SHARED : PTHREAD_PROCESS_PRIVATE); - - return 0; -} diff --git a/nptl/pthread_mutexattr_getrobust.c b/nptl/pthread_mutexattr_getrobust.c deleted file mode 100644 index 833dca2206..0000000000 --- a/nptl/pthread_mutexattr_getrobust.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (C) 2005-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2005. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthreadP.h> - - -int -pthread_mutexattr_getrobust (const pthread_mutexattr_t *attr, int *robustness) -{ - const struct pthread_mutexattr *iattr; - - iattr = (const struct pthread_mutexattr *) attr; - - *robustness = ((iattr->mutexkind & PTHREAD_MUTEXATTR_FLAG_ROBUST) != 0 - ? PTHREAD_MUTEX_ROBUST_NP : PTHREAD_MUTEX_STALLED_NP); - - return 0; -} -weak_alias (pthread_mutexattr_getrobust, pthread_mutexattr_getrobust_np) diff --git a/nptl/pthread_mutexattr_gettype.c b/nptl/pthread_mutexattr_gettype.c deleted file mode 100644 index 1e915b1c45..0000000000 --- a/nptl/pthread_mutexattr_gettype.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthreadP.h> - - -int -pthread_mutexattr_gettype (const pthread_mutexattr_t *attr, int *kind) -{ - const struct pthread_mutexattr *iattr; - - iattr = (const struct pthread_mutexattr *) attr; - - *kind = (iattr->mutexkind & ~PTHREAD_MUTEXATTR_FLAG_BITS - & ~PTHREAD_MUTEX_NO_ELISION_NP); - - return 0; -} -weak_alias (pthread_mutexattr_gettype, pthread_mutexattr_getkind_np) diff --git a/nptl/pthread_mutexattr_init.c b/nptl/pthread_mutexattr_init.c deleted file mode 100644 index 210d490c44..0000000000 --- a/nptl/pthread_mutexattr_init.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <pthreadP.h> - - -int -__pthread_mutexattr_init (pthread_mutexattr_t *attr) -{ - if (sizeof (struct pthread_mutexattr) != sizeof (pthread_mutexattr_t)) - memset (attr, '\0', sizeof (*attr)); - - /* We use bit 31 to signal whether the mutex is going to be - process-shared or not. By default it is zero, i.e., the mutex is - not process-shared. */ - ((struct pthread_mutexattr *) attr)->mutexkind = PTHREAD_MUTEX_NORMAL; - - return 0; -} -strong_alias (__pthread_mutexattr_init, pthread_mutexattr_init) diff --git a/nptl/pthread_mutexattr_setprioceiling.c b/nptl/pthread_mutexattr_setprioceiling.c deleted file mode 100644 index b6edc21648..0000000000 --- a/nptl/pthread_mutexattr_setprioceiling.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Change priority ceiling setting in pthread_mutexattr_t. - Copyright (C) 2006-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2006. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthreadP.h> -#include <atomic.h> - - -int -pthread_mutexattr_setprioceiling (pthread_mutexattr_t *attr, int prioceiling) -{ - /* See __init_sched_fifo_prio. */ - if (atomic_load_relaxed (&__sched_fifo_min_prio) == -1 - || atomic_load_relaxed (&__sched_fifo_max_prio) == -1) - __init_sched_fifo_prio (); - - if (__glibc_unlikely (prioceiling - < atomic_load_relaxed (&__sched_fifo_min_prio)) - || __glibc_unlikely (prioceiling - > atomic_load_relaxed (&__sched_fifo_max_prio)) - || __glibc_unlikely ((prioceiling - & (PTHREAD_MUTEXATTR_PRIO_CEILING_MASK - >> PTHREAD_MUTEXATTR_PRIO_CEILING_SHIFT)) - != prioceiling)) - return EINVAL; - - struct pthread_mutexattr *iattr = (struct pthread_mutexattr *) attr; - - iattr->mutexkind = ((iattr->mutexkind & ~PTHREAD_MUTEXATTR_PRIO_CEILING_MASK) - | (prioceiling << PTHREAD_MUTEXATTR_PRIO_CEILING_SHIFT)); - - return 0; -} diff --git a/nptl/pthread_mutexattr_setprotocol.c b/nptl/pthread_mutexattr_setprotocol.c deleted file mode 100644 index 301fd0a4fc..0000000000 --- a/nptl/pthread_mutexattr_setprotocol.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Change priority protocol setting in pthread_mutexattr_t. - Copyright (C) 2006-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2006. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthreadP.h> - - -int -pthread_mutexattr_setprotocol (pthread_mutexattr_t *attr, int protocol) -{ - if (protocol != PTHREAD_PRIO_NONE - && protocol != PTHREAD_PRIO_INHERIT - && __builtin_expect (protocol != PTHREAD_PRIO_PROTECT, 0)) - return EINVAL; - - struct pthread_mutexattr *iattr = (struct pthread_mutexattr *) attr; - - iattr->mutexkind = ((iattr->mutexkind & ~PTHREAD_MUTEXATTR_PROTOCOL_MASK) - | (protocol << PTHREAD_MUTEXATTR_PROTOCOL_SHIFT)); - - return 0; -} diff --git a/nptl/pthread_mutexattr_setpshared.c b/nptl/pthread_mutexattr_setpshared.c deleted file mode 100644 index a81b7d85ba..0000000000 --- a/nptl/pthread_mutexattr_setpshared.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthreadP.h> -#include <futex-internal.h> - - -int -pthread_mutexattr_setpshared (pthread_mutexattr_t *attr, int pshared) -{ - struct pthread_mutexattr *iattr; - - int err = futex_supports_pshared (pshared); - if (err != 0) - return err; - - iattr = (struct pthread_mutexattr *) attr; - - if (pshared == PTHREAD_PROCESS_PRIVATE) - iattr->mutexkind &= ~PTHREAD_MUTEXATTR_FLAG_PSHARED; - else - iattr->mutexkind |= PTHREAD_MUTEXATTR_FLAG_PSHARED; - - return 0; -} diff --git a/nptl/pthread_mutexattr_setrobust.c b/nptl/pthread_mutexattr_setrobust.c deleted file mode 100644 index a71085297a..0000000000 --- a/nptl/pthread_mutexattr_setrobust.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 2005-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2005. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthreadP.h> - - -int -pthread_mutexattr_setrobust (pthread_mutexattr_t *attr, int robustness) -{ - if (robustness != PTHREAD_MUTEX_STALLED_NP - && __builtin_expect (robustness != PTHREAD_MUTEX_ROBUST_NP, 0)) - return EINVAL; - - struct pthread_mutexattr *iattr = (struct pthread_mutexattr *) attr; - - /* We use bit 30 to signal whether the mutex is going to be - robust or not. */ - if (robustness == PTHREAD_MUTEX_STALLED_NP) - iattr->mutexkind &= ~PTHREAD_MUTEXATTR_FLAG_ROBUST; - else - iattr->mutexkind |= PTHREAD_MUTEXATTR_FLAG_ROBUST; - - return 0; -} -weak_alias (pthread_mutexattr_setrobust, pthread_mutexattr_setrobust_np) diff --git a/nptl/pthread_mutexattr_settype.c b/nptl/pthread_mutexattr_settype.c deleted file mode 100644 index 8c4d11f998..0000000000 --- a/nptl/pthread_mutexattr_settype.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthreadP.h> - - -int -__pthread_mutexattr_settype (pthread_mutexattr_t *attr, int kind) -{ - struct pthread_mutexattr *iattr; - - if (kind < PTHREAD_MUTEX_NORMAL || kind > PTHREAD_MUTEX_ADAPTIVE_NP) - return EINVAL; - - /* Cannot distinguish between DEFAULT and NORMAL. So any settype - call disables elision for now. */ - if (kind == PTHREAD_MUTEX_NORMAL) - kind |= PTHREAD_MUTEX_NO_ELISION_NP; - - iattr = (struct pthread_mutexattr *) attr; - - iattr->mutexkind = (iattr->mutexkind & PTHREAD_MUTEXATTR_FLAG_BITS) | kind; - - return 0; -} -weak_alias (__pthread_mutexattr_settype, pthread_mutexattr_setkind_np) -strong_alias (__pthread_mutexattr_settype, pthread_mutexattr_settype) diff --git a/nptl/pthread_once.c b/nptl/pthread_once.c deleted file mode 100644 index fbc51ca0b2..0000000000 --- a/nptl/pthread_once.c +++ /dev/null @@ -1,146 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" -#include <futex-internal.h> -#include <atomic.h> - - -unsigned long int __fork_generation attribute_hidden; - - -static void -clear_once_control (void *arg) -{ - pthread_once_t *once_control = (pthread_once_t *) arg; - - /* Reset to the uninitialized state here. We don't need a stronger memory - order because we do not need to make any other of our writes visible to - other threads that see this value: This function will be called if we - get interrupted (see __pthread_once), so all we need to relay to other - threads is the state being reset again. */ - atomic_store_relaxed (once_control, 0); - futex_wake ((unsigned int *) once_control, INT_MAX, FUTEX_PRIVATE); -} - - -/* This is similar to a lock implementation, but we distinguish between three - states: not yet initialized (0), initialization in progress - (__fork_generation | __PTHREAD_ONCE_INPROGRESS), and initialization - finished (__PTHREAD_ONCE_DONE); __fork_generation does not use the bits - that are used for __PTHREAD_ONCE_INPROGRESS and __PTHREAD_ONCE_DONE (which - is what __PTHREAD_ONCE_FORK_GEN_INCR is used for). If in the first state, - threads will try to run the initialization by moving to the second state; - the first thread to do so via a CAS on once_control runs init_routine, - other threads block. - When forking the process, some threads can be interrupted during the second - state; they won't be present in the forked child, so we need to restart - initialization in the child. To distinguish an in-progress initialization - from an interrupted initialization (in which case we need to reclaim the - lock), we look at the fork generation that's part of the second state: We - can reclaim iff it differs from the current fork generation. - XXX: This algorithm has an ABA issue on the fork generation: If an - initialization is interrupted, we then fork 2^30 times (30 bits of - once_control are used for the fork generation), and try to initialize - again, we can deadlock because we can't distinguish the in-progress and - interrupted cases anymore. - XXX: We split out this slow path because current compilers do not generate - as efficient code when the fast path in __pthread_once below is not in a - separate function. */ -static int -__attribute__ ((noinline)) -__pthread_once_slow (pthread_once_t *once_control, void (*init_routine) (void)) -{ - while (1) - { - int val, newval; - - /* We need acquire memory order for this load because if the value - signals that initialization has finished, we need to see any - data modifications done during initialization. */ - val = atomic_load_acquire (once_control); - do - { - /* Check if the initialization has already been done. */ - if (__glibc_likely ((val & __PTHREAD_ONCE_DONE) != 0)) - return 0; - - /* We try to set the state to in-progress and having the current - fork generation. We don't need atomic accesses for the fork - generation because it's immutable in a particular process, and - forked child processes start with a single thread that modified - the generation. */ - newval = __fork_generation | __PTHREAD_ONCE_INPROGRESS; - /* We need acquire memory order here for the same reason as for the - load from once_control above. */ - } - while (__glibc_unlikely (!atomic_compare_exchange_weak_acquire ( - once_control, &val, newval))); - - /* Check if another thread already runs the initializer. */ - if ((val & __PTHREAD_ONCE_INPROGRESS) != 0) - { - /* Check whether the initializer execution was interrupted by a - fork. We know that for both values, __PTHREAD_ONCE_INPROGRESS - is set and __PTHREAD_ONCE_DONE is not. */ - if (val == newval) - { - /* Same generation, some other thread was faster. Wait and - retry. */ - futex_wait_simple ((unsigned int *) once_control, - (unsigned int) newval, FUTEX_PRIVATE); - continue; - } - } - - /* This thread is the first here. Do the initialization. - Register a cleanup handler so that in case the thread gets - interrupted the initialization can be restarted. */ - pthread_cleanup_push (clear_once_control, once_control); - - init_routine (); - - pthread_cleanup_pop (0); - - - /* Mark *once_control as having finished the initialization. We need - release memory order here because we need to synchronize with other - threads that want to use the initialized data. */ - atomic_store_release (once_control, __PTHREAD_ONCE_DONE); - - /* Wake up all other threads. */ - futex_wake ((unsigned int *) once_control, INT_MAX, FUTEX_PRIVATE); - break; - } - - return 0; -} - -int -__pthread_once (pthread_once_t *once_control, void (*init_routine) (void)) -{ - /* Fast path. See __pthread_once_slow. */ - int val; - val = atomic_load_acquire (once_control); - if (__glibc_likely ((val & __PTHREAD_ONCE_DONE) != 0)) - return 0; - else - return __pthread_once_slow (once_control, init_routine); -} -weak_alias (__pthread_once, pthread_once) -hidden_def (__pthread_once) diff --git a/nptl/pthread_rwlock_common.c b/nptl/pthread_rwlock_common.c deleted file mode 100644 index 256508ca2a..0000000000 --- a/nptl/pthread_rwlock_common.c +++ /dev/null @@ -1,924 +0,0 @@ -/* POSIX reader--writer lock: core parts. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <sysdep.h> -#include <pthread.h> -#include <pthreadP.h> -#include <sys/time.h> -#include <stap-probe.h> -#include <atomic.h> -#include <futex-internal.h> - - -/* A reader--writer lock that fulfills the POSIX requirements (but operations - on this lock are not necessarily full barriers, as one may interpret the - POSIX requirement about "synchronizing memory"). All critical sections are - in a total order, writers synchronize with prior writers and readers, and - readers synchronize with prior writers. - - A thread is allowed to acquire a read lock recursively (i.e., have rdlock - critical sections that overlap in sequenced-before) unless the kind of the - rwlock is set to PTHREAD_RWLOCK_PREFER_WRITERS_NONRECURSIVE_NP. - - This lock is built so that workloads of mostly readers can be executed with - low runtime overheads. This matches that the default kind of the lock is - PTHREAD_RWLOCK_PREFER_READER_NP. Acquiring a read lock requires a single - atomic addition if the lock is or was previously acquired by other - readers; releasing the lock is a single CAS if there are no concurrent - writers. - Workloads consisting of mostly writers are of secondary importance. - An uncontended write lock acquisition is as fast as for a normal - exclusive mutex but writer contention is somewhat more costly due to - keeping track of the exact number of writers. If the rwlock kind requests - writers to be preferred (i.e., PTHREAD_RWLOCK_PREFER_WRITERS_NP or the - no-recursive-readers variant of it), then writer--to--writer lock ownership - hand-over is fairly fast and bypasses lock acquisition attempts by readers. - The costs of lock ownership transfer between readers and writers vary. If - the program asserts that there are no recursive readers and writers are - preferred, then write lock acquisition attempts will block subsequent read - lock acquisition attempts, so that new incoming readers do not prolong a - phase in which readers have acquired the lock. - - - The main components of the rwlock are a writer-only lock that allows only - one of the concurrent writers to be the primary writer, and a - single-writer-multiple-readers lock that decides between read phases, in - which readers have acquired the rwlock, and write phases in which a primary - writer or a sequence of different primary writers have acquired the rwlock. - - The single-writer-multiple-readers lock is the central piece of state - describing the rwlock and is encoded in the __readers field (see below for - a detailed explanation): - - State WP WL R RW Notes - --------------------------- - #1 0 0 0 0 Lock is idle (and in a read phase). - #2 0 0 >0 0 Readers have acquired the lock. - #3 0 1 0 0 Lock is not acquired; a writer is waiting for a write - phase to start or will try to start one. - #4 0 1 >0 0 Readers have acquired the lock; a writer is waiting - and explicit hand-over to the writer is required. - #4a 0 1 >0 1 Same as #4 except that there are further readers - waiting because the writer is to be preferred. - #5 1 0 0 0 Lock is idle (and in a write phase). - #6 1 0 >0 0 Write phase; readers are waiting for a read phase to - start or will try to start one. - #7 1 1 0 0 Lock is acquired by a writer. - #8 1 1 >0 0 Lock acquired by a writer and readers are waiting; - explicit hand-over to the readers is required. - - WP (PTHREAD_RWLOCK_WRPHASE) is true if the lock is in a write phase, so - potentially acquired by a primary writer. - WL (PTHREAD_RWLOCK_WRLOCKED) is true if there is a primary writer (i.e., - the thread that was able to set this bit from false to true). - R (all bits in __readers except the number of least-significant bits - denoted in PTHREAD_RWLOCK_READER_SHIFT) is the number of readers that have - or are trying to acquired the lock. There may be more readers waiting if - writers are preferred and there will be no recursive readers, in which - case RW (PTHREAD_RWLOCK_RWAITING) is true in state #4a. - - We want to block using futexes but using __readers as a futex word directly - is not a good solution. First, we want to wait on different conditions - such as waiting for a phase change vs. waiting for the primary writer to - release the writer-only lock. Second, the number of readers could change - frequently, which would make it likely that a writer's futex_wait fails - frequently too because the expected value does not match the value of - __readers anymore. - Therefore, we split out the futex words into the __wrphase_futex and - __writers_futex fields. The former tracks the value of the WP bit and is - changed after changing WP by the thread that changes WP. However, because - of the POSIX requirements regarding mutex/rwlock destruction (i.e., that - destroying a rwlock is allowed as soon as no thread has acquired or will - acquire the lock), we have to be careful and hand over lock ownership (via - a phase change) carefully to those threads waiting. Specifically, we must - prevent a situation in which we are not quite sure whether we still have - to unblock another thread through a change to memory (executing a - futex_wake on a former futex word that is now used for something else is - fine). - The scheme we use for __wrphase_futex is that waiting threads that may - use the futex word to block now all have to use the futex word to block; it - is not allowed to take the short-cut and spin-wait on __readers because - then the waking thread cannot just make one final change to memory to - unblock all potentially waiting threads. If, for example, a reader - increments R in states #7 or #8, it has to then block until __wrphase_futex - is 0 and it can confirm that the value of 0 was stored by the primary - writer; in turn, the primary writer has to change to a read phase too when - releasing WL (i.e., to state #2), and it must change __wrphase_futex to 0 - as the next step. This ensures that the waiting reader will not be able to - acquire, release, and then destroy the lock concurrently with the pending - futex unblock operations by the former primary writer. This scheme is - called explicit hand-over in what follows. - Note that waiting threads can cancel waiting only if explicit hand-over has - not yet started (e.g., if __readers is still in states #7 or #8 in the - example above). - - Writers determine the primary writer through WL. Blocking using futexes - is performed using __writers_futex as a futex word; primary writers will - enable waiting on this futex by setting it to 1 after they acquired the WL - bit and will disable waiting by setting it to 0 before they release WL. - This leaves small windows where blocking using futexes is not possible - although a primary writer exists, but in turn decreases complexity of the - writer--writer synchronization and does not affect correctness. - If writers are preferred, writers can hand over WL directly to other - waiting writers that registered by incrementing __writers: If the primary - writer can CAS __writers from a non-zero value to the same value with the - PTHREAD_RWLOCK_WRHANDOVER bit set, it effectively transfers WL ownership - to one of the registered waiting writers and does not reset WL; in turn, - a registered writer that can clear PTHREAD_RWLOCK_WRHANDOVER using a CAS - then takes over WL. Note that registered waiting writers can cancel - waiting by decrementing __writers, but the last writer to unregister must - become the primary writer if PTHREAD_RWLOCK_WRHANDOVER is set. - Also note that adding another state/bit to signal potential writer--writer - contention (e.g., as done in the normal mutex algorithm) would not be - helpful because we would have to conservatively assume that there is in - fact no other writer, and wake up readers too. - - To avoid having to call futex_wake when no thread uses __wrphase_futex or - __writers_futex, threads will set the PTHREAD_RWLOCK_FUTEX_USED bit in the - respective futex words before waiting on it (using a CAS so it will only be - set if in a state in which waiting would be possible). In the case of - __writers_futex, we wake only one thread but several threads may share - PTHREAD_RWLOCK_FUTEX_USED, so we must assume that there are still others. - This is similar to what we do in pthread_mutex_lock. We do not need to - do this for __wrphase_futex because there, we always wake all waiting - threads. - - Blocking in the state #4a simply uses __readers as futex word. This - simplifies the algorithm but suffers from some of the drawbacks discussed - before, though not to the same extent because R can only decrease in this - state, so the number of potentially failing futex_wait attempts will be - bounded. All threads moving from state #4a to another state must wake - up threads blocked on the __readers futex. - - The ordering invariants that we have to take care of in the implementation - are primarily those necessary for a reader--writer lock; this is rather - straightforward and happens during write/read phase switching (potentially - through explicit hand-over), and between writers through synchronization - involving the PTHREAD_RWLOCK_WRLOCKED or PTHREAD_RWLOCK_WRHANDOVER bits. - Additionally, we need to take care that modifications of __writers_futex - and __wrphase_futex (e.g., by otherwise unordered readers) take place in - the writer critical sections or read/write phases, respectively, and that - explicit hand-over observes stores from the previous phase. How this is - done is explained in more detail in comments in the code. - - Many of the accesses to the futex words just need relaxed MO. This is - possible because we essentially drive both the core rwlock synchronization - and the futex synchronization in parallel. For example, an unlock will - unlock the rwlock and take part in the futex synchronization (using - PTHREAD_RWLOCK_FUTEX_USED, see above); even if they are not tightly - ordered in some way, the futex synchronization ensures that there are no - lost wake-ups, and woken threads will then eventually see the most recent - state of the rwlock. IOW, waiting threads will always be woken up, while - not being able to wait using futexes (which can happen) is harmless; in - turn, this means that waiting threads don't need special ordering wrt. - waking threads. - - The futex synchronization consists of the three-state futex word: - (1) cannot block on it, (2) can block on it, and (3) there might be a - thread blocked on it (i.e., with PTHREAD_RWLOCK_FUTEX_USED set). - Relaxed-MO atomic read-modify-write operations are sufficient to maintain - this (e.g., using a CAS to go from (2) to (3) but not from (1) to (3)), - but we need ordering of the futex word modifications by the waking threads - so that they collectively make correct state changes between (1)-(3). - The futex-internal synchronization (i.e., the conceptual critical sections - around futex operations in the kernel) then ensures that even an - unconstrained load (i.e., relaxed MO) inside of futex_wait will not lead to - lost wake-ups because either the waiting thread will see the change from - (3) to (1) when a futex_wake came first, or this futex_wake will wake this - waiting thread because the waiting thread came first. - - - POSIX allows but does not require rwlock acquisitions to be a cancellation - point. We do not support cancellation. - - TODO We do not try to elide any read or write lock acquisitions currently. - While this would be possible, it is unclear whether HTM performance is - currently predictable enough and our runtime tuning is good enough at - deciding when to use elision so that enabling it would lead to consistently - better performance. */ - - -static int -__pthread_rwlock_get_private (pthread_rwlock_t *rwlock) -{ - return rwlock->__data.__shared != 0 ? FUTEX_SHARED : FUTEX_PRIVATE; -} - -static __always_inline void -__pthread_rwlock_rdunlock (pthread_rwlock_t *rwlock) -{ - int private = __pthread_rwlock_get_private (rwlock); - /* We decrease the number of readers, and if we are the last reader and - there is a primary writer, we start a write phase. We use a CAS to - make this atomic so that it is clear whether we must hand over ownership - explicitly. */ - unsigned int r = atomic_load_relaxed (&rwlock->__data.__readers); - unsigned int rnew; - for (;;) - { - rnew = r - (1 << PTHREAD_RWLOCK_READER_SHIFT); - /* If we are the last reader, we also need to unblock any readers - that are waiting for a writer to go first (PTHREAD_RWLOCK_RWAITING) - so that they can register while the writer is active. */ - if ((rnew >> PTHREAD_RWLOCK_READER_SHIFT) == 0) - { - if ((rnew & PTHREAD_RWLOCK_WRLOCKED) != 0) - rnew |= PTHREAD_RWLOCK_WRPHASE; - rnew &= ~(unsigned int) PTHREAD_RWLOCK_RWAITING; - } - /* We need release MO here for three reasons. First, so that we - synchronize with subsequent writers. Second, we might have been the - first reader and set __wrphase_futex to 0, so we need to synchronize - with the last reader that will set it to 1 (note that we will always - change __readers before the last reader, or we are the last reader). - Third, a writer that takes part in explicit hand-over needs to see - the first reader's store to __wrphase_futex (or a later value) if - the writer observes that a write phase has been started. */ - if (atomic_compare_exchange_weak_release (&rwlock->__data.__readers, - &r, rnew)) - break; - /* TODO Back-off. */ - } - if ((rnew & PTHREAD_RWLOCK_WRPHASE) != 0) - { - /* We need to do explicit hand-over. We need the acquire MO fence so - that our modification of _wrphase_futex happens after a store by - another reader that started a read phase. Relaxed MO is sufficient - for the modification of __wrphase_futex because it is just used - to delay acquisition by a writer until all threads are unblocked - irrespective of whether they are looking at __readers or - __wrphase_futex; any other synchronizes-with relations that are - necessary are established through __readers. */ - atomic_thread_fence_acquire (); - if ((atomic_exchange_relaxed (&rwlock->__data.__wrphase_futex, 1) - & PTHREAD_RWLOCK_FUTEX_USED) != 0) - futex_wake (&rwlock->__data.__wrphase_futex, INT_MAX, private); - } - /* Also wake up waiting readers if we did reset the RWAITING flag. */ - if ((r & PTHREAD_RWLOCK_RWAITING) != (rnew & PTHREAD_RWLOCK_RWAITING)) - futex_wake (&rwlock->__data.__readers, INT_MAX, private); -} - - -static __always_inline int -__pthread_rwlock_rdlock_full (pthread_rwlock_t *rwlock, - const struct timespec *abstime) -{ - unsigned int r; - - /* Make sure we are not holding the rwlock as a writer. This is a deadlock - situation we recognize and report. */ - if (__glibc_unlikely (atomic_load_relaxed (&rwlock->__data.__cur_writer) - == THREAD_GETMEM (THREAD_SELF, tid))) - return EDEADLK; - - /* If we prefer writers, recursive rdlock is disallowed, we are in a read - phase, and there are other readers present, we try to wait without - extending the read phase. We will be unblocked by either one of the - other active readers, or if the writer gives up WRLOCKED (e.g., on - timeout). - If there are no other readers, we simply race with any existing primary - writer; it would have been a race anyway, and changing the odds slightly - will likely not make a big difference. */ - if (rwlock->__data.__flags == PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP) - { - r = atomic_load_relaxed (&rwlock->__data.__readers); - while (((r & PTHREAD_RWLOCK_WRPHASE) == 0) - && ((r & PTHREAD_RWLOCK_WRLOCKED) != 0) - && ((r >> PTHREAD_RWLOCK_READER_SHIFT) > 0)) - { - /* TODO Spin first. */ - /* Try setting the flag signaling that we are waiting without having - incremented the number of readers. Relaxed MO is fine because - this is just about waiting for a state change in __readers. */ - if (atomic_compare_exchange_weak_relaxed - (&rwlock->__data.__readers, &r, r | PTHREAD_RWLOCK_RWAITING)) - { - /* Wait for as long as the flag is set. An ABA situation is - harmless because the flag is just about the state of - __readers, and all threads set the flag under the same - conditions. */ - while ((atomic_load_relaxed (&rwlock->__data.__readers) - & PTHREAD_RWLOCK_RWAITING) != 0) - { - int private = __pthread_rwlock_get_private (rwlock); - int err = futex_abstimed_wait (&rwlock->__data.__readers, - r, abstime, private); - /* We ignore EAGAIN and EINTR. On time-outs, we can just - return because we don't need to clean up anything. */ - if (err == ETIMEDOUT) - return err; - } - /* It makes sense to not break out of the outer loop here - because we might be in the same situation again. */ - } - else - { - /* TODO Back-off. */ - } - } - } - /* Register as a reader, using an add-and-fetch so that R can be used as - expected value for future operations. Acquire MO so we synchronize with - prior writers as well as the last reader of the previous read phase (see - below). */ - r = atomic_fetch_add_acquire (&rwlock->__data.__readers, - (1 << PTHREAD_RWLOCK_READER_SHIFT)) + (1 << PTHREAD_RWLOCK_READER_SHIFT); - - /* Check whether there is an overflow in the number of readers. We assume - that the total number of threads is less than half the maximum number - of readers that we have bits for in __readers (i.e., with 32-bit int and - PTHREAD_RWLOCK_READER_SHIFT of 3, we assume there are less than - 1 << (32-3-1) concurrent threads). - If there is an overflow, we use a CAS to try to decrement the number of - readers if there still is an overflow situation. If so, we return - EAGAIN; if not, we are not a thread causing an overflow situation, and so - we just continue. Using a fetch-add instead of the CAS isn't possible - because other readers might release the lock concurrently, which could - make us the last reader and thus responsible for handing ownership over - to writers (which requires a CAS too to make the decrement and ownership - transfer indivisible). */ - while (__glibc_unlikely (r >= PTHREAD_RWLOCK_READER_OVERFLOW)) - { - /* Relaxed MO is okay because we just want to undo our registration and - cannot have changed the rwlock state substantially if the CAS - succeeds. */ - if (atomic_compare_exchange_weak_relaxed (&rwlock->__data.__readers, &r, - r - (1 << PTHREAD_RWLOCK_READER_SHIFT))) - return EAGAIN; - } - - /* We have registered as a reader, so if we are in a read phase, we have - acquired a read lock. This is also the reader--reader fast-path. - Even if there is a primary writer, we just return. If writers are to - be preferred and we are the only active reader, we could try to enter a - write phase to let the writer proceed. This would be okay because we - cannot have acquired the lock previously as a reader (which could result - in deadlock if we would wait for the primary writer to run). However, - this seems to be a corner case and handling it specially not be worth the - complexity. */ - if (__glibc_likely ((r & PTHREAD_RWLOCK_WRPHASE) == 0)) - return 0; - - /* If there is no primary writer but we are in a write phase, we can try - to install a read phase ourself. */ - while (((r & PTHREAD_RWLOCK_WRPHASE) != 0) - && ((r & PTHREAD_RWLOCK_WRLOCKED) == 0)) - { - /* Try to enter a read phase: If the CAS below succeeds, we have - ownership; if it fails, we will simply retry and reassess the - situation. - Acquire MO so we synchronize with prior writers. */ - if (atomic_compare_exchange_weak_acquire (&rwlock->__data.__readers, &r, - r ^ PTHREAD_RWLOCK_WRPHASE)) - { - /* We started the read phase, so we are also responsible for - updating the write-phase futex. Relaxed MO is sufficient. - Note that there can be no other reader that we have to wake - because all other readers will see the read phase started by us - (or they will try to start it themselves); if a writer started - the read phase, we cannot have started it. Furthermore, we - cannot discard a PTHREAD_RWLOCK_FUTEX_USED flag because we will - overwrite the value set by the most recent writer (or the readers - before it in case of explicit hand-over) and we know that there - are no waiting readers. */ - atomic_store_relaxed (&rwlock->__data.__wrphase_futex, 0); - return 0; - } - else - { - /* TODO Back off before retrying. Also see above. */ - } - } - - if ((r & PTHREAD_RWLOCK_WRPHASE) != 0) - { - /* We are in a write phase, and there must be a primary writer because - of the previous loop. Block until the primary writer gives up the - write phase. This case requires explicit hand-over using - __wrphase_futex. - However, __wrphase_futex might not have been set to 1 yet (either - because explicit hand-over to the writer is still ongoing, or because - the writer has started the write phase but does not yet have updated - __wrphase_futex). The least recent value of __wrphase_futex we can - read from here is the modification of the last read phase (because - we synchronize with the last reader in this read phase through - __readers; see the use of acquire MO on the fetch_add above). - Therefore, if we observe a value of 0 for __wrphase_futex, we need - to subsequently check that __readers now indicates a read phase; we - need to use acquire MO for this so that if we observe a read phase, - we will also see the modification of __wrphase_futex by the previous - writer. We then need to load __wrphase_futex again and continue to - wait if it is not 0, so that we do not skip explicit hand-over. - Relaxed MO is sufficient for the load from __wrphase_futex because - we just use it as an indicator for when we can proceed; we use - __readers and the acquire MO accesses to it to eventually read from - the proper stores to __wrphase_futex. */ - unsigned int wpf; - bool ready = false; - for (;;) - { - while (((wpf = atomic_load_relaxed (&rwlock->__data.__wrphase_futex)) - | PTHREAD_RWLOCK_FUTEX_USED) == (1 | PTHREAD_RWLOCK_FUTEX_USED)) - { - int private = __pthread_rwlock_get_private (rwlock); - if (((wpf & PTHREAD_RWLOCK_FUTEX_USED) == 0) - && !atomic_compare_exchange_weak_relaxed - (&rwlock->__data.__wrphase_futex, - &wpf, wpf | PTHREAD_RWLOCK_FUTEX_USED)) - continue; - int err = futex_abstimed_wait (&rwlock->__data.__wrphase_futex, - 1 | PTHREAD_RWLOCK_FUTEX_USED, abstime, private); - if (err == ETIMEDOUT) - { - /* If we timed out, we need to unregister. If no read phase - has been installed while we waited, we can just decrement - the number of readers. Otherwise, we just acquire the - lock, which is allowed because we give no precise timing - guarantees, and because the timeout is only required to - be in effect if we would have had to wait for other - threads (e.g., if futex_wait would time-out immediately - because the given absolute time is in the past). */ - r = atomic_load_relaxed (&rwlock->__data.__readers); - while ((r & PTHREAD_RWLOCK_WRPHASE) != 0) - { - /* We don't need to make anything else visible to - others besides unregistering, so relaxed MO is - sufficient. */ - if (atomic_compare_exchange_weak_relaxed - (&rwlock->__data.__readers, &r, - r - (1 << PTHREAD_RWLOCK_READER_SHIFT))) - return ETIMEDOUT; - /* TODO Back-off. */ - } - /* Use the acquire MO fence to mirror the steps taken in the - non-timeout case. Note that the read can happen both - in the atomic_load above as well as in the failure case - of the CAS operation. */ - atomic_thread_fence_acquire (); - /* We still need to wait for explicit hand-over, but we must - not use futex_wait anymore because we would just time out - in this case and thus make the spin-waiting we need - unnecessarily expensive. */ - while ((atomic_load_relaxed (&rwlock->__data.__wrphase_futex) - | PTHREAD_RWLOCK_FUTEX_USED) - == (1 | PTHREAD_RWLOCK_FUTEX_USED)) - { - /* TODO Back-off? */ - } - ready = true; - break; - } - /* If we got interrupted (EINTR) or the futex word does not have the - expected value (EAGAIN), retry. */ - } - if (ready) - /* See below. */ - break; - /* We need acquire MO here so that we synchronize with the lock - release of the writer, and so that we observe a recent value of - __wrphase_futex (see below). */ - if ((atomic_load_acquire (&rwlock->__data.__readers) - & PTHREAD_RWLOCK_WRPHASE) == 0) - /* We are in a read phase now, so the least recent modification of - __wrphase_futex we can read from is the store by the writer - with value 1. Thus, only now we can assume that if we observe - a value of 0, explicit hand-over is finished. Retry the loop - above one more time. */ - ready = true; - } - } - - return 0; -} - - -static __always_inline void -__pthread_rwlock_wrunlock (pthread_rwlock_t *rwlock) -{ - int private = __pthread_rwlock_get_private (rwlock); - - atomic_store_relaxed (&rwlock->__data.__cur_writer, 0); - /* Disable waiting by writers. We will wake up after we decided how to - proceed. */ - bool wake_writers = ((atomic_exchange_relaxed - (&rwlock->__data.__writers_futex, 0) & PTHREAD_RWLOCK_FUTEX_USED) != 0); - - if (rwlock->__data.__flags != PTHREAD_RWLOCK_PREFER_READER_NP) - { - /* First, try to hand over to another writer. */ - unsigned int w = atomic_load_relaxed (&rwlock->__data.__writers); - while (w != 0) - { - /* Release MO so that another writer that gets WRLOCKED from us will - synchronize with us and thus can take over our view of - __readers (including, for example, whether we are in a write - phase or not). */ - if (atomic_compare_exchange_weak_release (&rwlock->__data.__writers, - &w, w | PTHREAD_RWLOCK_WRHANDOVER)) - /* Another writer will take over. */ - goto done; - /* TODO Back-off. */ - } - } - - /* We have done everything we needed to do to prefer writers, so now we - either hand over explicitly to readers if there are any, or we simply - stay in a write phase. See pthread_rwlock_rdunlock for more details. */ - unsigned int r = atomic_load_relaxed (&rwlock->__data.__readers); - /* Release MO so that subsequent readers or writers synchronize with us. */ - while (!atomic_compare_exchange_weak_release - (&rwlock->__data.__readers, &r, (r ^ PTHREAD_RWLOCK_WRLOCKED) - ^ ((r >> PTHREAD_RWLOCK_READER_SHIFT) == 0 ? 0 - : PTHREAD_RWLOCK_WRPHASE))) - { - /* TODO Back-off. */ - } - if ((r >> PTHREAD_RWLOCK_READER_SHIFT) != 0) - { - /* We must hand over explicitly through __wrphase_futex. Relaxed MO is - sufficient because it is just used to delay acquisition by a writer; - any other synchronizes-with relations that are necessary are - established through __readers. */ - if ((atomic_exchange_relaxed (&rwlock->__data.__wrphase_futex, 0) - & PTHREAD_RWLOCK_FUTEX_USED) != 0) - futex_wake (&rwlock->__data.__wrphase_futex, INT_MAX, private); - } - - done: - /* We released WRLOCKED in some way, so wake a writer. */ - if (wake_writers) - futex_wake (&rwlock->__data.__writers_futex, 1, private); -} - - -static __always_inline int -__pthread_rwlock_wrlock_full (pthread_rwlock_t *rwlock, - const struct timespec *abstime) -{ - /* Make sure we are not holding the rwlock as a writer. This is a deadlock - situation we recognize and report. */ - if (__glibc_unlikely (atomic_load_relaxed (&rwlock->__data.__cur_writer) - == THREAD_GETMEM (THREAD_SELF, tid))) - return EDEADLK; - - /* First we try to acquire the role of primary writer by setting WRLOCKED; - if it was set before, there already is a primary writer. Acquire MO so - that we synchronize with previous primary writers. - - We do not try to change to a write phase right away using a fetch_or - because we would have to reset it again and wake readers if there are - readers present (some readers could try to acquire the lock more than - once, so setting a write phase in the middle of this could cause - deadlock). Changing to a write phase eagerly would only speed up the - transition from a read phase to a write phase in the uncontended case, - but it would slow down the contended case if readers are preferred (which - is the default). - We could try to CAS from a state with no readers to a write phase, but - this could be less scalable if readers arrive and leave frequently. */ - bool may_share_futex_used_flag = false; - unsigned int r = atomic_fetch_or_acquire (&rwlock->__data.__readers, - PTHREAD_RWLOCK_WRLOCKED); - if (__glibc_unlikely ((r & PTHREAD_RWLOCK_WRLOCKED) != 0)) - { - /* There is another primary writer. */ - bool prefer_writer = - (rwlock->__data.__flags != PTHREAD_RWLOCK_PREFER_READER_NP); - if (prefer_writer) - { - /* We register as a waiting writer, so that we can make use of - writer--writer hand-over. Relaxed MO is fine because we just - want to register. We assume that the maximum number of threads - is less than the capacity in __writers. */ - atomic_fetch_add_relaxed (&rwlock->__data.__writers, 1); - } - for (;;) - { - /* TODO Spin until WRLOCKED is 0 before trying the CAS below. - But pay attention to not delay trying writer--writer hand-over - for too long (which we must try eventually anyway). */ - if ((r & PTHREAD_RWLOCK_WRLOCKED) == 0) - { - /* Try to become the primary writer or retry. Acquire MO as in - the fetch_or above. */ - if (atomic_compare_exchange_weak_acquire - (&rwlock->__data.__readers, &r, - r | PTHREAD_RWLOCK_WRLOCKED)) - { - if (prefer_writer) - { - /* Unregister as a waiting writer. Note that because we - acquired WRLOCKED, WRHANDOVER will not be set. - Acquire MO on the CAS above ensures that - unregistering happens after the previous writer; - this sorts the accesses to __writers by all - primary writers in a useful way (e.g., any other - primary writer acquiring after us or getting it from - us through WRHANDOVER will see both our changes to - __writers). - ??? Perhaps this is not strictly necessary for - reasons we do not yet know of. */ - atomic_fetch_add_relaxed (&rwlock->__data.__writers, - -1); - } - break; - } - /* Retry if the CAS fails (r will have been updated). */ - continue; - } - /* If writer--writer hand-over is available, try to become the - primary writer this way by grabbing the WRHANDOVER token. If we - succeed, we own WRLOCKED. */ - if (prefer_writer) - { - unsigned int w = atomic_load_relaxed - (&rwlock->__data.__writers); - if ((w & PTHREAD_RWLOCK_WRHANDOVER) != 0) - { - /* Acquire MO is required here so that we synchronize with - the writer that handed over WRLOCKED. We also need this - for the reload of __readers below because our view of - __readers must be at least as recent as the view of the - writer that handed over WRLOCKED; we must avoid an ABA - through WRHANDOVER, which could, for example, lead to us - assuming we are still in a write phase when in fact we - are not. */ - if (atomic_compare_exchange_weak_acquire - (&rwlock->__data.__writers, - &w, (w - PTHREAD_RWLOCK_WRHANDOVER - 1))) - { - /* Reload so our view is consistent with the view of - the previous owner of WRLOCKED. See above. */ - r = atomic_load_relaxed (&rwlock->__data.__readers); - break; - } - /* We do not need to reload __readers here. We should try - to perform writer--writer hand-over if possible; if it - is not possible anymore, we will reload __readers - elsewhere in this loop. */ - continue; - } - } - /* We did not acquire WRLOCKED nor were able to use writer--writer - hand-over, so we block on __writers_futex. */ - int private = __pthread_rwlock_get_private (rwlock); - unsigned int wf = atomic_load_relaxed - (&rwlock->__data.__writers_futex); - if (((wf & ~(unsigned int) PTHREAD_RWLOCK_FUTEX_USED) != 1) - || ((wf != (1 | PTHREAD_RWLOCK_FUTEX_USED)) - && !atomic_compare_exchange_weak_relaxed - (&rwlock->__data.__writers_futex, &wf, - 1 | PTHREAD_RWLOCK_FUTEX_USED))) - { - /* If we cannot block on __writers_futex because there is no - primary writer, or we cannot set PTHREAD_RWLOCK_FUTEX_USED, - we retry. We must reload __readers here in case we cannot - block on __writers_futex so that we can become the primary - writer and are not stuck in a loop that just continuously - fails to block on __writers_futex. */ - r = atomic_load_relaxed (&rwlock->__data.__readers); - continue; - } - /* We set the flag that signals that the futex is used, or we could - have set it if we had been faster than other waiters. As a - result, we may share the flag with an unknown number of other - writers. Therefore, we must keep this flag set when we acquire - the lock. We do not need to do this when we do not reach this - point here because then we are not part of the group that may - share the flag, and another writer will wake one of the writers - in this group. */ - may_share_futex_used_flag = true; - int err = futex_abstimed_wait (&rwlock->__data.__writers_futex, - 1 | PTHREAD_RWLOCK_FUTEX_USED, abstime, private); - if (err == ETIMEDOUT) - { - if (prefer_writer) - { - /* We need to unregister as a waiting writer. If we are the - last writer and writer--writer hand-over is available, - we must make use of it because nobody else will reset - WRLOCKED otherwise. (If we use it, we simply pretend - that this happened before the timeout; see - pthread_rwlock_rdlock_full for the full reasoning.) - Also see the similar code above. */ - unsigned int w = atomic_load_relaxed - (&rwlock->__data.__writers); - while (!atomic_compare_exchange_weak_acquire - (&rwlock->__data.__writers, &w, - (w == PTHREAD_RWLOCK_WRHANDOVER + 1 ? 0 : w - 1))) - { - /* TODO Back-off. */ - } - if (w == PTHREAD_RWLOCK_WRHANDOVER + 1) - { - /* We must continue as primary writer. See above. */ - r = atomic_load_relaxed (&rwlock->__data.__readers); - break; - } - } - /* We cleaned up and cannot have stolen another waiting writer's - futex wake-up, so just return. */ - return ETIMEDOUT; - } - /* If we got interrupted (EINTR) or the futex word does not have the - expected value (EAGAIN), retry after reloading __readers. */ - r = atomic_load_relaxed (&rwlock->__data.__readers); - } - /* Our snapshot of __readers is up-to-date at this point because we - either set WRLOCKED using a CAS or were handed over WRLOCKED from - another writer whose snapshot of __readers we inherit. */ - } - - /* If we are in a read phase and there are no readers, try to start a write - phase. */ - while (((r & PTHREAD_RWLOCK_WRPHASE) == 0) - && ((r >> PTHREAD_RWLOCK_READER_SHIFT) == 0)) - { - /* Acquire MO so that we synchronize with prior writers and do - not interfere with their updates to __writers_futex, as well - as regarding prior readers and their updates to __wrphase_futex, - respectively. */ - if (atomic_compare_exchange_weak_acquire (&rwlock->__data.__readers, - &r, r | PTHREAD_RWLOCK_WRPHASE)) - { - /* We have started a write phase, so need to enable readers to wait. - See the similar case in__pthread_rwlock_rdlock_full. */ - atomic_store_relaxed (&rwlock->__data.__wrphase_futex, 1); - /* Make sure we fall through to the end of the function. */ - r |= PTHREAD_RWLOCK_WRPHASE; - break; - } - /* TODO Back-off. */ - } - - /* We are the primary writer; enable blocking on __writers_futex. Relaxed - MO is sufficient for futex words; acquire MO on the previous - modifications of __readers ensures that this store happens after the - store of value 0 by the previous primary writer. */ - atomic_store_relaxed (&rwlock->__data.__writers_futex, - 1 | (may_share_futex_used_flag ? PTHREAD_RWLOCK_FUTEX_USED : 0)); - - if (__glibc_unlikely ((r & PTHREAD_RWLOCK_WRPHASE) == 0)) - { - /* We are not in a read phase and there are readers (because of the - previous loop). Thus, we have to wait for explicit hand-over from - one of these readers. - We basically do the same steps as for the similar case in - __pthread_rwlock_rdlock_full, except that we additionally might try - to directly hand over to another writer and need to wake up - other writers or waiting readers (i.e., PTHREAD_RWLOCK_RWAITING). */ - unsigned int wpf; - bool ready = false; - for (;;) - { - while (((wpf = atomic_load_relaxed (&rwlock->__data.__wrphase_futex)) - | PTHREAD_RWLOCK_FUTEX_USED) == PTHREAD_RWLOCK_FUTEX_USED) - { - int private = __pthread_rwlock_get_private (rwlock); - if (((wpf & PTHREAD_RWLOCK_FUTEX_USED) == 0) - && !atomic_compare_exchange_weak_relaxed - (&rwlock->__data.__wrphase_futex, &wpf, - PTHREAD_RWLOCK_FUTEX_USED)) - continue; - int err = futex_abstimed_wait (&rwlock->__data.__wrphase_futex, - PTHREAD_RWLOCK_FUTEX_USED, abstime, private); - if (err == ETIMEDOUT) - { - if (rwlock->__data.__flags - != PTHREAD_RWLOCK_PREFER_READER_NP) - { - /* We try writer--writer hand-over. */ - unsigned int w = atomic_load_relaxed - (&rwlock->__data.__writers); - if (w != 0) - { - /* We are about to hand over WRLOCKED, so we must - release __writers_futex too; otherwise, we'd have - a pending store, which could at least prevent - other threads from waiting using the futex - because it could interleave with the stores - by subsequent writers. In turn, this means that - we have to clean up when we do not hand over - WRLOCKED. - Release MO so that another writer that gets - WRLOCKED from us can take over our view of - __readers. */ - unsigned int wf = atomic_exchange_relaxed - (&rwlock->__data.__writers_futex, 0); - while (w != 0) - { - if (atomic_compare_exchange_weak_release - (&rwlock->__data.__writers, &w, - w | PTHREAD_RWLOCK_WRHANDOVER)) - { - /* Wake other writers. */ - if ((wf & PTHREAD_RWLOCK_FUTEX_USED) != 0) - futex_wake - (&rwlock->__data.__writers_futex, 1, - private); - return ETIMEDOUT; - } - /* TODO Back-off. */ - } - /* We still own WRLOCKED and someone else might set - a write phase concurrently, so enable waiting - again. Make sure we don't loose the flag that - signals whether there are threads waiting on - this futex. */ - atomic_store_relaxed - (&rwlock->__data.__writers_futex, wf); - } - } - /* If we timed out and we are not in a write phase, we can - just stop being a primary writer. Otherwise, we just - acquire the lock. */ - r = atomic_load_relaxed (&rwlock->__data.__readers); - if ((r & PTHREAD_RWLOCK_WRPHASE) == 0) - { - /* We are about to release WRLOCKED, so we must release - __writers_futex too; see the handling of - writer--writer hand-over above. */ - unsigned int wf = atomic_exchange_relaxed - (&rwlock->__data.__writers_futex, 0); - while ((r & PTHREAD_RWLOCK_WRPHASE) == 0) - { - /* While we don't need to make anything from a - caller's critical section visible to other - threads, we need to ensure that our changes to - __writers_futex are properly ordered. - Therefore, use release MO to synchronize with - subsequent primary writers. Also wake up any - waiting readers as they are waiting because of - us. */ - if (atomic_compare_exchange_weak_release - (&rwlock->__data.__readers, &r, - (r ^ PTHREAD_RWLOCK_WRLOCKED) - & ~(unsigned int) PTHREAD_RWLOCK_RWAITING)) - { - /* Wake other writers. */ - if ((wf & PTHREAD_RWLOCK_FUTEX_USED) != 0) - futex_wake (&rwlock->__data.__writers_futex, - 1, private); - /* Wake waiting readers. */ - if ((r & PTHREAD_RWLOCK_RWAITING) != 0) - futex_wake (&rwlock->__data.__readers, - INT_MAX, private); - return ETIMEDOUT; - } - } - /* We still own WRLOCKED and someone else might set a - write phase concurrently, so enable waiting again. - Make sure we don't loose the flag that signals - whether there are threads waiting on this futex. */ - atomic_store_relaxed (&rwlock->__data.__writers_futex, - wf); - } - /* Use the acquire MO fence to mirror the steps taken in the - non-timeout case. Note that the read can happen both - in the atomic_load above as well as in the failure case - of the CAS operation. */ - atomic_thread_fence_acquire (); - /* We still need to wait for explicit hand-over, but we must - not use futex_wait anymore. */ - while ((atomic_load_relaxed - (&rwlock->__data.__wrphase_futex) - | PTHREAD_RWLOCK_FUTEX_USED) - == PTHREAD_RWLOCK_FUTEX_USED) - { - /* TODO Back-off. */ - } - ready = true; - break; - } - /* If we got interrupted (EINTR) or the futex word does not have - the expected value (EAGAIN), retry. */ - } - /* See pthread_rwlock_rdlock_full. */ - if (ready) - break; - if ((atomic_load_acquire (&rwlock->__data.__readers) - & PTHREAD_RWLOCK_WRPHASE) != 0) - ready = true; - } - } - - atomic_store_relaxed (&rwlock->__data.__cur_writer, - THREAD_GETMEM (THREAD_SELF, tid)); - return 0; -} diff --git a/nptl/pthread_rwlock_destroy.c b/nptl/pthread_rwlock_destroy.c deleted file mode 100644 index b63ce46420..0000000000 --- a/nptl/pthread_rwlock_destroy.c +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" -#include <stap-probe.h> - - -int -__pthread_rwlock_destroy (pthread_rwlock_t *rwlock) -{ - LIBC_PROBE (rwlock_destroy, 1, rwlock); - - /* Nothing to be done. For now. */ - return 0; -} -strong_alias (__pthread_rwlock_destroy, pthread_rwlock_destroy) diff --git a/nptl/pthread_rwlock_init.c b/nptl/pthread_rwlock_init.c deleted file mode 100644 index 764ba110fb..0000000000 --- a/nptl/pthread_rwlock_init.c +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" -#include <string.h> - - -static const struct pthread_rwlockattr default_rwlockattr = - { - .lockkind = PTHREAD_RWLOCK_DEFAULT_NP, - .pshared = PTHREAD_PROCESS_PRIVATE - }; - - -/* See pthread_rwlock_common.c. */ -int -__pthread_rwlock_init (pthread_rwlock_t *rwlock, - const pthread_rwlockattr_t *attr) -{ - const struct pthread_rwlockattr *iattr; - - iattr = ((const struct pthread_rwlockattr *) attr) ?: &default_rwlockattr; - - memset (rwlock, '\0', sizeof (*rwlock)); - - rwlock->__data.__flags = iattr->lockkind; - - /* The value of __SHARED in a private rwlock must be zero. */ - rwlock->__data.__shared = (iattr->pshared != PTHREAD_PROCESS_PRIVATE); - - return 0; -} -strong_alias (__pthread_rwlock_init, pthread_rwlock_init) diff --git a/nptl/pthread_rwlock_rdlock.c b/nptl/pthread_rwlock_rdlock.c deleted file mode 100644 index e07581bbf5..0000000000 --- a/nptl/pthread_rwlock_rdlock.c +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthread_rwlock_common.c" - -/* See pthread_rwlock_common.c. */ -int -__pthread_rwlock_rdlock (pthread_rwlock_t *rwlock) -{ - LIBC_PROBE (rdlock_entry, 1, rwlock); - - int result = __pthread_rwlock_rdlock_full (rwlock, NULL); - LIBC_PROBE (rdlock_acquire_read, 1, rwlock); - return result; -} - -weak_alias (__pthread_rwlock_rdlock, pthread_rwlock_rdlock) -hidden_def (__pthread_rwlock_rdlock) diff --git a/nptl/pthread_rwlock_timedrdlock.c b/nptl/pthread_rwlock_timedrdlock.c deleted file mode 100644 index 9f084f8c34..0000000000 --- a/nptl/pthread_rwlock_timedrdlock.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthread_rwlock_common.c" - -/* See pthread_rwlock_common.c. */ -int -pthread_rwlock_timedrdlock (pthread_rwlock_t *rwlock, - const struct timespec *abstime) -{ - /* Make sure the passed in timeout value is valid. Note that the previous - implementation assumed that this check *must* not be performed if there - would in fact be no blocking; however, POSIX only requires that "the - validity of the abstime parameter need not be checked if the lock can be - immediately acquired" (i.e., we need not but may check it). */ - /* ??? Just move this to __pthread_rwlock_rdlock_full? */ - if (__glibc_unlikely (abstime->tv_nsec >= 1000000000 - || abstime->tv_nsec < 0)) - return EINVAL; - - return __pthread_rwlock_rdlock_full (rwlock, abstime); -} diff --git a/nptl/pthread_rwlock_timedwrlock.c b/nptl/pthread_rwlock_timedwrlock.c deleted file mode 100644 index 5626505d2c..0000000000 --- a/nptl/pthread_rwlock_timedwrlock.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthread_rwlock_common.c" - -/* See pthread_rwlock_common.c. */ -int -pthread_rwlock_timedwrlock (pthread_rwlock_t *rwlock, - const struct timespec *abstime) -{ - /* Make sure the passed in timeout value is valid. Note that the previous - implementation assumed that this check *must* not be performed if there - would in fact be no blocking; however, POSIX only requires that "the - validity of the abstime parameter need not be checked if the lock can be - immediately acquired" (i.e., we need not but may check it). */ - /* ??? Just move this to __pthread_rwlock_wrlock_full? */ - if (__glibc_unlikely (abstime->tv_nsec >= 1000000000 - || abstime->tv_nsec < 0)) - return EINVAL; - - return __pthread_rwlock_wrlock_full (rwlock, abstime); -} diff --git a/nptl/pthread_rwlock_tryrdlock.c b/nptl/pthread_rwlock_tryrdlock.c deleted file mode 100644 index 6c3014ce53..0000000000 --- a/nptl/pthread_rwlock_tryrdlock.c +++ /dev/null @@ -1,112 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include "pthreadP.h" -#include <atomic.h> -#include <stdbool.h> -#include "pthread_rwlock_common.c" - - -/* See pthread_rwlock_common.c for an overview. */ -int -__pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock) -{ - /* For tryrdlock, we could speculate that we will succeed and go ahead and - register as a reader. However, if we misspeculate, we have to do the - same steps as a timed-out rdlock, which will increase contention. - Therefore, there is a trade-off between being able to use a combinable - read-modify-write operation and a CAS loop as used below; we pick the - latter because it simplifies the code, and should perform better when - tryrdlock is used in cases where writers are infrequent. - Because POSIX does not require a failed trylock to "synchronize memory", - relaxed MO is sufficient here and on the failure path of the CAS - below. */ - unsigned int r = atomic_load_relaxed (&rwlock->__data.__readers); - unsigned int rnew; - do - { - if ((r & PTHREAD_RWLOCK_WRPHASE) == 0) - { - /* If we are in a read phase, try to acquire unless there is a - primary writer and we prefer writers and there will be no - recursive read locks. */ - if (((r & PTHREAD_RWLOCK_WRLOCKED) != 0) - && (rwlock->__data.__flags - == PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP)) - return EBUSY; - rnew = r + (1 << PTHREAD_RWLOCK_READER_SHIFT); - } - else - { - /* If there is a writer that has acquired the lock and we are in - a write phase, fail. */ - if ((r & PTHREAD_RWLOCK_WRLOCKED) != 0) - return EBUSY; - else - { - /* If we do not care about potentially waiting writers, just - try to acquire. */ - rnew = (r + (1 << PTHREAD_RWLOCK_READER_SHIFT)) - ^ PTHREAD_RWLOCK_WRPHASE; - } - } - /* If we could have caused an overflow or take effect during an - overflow, we just can / need to return EAGAIN. There is no need to - have actually modified the number of readers because we could have - done that and cleaned up immediately. */ - if (rnew >= PTHREAD_RWLOCK_READER_OVERFLOW) - return EAGAIN; - } - /* If the CAS fails, we retry; this prevents that tryrdlock fails spuriously - (i.e., fails to acquire the lock although there is no writer), which is - fine for C++14 but not currently allowed by POSIX. - However, because tryrdlock must not appear to block, we should avoid - starving this CAS loop due to constant changes to __readers: - While normal rdlock readers that won't be able to acquire will just block - (and we expect timeouts on timedrdlock to be longer than one retry of the - CAS loop), we can have concurrently failing tryrdlock calls due to - readers or writers that acquire and release in the meantime. Using - randomized exponential back-off to make a live-lock unlikely should be - sufficient. - TODO Back-off. - Acquire MO so we synchronize with prior writers. */ - while (!atomic_compare_exchange_weak_acquire (&rwlock->__data.__readers, - &r, rnew)); - - if ((r & PTHREAD_RWLOCK_WRPHASE) != 0) - { - /* Same as in __pthread_rwlock_rdlock_full: - We started the read phase, so we are also responsible for - updating the write-phase futex. Relaxed MO is sufficient. - Note that there can be no other reader that we have to wake - because all other readers will see the read phase started by us - (or they will try to start it themselves); if a writer started - the read phase, we cannot have started it. Furthermore, we - cannot discard a PTHREAD_RWLOCK_FUTEX_USED flag because we will - overwrite the value set by the most recent writer (or the readers - before it in case of explicit hand-over) and we know that there - are no waiting readers. */ - atomic_store_relaxed (&rwlock->__data.__wrphase_futex, 0); - } - - return 0; - - -} -strong_alias (__pthread_rwlock_tryrdlock, pthread_rwlock_tryrdlock) diff --git a/nptl/pthread_rwlock_trywrlock.c b/nptl/pthread_rwlock_trywrlock.c deleted file mode 100644 index 0d9ccaf79c..0000000000 --- a/nptl/pthread_rwlock_trywrlock.c +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include "pthreadP.h" -#include <atomic.h> - -/* See pthread_rwlock_common.c for an overview. */ -int -__pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock) -{ - /* When in a trywrlock, we can acquire the write lock if it is in states - #1 (idle and read phase) and #5 (idle and write phase), and also in #6 - (readers waiting, write phase) if we prefer writers. - If we observe any other state, we are allowed to fail and do not need to - "synchronize memory" as specified by POSIX (hence relaxed MO is - sufficient for the first load and the CAS failure path). - We face a similar issue as in tryrdlock in that we need to both avoid - live-locks / starvation and must not fail spuriously (see there for - further comments) -- and thus must loop until we get a definitive - observation or state change. */ - unsigned int r = atomic_load_relaxed (&rwlock->__data.__readers); - bool prefer_writer = - (rwlock->__data.__flags != PTHREAD_RWLOCK_PREFER_READER_NP); - while (((r & PTHREAD_RWLOCK_WRLOCKED) == 0) - && (((r >> PTHREAD_RWLOCK_READER_SHIFT) == 0) - || (prefer_writer && ((r & PTHREAD_RWLOCK_WRPHASE) != 0)))) - { - /* Try to transition to states #7 or #8 (i.e., acquire the lock). */ - if (atomic_compare_exchange_weak_acquire ( - &rwlock->__data.__readers, &r, - r | PTHREAD_RWLOCK_WRPHASE | PTHREAD_RWLOCK_WRLOCKED)) - { - atomic_store_relaxed (&rwlock->__data.__writers_futex, 1); - atomic_store_relaxed (&rwlock->__data.__wrphase_futex, 1); - atomic_store_relaxed (&rwlock->__data.__cur_writer, - THREAD_GETMEM (THREAD_SELF, tid)); - return 0; - } - /* TODO Back-off. */ - /* See above. */ - } - return EBUSY; -} - -strong_alias (__pthread_rwlock_trywrlock, pthread_rwlock_trywrlock) diff --git a/nptl/pthread_rwlock_unlock.c b/nptl/pthread_rwlock_unlock.c deleted file mode 100644 index ef46e88263..0000000000 --- a/nptl/pthread_rwlock_unlock.c +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <sysdep.h> -#include <futex-internal.h> -#include <pthread.h> -#include <pthreadP.h> -#include <stap-probe.h> - -#include "pthread_rwlock_common.c" - -/* See pthread_rwlock_common.c for an overview. */ -int -__pthread_rwlock_unlock (pthread_rwlock_t *rwlock) -{ - LIBC_PROBE (rwlock_unlock, 1, rwlock); - - /* We distinguish between having acquired a read vs. a write lock by looking - at the writer TID. If it's equal to our TID, we must be the writer - because nobody else can have stored this value. Also, if we are a - reader, we will read from the wrunlock store with value 0 by the most - recent writer because that writer happens-before us. */ - if (atomic_load_relaxed (&rwlock->__data.__cur_writer) - == THREAD_GETMEM (THREAD_SELF, tid)) - __pthread_rwlock_wrunlock (rwlock); - else - __pthread_rwlock_rdunlock (rwlock); - return 0; -} - -weak_alias (__pthread_rwlock_unlock, pthread_rwlock_unlock) -hidden_def (__pthread_rwlock_unlock) diff --git a/nptl/pthread_rwlock_wrlock.c b/nptl/pthread_rwlock_wrlock.c deleted file mode 100644 index 335fcd18cc..0000000000 --- a/nptl/pthread_rwlock_wrlock.c +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthread_rwlock_common.c" - -/* See pthread_rwlock_common.c. */ -int -__pthread_rwlock_wrlock (pthread_rwlock_t *rwlock) -{ - LIBC_PROBE (wrlock_entry, 1, rwlock); - - int result = __pthread_rwlock_wrlock_full (rwlock, NULL); - LIBC_PROBE (wrlock_acquire_write, 1, rwlock); - return result; -} - -weak_alias (__pthread_rwlock_wrlock, pthread_rwlock_wrlock) -hidden_def (__pthread_rwlock_wrlock) diff --git a/nptl/pthread_rwlockattr_destroy.c b/nptl/pthread_rwlockattr_destroy.c deleted file mode 100644 index 73dd36cc9f..0000000000 --- a/nptl/pthread_rwlockattr_destroy.c +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" - - -int -pthread_rwlockattr_destroy (pthread_rwlockattr_t *attr) -{ - /* Nothing to do. For now. */ - - return 0; -} diff --git a/nptl/pthread_rwlockattr_getkind_np.c b/nptl/pthread_rwlockattr_getkind_np.c deleted file mode 100644 index 273aa70fbc..0000000000 --- a/nptl/pthread_rwlockattr_getkind_np.c +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" - - -int -pthread_rwlockattr_getkind_np (const pthread_rwlockattr_t *attr, int *pref) -{ - *pref = ((const struct pthread_rwlockattr *) attr)->lockkind; - - return 0; -} diff --git a/nptl/pthread_rwlockattr_getpshared.c b/nptl/pthread_rwlockattr_getpshared.c deleted file mode 100644 index 564d7ef9e9..0000000000 --- a/nptl/pthread_rwlockattr_getpshared.c +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" - - -int -pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *attr, int *pshared) -{ - *pshared = ((const struct pthread_rwlockattr *) attr)->pshared; - - return 0; -} diff --git a/nptl/pthread_rwlockattr_init.c b/nptl/pthread_rwlockattr_init.c deleted file mode 100644 index 8d90647db0..0000000000 --- a/nptl/pthread_rwlockattr_init.c +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" - - -int -pthread_rwlockattr_init (pthread_rwlockattr_t *attr) -{ - struct pthread_rwlockattr *iattr; - - iattr = (struct pthread_rwlockattr *) attr; - - iattr->lockkind = PTHREAD_RWLOCK_DEFAULT_NP; - iattr->pshared = PTHREAD_PROCESS_PRIVATE; - - return 0; -} diff --git a/nptl/pthread_rwlockattr_setkind_np.c b/nptl/pthread_rwlockattr_setkind_np.c deleted file mode 100644 index b3cdc7fb65..0000000000 --- a/nptl/pthread_rwlockattr_setkind_np.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include "pthreadP.h" - - -int -pthread_rwlockattr_setkind_np (pthread_rwlockattr_t *attr, int pref) -{ - struct pthread_rwlockattr *iattr; - - if (pref != PTHREAD_RWLOCK_PREFER_READER_NP - && pref != PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP - && __builtin_expect (pref != PTHREAD_RWLOCK_PREFER_WRITER_NP, 0)) - return EINVAL; - - iattr = (struct pthread_rwlockattr *) attr; - - iattr->lockkind = pref; - - return 0; -} diff --git a/nptl/pthread_rwlockattr_setpshared.c b/nptl/pthread_rwlockattr_setpshared.c deleted file mode 100644 index 450e3af593..0000000000 --- a/nptl/pthread_rwlockattr_setpshared.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include "pthreadP.h" -#include <futex-internal.h> - - -int -pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr, int pshared) -{ - struct pthread_rwlockattr *iattr; - - int err = futex_supports_pshared (pshared); - if (err != 0) - return err; - - iattr = (struct pthread_rwlockattr *) attr; - - iattr->pshared = pshared; - - return 0; -} diff --git a/nptl/pthread_self.c b/nptl/pthread_self.c deleted file mode 100644 index 4c978e1cfa..0000000000 --- a/nptl/pthread_self.c +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" -#include <tls.h> - - -pthread_t -__pthread_self (void) -{ - return (pthread_t) THREAD_SELF; -} -strong_alias (__pthread_self, pthread_self) diff --git a/nptl/pthread_setaffinity.c b/nptl/pthread_setaffinity.c deleted file mode 100644 index ea9cf6f395..0000000000 --- a/nptl/pthread_setaffinity.c +++ /dev/null @@ -1,32 +0,0 @@ -/* Set the processor affinity of a thread. Stub version. - Copyright (C) 2014-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthreadP.h> - -int -pthread_setaffinity_np (pthread_t th, - size_t cpusetsize, const cpu_set_t *cpuset) -{ - const struct pthread *pd = (const struct pthread *) th; - - if (INVALID_TD_P (pd)) - return ESRCH; - - return ENOSYS; -} -stub_warning (pthread_setaffinity_np) diff --git a/nptl/pthread_setattr_default_np.c b/nptl/pthread_setattr_default_np.c deleted file mode 100644 index dd1b6fc915..0000000000 --- a/nptl/pthread_setattr_default_np.c +++ /dev/null @@ -1,108 +0,0 @@ -/* Set the default attributes to be used by pthread_create in the process. - Copyright (C) 2013-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdlib.h> -#include <pthreadP.h> -#include <assert.h> -#include <string.h> - - -int -pthread_setattr_default_np (const pthread_attr_t *in) -{ - const struct pthread_attr *real_in; - struct pthread_attr attrs; - int ret; - - assert (sizeof (*in) >= sizeof (struct pthread_attr)); - real_in = (struct pthread_attr *) in; - - /* Catch invalid values. */ - int policy = real_in->schedpolicy; - ret = check_sched_policy_attr (policy); - if (ret) - return ret; - - const struct sched_param *param = &real_in->schedparam; - if (param->sched_priority > 0) - { - ret = check_sched_priority_attr (param->sched_priority, policy); - if (ret) - return ret; - } - - /* stacksize == 0 is fine. It means that we don't change the current - value. */ - if (real_in->stacksize != 0) - { - ret = check_stacksize_attr (real_in->stacksize); - if (ret) - return ret; - } - - /* Having a default stack address is wrong. */ - if (real_in->flags & ATTR_FLAG_STACKADDR) - return EINVAL; - - attrs = *real_in; - - /* Now take the lock because we start writing into - __default_pthread_attr. */ - lll_lock (__default_pthread_attr_lock, LLL_PRIVATE); - - /* Free the cpuset if the input is 0. Otherwise copy in the cpuset - contents. */ - size_t cpusetsize = attrs.cpusetsize; - if (cpusetsize == 0) - { - free (__default_pthread_attr.cpuset); - __default_pthread_attr.cpuset = NULL; - } - else if (cpusetsize == __default_pthread_attr.cpusetsize) - { - attrs.cpuset = __default_pthread_attr.cpuset; - memcpy (attrs.cpuset, real_in->cpuset, cpusetsize); - } - else - { - /* This may look wrong at first sight, but it isn't. We're freeing - __default_pthread_attr.cpuset and allocating to attrs.cpuset because - we'll copy over all of attr to __default_pthread_attr later. */ - cpu_set_t *newp = realloc (__default_pthread_attr.cpuset, - cpusetsize); - - if (newp == NULL) - { - ret = ENOMEM; - goto out; - } - - attrs.cpuset = newp; - memcpy (attrs.cpuset, real_in->cpuset, cpusetsize); - } - - /* We don't want to accidentally set the default stacksize to zero. */ - if (attrs.stacksize == 0) - attrs.stacksize = __default_pthread_attr.stacksize; - __default_pthread_attr = attrs; - - out: - lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE); - return ret; -} diff --git a/nptl/pthread_setcancelstate.c b/nptl/pthread_setcancelstate.c deleted file mode 100644 index 8a1cb9ac3f..0000000000 --- a/nptl/pthread_setcancelstate.c +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include "pthreadP.h" -#include <atomic.h> - - -int -__pthread_setcancelstate (int state, int *oldstate) -{ - volatile struct pthread *self; - - if (state < PTHREAD_CANCEL_ENABLE || state > PTHREAD_CANCEL_DISABLE) - return EINVAL; - - self = THREAD_SELF; - - int oldval = THREAD_GETMEM (self, cancelhandling); - while (1) - { - int newval = (state == PTHREAD_CANCEL_DISABLE - ? oldval | CANCELSTATE_BITMASK - : oldval & ~CANCELSTATE_BITMASK); - - /* Store the old value. */ - if (oldstate != NULL) - *oldstate = ((oldval & CANCELSTATE_BITMASK) - ? PTHREAD_CANCEL_DISABLE : PTHREAD_CANCEL_ENABLE); - - /* Avoid doing unnecessary work. The atomic operation can - potentially be expensive if the memory has to be locked and - remote cache lines have to be invalidated. */ - if (oldval == newval) - break; - - /* Update the cancel handling word. This has to be done - atomically since other bits could be modified as well. */ - int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval, - oldval); - if (__glibc_likely (curval == oldval)) - { - if (CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS (newval)) - __do_cancel (); - - break; - } - - /* Prepare for the next round. */ - oldval = curval; - } - - return 0; -} -strong_alias (__pthread_setcancelstate, pthread_setcancelstate) -hidden_def (__pthread_setcancelstate) diff --git a/nptl/pthread_setcanceltype.c b/nptl/pthread_setcanceltype.c deleted file mode 100644 index dd1f374849..0000000000 --- a/nptl/pthread_setcanceltype.c +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include "pthreadP.h" -#include <atomic.h> - - -int -__pthread_setcanceltype (int type, int *oldtype) -{ - if (type < PTHREAD_CANCEL_DEFERRED || type > PTHREAD_CANCEL_ASYNCHRONOUS) - return EINVAL; - -#ifndef SIGCANCEL - if (type == PTHREAD_CANCEL_ASYNCHRONOUS) - return ENOTSUP; -#endif - - volatile struct pthread *self = THREAD_SELF; - - int oldval = THREAD_GETMEM (self, cancelhandling); - while (1) - { - int newval = (type == PTHREAD_CANCEL_ASYNCHRONOUS - ? oldval | CANCELTYPE_BITMASK - : oldval & ~CANCELTYPE_BITMASK); - - /* Store the old value. */ - if (oldtype != NULL) - *oldtype = ((oldval & CANCELTYPE_BITMASK) - ? PTHREAD_CANCEL_ASYNCHRONOUS : PTHREAD_CANCEL_DEFERRED); - - /* Avoid doing unnecessary work. The atomic operation can - potentially be expensive if the memory has to be locked and - remote cache lines have to be invalidated. */ - if (oldval == newval) - break; - - /* Update the cancel handling word. This has to be done - atomically since other bits could be modified as well. */ - int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval, - oldval); - if (__glibc_likely (curval == oldval)) - { - if (CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS (newval)) - { - THREAD_SETMEM (self, result, PTHREAD_CANCELED); - __do_cancel (); - } - - break; - } - - /* Prepare for the next round. */ - oldval = curval; - } - - return 0; -} -strong_alias (__pthread_setcanceltype, pthread_setcanceltype) diff --git a/nptl/pthread_setconcurrency.c b/nptl/pthread_setconcurrency.c deleted file mode 100644 index 2a78e15f85..0000000000 --- a/nptl/pthread_setconcurrency.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include "pthreadP.h" - - -/* Global definition. Needed in pthread_getconcurrency as well. */ -int __concurrency_level; - - -int -pthread_setconcurrency (int level) -{ - if (level < 0) - return EINVAL; - - __concurrency_level = level; - - /* XXX For ports which actually need to handle the concurrency level - some more code is probably needed here. */ - - return 0; -} diff --git a/nptl/pthread_setegid.c b/nptl/pthread_setegid.c deleted file mode 100644 index 9252dfac7d..0000000000 --- a/nptl/pthread_setegid.c +++ /dev/null @@ -1,3 +0,0 @@ -#define SINGLE_THREAD -#define setegid pthread_setegid_np -#include <setegid.c> diff --git a/nptl/pthread_seteuid.c b/nptl/pthread_seteuid.c deleted file mode 100644 index 47bb698025..0000000000 --- a/nptl/pthread_seteuid.c +++ /dev/null @@ -1,3 +0,0 @@ -#define SINGLE_THREAD -#define seteuid pthread_seteuid_np -#include <seteuid.c> diff --git a/nptl/pthread_setgid.c b/nptl/pthread_setgid.c deleted file mode 100644 index b06bffbf32..0000000000 --- a/nptl/pthread_setgid.c +++ /dev/null @@ -1,3 +0,0 @@ -#define SINGLE_THREAD -#define __setgid pthread_setgid_np -#include <setgid.c> diff --git a/nptl/pthread_setname.c b/nptl/pthread_setname.c deleted file mode 100644 index e8a0d483a5..0000000000 --- a/nptl/pthread_setname.c +++ /dev/null @@ -1,32 +0,0 @@ -/* pthread_setname_np -- Set thread name. Stub version. - Copyright (C) 2014-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthreadP.h> - -int -pthread_setname_np (pthread_t th, const char *name) -{ - const struct pthread *pd = (const struct pthread *) th; - - if (INVALID_TD_P (pd)) - return ESRCH; - - return ENOSYS; -} -stub_warning (pthread_setname_np) diff --git a/nptl/pthread_setregid.c b/nptl/pthread_setregid.c deleted file mode 100644 index 7461d2b7fd..0000000000 --- a/nptl/pthread_setregid.c +++ /dev/null @@ -1,3 +0,0 @@ -#define SINGLE_THREAD -#define __setregid pthread_setregid_np -#include <setregid.c> diff --git a/nptl/pthread_setresgid.c b/nptl/pthread_setresgid.c deleted file mode 100644 index 369fae2672..0000000000 --- a/nptl/pthread_setresgid.c +++ /dev/null @@ -1,3 +0,0 @@ -#define SINGLE_THREAD -#define __setresgid pthread_setresgid_np -#include <setresgid.c> diff --git a/nptl/pthread_setresuid.c b/nptl/pthread_setresuid.c deleted file mode 100644 index ac57c0fa8d..0000000000 --- a/nptl/pthread_setresuid.c +++ /dev/null @@ -1,3 +0,0 @@ -#define SINGLE_THREAD -#define __setresuid pthread_setresuid_np -#include <setresuid.c> diff --git a/nptl/pthread_setreuid.c b/nptl/pthread_setreuid.c deleted file mode 100644 index aa804ab01d..0000000000 --- a/nptl/pthread_setreuid.c +++ /dev/null @@ -1,3 +0,0 @@ -#define SINGLE_THREAD -#define __setreuid pthread_setreuid_np -#include <setreuid.c> diff --git a/nptl/pthread_setschedparam.c b/nptl/pthread_setschedparam.c deleted file mode 100644 index a6539b3ee1..0000000000 --- a/nptl/pthread_setschedparam.c +++ /dev/null @@ -1,72 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <sched.h> -#include <string.h> -#include "pthreadP.h" -#include <lowlevellock.h> - - -int -__pthread_setschedparam (pthread_t threadid, int policy, - const struct sched_param *param) -{ - struct pthread *pd = (struct pthread *) threadid; - - /* Make sure the descriptor is valid. */ - if (INVALID_TD_P (pd)) - /* Not a valid thread handle. */ - return ESRCH; - - int result = 0; - - /* See CREATE THREAD NOTES in nptl/pthread_create.c. */ - lll_lock (pd->lock, LLL_PRIVATE); - - struct sched_param p; - const struct sched_param *orig_param = param; - - /* If the thread should have higher priority because of some - PTHREAD_PRIO_PROTECT mutexes it holds, adjust the priority. */ - if (__builtin_expect (pd->tpp != NULL, 0) - && pd->tpp->priomax > param->sched_priority) - { - p = *param; - p.sched_priority = pd->tpp->priomax; - param = &p; - } - - /* Try to set the scheduler information. */ - if (__builtin_expect (__sched_setscheduler (pd->tid, policy, - param) == -1, 0)) - result = errno; - else - { - /* We succeeded changing the kernel information. Reflect this - change in the thread descriptor. */ - pd->schedpolicy = policy; - memcpy (&pd->schedparam, orig_param, sizeof (struct sched_param)); - pd->flags |= ATTR_FLAG_SCHED_SET | ATTR_FLAG_POLICY_SET; - } - - lll_unlock (pd->lock, LLL_PRIVATE); - - return result; -} -strong_alias (__pthread_setschedparam, pthread_setschedparam) diff --git a/nptl/pthread_setschedprio.c b/nptl/pthread_setschedprio.c deleted file mode 100644 index b83d2fba43..0000000000 --- a/nptl/pthread_setschedprio.c +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <sched.h> -#include <string.h> -#include <sched.h> -#include "pthreadP.h" -#include <lowlevellock.h> - - -int -pthread_setschedprio (pthread_t threadid, int prio) -{ - struct pthread *pd = (struct pthread *) threadid; - - /* Make sure the descriptor is valid. */ - if (INVALID_TD_P (pd)) - /* Not a valid thread handle. */ - return ESRCH; - - int result = 0; - struct sched_param param; - param.sched_priority = prio; - - /* See CREATE THREAD NOTES in nptl/pthread_create.c. */ - lll_lock (pd->lock, LLL_PRIVATE); - - /* If the thread should have higher priority because of some - PTHREAD_PRIO_PROTECT mutexes it holds, adjust the priority. */ - if (__builtin_expect (pd->tpp != NULL, 0) && pd->tpp->priomax > prio) - param.sched_priority = pd->tpp->priomax; - - /* Try to set the scheduler information. */ - if (__glibc_unlikely (sched_setparam (pd->tid, ¶m) == -1)) - result = errno; - else - { - /* We succeeded changing the kernel information. Reflect this - change in the thread descriptor. */ - param.sched_priority = prio; - memcpy (&pd->schedparam, ¶m, sizeof (struct sched_param)); - pd->flags |= ATTR_FLAG_SCHED_SET; - } - - lll_unlock (pd->lock, LLL_PRIVATE); - - return result; -} diff --git a/nptl/pthread_setspecific.c b/nptl/pthread_setspecific.c deleted file mode 100644 index c5416a5ae0..0000000000 --- a/nptl/pthread_setspecific.c +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdlib.h> -#include "pthreadP.h" - - -int -__pthread_setspecific (pthread_key_t key, const void *value) -{ - struct pthread *self; - unsigned int idx1st; - unsigned int idx2nd; - struct pthread_key_data *level2; - unsigned int seq; - - self = THREAD_SELF; - - /* Special case access to the first 2nd-level block. This is the - usual case. */ - if (__glibc_likely (key < PTHREAD_KEY_2NDLEVEL_SIZE)) - { - /* Verify the key is sane. */ - if (KEY_UNUSED ((seq = __pthread_keys[key].seq))) - /* Not valid. */ - return EINVAL; - - level2 = &self->specific_1stblock[key]; - - /* Remember that we stored at least one set of data. */ - if (value != NULL) - THREAD_SETMEM (self, specific_used, true); - } - else - { - if (key >= PTHREAD_KEYS_MAX - || KEY_UNUSED ((seq = __pthread_keys[key].seq))) - /* Not valid. */ - return EINVAL; - - idx1st = key / PTHREAD_KEY_2NDLEVEL_SIZE; - idx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE; - - /* This is the second level array. Allocate it if necessary. */ - level2 = THREAD_GETMEM_NC (self, specific, idx1st); - if (level2 == NULL) - { - if (value == NULL) - /* We don't have to do anything. The value would in any case - be NULL. We can save the memory allocation. */ - return 0; - - level2 - = (struct pthread_key_data *) calloc (PTHREAD_KEY_2NDLEVEL_SIZE, - sizeof (*level2)); - if (level2 == NULL) - return ENOMEM; - - THREAD_SETMEM_NC (self, specific, idx1st, level2); - } - - /* Pointer to the right array element. */ - level2 = &level2[idx2nd]; - - /* Remember that we stored at least one set of data. */ - THREAD_SETMEM (self, specific_used, true); - } - - /* Store the data and the sequence number so that we can recognize - stale data. */ - level2->seq = seq; - level2->data = (void *) value; - - return 0; -} -strong_alias (__pthread_setspecific, pthread_setspecific) -hidden_def (__pthread_setspecific) diff --git a/nptl/pthread_setuid.c b/nptl/pthread_setuid.c deleted file mode 100644 index ff949c850f..0000000000 --- a/nptl/pthread_setuid.c +++ /dev/null @@ -1,3 +0,0 @@ -#define SINGLE_THREAD -#define __setuid pthread_setuid_np -#include <setuid.c> diff --git a/nptl/pthread_sigmask.c b/nptl/pthread_sigmask.c deleted file mode 100644 index 56a0ecc396..0000000000 --- a/nptl/pthread_sigmask.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Examine and change blocked signals for a thread. Generic POSIX version. - Copyright (C) 2014-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <signal.h> -#include <pthreadP.h> - -#if defined SIGCANCEL || defined SIGTIMER || defined SIGSETXID -# error "This implementation assumes no internal-only signal numbers." -#endif - -int -pthread_sigmask (int how, const sigset_t *newmask, sigset_t *oldmask) -{ - /* Here we assume that sigprocmask actually does everything right. - The only difference is the return value protocol. */ - int result = sigprocmask (how, newmask, oldmask); - if (result < 0) - result = errno; - return result; -} diff --git a/nptl/pthread_sigqueue.c b/nptl/pthread_sigqueue.c deleted file mode 100644 index 09b686f4ce..0000000000 --- a/nptl/pthread_sigqueue.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Queue a signal (with value) for a specific pthread. Stub version. - Copyright (C) 2014-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <signal.h> -#include <pthreadP.h> - - -int -pthread_sigqueue (pthread_t threadid, int signo, const union sigval value) -{ - struct pthread *pd = (struct pthread *) threadid; - - /* Make sure the descriptor is valid. */ - if (DEBUGGING_P && INVALID_TD_P (pd)) - /* Not a valid thread handle. */ - return ESRCH; - - return ENOSYS; -} - -stub_warning (pthread_sigqueue) diff --git a/nptl/pthread_spin_destroy.c b/nptl/pthread_spin_destroy.c deleted file mode 100644 index 2eca129155..0000000000 --- a/nptl/pthread_spin_destroy.c +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" - - -int -pthread_spin_destroy (pthread_spinlock_t *lock) -{ - /* Nothing to do. */ - return 0; -} diff --git a/nptl/pthread_spin_init.c b/nptl/pthread_spin_init.c deleted file mode 100644 index fe3091377e..0000000000 --- a/nptl/pthread_spin_init.c +++ /dev/null @@ -1,28 +0,0 @@ -/* pthread_spin_init -- initialize a spin lock. Generic version. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" - -int -pthread_spin_init (pthread_spinlock_t *lock, int pshared) -{ - /* Relaxed MO is fine because this is an initializing store. */ - atomic_store_relaxed (lock, 0); - return 0; -} diff --git a/nptl/pthread_spin_lock.c b/nptl/pthread_spin_lock.c deleted file mode 100644 index 682af80240..0000000000 --- a/nptl/pthread_spin_lock.c +++ /dev/null @@ -1,80 +0,0 @@ -/* pthread_spin_lock -- lock a spin lock. Generic version. - Copyright (C) 2012-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <atomic.h> -#include "pthreadP.h" - -int -pthread_spin_lock (pthread_spinlock_t *lock) -{ - int val = 0; - - /* We assume that the first try mostly will be successful, thus we use - atomic_exchange if it is not implemented by a CAS loop (we also assume - that atomic_exchange can be faster if it succeeds, see - ATOMIC_EXCHANGE_USES_CAS). Otherwise, we use a weak CAS and not an - exchange so we bail out after the first failed attempt to change the - state. For the subsequent attempts we use atomic_compare_and_exchange - after we observe that the lock is not acquired. - See also comment in pthread_spin_trylock. - We use acquire MO to synchronize-with the release MO store in - pthread_spin_unlock, and thus ensure that prior critical sections - happen-before this critical section. */ -#if ! ATOMIC_EXCHANGE_USES_CAS - /* Try to acquire the lock with an exchange instruction as this architecture - has such an instruction and we assume it is faster than a CAS. - The acquisition succeeds if the lock is not in an acquired state. */ - if (__glibc_likely (atomic_exchange_acquire (lock, 1) == 0)) - return 0; -#else - /* Try to acquire the lock with a CAS instruction as this architecture - has no exchange instruction. The acquisition succeeds if the lock is not - acquired. */ - if (__glibc_likely (atomic_compare_exchange_weak_acquire (lock, &val, 1))) - return 0; -#endif - - do - { - /* The lock is contended and we need to wait. Going straight back - to cmpxchg is not a good idea on many targets as that will force - expensive memory synchronizations among processors and penalize other - running threads. - There is no technical reason for throwing in a CAS every now and then, - and so far we have no evidence that it can improve performance. - If that would be the case, we have to adjust other spin-waiting loops - elsewhere, too! - Thus we use relaxed MO reads until we observe the lock to not be - acquired anymore. */ - do - { - /* TODO Back-off. */ - - atomic_spin_nop (); - - val = atomic_load_relaxed (lock); - } - while (val != 0); - - /* We need acquire memory order here for the same reason as mentioned - for the first try to lock the spinlock. */ - } - while (!atomic_compare_exchange_weak_acquire (lock, &val, 1)); - - return 0; -} diff --git a/nptl/pthread_spin_trylock.c b/nptl/pthread_spin_trylock.c deleted file mode 100644 index 83921b06b8..0000000000 --- a/nptl/pthread_spin_trylock.c +++ /dev/null @@ -1,79 +0,0 @@ -/* pthread_spin_trylock -- trylock a spin lock. Generic version. - Copyright (C) 2012-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <atomic.h> -#include "pthreadP.h" - -int -pthread_spin_trylock (pthread_spinlock_t *lock) -{ - /* For the spin try lock, we have the following possibilities: - - 1) If we assume that trylock will most likely succeed in practice: - * We just do an exchange. - - 2) If we want to bias towards cases where trylock succeeds, but don't - rule out contention: - * If exchange is not implemented by a CAS loop, and exchange is faster - than CAS, do an exchange. - * If exchange is implemented by a CAS loop, use a weak CAS and not an - exchange so we bail out after the first failed attempt to change the state. - - 3) If we expect contention to be likely: - * If CAS always brings the cache line into an exclusive state even if the - spinlock is already acquired, then load the value first with - atomic_load_relaxed and test if lock is not acquired. Then do 2). - - We assume that 2) is the common case, and that this won't be slower than - 1) in the common case. - - We use acquire MO to synchronize-with the release MO store in - pthread_spin_unlock, and thus ensure that prior critical sections - happen-before this critical section. */ -#if ! ATOMIC_EXCHANGE_USES_CAS - /* Try to acquire the lock with an exchange instruction as this architecture - has such an instruction and we assume it is faster than a CAS. - The acquisition succeeds if the lock is not in an acquired state. */ - if (atomic_exchange_acquire (lock, 1) == 0) - return 0; -#else - /* Try to acquire the lock with a CAS instruction as this architecture - has no exchange instruction. The acquisition succeeds if the lock is not - acquired. */ - do - { - int val = 0; - if (atomic_compare_exchange_weak_acquire (lock, &val, 1)) - return 0; - } - /* atomic_compare_exchange_weak_acquire can fail spuriously. Whereas - C++11 and C11 make it clear that trylock operations can fail spuriously, - POSIX does not explicitly specify this; it only specifies that failing - synchronization operations do not need to have synchronization effects - themselves, but a spurious failure is something that could contradict a - happens-before established earlier (e.g., that we need to observe that - the lock is acquired). Therefore, we emulate a strong CAS by simply - checking with a relaxed MO load that the lock is really acquired before - returning EBUSY; the additional overhead this may cause is on the slow - path. */ - while (atomic_load_relaxed (lock) == 0); -#endif - - return EBUSY; -} diff --git a/nptl/pthread_spin_unlock.c b/nptl/pthread_spin_unlock.c deleted file mode 100644 index f83b69639a..0000000000 --- a/nptl/pthread_spin_unlock.c +++ /dev/null @@ -1,31 +0,0 @@ -/* pthread_spin_unlock -- unlock a spin lock. Generic version. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "pthreadP.h" -#include <atomic.h> - -int -pthread_spin_unlock (pthread_spinlock_t *lock) -{ - /* The atomic_store_release synchronizes-with the atomic_exchange_acquire - or atomic_compare_exchange_weak_acquire in pthread_spin_lock / - pthread_spin_trylock. */ - atomic_store_release (lock, 0); - return 0; -} diff --git a/nptl/pthread_testcancel.c b/nptl/pthread_testcancel.c deleted file mode 100644 index 38b343fbd9..0000000000 --- a/nptl/pthread_testcancel.c +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdlib.h> -#include "pthreadP.h" - - -void -__pthread_testcancel (void) -{ - CANCELLATION_P (THREAD_SELF); -} -strong_alias (__pthread_testcancel, pthread_testcancel) -hidden_def (__pthread_testcancel) diff --git a/nptl/pthread_timedjoin.c b/nptl/pthread_timedjoin.c deleted file mode 100644 index 567c171133..0000000000 --- a/nptl/pthread_timedjoin.c +++ /dev/null @@ -1,104 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdlib.h> -#include <atomic.h> -#include "pthreadP.h" - - -static void -cleanup (void *arg) -{ - *(void **) arg = NULL; -} - - -int -pthread_timedjoin_np (pthread_t threadid, void **thread_return, - const struct timespec *abstime) -{ - struct pthread *self; - struct pthread *pd = (struct pthread *) threadid; - int result; - - /* Make sure the descriptor is valid. */ - if (INVALID_NOT_TERMINATED_TD_P (pd)) - /* Not a valid thread handle. */ - return ESRCH; - - /* Is the thread joinable?. */ - if (IS_DETACHED (pd)) - /* We cannot wait for the thread. */ - return EINVAL; - - self = THREAD_SELF; - if (pd == self || self->joinid == pd) - /* This is a deadlock situation. The threads are waiting for each - other to finish. Note that this is a "may" error. To be 100% - sure we catch this error we would have to lock the data - structures but it is not necessary. In the unlikely case that - two threads are really caught in this situation they will - deadlock. It is the programmer's problem to figure this - out. */ - return EDEADLK; - - /* Wait for the thread to finish. If it is already locked something - is wrong. There can only be one waiter. */ - if (__builtin_expect (atomic_compare_and_exchange_bool_acq (&pd->joinid, - self, NULL), 0)) - /* There is already somebody waiting for the thread. */ - return EINVAL; - - - /* During the wait we change to asynchronous cancellation. If we - are cancelled the thread we are waiting for must be marked as - un-wait-ed for again. */ - pthread_cleanup_push (cleanup, &pd->joinid); - - /* Switch to asynchronous cancellation. */ - int oldtype = CANCEL_ASYNC (); - - - /* Wait for the child. */ - result = lll_timedwait_tid (pd->tid, abstime); - - - /* Restore cancellation mode. */ - CANCEL_RESET (oldtype); - - /* Remove the handler. */ - pthread_cleanup_pop (0); - - - /* We might have timed out. */ - if (result == 0) - { - /* Store the return value if the caller is interested. */ - if (thread_return != NULL) - *thread_return = pd->result; - - - /* Free the TCB. */ - __free_tcb (pd); - } - else - pd->joinid = NULL; - - return result; -} diff --git a/nptl/pthread_tryjoin.c b/nptl/pthread_tryjoin.c deleted file mode 100644 index 6a3b62e409..0000000000 --- a/nptl/pthread_tryjoin.c +++ /dev/null @@ -1,72 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdlib.h> - -#include <atomic.h> -#include "pthreadP.h" - - -int -pthread_tryjoin_np (pthread_t threadid, void **thread_return) -{ - struct pthread *self; - struct pthread *pd = (struct pthread *) threadid; - - /* Make sure the descriptor is valid. */ - if (DEBUGGING_P && __find_in_stack_list (pd) == NULL) - /* Not a valid thread handle. */ - return ESRCH; - - /* Is the thread joinable?. */ - if (IS_DETACHED (pd)) - /* We cannot wait for the thread. */ - return EINVAL; - - self = THREAD_SELF; - if (pd == self || self->joinid == pd) - /* This is a deadlock situation. The threads are waiting for each - other to finish. Note that this is a "may" error. To be 100% - sure we catch this error we would have to lock the data - structures but it is not necessary. In the unlikely case that - two threads are really caught in this situation they will - deadlock. It is the programmer's problem to figure this - out. */ - return EDEADLK; - - /* Return right away if the thread hasn't terminated yet. */ - if (pd->tid != 0) - return EBUSY; - - /* Wait for the thread to finish. If it is already locked something - is wrong. There can only be one waiter. */ - if (atomic_compare_and_exchange_bool_acq (&pd->joinid, self, NULL)) - /* There is already somebody waiting for the thread. */ - return EINVAL; - - /* Store the return value if the caller is interested. */ - if (thread_return != NULL) - *thread_return = pd->result; - - - /* Free the TCB. */ - __free_tcb (pd); - - return 0; -} diff --git a/nptl/pthread_yield.c b/nptl/pthread_yield.c deleted file mode 100644 index 9a6d3f12b2..0000000000 --- a/nptl/pthread_yield.c +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <sched.h> - - -/* With the 1-on-1 model we implement this function is equivalent to - the 'sched_yield' function. */ -int -pthread_yield (void) -{ - return sched_yield (); -} diff --git a/nptl/register-atfork.c b/nptl/register-atfork.c deleted file mode 100644 index e6a62b84b5..0000000000 --- a/nptl/register-atfork.c +++ /dev/null @@ -1,144 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdlib.h> -#include <string.h> -#include <fork.h> -#include <atomic.h> - - -struct fork_handler *__fork_handlers; - -/* Lock to protect allocation and deallocation of fork handlers. */ -int __fork_lock = LLL_LOCK_INITIALIZER; - - -/* Number of pre-allocated handler entries. */ -#define NHANDLER 48 - -/* Memory pool for fork handler structures. */ -static struct fork_handler_pool -{ - struct fork_handler_pool *next; - struct fork_handler mem[NHANDLER]; -} fork_handler_pool; - - -static struct fork_handler * -fork_handler_alloc (void) -{ - struct fork_handler_pool *runp = &fork_handler_pool; - struct fork_handler *result = NULL; - unsigned int i; - - do - { - /* Search for an empty entry. */ - for (i = 0; i < NHANDLER; ++i) - if (runp->mem[i].refcntr == 0) - goto found; - } - while ((runp = runp->next) != NULL); - - /* We have to allocate a new entry. */ - runp = (struct fork_handler_pool *) calloc (1, sizeof (*runp)); - if (runp != NULL) - { - /* Enqueue the new memory pool into the list. */ - runp->next = fork_handler_pool.next; - fork_handler_pool.next = runp; - - /* We use the last entry on the page. This means when we start - searching from the front the next time we will find the first - entry unused. */ - i = NHANDLER - 1; - - found: - result = &runp->mem[i]; - result->refcntr = 1; - result->need_signal = 0; - } - - return result; -} - - -int -__register_atfork (void (*prepare) (void), void (*parent) (void), - void (*child) (void), void *dso_handle) -{ - /* Get the lock to not conflict with other allocations. */ - lll_lock (__fork_lock, LLL_PRIVATE); - - struct fork_handler *newp = fork_handler_alloc (); - - if (newp != NULL) - { - /* Initialize the new record. */ - newp->prepare_handler = prepare; - newp->parent_handler = parent; - newp->child_handler = child; - newp->dso_handle = dso_handle; - - __linkin_atfork (newp); - } - - /* Release the lock. */ - lll_unlock (__fork_lock, LLL_PRIVATE); - - return newp == NULL ? ENOMEM : 0; -} -libc_hidden_def (__register_atfork) - - -void -attribute_hidden -__linkin_atfork (struct fork_handler *newp) -{ - do - newp->next = __fork_handlers; - while (catomic_compare_and_exchange_bool_acq (&__fork_handlers, - newp, newp->next) != 0); -} - - -libc_freeres_fn (free_mem) -{ - /* Get the lock to not conflict with running forks. */ - lll_lock (__fork_lock, LLL_PRIVATE); - - /* No more fork handlers. */ - __fork_handlers = NULL; - - /* Free eventually allocated memory blocks for the object pool. */ - struct fork_handler_pool *runp = fork_handler_pool.next; - - memset (&fork_handler_pool, '\0', sizeof (fork_handler_pool)); - - /* Release the lock. */ - lll_unlock (__fork_lock, LLL_PRIVATE); - - /* We can free the memory after releasing the lock. */ - while (runp != NULL) - { - struct fork_handler_pool *oldp = runp; - runp = runp->next; - free (oldp); - } -} diff --git a/nptl/res.c b/nptl/res.c deleted file mode 100644 index bb08bc768f..0000000000 --- a/nptl/res.c +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <features.h> -#include <resolv.h> -#include <tls.h> - -struct __res_state * -__res_state (void) -{ - return __resp; -} diff --git a/nptl/sem_close.c b/nptl/sem_close.c deleted file mode 100644 index 5049eadb1f..0000000000 --- a/nptl/sem_close.c +++ /dev/null @@ -1,79 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <search.h> -#include <sys/mman.h> -#include "semaphoreP.h" - - -/* Global variables to parametrize the walk function. This works - since we always have to use locks. And we have to use the twalk - function since the entries are not sorted wrt the mapping - address. */ -static sem_t *the_sem; -static struct inuse_sem *rec; - -static void -walker (const void *inodep, const VISIT which, const int depth) -{ - struct inuse_sem *nodep = *(struct inuse_sem **) inodep; - - if (nodep->sem == the_sem) - rec = nodep; -} - - -int -sem_close (sem_t *sem) -{ - int result = 0; - - /* Get the lock. */ - lll_lock (__sem_mappings_lock, LLL_PRIVATE); - - /* Locate the entry for the mapping the caller provided. */ - rec = NULL; - the_sem = sem; - __twalk (__sem_mappings, walker); - if (rec != NULL) - { - /* Check the reference counter. If it is going to be zero, free - all the resources. */ - if (--rec->refcnt == 0) - { - /* Remove the record from the tree. */ - (void) __tdelete (rec, &__sem_mappings, __sem_search); - - result = munmap (rec->sem, sizeof (sem_t)); - - free (rec); - } - } - else - { - /* This is no valid semaphore. */ - result = -1; - __set_errno (EINVAL); - } - - /* Release the lock. */ - lll_unlock (__sem_mappings_lock, LLL_PRIVATE); - - return result; -} diff --git a/nptl/sem_destroy.c b/nptl/sem_destroy.c deleted file mode 100644 index 5e3a0d5272..0000000000 --- a/nptl/sem_destroy.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <semaphore.h> -#include <shlib-compat.h> -#include "semaphoreP.h" - - -int -__new_sem_destroy (sem_t *sem) -{ - /* XXX Check for valid parameter. */ - - /* Nothing to do. */ - return 0; -} -versioned_symbol (libpthread, __new_sem_destroy, sem_destroy, GLIBC_2_1); -#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1) -strong_alias (__new_sem_destroy, __old_sem_destroy) -compat_symbol (libpthread, __old_sem_destroy, sem_destroy, GLIBC_2_0); -#endif diff --git a/nptl/sem_getvalue.c b/nptl/sem_getvalue.c deleted file mode 100644 index 8dfc1cde41..0000000000 --- a/nptl/sem_getvalue.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <semaphore.h> -#include <shlib-compat.h> -#include "semaphoreP.h" -#include <atomic.h> - - -int -__new_sem_getvalue (sem_t *sem, int *sval) -{ - struct new_sem *isem = (struct new_sem *) sem; - - /* XXX Check for valid SEM parameter. */ - /* FIXME This uses relaxed MO, even though POSIX specifies that this function - should be linearizable. However, its debatable whether linearizability - is the right requirement. We need to follow up with POSIX and, if - necessary, use a stronger MO here and elsewhere (e.g., potentially - release MO in all places where we consume a token). */ - -#if __HAVE_64B_ATOMICS - *sval = atomic_load_relaxed (&isem->data) & SEM_VALUE_MASK; -#else - *sval = atomic_load_relaxed (&isem->value) >> SEM_VALUE_SHIFT; -#endif - - return 0; -} -versioned_symbol (libpthread, __new_sem_getvalue, sem_getvalue, GLIBC_2_1); -#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1) -int -__old_sem_getvalue (sem_t *sem, int *sval) -{ - struct old_sem *isem = (struct old_sem *) sem; - *sval = isem->value; - return 0; -} -compat_symbol (libpthread, __old_sem_getvalue, sem_getvalue, GLIBC_2_0); -#endif diff --git a/nptl/sem_init.c b/nptl/sem_init.c deleted file mode 100644 index b9b839cd64..0000000000 --- a/nptl/sem_init.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <semaphore.h> -#include <shlib-compat.h> -#include "semaphoreP.h" -#include <kernel-features.h> -#include <futex-internal.h> - - -int -__new_sem_init (sem_t *sem, int pshared, unsigned int value) -{ - /* Parameter sanity check. */ - if (__glibc_unlikely (value > SEM_VALUE_MAX)) - { - __set_errno (EINVAL); - return -1; - } - pshared = pshared != 0 ? PTHREAD_PROCESS_SHARED : PTHREAD_PROCESS_PRIVATE; - int err = futex_supports_pshared (pshared); - if (err != 0) - { - __set_errno (err); - return -1; - } - - /* Map to the internal type. */ - struct new_sem *isem = (struct new_sem *) sem; - - /* Use the values the caller provided. */ -#if __HAVE_64B_ATOMICS - isem->data = value; -#else - isem->value = value << SEM_VALUE_SHIFT; - /* pad is used as a mutex on pre-v9 sparc and ignored otherwise. */ - isem->pad = 0; - isem->nwaiters = 0; -#endif - - isem->private = (pshared == PTHREAD_PROCESS_PRIVATE - ? FUTEX_PRIVATE : FUTEX_SHARED); - - return 0; -} -versioned_symbol (libpthread, __new_sem_init, sem_init, GLIBC_2_1); - - - -#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1) -int -attribute_compat_text_section -__old_sem_init (sem_t *sem, int pshared, unsigned int value) -{ - /* Parameter sanity check. */ - if (__glibc_unlikely (value > SEM_VALUE_MAX)) - { - __set_errno (EINVAL); - return -1; - } - - /* Map to the internal type. */ - struct old_sem *isem = (struct old_sem *) sem; - - /* Use the value the user provided. */ - isem->value = value; - - /* We cannot store the PSHARED attribute. So we always use the - operations needed for shared semaphores. */ - - return 0; -} -compat_symbol (libpthread, __old_sem_init, sem_init, GLIBC_2_0); -#endif diff --git a/nptl/sem_open.c b/nptl/sem_open.c deleted file mode 100644 index a80e5b8e9b..0000000000 --- a/nptl/sem_open.c +++ /dev/null @@ -1,329 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <fcntl.h> -#include <pthread.h> -#include <search.h> -#include <semaphore.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/stat.h> -#include "semaphoreP.h" -#include <shm-directory.h> -#include <futex-internal.h> -#include <libc-lock.h> - -/* Comparison function for search of existing mapping. */ -int -attribute_hidden -__sem_search (const void *a, const void *b) -{ - const struct inuse_sem *as = (const struct inuse_sem *) a; - const struct inuse_sem *bs = (const struct inuse_sem *) b; - - if (as->ino != bs->ino) - /* Cannot return the difference the type is larger than int. */ - return as->ino < bs->ino ? -1 : (as->ino == bs->ino ? 0 : 1); - - if (as->dev != bs->dev) - /* Cannot return the difference the type is larger than int. */ - return as->dev < bs->dev ? -1 : (as->dev == bs->dev ? 0 : 1); - - return strcmp (as->name, bs->name); -} - - -/* The search tree for existing mappings. */ -void *__sem_mappings attribute_hidden; - -/* Lock to protect the search tree. */ -int __sem_mappings_lock attribute_hidden = LLL_LOCK_INITIALIZER; - - -/* Search for existing mapping and if possible add the one provided. */ -static sem_t * -check_add_mapping (const char *name, size_t namelen, int fd, sem_t *existing) -{ - sem_t *result = SEM_FAILED; - - /* Get the information about the file. */ - struct stat64 st; - if (__fxstat64 (_STAT_VER, fd, &st) == 0) - { - /* Get the lock. */ - lll_lock (__sem_mappings_lock, LLL_PRIVATE); - - /* Search for an existing mapping given the information we have. */ - struct inuse_sem *fake; - fake = (struct inuse_sem *) alloca (sizeof (*fake) + namelen); - memcpy (fake->name, name, namelen); - fake->dev = st.st_dev; - fake->ino = st.st_ino; - - struct inuse_sem **foundp = __tfind (fake, &__sem_mappings, - __sem_search); - if (foundp != NULL) - { - /* There is already a mapping. Use it. */ - result = (*foundp)->sem; - ++(*foundp)->refcnt; - } - else - { - /* We haven't found a mapping. Install ione. */ - struct inuse_sem *newp; - - newp = (struct inuse_sem *) malloc (sizeof (*newp) + namelen); - if (newp != NULL) - { - /* If the caller hasn't provided any map it now. */ - if (existing == SEM_FAILED) - existing = (sem_t *) mmap (NULL, sizeof (sem_t), - PROT_READ | PROT_WRITE, MAP_SHARED, - fd, 0); - - newp->dev = st.st_dev; - newp->ino = st.st_ino; - newp->refcnt = 1; - newp->sem = existing; - memcpy (newp->name, name, namelen); - - /* Insert the new value. */ - if (existing != MAP_FAILED - && __tsearch (newp, &__sem_mappings, __sem_search) != NULL) - /* Successful. */ - result = existing; - else - /* Something went wrong while inserting the new - value. We fail completely. */ - free (newp); - } - } - - /* Release the lock. */ - lll_unlock (__sem_mappings_lock, LLL_PRIVATE); - } - - if (result != existing && existing != SEM_FAILED && existing != MAP_FAILED) - { - /* Do not disturb errno. */ - int save = errno; - munmap (existing, sizeof (sem_t)); - errno = save; - } - - return result; -} - - -sem_t * -sem_open (const char *name, int oflag, ...) -{ - int fd; - sem_t *result; - - /* Check that shared futexes are supported. */ - int err = futex_supports_pshared (PTHREAD_PROCESS_SHARED); - if (err != 0) - { - __set_errno (err); - return SEM_FAILED; - } - - /* Create the name of the final file in local variable SHM_NAME. */ - SHM_GET_NAME (EINVAL, SEM_FAILED, SEM_SHM_PREFIX); - - /* Disable asynchronous cancellation. */ -#ifdef __libc_ptf_call - int state; - __libc_ptf_call (__pthread_setcancelstate, - (PTHREAD_CANCEL_DISABLE, &state), 0); -#endif - - /* If the semaphore object has to exist simply open it. */ - if ((oflag & O_CREAT) == 0 || (oflag & O_EXCL) == 0) - { - try_again: - fd = __libc_open (shm_name, - (oflag & ~(O_CREAT|O_ACCMODE)) | O_NOFOLLOW | O_RDWR); - - if (fd == -1) - { - /* If we are supposed to create the file try this next. */ - if ((oflag & O_CREAT) != 0 && errno == ENOENT) - goto try_create; - - /* Return. errno is already set. */ - } - else - /* Check whether we already have this semaphore mapped and - create one if necessary. */ - result = check_add_mapping (name, namelen, fd, SEM_FAILED); - } - else - { - /* We have to open a temporary file first since it must have the - correct form before we can start using it. */ - char *tmpfname; - mode_t mode; - unsigned int value; - va_list ap; - - try_create: - va_start (ap, oflag); - - mode = va_arg (ap, mode_t); - value = va_arg (ap, unsigned int); - - va_end (ap); - - if (value > SEM_VALUE_MAX) - { - __set_errno (EINVAL); - result = SEM_FAILED; - goto out; - } - - /* Create the initial file content. */ - union - { - sem_t initsem; - struct new_sem newsem; - } sem; - -#if __HAVE_64B_ATOMICS - sem.newsem.data = value; -#else - sem.newsem.value = value << SEM_VALUE_SHIFT; - /* pad is used as a mutex on pre-v9 sparc and ignored otherwise. */ - sem.newsem.pad = 0; - sem.newsem.nwaiters = 0; -#endif - /* This always is a shared semaphore. */ - sem.newsem.private = FUTEX_SHARED; - - /* Initialize the remaining bytes as well. */ - memset ((char *) &sem.initsem + sizeof (struct new_sem), '\0', - sizeof (sem_t) - sizeof (struct new_sem)); - - tmpfname = __alloca (shm_dirlen + sizeof SEM_SHM_PREFIX + 6); - char *xxxxxx = __mempcpy (tmpfname, shm_dir, shm_dirlen); - - int retries = 0; -#define NRETRIES 50 - while (1) - { - /* Add the suffix for mktemp. */ - strcpy (xxxxxx, "XXXXXX"); - - /* We really want to use mktemp here. We cannot use mkstemp - since the file must be opened with a specific mode. The - mode cannot later be set since then we cannot apply the - file create mask. */ - if (__mktemp (tmpfname) == NULL) - { - result = SEM_FAILED; - goto out; - } - - /* Open the file. Make sure we do not overwrite anything. */ - fd = __libc_open (tmpfname, O_RDWR | O_CREAT | O_EXCL, mode); - if (fd == -1) - { - if (errno == EEXIST) - { - if (++retries < NRETRIES) - continue; - - __set_errno (EAGAIN); - } - - result = SEM_FAILED; - goto out; - } - - /* We got a file. */ - break; - } - - if (TEMP_FAILURE_RETRY (__libc_write (fd, &sem.initsem, sizeof (sem_t))) - == sizeof (sem_t) - /* Map the sem_t structure from the file. */ - && (result = (sem_t *) mmap (NULL, sizeof (sem_t), - PROT_READ | PROT_WRITE, MAP_SHARED, - fd, 0)) != MAP_FAILED) - { - /* Create the file. Don't overwrite an existing file. */ - if (link (tmpfname, shm_name) != 0) - { - /* Undo the mapping. */ - (void) munmap (result, sizeof (sem_t)); - - /* Reinitialize 'result'. */ - result = SEM_FAILED; - - /* This failed. If O_EXCL is not set and the problem was - that the file exists, try again. */ - if ((oflag & O_EXCL) == 0 && errno == EEXIST) - { - /* Remove the file. */ - (void) unlink (tmpfname); - - /* Close the file. */ - (void) __libc_close (fd); - - goto try_again; - } - } - else - /* Insert the mapping into the search tree. This also - determines whether another thread sneaked by and already - added such a mapping despite the fact that we created it. */ - result = check_add_mapping (name, namelen, fd, result); - } - - /* Now remove the temporary name. This should never fail. If - it fails we leak a file name. Better fix the kernel. */ - (void) unlink (tmpfname); - } - - /* Map the mmap error to the error we need. */ - if (MAP_FAILED != (void *) SEM_FAILED && result == MAP_FAILED) - result = SEM_FAILED; - - /* We don't need the file descriptor anymore. */ - if (fd != -1) - { - /* Do not disturb errno. */ - int save = errno; - __libc_close (fd); - errno = save; - } - -out: -#ifdef __libc_ptf_call - __libc_ptf_call (__pthread_setcancelstate, (state, NULL), 0); -#endif - - return result; -} diff --git a/nptl/sem_post.c b/nptl/sem_post.c deleted file mode 100644 index bb4f851a6b..0000000000 --- a/nptl/sem_post.c +++ /dev/null @@ -1,103 +0,0 @@ -/* sem_post -- post to a POSIX semaphore. Generic futex-using version. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <atomic.h> -#include <errno.h> -#include <sysdep.h> -#include <lowlevellock.h> /* lll_futex* used by the old code. */ -#include <futex-internal.h> -#include <internaltypes.h> -#include <semaphore.h> - -#include <shlib-compat.h> - - -/* See sem_wait for an explanation of the algorithm. */ -int -__new_sem_post (sem_t *sem) -{ - struct new_sem *isem = (struct new_sem *) sem; - int private = isem->private; - -#if __HAVE_64B_ATOMICS - /* Add a token to the semaphore. We use release MO to make sure that a - thread acquiring this token synchronizes with us and other threads that - added tokens before (the release sequence includes atomic RMW operations - by other threads). */ - /* TODO Use atomic_fetch_add to make it scale better than a CAS loop? */ - uint64_t d = atomic_load_relaxed (&isem->data); - do - { - if ((d & SEM_VALUE_MASK) == SEM_VALUE_MAX) - { - __set_errno (EOVERFLOW); - return -1; - } - } - while (!atomic_compare_exchange_weak_release (&isem->data, &d, d + 1)); - - /* If there is any potentially blocked waiter, wake one of them. */ - if ((d >> SEM_NWAITERS_SHIFT) > 0) - futex_wake (((unsigned int *) &isem->data) + SEM_VALUE_OFFSET, 1, private); -#else - /* Add a token to the semaphore. Similar to 64b version. */ - unsigned int v = atomic_load_relaxed (&isem->value); - do - { - if ((v >> SEM_VALUE_SHIFT) == SEM_VALUE_MAX) - { - __set_errno (EOVERFLOW); - return -1; - } - } - while (!atomic_compare_exchange_weak_release - (&isem->value, &v, v + (1 << SEM_VALUE_SHIFT))); - - /* If there is any potentially blocked waiter, wake one of them. */ - if ((v & SEM_NWAITERS_MASK) != 0) - futex_wake (&isem->value, 1, private); -#endif - - return 0; -} -versioned_symbol (libpthread, __new_sem_post, sem_post, GLIBC_2_1); - - -#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_1) -int -attribute_compat_text_section -__old_sem_post (sem_t *sem) -{ - int *futex = (int *) sem; - - /* We must need to synchronize with consumers of this token, so the atomic - increment must have release MO semantics. */ - atomic_write_barrier (); - (void) atomic_increment_val (futex); - /* We always have to assume it is a shared semaphore. */ - int err = lll_futex_wake (futex, 1, LLL_SHARED); - if (__builtin_expect (err, 0) < 0) - { - __set_errno (-err); - return -1; - } - return 0; -} -compat_symbol (libpthread, __old_sem_post, sem_post, GLIBC_2_0); -#endif diff --git a/nptl/sem_timedwait.c b/nptl/sem_timedwait.c deleted file mode 100644 index 22b0778cc2..0000000000 --- a/nptl/sem_timedwait.c +++ /dev/null @@ -1,40 +0,0 @@ -/* sem_timedwait -- wait on a semaphore with timeout. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include "sem_waitcommon.c" - -/* This is in a separate file because because sem_timedwait is only provided - if __USE_XOPEN2K is defined. */ -int -sem_timedwait (sem_t *sem, const struct timespec *abstime) -{ - if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000) - { - __set_errno (EINVAL); - return -1; - } - - /* Check sem_wait.c for a more detailed explanation why it is required. */ - __pthread_testcancel (); - - if (__new_sem_wait_fast ((struct new_sem *) sem, 0) == 0) - return 0; - else - return __new_sem_wait_slow((struct new_sem *) sem, abstime); -} diff --git a/nptl/sem_unlink.c b/nptl/sem_unlink.c deleted file mode 100644 index 2ab38ab086..0000000000 --- a/nptl/sem_unlink.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <semaphore.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include "semaphoreP.h" -#include <shm-directory.h> - -int -sem_unlink (const char *name) -{ - /* Construct the filename. */ - SHM_GET_NAME (ENOENT, -1, SEM_SHM_PREFIX); - - /* Now try removing it. */ - int ret = unlink (shm_name); - if (ret < 0 && errno == EPERM) - __set_errno (EACCES); - return ret; -} diff --git a/nptl/sem_wait.c b/nptl/sem_wait.c deleted file mode 100644 index 625bf08c83..0000000000 --- a/nptl/sem_wait.c +++ /dev/null @@ -1,106 +0,0 @@ -/* sem_wait -- wait on a semaphore. Generic futex-using version. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <lowlevellock.h> /* lll_futex* used by the old code. */ -#include "sem_waitcommon.c" - -int -__new_sem_wait (sem_t *sem) -{ - /* We need to check whether we need to act upon a cancellation request here - because POSIX specifies that cancellation points "shall occur" in - sem_wait and sem_timedwait, which also means that they need to check - this regardless whether they block or not (unlike "may occur" - functions). See the POSIX Rationale for this requirement: Section - "Thread Cancellation Overview" [1] and austin group issue #1076 [2] - for thoughs on why this may be a suboptimal design. - - [1] http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xsh_chap02.html - [2] http://austingroupbugs.net/view.php?id=1076 for thoughts on why this - */ - __pthread_testcancel (); - - if (__new_sem_wait_fast ((struct new_sem *) sem, 0) == 0) - return 0; - else - return __new_sem_wait_slow((struct new_sem *) sem, NULL); -} -versioned_symbol (libpthread, __new_sem_wait, sem_wait, GLIBC_2_1); - -#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_1) -int -attribute_compat_text_section -__old_sem_wait (sem_t *sem) -{ - int *futex = (int *) sem; - int err; - - do - { - if (atomic_decrement_if_positive (futex) > 0) - return 0; - - /* Enable asynchronous cancellation. Required by the standard. */ - int oldtype = __pthread_enable_asynccancel (); - - /* Always assume the semaphore is shared. */ - err = lll_futex_wait (futex, 0, LLL_SHARED); - - /* Disable asynchronous cancellation. */ - __pthread_disable_asynccancel (oldtype); - } - while (err == 0 || err == -EWOULDBLOCK); - - __set_errno (-err); - return -1; -} - -compat_symbol (libpthread, __old_sem_wait, sem_wait, GLIBC_2_0); -#endif - -int -__new_sem_trywait (sem_t *sem) -{ - /* We must not fail spuriously, so require a definitive result even if this - may lead to a long execution time. */ - if (__new_sem_wait_fast ((struct new_sem *) sem, 1) == 0) - return 0; - __set_errno (EAGAIN); - return -1; -} -versioned_symbol (libpthread, __new_sem_trywait, sem_trywait, GLIBC_2_1); -#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_1) -int -__old_sem_trywait (sem_t *sem) -{ - int *futex = (int *) sem; - int val; - - if (*futex > 0) - { - val = atomic_decrement_if_positive (futex); - if (val > 0) - return 0; - } - - __set_errno (EAGAIN); - return -1; -} -compat_symbol (libpthread, __old_sem_trywait, sem_trywait, GLIBC_2_0); -#endif diff --git a/nptl/sem_waitcommon.c b/nptl/sem_waitcommon.c deleted file mode 100644 index a3412a0d35..0000000000 --- a/nptl/sem_waitcommon.c +++ /dev/null @@ -1,356 +0,0 @@ -/* sem_waitcommon -- wait on a semaphore, shared code. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <kernel-features.h> -#include <errno.h> -#include <sysdep.h> -#include <futex-internal.h> -#include <internaltypes.h> -#include <semaphore.h> -#include <sys/time.h> - -#include <pthreadP.h> -#include <shlib-compat.h> -#include <atomic.h> - - -/* The semaphore provides two main operations: sem_post adds a token to the - semaphore; sem_wait grabs a token from the semaphore, potentially waiting - until there is a token available. A sem_wait needs to synchronize with - the sem_post that provided the token, so that whatever lead to the sem_post - happens before the code after sem_wait. - - Conceptually, available tokens can simply be counted; let's call that the - value of the semaphore. However, we also want to know whether there might - be a sem_wait that is blocked on the value because it was zero (using a - futex with the value being the futex variable); if there is no blocked - sem_wait, sem_post does not need to execute a futex_wake call. Therefore, - we also need to count the number of potentially blocked sem_wait calls - (which we call nwaiters). - - What makes this tricky is that POSIX requires that a semaphore can be - destroyed as soon as the last remaining sem_wait has returned, and no - other sem_wait or sem_post calls are executing concurrently. However, the - sem_post call whose token was consumed by the last sem_wait is considered - to have finished once it provided the token to the sem_wait. - Thus, sem_post must not access the semaphore struct anymore after it has - made a token available; IOW, it needs to be able to atomically provide - a token and check whether any blocked sem_wait calls might exist. - - This is straightforward to do if the architecture provides 64b atomics - because we can just put both the value and nwaiters into one variable that - we access atomically: This is the data field, the value is in the - least-significant 32 bits, and nwaiters in the other bits. When sem_post - makes a value available, it can atomically check nwaiters. - - If we have only 32b atomics available, we cannot put both nwaiters and - value into one 32b value because then we might have too few bits for both - of those counters. Therefore, we need to use two distinct fields. - - To allow sem_post to atomically make a token available and check for - blocked sem_wait calls, we use one bit in value to indicate whether - nwaiters is nonzero. That allows sem_post to use basically the same - algorithm as with 64b atomics, but requires sem_wait to update the bit; it - can't do this atomically with another access to nwaiters, but it can compute - a conservative value for the bit because it's benign if the bit is set - even if nwaiters is zero (all we get is an unnecessary futex wake call by - sem_post). - Specifically, sem_wait will unset the bit speculatively if it believes that - there is no other concurrently executing sem_wait. If it misspeculated, - it will have to clean up by waking any other sem_wait call (i.e., what - sem_post would do otherwise). This does not conflict with the destruction - requirement because the semaphore must not be destructed while any sem_wait - is still executing. */ - -#if !__HAVE_64B_ATOMICS -static void -__sem_wait_32_finish (struct new_sem *sem); -#endif - -static void -__sem_wait_cleanup (void *arg) -{ - struct new_sem *sem = (struct new_sem *) arg; - -#if __HAVE_64B_ATOMICS - /* Stop being registered as a waiter. See below for MO. */ - atomic_fetch_add_relaxed (&sem->data, -((uint64_t) 1 << SEM_NWAITERS_SHIFT)); -#else - __sem_wait_32_finish (sem); -#endif -} - -/* Wait until at least one token is available, possibly with a timeout. - This is in a separate function in order to make sure gcc - puts the call site into an exception region, and thus the - cleanups get properly run. TODO still necessary? Other futex_wait - users don't seem to need it. */ -static int -__attribute__ ((noinline)) -do_futex_wait (struct new_sem *sem, const struct timespec *abstime) -{ - int err; - -#if __HAVE_64B_ATOMICS - err = futex_abstimed_wait_cancelable ( - (unsigned int *) &sem->data + SEM_VALUE_OFFSET, 0, abstime, - sem->private); -#else - err = futex_abstimed_wait_cancelable (&sem->value, SEM_NWAITERS_MASK, - abstime, sem->private); -#endif - - return err; -} - -/* Fast path: Try to grab a token without blocking. */ -static int -__new_sem_wait_fast (struct new_sem *sem, int definitive_result) -{ - /* We need acquire MO if we actually grab a token, so that this - synchronizes with all token providers (i.e., the RMW operation we read - from or all those before it in modification order; also see sem_post). - We do not need to guarantee any ordering if we observed that there is - no token (POSIX leaves it unspecified whether functions that fail - synchronize memory); thus, relaxed MO is sufficient for the initial load - and the failure path of the CAS. If the weak CAS fails and we need a - definitive result, retry. */ -#if __HAVE_64B_ATOMICS - uint64_t d = atomic_load_relaxed (&sem->data); - do - { - if ((d & SEM_VALUE_MASK) == 0) - break; - if (atomic_compare_exchange_weak_acquire (&sem->data, &d, d - 1)) - return 0; - } - while (definitive_result); - return -1; -#else - unsigned int v = atomic_load_relaxed (&sem->value); - do - { - if ((v >> SEM_VALUE_SHIFT) == 0) - break; - if (atomic_compare_exchange_weak_acquire (&sem->value, - &v, v - (1 << SEM_VALUE_SHIFT))) - return 0; - } - while (definitive_result); - return -1; -#endif -} - -/* Slow path that blocks. */ -static int -__attribute__ ((noinline)) -__new_sem_wait_slow (struct new_sem *sem, const struct timespec *abstime) -{ - int err = 0; - -#if __HAVE_64B_ATOMICS - /* Add a waiter. Relaxed MO is sufficient because we can rely on the - ordering provided by the RMW operations we use. */ - uint64_t d = atomic_fetch_add_relaxed (&sem->data, - (uint64_t) 1 << SEM_NWAITERS_SHIFT); - - pthread_cleanup_push (__sem_wait_cleanup, sem); - - /* Wait for a token to be available. Retry until we can grab one. */ - for (;;) - { - /* If there is no token available, sleep until there is. */ - if ((d & SEM_VALUE_MASK) == 0) - { - err = do_futex_wait (sem, abstime); - /* A futex return value of 0 or EAGAIN is due to a real or spurious - wake-up, or due to a change in the number of tokens. We retry in - these cases. - If we timed out, forward this to the caller. - EINTR is returned if we are interrupted by a signal; we - forward this to the caller. (See futex_wait and related - documentation. Before Linux 2.6.22, EINTR was also returned on - spurious wake-ups; we only support more recent Linux versions, - so do not need to consider this here.) */ - if (err == ETIMEDOUT || err == EINTR) - { - __set_errno (err); - err = -1; - /* Stop being registered as a waiter. */ - atomic_fetch_add_relaxed (&sem->data, - -((uint64_t) 1 << SEM_NWAITERS_SHIFT)); - break; - } - /* Relaxed MO is sufficient; see below. */ - d = atomic_load_relaxed (&sem->data); - } - else - { - /* Try to grab both a token and stop being a waiter. We need - acquire MO so this synchronizes with all token providers (i.e., - the RMW operation we read from or all those before it in - modification order; also see sem_post). On the failure path, - relaxed MO is sufficient because we only eventually need the - up-to-date value; the futex_wait or the CAS perform the real - work. */ - if (atomic_compare_exchange_weak_acquire (&sem->data, - &d, d - 1 - ((uint64_t) 1 << SEM_NWAITERS_SHIFT))) - { - err = 0; - break; - } - } - } - - pthread_cleanup_pop (0); -#else - /* The main difference to the 64b-atomics implementation is that we need to - access value and nwaiters in separate steps, and that the nwaiters bit - in the value can temporarily not be set even if nwaiters is nonzero. - We work around incorrectly unsetting the nwaiters bit by letting sem_wait - set the bit again and waking the number of waiters that could grab a - token. There are two additional properties we need to ensure: - (1) We make sure that whenever unsetting the bit, we see the increment of - nwaiters by the other thread that set the bit. IOW, we will notice if - we make a mistake. - (2) When setting the nwaiters bit, we make sure that we see the unsetting - of the bit by another waiter that happened before us. This avoids having - to blindly set the bit whenever we need to block on it. We set/unset - the bit while having incremented nwaiters (i.e., are a registered - waiter), and the problematic case only happens when one waiter indeed - followed another (i.e., nwaiters was never larger than 1); thus, this - works similarly as with a critical section using nwaiters (see the MOs - and related comments below). - - An alternative approach would be to unset the bit after decrementing - nwaiters; however, that would result in needing Dekker-like - synchronization and thus full memory barriers. We also would not be able - to prevent misspeculation, so this alternative scheme does not seem - beneficial. */ - unsigned int v; - - /* Add a waiter. We need acquire MO so this synchronizes with the release - MO we use when decrementing nwaiters below; it ensures that if another - waiter unset the bit before us, we see that and set it again. Also see - property (2) above. */ - atomic_fetch_add_acquire (&sem->nwaiters, 1); - - pthread_cleanup_push (__sem_wait_cleanup, sem); - - /* Wait for a token to be available. Retry until we can grab one. */ - /* We do not need any ordering wrt. to this load's reads-from, so relaxed - MO is sufficient. The acquire MO above ensures that in the problematic - case, we do see the unsetting of the bit by another waiter. */ - v = atomic_load_relaxed (&sem->value); - do - { - do - { - /* We are about to block, so make sure that the nwaiters bit is - set. We need release MO on the CAS to ensure that when another - waiter unsets the nwaiters bit, it will also observe that we - incremented nwaiters in the meantime (also see the unsetting of - the bit below). Relaxed MO on CAS failure is sufficient (see - above). */ - do - { - if ((v & SEM_NWAITERS_MASK) != 0) - break; - } - while (!atomic_compare_exchange_weak_release (&sem->value, - &v, v | SEM_NWAITERS_MASK)); - /* If there is no token, wait. */ - if ((v >> SEM_VALUE_SHIFT) == 0) - { - /* See __HAVE_64B_ATOMICS variant. */ - err = do_futex_wait(sem, abstime); - if (err == ETIMEDOUT || err == EINTR) - { - __set_errno (err); - err = -1; - goto error; - } - err = 0; - /* We blocked, so there might be a token now. Relaxed MO is - sufficient (see above). */ - v = atomic_load_relaxed (&sem->value); - } - } - /* If there is no token, we must not try to grab one. */ - while ((v >> SEM_VALUE_SHIFT) == 0); - } - /* Try to grab a token. We need acquire MO so this synchronizes with - all token providers (i.e., the RMW operation we read from or all those - before it in modification order; also see sem_post). */ - while (!atomic_compare_exchange_weak_acquire (&sem->value, - &v, v - (1 << SEM_VALUE_SHIFT))); - -error: - pthread_cleanup_pop (0); - - __sem_wait_32_finish (sem); -#endif - - return err; -} - -/* Stop being a registered waiter (non-64b-atomics code only). */ -#if !__HAVE_64B_ATOMICS -static void -__sem_wait_32_finish (struct new_sem *sem) -{ - /* The nwaiters bit is still set, try to unset it now if this seems - necessary. We do this before decrementing nwaiters so that the unsetting - is visible to other waiters entering after us. Relaxed MO is sufficient - because we are just speculating here; a stronger MO would not prevent - misspeculation. */ - unsigned int wguess = atomic_load_relaxed (&sem->nwaiters); - if (wguess == 1) - /* We might be the last waiter, so unset. This needs acquire MO so that - it syncronizes with the release MO when setting the bit above; if we - overwrite someone else that set the bit, we'll read in the following - decrement of nwaiters at least from that release sequence, so we'll - see if the other waiter is still active or if another writer entered - in the meantime (i.e., using the check below). */ - atomic_fetch_and_acquire (&sem->value, ~SEM_NWAITERS_MASK); - - /* Now stop being a waiter, and see whether our guess was correct. - This needs release MO so that it synchronizes with the acquire MO when - a waiter increments nwaiters; this makes sure that newer writers see that - we reset the waiters_present bit. */ - unsigned int wfinal = atomic_fetch_add_release (&sem->nwaiters, -1); - if (wfinal > 1 && wguess == 1) - { - /* We guessed wrong, and so need to clean up after the mistake and - unblock any waiters that could have not been woken. There is no - additional ordering that we need to set up, so relaxed MO is - sufficient. */ - unsigned int v = atomic_fetch_or_relaxed (&sem->value, - SEM_NWAITERS_MASK); - /* If there are available tokens, then wake as many waiters. If there - aren't any, then there is no need to wake anyone because there is - none to grab for another waiter. If tokens become available - subsequently, then the respective sem_post calls will do the wake-up - due to us having set the nwaiters bit again. */ - v >>= SEM_VALUE_SHIFT; - if (v > 0) - futex_wake (&sem->value, v, sem->private); - } -} -#endif diff --git a/nptl/semaphoreP.h b/nptl/semaphoreP.h deleted file mode 100644 index 1bdaeabdfa..0000000000 --- a/nptl/semaphoreP.h +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <semaphore.h> -#include "pthreadP.h" - -#define SEM_SHM_PREFIX "sem." - -/* Keeping track of currently used mappings. */ -struct inuse_sem -{ - dev_t dev; - ino_t ino; - int refcnt; - sem_t *sem; - char name[0]; -}; - - -/* The search tree for existing mappings. */ -extern void *__sem_mappings attribute_hidden; - -/* Lock to protect the search tree. */ -extern int __sem_mappings_lock attribute_hidden; - - -/* Comparison function for search in tree with existing mappings. */ -extern int __sem_search (const void *a, const void *b) attribute_hidden; - - -/* Prototypes of functions with multiple interfaces. */ -extern int __new_sem_init (sem_t *sem, int pshared, unsigned int value); -extern int __old_sem_init (sem_t *sem, int pshared, unsigned int value); -extern int __new_sem_destroy (sem_t *sem); -extern int __new_sem_post (sem_t *sem); -extern int __new_sem_wait (sem_t *sem); -extern int __old_sem_wait (sem_t *sem); -extern int __new_sem_trywait (sem_t *sem); -extern int __new_sem_getvalue (sem_t *sem, int *sval); diff --git a/nptl/shlib-versions b/nptl/shlib-versions deleted file mode 100644 index e08931af1a..0000000000 --- a/nptl/shlib-versions +++ /dev/null @@ -1 +0,0 @@ -libpthread=0 diff --git a/nptl/sigaction.c b/nptl/sigaction.c deleted file mode 100644 index 2994fd57e3..0000000000 --- a/nptl/sigaction.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - - -/* This is no complete implementation. The file is meant to be - included in the real implementation to provide the wrapper around - __libc_sigaction. */ - -#include <nptl/pthreadP.h> - -/* We use the libc implementation but we tell it to not allow - SIGCANCEL or SIGTIMER to be handled. */ -#define LIBC_SIGACTION 1 - - -int -__sigaction (int sig, const struct sigaction *act, struct sigaction *oact) -{ - if (__glibc_unlikely (sig == SIGCANCEL || sig == SIGSETXID)) - { - __set_errno (EINVAL); - return -1; - } - - return __libc_sigaction (sig, act, oact); -} -libc_hidden_weak (__sigaction) -weak_alias (__sigaction, sigaction) diff --git a/nptl/smp.h b/nptl/smp.h deleted file mode 100644 index d303a8e3ef..0000000000 --- a/nptl/smp.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Determine whether the host has multiple processors. Stub version. - Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -/* Test whether the machine has more than one processor. This is not the - best test but good enough. More complicated tests would require `malloc' - which is not available at that time. */ -static inline int -is_smp_system (void) -{ - /* Assume all machines are SMP and/or CMT and/or SMT. */ - return 1; -} diff --git a/nptl/sockperf.c b/nptl/sockperf.c deleted file mode 100644 index 2d4b872740..0000000000 --- a/nptl/sockperf.c +++ /dev/null @@ -1,593 +0,0 @@ -#define _GNU_SOURCE -#include <argp.h> -#include <complex.h> -#include <errno.h> -#include <error.h> -#include <fcntl.h> -#include <gd.h> -#include <inttypes.h> -#include <pthread.h> -#include <signal.h> -#include <stdbool.h> -#include <stddef.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <unistd.h> -#include <sys/param.h> -#include <sys/poll.h> -#include <sys/socket.h> -#include <sys/un.h> - - -#define size_x 320 -#define size_y 240 - - -#define PATH "/tmp/s.sockperf" - - -struct thread_param -{ - unsigned int from; - unsigned int to; - unsigned int nserv; -}; - -struct coord -{ - unsigned int x; - unsigned int y; - complex double z; -}; - - -/* We use 64bit values for the times. */ -typedef unsigned long long int hp_timing_t; - - -static unsigned int nclients = 2; -static unsigned int nservers = 2; - -static bool timing; -static int points; - - -static complex double top_left = -0.7 + 0.2i; -static complex double bottom_right = -0.5 - 0.0i; - - -static int colors[256]; -static gdImagePtr image; -static pthread_mutex_t image_lock; - -static int sock; - - -static void * -client (void *arg) -{ - struct thread_param *param = arg; - unsigned int cnt; - unsigned int nserv = param->nserv; - struct pollfd servpoll[nserv]; - struct sockaddr_un servaddr; - socklen_t servlen; - struct coord c; - - bool new_coord (void) - { - if (cnt >= param->to) - return false; - - unsigned int row = cnt / size_x; - unsigned int col = cnt % size_x; - - c.x = col; - c.y = row; - c.z = (top_left - + ((col - * (creal (bottom_right) - creal (top_left))) / size_x) - + (_Complex_I * (row * (cimag (bottom_right) - cimag (top_left))) - / size_y)); - - ++cnt; - - return true; - } - - - for (cnt = 0; cnt < nserv; ++cnt) - { - servpoll[cnt].fd = socket (AF_UNIX, SOCK_STREAM, 0); - if (servpoll[cnt].fd < 0) - { - puts ("cannot create socket in client"); - return NULL; - } - - memset (&servaddr, '\0', sizeof (servaddr)); - servaddr.sun_family = AF_UNIX; - strncpy (servaddr.sun_path, PATH, sizeof (servaddr.sun_path)); - servlen = offsetof (struct sockaddr_un, sun_path) + strlen (PATH) + 1; - - - int err; - while (1) - { - err = TEMP_FAILURE_RETRY (connect (servpoll[cnt].fd, &servaddr, - servlen)); - if (err != -1 || errno != ECONNREFUSED) - break; - - pthread_yield (); - } - - if (err == -1) - { - printf ("cannot connect: %m (%d)\n", errno); - exit (1); - } - - servpoll[cnt].events = POLLOUT; - servpoll[cnt].revents = 0; - } - - cnt = param->from; - - new_coord (); - bool z_valid = true; - - while (1) - { - int i; - int n = poll (servpoll, nserv, -1); - if (n == -1) - { - puts ("poll returned error"); - break; - } - - bool cont = false; - for (i = 0; i < nserv && n > 0; ++i) - if (servpoll[i].revents != 0) - { - if (servpoll[i].revents == POLLIN) - { - unsigned int vals[3]; - if (TEMP_FAILURE_RETRY (read (servpoll[i].fd, &vals, - sizeof (vals))) - != sizeof (vals)) - { - puts ("read error in client"); - return NULL; - } - - pthread_mutex_lock (&image_lock); - - gdImageSetPixel (image, vals[0], vals[1], vals[2]); - ++points; - - pthread_mutex_unlock (&image_lock); - - servpoll[i].events = POLLOUT; - } - else - { - if (servpoll[i].revents != POLLOUT) - printf ("revents: %hd != POLLOUT ???\n", - servpoll[i].revents); - - if (z_valid) - { - if (TEMP_FAILURE_RETRY (write (servpoll[i].fd, &c, - sizeof (c))) != sizeof (c)) - { - puts ("write error in client"); - return NULL; - } - cont = true; - servpoll[i].events = POLLIN; - - z_valid = new_coord (); - if (! z_valid) - /* No more to do. Clear the event fields. */ - for (i = 0; i < nserv; ++i) - if (servpoll[i].events == POLLOUT) - servpoll[i].events = servpoll[i].revents = 0; - } - else - servpoll[i].events = servpoll[i].revents = 0; - } - - --n; - } - else if (servpoll[i].events != 0) - cont = true; - - if (! cont && ! z_valid) - break; - } - - c.x = 0xffffffff; - c.y = 0xffffffff; - for (cnt = 0; cnt < nserv; ++cnt) - { - TEMP_FAILURE_RETRY (write (servpoll[cnt].fd, &c, sizeof (c))); - close (servpoll[cnt].fd); - } - - return NULL; -} - - -static void * -server (void *arg) -{ - struct sockaddr_un cliaddr; - socklen_t clilen; - int clisock = TEMP_FAILURE_RETRY (accept (sock, &cliaddr, &clilen)); - - if (clisock == -1) - { - puts ("accept failed"); - return NULL; - } - - while (1) - { - struct coord c; - - if (TEMP_FAILURE_RETRY (read (clisock, &c, sizeof (c))) != sizeof (c)) - { - printf ("server read failed: %m (%d)\n", errno); - break; - } - - if (c.x == 0xffffffff && c.y == 0xffffffff) - break; - - unsigned int rnds = 0; - complex double z = c.z; - while (cabs (z) < 4.0) - { - z = z * z - 1; - if (++rnds == 255) - break; - } - - unsigned int vals[3] = { c.x, c.y, rnds }; - if (TEMP_FAILURE_RETRY (write (clisock, vals, sizeof (vals))) - != sizeof (vals)) - { - puts ("server write error"); - return NULL; - } - } - - close (clisock); - - return NULL; -} - - -static const char *outfilename = "test.png"; - - -static const struct argp_option options[] = - { - { "clients", 'c', "NUMBER", 0, "Number of client threads" }, - { "servers", 's', "NUMBER", 0, "Number of server threads per client" }, - { "timing", 'T', NULL, 0, - "Measure time from startup to the last thread finishing" }, - { NULL, 0, NULL, 0, NULL } - }; - -/* Prototype for option handler. */ -static error_t parse_opt (int key, char *arg, struct argp_state *state); - -/* Data structure to communicate with argp functions. */ -static struct argp argp = -{ - options, parse_opt -}; - - -int -main (int argc, char *argv[]) -{ - int cnt; - FILE *outfile; - struct sockaddr_un servaddr; - socklen_t servlen; - int remaining; - - /* Parse and process arguments. */ - argp_parse (&argp, argc, argv, 0, &remaining, NULL); - - - pthread_t servth[nservers * nclients]; - pthread_t clntth[nclients]; - struct thread_param clntparam[nclients]; - - - image = gdImageCreate (size_x, size_y); - if (image == NULL) - { - puts ("gdImageCreate failed"); - return 1; - } - - for (cnt = 0; cnt < 255; ++cnt) - colors[cnt] = gdImageColorAllocate (image, 256 - cnt, 256 - cnt, - 256 - cnt); - /* Black. */ - colors[cnt] = gdImageColorAllocate (image, 0, 0, 0); - - - sock = socket (AF_UNIX, SOCK_STREAM, 0); - if (sock < 0) - error (EXIT_FAILURE, errno, "cannot create socket"); - - memset (&servaddr, '\0', sizeof (servaddr)); - servaddr.sun_family = AF_UNIX; - strncpy (servaddr.sun_path, PATH, sizeof (servaddr.sun_path)); - servlen = offsetof (struct sockaddr_un, sun_path) + strlen (PATH) + 1; - - if (bind (sock, &servaddr, servlen) == -1) - error (EXIT_FAILURE, errno, "bind failed"); - - listen (sock, SOMAXCONN); - - pthread_mutex_init (&image_lock, NULL); - - - struct sigaction sa; - sa.sa_handler = SIG_IGN; - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - - clockid_t cl; - struct timespec start_time; - if (timing) - { - if (clock_getcpuclockid (0, &cl) != 0 - || clock_gettime (cl, &start_time) != 0) - timing = false; - } - - /* Start the servers. */ - for (cnt = 0; cnt < nservers * nclients; ++cnt) - { - if (pthread_create (&servth[cnt], NULL, server, NULL) != 0) - { - puts ("pthread_create for server failed"); - exit (1); - } - } - - for (cnt = 0; cnt < nclients; ++cnt) - { - clntparam[cnt].from = cnt * (size_x * size_y) / nclients; - clntparam[cnt].to = MIN ((cnt + 1) * (size_x * size_y) / nclients, - size_x * size_y); - clntparam[cnt].nserv = nservers; - - if (pthread_create (&clntth[cnt], NULL, client, &clntparam[cnt]) != 0) - { - puts ("pthread_create for client failed"); - exit (1); - } - } - - - /* Wait for the clients. */ - for (cnt = 0; cnt < nclients; ++cnt) - if (pthread_join (clntth[cnt], NULL) != 0) - { - puts ("client pthread_join failed"); - exit (1); - } - - /* Wait for the servers. */ - for (cnt = 0; cnt < nclients * nservers; ++cnt) - if (pthread_join (servth[cnt], NULL) != 0) - { - puts ("server pthread_join failed"); - exit (1); - } - - - if (timing) - { - struct timespec end_time; - - if (clock_gettime (cl, &end_time) == 0) - { - end_time.tv_sec -= start_time.tv_sec; - end_time.tv_nsec -= start_time.tv_nsec; - if (end_time.tv_nsec < 0) - { - end_time.tv_nsec += 1000000000; - --end_time.tv_sec; - } - - printf ("\nRuntime: %lu.%09lu seconds\n%d points computed\n", - (unsigned long int) end_time.tv_sec, - (unsigned long int) end_time.tv_nsec, - points); - } - } - - - outfile = fopen (outfilename, "w"); - if (outfile == NULL) - error (EXIT_FAILURE, errno, "cannot open output file '%s'", outfilename); - - gdImagePng (image, outfile); - - fclose (outfile); - - unlink (PATH); - - return 0; -} - - -/* Handle program arguments. */ -static error_t -parse_opt (int key, char *arg, struct argp_state *state) -{ - switch (key) - { - case 'c': - nclients = strtoul (arg, NULL, 0); - break; - - case 's': - nservers = strtoul (arg, NULL, 0); - break; - - case 'T': - timing = true; - break; - - default: - return ARGP_ERR_UNKNOWN; - } - - return 0; -} - - -static hp_timing_t -get_clockfreq (void) -{ - /* We read the information from the /proc filesystem. It contains at - least one line like - cpu MHz : 497.840237 - or also - cpu MHz : 497.841 - We search for this line and convert the number in an integer. */ - static hp_timing_t result; - int fd; - - /* If this function was called before, we know the result. */ - if (result != 0) - return result; - - fd = open ("/proc/cpuinfo", O_RDONLY); - if (__glibc_likely (fd != -1)) - { - /* XXX AFAIK the /proc filesystem can generate "files" only up - to a size of 4096 bytes. */ - char buf[4096]; - ssize_t n; - - n = read (fd, buf, sizeof buf); - if (__builtin_expect (n, 1) > 0) - { - char *mhz = memmem (buf, n, "cpu MHz", 7); - - if (__glibc_likely (mhz != NULL)) - { - char *endp = buf + n; - int seen_decpoint = 0; - int ndigits = 0; - - /* Search for the beginning of the string. */ - while (mhz < endp && (*mhz < '0' || *mhz > '9') && *mhz != '\n') - ++mhz; - - while (mhz < endp && *mhz != '\n') - { - if (*mhz >= '0' && *mhz <= '9') - { - result *= 10; - result += *mhz - '0'; - if (seen_decpoint) - ++ndigits; - } - else if (*mhz == '.') - seen_decpoint = 1; - - ++mhz; - } - - /* Compensate for missing digits at the end. */ - while (ndigits++ < 6) - result *= 10; - } - } - - close (fd); - } - - return result; -} - - -int -clock_getcpuclockid (pid_t pid, clockid_t *clock_id) -{ - /* We don't allow any process ID but our own. */ - if (pid != 0 && pid != getpid ()) - return EPERM; - -#ifdef CLOCK_PROCESS_CPUTIME_ID - /* Store the number. */ - *clock_id = CLOCK_PROCESS_CPUTIME_ID; - - return 0; -#else - /* We don't have a timer for that. */ - return ENOENT; -#endif -} - - -#define HP_TIMING_NOW(Var) __asm__ __volatile__ ("rdtsc" : "=A" (Var)) - -/* Get current value of CLOCK and store it in TP. */ -int -clock_gettime (clockid_t clock_id, struct timespec *tp) -{ - int retval = -1; - - switch (clock_id) - { - case CLOCK_PROCESS_CPUTIME_ID: - { - - static hp_timing_t freq; - hp_timing_t tsc; - - /* Get the current counter. */ - HP_TIMING_NOW (tsc); - - if (freq == 0) - { - freq = get_clockfreq (); - if (freq == 0) - return EINVAL; - } - - /* Compute the seconds. */ - tp->tv_sec = tsc / freq; - - /* And the nanoseconds. This computation should be stable until - we get machines with about 16GHz frequency. */ - tp->tv_nsec = ((tsc % freq) * UINT64_C (1000000000)) / freq; - - retval = 0; - } - break; - - default: - errno = EINVAL; - break; - } - - return retval; -} diff --git a/nptl/stack-aliasing.h b/nptl/stack-aliasing.h deleted file mode 100644 index 73ee4ded3d..0000000000 --- a/nptl/stack-aliasing.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Define macros for stack address aliasing issues for NPTL. Stub version. - Copyright (C) 2014-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* This is a number of bytes that is an alignment that should be avoided - when choosing the exact size of a new thread's stack. If the size - chosen is aligned to this, an extra page will be added to render the - size off-aligned. */ -#define MULTI_PAGE_ALIASING 0 diff --git a/nptl/test-cond-printers.c b/nptl/test-cond-printers.c deleted file mode 100644 index 41e4ac8595..0000000000 --- a/nptl/test-cond-printers.c +++ /dev/null @@ -1,57 +0,0 @@ -/* Helper program for testing the pthread_cond_t pretty printer. - - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* Keep the calls to the pthread_* functions on separate lines to make it easy - to advance through the program using the gdb 'next' command. */ - -#include <time.h> -#include <pthread.h> - -#define PASS 0 -#define FAIL 1 - -static int test_status_destroyed (pthread_cond_t *condvar); - -int -main (void) -{ - pthread_cond_t condvar; - pthread_condattr_t attr; - int result = FAIL; - - if (pthread_condattr_init (&attr) == 0 - && test_status_destroyed (&condvar) == PASS) - result = PASS; - /* Else, one of the pthread_cond* functions failed. */ - - return result; -} - -/* Initializes CONDVAR, then destroys it. */ -static int -test_status_destroyed (pthread_cond_t *condvar) -{ - int result = FAIL; - - if (pthread_cond_init (condvar, NULL) == 0 - && pthread_cond_destroy (condvar) == 0) - result = PASS; /* Test status (destroyed). */ - - return result; -} diff --git a/nptl/test-cond-printers.py b/nptl/test-cond-printers.py deleted file mode 100644 index d496b2b9b9..0000000000 --- a/nptl/test-cond-printers.py +++ /dev/null @@ -1,50 +0,0 @@ -# Common tests for the ConditionVariablePrinter class. -# -# Copyright (C) 2016-2017 Free Software Foundation, Inc. -# This file is part of the GNU C Library. -# -# The GNU C Library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# The GNU C Library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with the GNU C Library; if not, see -# <http://www.gnu.org/licenses/>. - -import sys - -from test_printers_common import * - -test_source = sys.argv[1] -test_bin = sys.argv[2] -printer_files = sys.argv[3:] -printer_names = ['global glibc-pthread-locks'] - -try: - init_test(test_bin, printer_files, printer_names) - go_to_main() - - var = 'condvar' - to_string = 'pthread_cond_t' - - break_at(test_source, 'Test status (destroyed)') - continue_cmd() # Go to test_status_destroyed - test_printer(var, to_string, {'Threads known to still execute a wait function': '0'}) - - continue_cmd() # Exit - -except (NoLineError, pexpect.TIMEOUT) as exception: - print('Error: {0}'.format(exception)) - result = FAIL - -else: - print('Test succeeded.') - result = PASS - -exit(result) diff --git a/nptl/test-condattr-printers.c b/nptl/test-condattr-printers.c deleted file mode 100644 index 9833d83b77..0000000000 --- a/nptl/test-condattr-printers.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Helper program for testing the pthread_cond_t and pthread_condattr_t - pretty printers. - - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* Keep the calls to the pthread_* functions on separate lines to make it easy - to advance through the program using the gdb 'next' command. */ - -#include <time.h> -#include <pthread.h> - -#define PASS 0 -#define FAIL 1 - -static int condvar_reinit (pthread_cond_t *condvar, - const pthread_condattr_t *attr); -static int test_setclock (pthread_cond_t *condvar, pthread_condattr_t *attr); -static int test_setpshared (pthread_cond_t *condvar, pthread_condattr_t *attr); - -/* Need these so we don't have lines longer than 79 chars. */ -#define SET_SHARED(attr, shared) pthread_condattr_setpshared (attr, shared) - -int -main (void) -{ - pthread_cond_t condvar; - pthread_condattr_t attr; - int result = FAIL; - - if (pthread_condattr_init (&attr) == 0 - && pthread_cond_init (&condvar, NULL) == 0 - && test_setclock (&condvar, &attr) == PASS - && test_setpshared (&condvar, &attr) == PASS) - result = PASS; - /* Else, one of the pthread_cond* functions failed. */ - - return result; -} - -/* Destroys CONDVAR and re-initializes it using ATTR. */ -static int -condvar_reinit (pthread_cond_t *condvar, const pthread_condattr_t *attr) -{ - int result = FAIL; - - if (pthread_cond_destroy (condvar) == 0 - && pthread_cond_init (condvar, attr) == 0) - result = PASS; - - return result; -} - -/* Tests setting the clock ID attribute. */ -__attribute__ ((noinline)) -static int -test_setclock (pthread_cond_t *condvar, pthread_condattr_t *attr) -{ - int result = FAIL; - - if (pthread_condattr_setclock (attr, CLOCK_REALTIME) == 0 /* Set clock. */ - && condvar_reinit (condvar, attr) == PASS) - result = PASS; - - return result; -} - -/* Tests setting whether the condvar can be shared between processes. */ -static int -test_setpshared (pthread_cond_t *condvar, pthread_condattr_t *attr) -{ - int result = FAIL; - - if (SET_SHARED (attr, PTHREAD_PROCESS_SHARED) == 0 /* Set shared. */ - && condvar_reinit (condvar, attr) == PASS - && SET_SHARED (attr, PTHREAD_PROCESS_PRIVATE) == 0 - && condvar_reinit (condvar, attr) == PASS) - result = PASS; - - return result; -} diff --git a/nptl/test-condattr-printers.py b/nptl/test-condattr-printers.py deleted file mode 100644 index df5c995c82..0000000000 --- a/nptl/test-condattr-printers.py +++ /dev/null @@ -1,71 +0,0 @@ -# Common tests for the ConditionVariablePrinter and -# ConditionVariableAttributesPrinter classes. -# -# Copyright (C) 2016-2017 Free Software Foundation, Inc. -# This file is part of the GNU C Library. -# -# The GNU C Library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# The GNU C Library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with the GNU C Library; if not, see -# <http://www.gnu.org/licenses/>. - -import sys - -from test_printers_common import * - -test_source = sys.argv[1] -test_bin = sys.argv[2] -printer_files = sys.argv[3:] -printer_names = ['global glibc-pthread-locks'] - -try: - init_test(test_bin, printer_files, printer_names) - go_to_main() - - check_debug_symbol('struct pthread_condattr') - - condvar_var = 'condvar' - condvar_to_string = 'pthread_cond_t' - - attr_var = 'attr' - attr_to_string = 'pthread_condattr_t' - - break_at(test_source, 'Set clock') - continue_cmd() # Go to test_setclock - next_cmd(2) - test_printer(condvar_var, condvar_to_string, {'Clock ID': 'CLOCK_REALTIME'}) - test_printer(attr_var, attr_to_string, {'Clock ID': 'CLOCK_REALTIME'}) - - break_at(test_source, 'Set shared') - continue_cmd() # Go to test_setpshared - next_cmd(2) - test_printer(condvar_var, condvar_to_string, {'Shared': 'Yes'}) - test_printer(attr_var, attr_to_string, {'Shared': 'Yes'}) - next_cmd(2) - test_printer(condvar_var, condvar_to_string, {'Shared': 'No'}) - test_printer(attr_var, attr_to_string, {'Shared': 'No'}) - - continue_cmd() # Exit - -except (NoLineError, pexpect.TIMEOUT) as exception: - print('Error: {0}'.format(exception)) - result = FAIL - -except DebugError as exception: - print(exception) - result = UNSUPPORTED - -else: - print('Test succeeded.') - result = PASS - -exit(result) diff --git a/nptl/test-mutex-printers.c b/nptl/test-mutex-printers.c deleted file mode 100644 index 4a80ee9053..0000000000 --- a/nptl/test-mutex-printers.c +++ /dev/null @@ -1,151 +0,0 @@ -/* Helper program for testing the pthread_mutex_t pretty printer. - - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* Keep the calls to the pthread_* functions on separate lines to make it easy - to advance through the program using the gdb 'next' command. */ - -#include <stdlib.h> -#include <errno.h> -#include <pthread.h> - -#define PASS 0 -#define FAIL 1 - -static int test_status_destroyed (pthread_mutex_t *mutex); -static int test_status_no_robust (pthread_mutex_t *mutex, - pthread_mutexattr_t *attr); -static int test_status_robust (pthread_mutex_t *mutex, - pthread_mutexattr_t *attr); -static int test_locking_state_robust (pthread_mutex_t *mutex); -static void *thread_func (void *arg); -static int test_recursive_locks (pthread_mutex_t *mutex, - pthread_mutexattr_t *attr); - -int -main (void) -{ - pthread_mutex_t mutex; - pthread_mutexattr_t attr; - int result = FAIL; - - if (pthread_mutexattr_init (&attr) == 0 - && test_status_destroyed (&mutex) == PASS - && test_status_no_robust (&mutex, &attr) == PASS - && test_status_robust (&mutex, &attr) == PASS - && test_recursive_locks (&mutex, &attr) == PASS) - result = PASS; - /* Else, one of the pthread_mutex* functions failed. */ - - return result; -} - -/* Initializes MUTEX, then destroys it. */ -static int -test_status_destroyed (pthread_mutex_t *mutex) -{ - int result = FAIL; - - if (pthread_mutex_init (mutex, NULL) == 0 - && pthread_mutex_destroy (mutex) == 0) - result = PASS; /* Test status (destroyed). */ - - return result; -} - -/* Tests locking of non-robust mutexes. */ -static int -test_status_no_robust (pthread_mutex_t *mutex, pthread_mutexattr_t *attr) -{ - int result = FAIL; - - if (pthread_mutexattr_setrobust (attr, PTHREAD_MUTEX_STALLED) == 0 - && pthread_mutex_init (mutex, attr) == 0 - && pthread_mutex_lock (mutex) == 0 /* Test status (non-robust). */ - && pthread_mutex_unlock (mutex) == 0 - && pthread_mutex_destroy (mutex) == 0) - result = PASS; - - return result; -} - -/* Tests locking of robust mutexes. */ -static int -test_status_robust (pthread_mutex_t *mutex, pthread_mutexattr_t *attr) -{ - int result = FAIL; - - if (pthread_mutexattr_setrobust (attr, PTHREAD_MUTEX_ROBUST) == 0 - && pthread_mutex_init (mutex, attr) == 0 - && test_locking_state_robust (mutex) == PASS /* Test status (robust). */ - && pthread_mutex_destroy (mutex) == 0) - result = PASS; - - return result; -} - -/* Tests locking and state corruption of robust mutexes. We'll mark it as - inconsistent, then not recoverable. */ -static int -test_locking_state_robust (pthread_mutex_t *mutex) -{ - int result = FAIL; - pthread_t thread; - - if (pthread_create (&thread, NULL, thread_func, mutex) == 0 /* Create. */ - && pthread_join (thread, NULL) == 0 - && pthread_mutex_lock (mutex) == EOWNERDEAD /* Test locking (robust). */ - && pthread_mutex_unlock (mutex) == 0) - result = PASS; - - return result; -} - -/* Function to be called by the child thread when testing robust mutexes. */ -static void * -thread_func (void *arg) -{ - pthread_mutex_t *mutex = (pthread_mutex_t *)arg; - - if (pthread_mutex_lock (mutex) != 0) /* Thread function. */ - exit (FAIL); - - /* Thread terminates without unlocking the mutex, thus marking it as - inconsistent. */ - return NULL; -} - -/* Tests locking the mutex multiple times in a row. */ -static int -test_recursive_locks (pthread_mutex_t *mutex, pthread_mutexattr_t *attr) -{ - int result = FAIL; - - if (pthread_mutexattr_settype (attr, PTHREAD_MUTEX_RECURSIVE) == 0 - && pthread_mutex_init (mutex, attr) == 0 - && pthread_mutex_lock (mutex) == 0 - && pthread_mutex_lock (mutex) == 0 - && pthread_mutex_lock (mutex) == 0 /* Test recursive locks. */ - && pthread_mutex_unlock (mutex) == 0 - && pthread_mutex_unlock (mutex) == 0 - && pthread_mutex_unlock (mutex) == 0 - && pthread_mutex_destroy (mutex) == 0) - result = PASS; - - return result; -} diff --git a/nptl/test-mutex-printers.py b/nptl/test-mutex-printers.py deleted file mode 100644 index 687a32c4f7..0000000000 --- a/nptl/test-mutex-printers.py +++ /dev/null @@ -1,100 +0,0 @@ -# Tests for the MutexPrinter class. -# -# Copyright (C) 2016-2017 Free Software Foundation, Inc. -# This file is part of the GNU C Library. -# -# The GNU C Library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# The GNU C Library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with the GNU C Library; if not, see -# <http://www.gnu.org/licenses/>. - -import sys - -from test_printers_common import * - -test_source = sys.argv[1] -test_bin = sys.argv[2] -printer_files = sys.argv[3:] -printer_names = ['global glibc-pthread-locks'] - -try: - init_test(test_bin, printer_files, printer_names) - go_to_main() - - var = 'mutex' - to_string = 'pthread_mutex_t' - - break_at(test_source, 'Test status (destroyed)') - continue_cmd() # Go to test_status_destroyed - test_printer(var, to_string, {'Status': 'Destroyed'}) - - break_at(test_source, 'Test status (non-robust)') - continue_cmd() # Go to test_status_no_robust - test_printer(var, to_string, {'Status': 'Not acquired'}) - next_cmd() - thread_id = get_current_thread_lwpid() - # Owner ID might be reported either as the thread ID or as "Unknown" - # (if e.g. lock elision is enabled). - test_printer(var, to_string, - {'Status': 'Acquired, possibly with no waiters', - 'Owner ID': r'({0}|Unknown)'.format(thread_id)}) - - break_at(test_source, 'Test status (robust)') - continue_cmd() # Go to test_status_robust - test_printer(var, to_string, {'Status': 'Not acquired'}) - - # We'll now test the robust mutex locking states. We'll create a new - # thread that will lock a robust mutex and exit without unlocking it. - break_at(test_source, 'Create') - continue_cmd() # Go to test_locking_state_robust - # Set a breakpoint for the new thread to hit. - break_at(test_source, 'Thread function') - continue_cmd() - # By now the new thread is created and has hit its breakpoint. - set_scheduler_locking(True) - parent = 1 - child = 2 - select_thread(child) - child_id = get_current_thread_lwpid() - # We've got the new thread's ID. - select_thread(parent) - # Make the new thread finish its function while we wait. - continue_cmd(thread=child) - # The new thread should be dead by now. - break_at(test_source, 'Test locking (robust)') - continue_cmd() - test_printer(var, to_string, {'Owner ID': r'{0} \(dead\)'.format(child_id)}) - # Try to lock and unlock the mutex. - next_cmd() - test_printer(var, to_string, {'Owner ID': thread_id, - 'State protected by this mutex': 'Inconsistent'}) - next_cmd() - test_printer(var, to_string, {'Status': 'Not acquired', - 'State protected by this mutex': 'Not recoverable'}) - set_scheduler_locking(False) - - break_at(test_source, 'Test recursive locks') - continue_cmd() # Go to test_recursive_locks - test_printer(var, to_string, {'Times acquired by the owner': '2'}) - next_cmd() - test_printer(var, to_string, {'Times acquired by the owner': '3'}) - continue_cmd() # Exit - -except (NoLineError, pexpect.TIMEOUT) as exception: - print('Error: {0}'.format(exception)) - result = FAIL - -else: - print('Test succeeded.') - result = PASS - -exit(result) diff --git a/nptl/test-mutexattr-printers.c b/nptl/test-mutexattr-printers.c deleted file mode 100644 index 4893f52cc3..0000000000 --- a/nptl/test-mutexattr-printers.c +++ /dev/null @@ -1,144 +0,0 @@ -/* Helper program for testing the pthread_mutex_t and pthread_mutexattr_t - pretty printers. - - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* Keep the calls to the pthread_* functions on separate lines to make it easy - to advance through the program using the gdb 'next' command. */ - -#include <pthread.h> - -#define PASS 0 -#define FAIL 1 -#define PRIOCEILING 42 - -/* Need these so we don't have lines longer than 79 chars. */ -#define SET_TYPE(attr, type) pthread_mutexattr_settype (attr, type) -#define SET_ROBUST(attr, robust) pthread_mutexattr_setrobust (attr, robust) -#define SET_SHARED(attr, shared) pthread_mutexattr_setpshared (attr, shared) -#define SET_PROTOCOL(attr, protocol) \ - pthread_mutexattr_setprotocol (attr, protocol) -#define SET_PRIOCEILING(mutex, prioceiling, old_ceiling) \ - pthread_mutex_setprioceiling (mutex, prioceiling, old_ceiling) - -static int mutex_reinit (pthread_mutex_t *mutex, - const pthread_mutexattr_t *attr); -static int test_settype (pthread_mutex_t *mutex, pthread_mutexattr_t *attr); -static int test_setrobust (pthread_mutex_t *mutex, pthread_mutexattr_t *attr); -static int test_setpshared (pthread_mutex_t *mutex, pthread_mutexattr_t *attr); -static int test_setprotocol (pthread_mutex_t *mutex, - pthread_mutexattr_t *attr); - -int -main (void) -{ - pthread_mutex_t mutex; - pthread_mutexattr_t attr; - int result = FAIL; - - if (pthread_mutexattr_init (&attr) == 0 - && pthread_mutex_init (&mutex, NULL) == 0 - && test_settype (&mutex, &attr) == PASS - && test_setrobust (&mutex, &attr) == PASS - && test_setpshared (&mutex, &attr) == PASS - && test_setprotocol (&mutex, &attr) == PASS) - result = PASS; - /* Else, one of the pthread_mutex* functions failed. */ - - return result; -} - -/* Destroys MUTEX and re-initializes it using ATTR. */ -static int -mutex_reinit (pthread_mutex_t *mutex, const pthread_mutexattr_t *attr) -{ - int result = FAIL; - - if (pthread_mutex_destroy (mutex) == 0 - && pthread_mutex_init (mutex, attr) == 0) - result = PASS; - - return result; -} - -/* Tests setting the mutex type. */ -static int -test_settype (pthread_mutex_t *mutex, pthread_mutexattr_t *attr) -{ - int result = FAIL; - - if (SET_TYPE (attr, PTHREAD_MUTEX_ERRORCHECK) == 0 /* Set type. */ - && mutex_reinit (mutex, attr) == 0 - && SET_TYPE (attr, PTHREAD_MUTEX_RECURSIVE) == 0 - && mutex_reinit (mutex, attr) == 0 - && SET_TYPE (attr, PTHREAD_MUTEX_NORMAL) == 0 - && mutex_reinit (mutex, attr) == 0) - result = PASS; - - return result; -} - -/* Tests setting whether the mutex is robust. */ -static int -test_setrobust (pthread_mutex_t *mutex, pthread_mutexattr_t *attr) -{ - int result = FAIL; - - if (SET_ROBUST (attr, PTHREAD_MUTEX_ROBUST) == 0 /* Set robust. */ - && mutex_reinit (mutex, attr) == 0 - && SET_ROBUST (attr, PTHREAD_MUTEX_STALLED) == 0 - && mutex_reinit (mutex, attr) == 0) - result = PASS; - - return result; -} - -/* Tests setting whether the mutex can be shared between processes. */ -static int -test_setpshared (pthread_mutex_t *mutex, pthread_mutexattr_t *attr) -{ - int result = FAIL; - - if (SET_SHARED (attr, PTHREAD_PROCESS_SHARED) == 0 /* Set shared. */ - && mutex_reinit (mutex, attr) == 0 - && SET_SHARED (attr, PTHREAD_PROCESS_PRIVATE) == 0 - && mutex_reinit (mutex, attr) == 0) - result = PASS; - - return result; -} - -/* Tests setting the mutex protocol and, for Priority Protect, the Priority - Ceiling. */ -static int -test_setprotocol (pthread_mutex_t *mutex, pthread_mutexattr_t *attr) -{ - int result = FAIL; - int old_prioceiling; - - if (SET_PROTOCOL (attr, PTHREAD_PRIO_INHERIT) == 0 /* Set protocol. */ - && mutex_reinit (mutex, attr) == 0 - && SET_PROTOCOL (attr, PTHREAD_PRIO_PROTECT) == 0 - && mutex_reinit (mutex, attr) == 0 - && SET_PRIOCEILING(mutex, PRIOCEILING, &old_prioceiling) == 0 - && SET_PROTOCOL (attr, PTHREAD_PRIO_NONE) == 0 - && mutex_reinit (mutex, attr) == 0) - result = PASS; - - return result; -} diff --git a/nptl/test-mutexattr-printers.py b/nptl/test-mutexattr-printers.py deleted file mode 100644 index db11a20f3a..0000000000 --- a/nptl/test-mutexattr-printers.py +++ /dev/null @@ -1,101 +0,0 @@ -# Common tests for the MutexPrinter and MutexAttributesPrinter classes. -# -# Copyright (C) 2016-2017 Free Software Foundation, Inc. -# This file is part of the GNU C Library. -# -# The GNU C Library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# The GNU C Library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with the GNU C Library; if not, see -# <http://www.gnu.org/licenses/>. - -import sys - -from test_printers_common import * - -test_source = sys.argv[1] -test_bin = sys.argv[2] -printer_files = sys.argv[3:] -printer_names = ['global glibc-pthread-locks'] -PRIOCEILING = 42 - -try: - init_test(test_bin, printer_files, printer_names) - go_to_main() - - check_debug_symbol('struct pthread_mutexattr') - - mutex_var = 'mutex' - mutex_to_string = 'pthread_mutex_t' - - attr_var = 'attr' - attr_to_string = 'pthread_mutexattr_t' - - break_at(test_source, 'Set type') - continue_cmd() # Go to test_settype - next_cmd(2) - test_printer(attr_var, attr_to_string, {'Type': 'Error check'}) - test_printer(mutex_var, mutex_to_string, {'Type': 'Error check'}) - next_cmd(2) - test_printer(attr_var, attr_to_string, {'Type': 'Recursive'}) - test_printer(mutex_var, mutex_to_string, {'Type': 'Recursive'}) - next_cmd(2) - test_printer(attr_var, attr_to_string, {'Type': 'Normal'}) - test_printer(mutex_var, mutex_to_string, {'Type': 'Normal'}) - - break_at(test_source, 'Set robust') - continue_cmd() # Go to test_setrobust - next_cmd(2) - test_printer(attr_var, attr_to_string, {'Robust': 'Yes'}) - test_printer(mutex_var, mutex_to_string, {'Robust': 'Yes'}) - next_cmd(2) - test_printer(attr_var, attr_to_string, {'Robust': 'No'}) - test_printer(mutex_var, mutex_to_string, {'Robust': 'No'}) - - break_at(test_source, 'Set shared') - continue_cmd() # Go to test_setpshared - next_cmd(2) - test_printer(attr_var, attr_to_string, {'Shared': 'Yes'}) - test_printer(mutex_var, mutex_to_string, {'Shared': 'Yes'}) - next_cmd(2) - test_printer(attr_var, attr_to_string, {'Shared': 'No'}) - test_printer(mutex_var, mutex_to_string, {'Shared': 'No'}) - - break_at(test_source, 'Set protocol') - continue_cmd() # Go to test_setprotocol - next_cmd(2) - test_printer(attr_var, attr_to_string, {'Protocol': 'Priority inherit'}) - test_printer(mutex_var, mutex_to_string, {'Protocol': 'Priority inherit'}) - next_cmd(2) - test_printer(attr_var, attr_to_string, {'Protocol': 'Priority protect'}) - test_printer(mutex_var, mutex_to_string, {'Protocol': 'Priority protect'}) - next_cmd(2) - test_printer(mutex_var, mutex_to_string, {'Priority ceiling': - str(PRIOCEILING)}) - next_cmd() - test_printer(attr_var, attr_to_string, {'Protocol': 'None'}) - test_printer(mutex_var, mutex_to_string, {'Protocol': 'None'}) - - continue_cmd() # Exit - -except (NoLineError, pexpect.TIMEOUT) as exception: - print('Error: {0}'.format(exception)) - result = FAIL - -except DebugError as exception: - print(exception) - result = UNSUPPORTED - -else: - print('Test succeeded.') - result = PASS - -exit(result) diff --git a/nptl/test-rwlock-printers.c b/nptl/test-rwlock-printers.c deleted file mode 100644 index 4bd4960552..0000000000 --- a/nptl/test-rwlock-printers.c +++ /dev/null @@ -1,78 +0,0 @@ -/* Helper program for testing the pthread_rwlock_t pretty printer. - - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* Keep the calls to the pthread_* functions on separate lines to make it easy - to advance through the program using the gdb 'next' command. */ - -#include <pthread.h> - -#define PASS 0 -#define FAIL 1 - -static int test_locking_reader (pthread_rwlock_t *rwlock); -static int test_locking_writer (pthread_rwlock_t *rwlock); - -int -main (void) -{ - pthread_rwlock_t rwlock; - - int result = FAIL; - - if (test_locking_reader (&rwlock) == PASS - && test_locking_writer (&rwlock) == PASS) - result = PASS; - /* Else, one of the pthread_rwlock* functions failed. */ - - return result; -} - -/* Tests locking the rwlock multiple times as a reader. */ -static int -test_locking_reader (pthread_rwlock_t *rwlock) -{ - int result = FAIL; - - if (pthread_rwlock_init (rwlock, NULL) == 0 - && pthread_rwlock_rdlock (rwlock) == 0 /* Test locking (reader). */ - && pthread_rwlock_rdlock (rwlock) == 0 - && pthread_rwlock_rdlock (rwlock) == 0 - && pthread_rwlock_unlock (rwlock) == 0 - && pthread_rwlock_unlock (rwlock) == 0 - && pthread_rwlock_unlock (rwlock) == 0 - && pthread_rwlock_destroy (rwlock) == 0) - result = PASS; - - return result; -} - -/* Tests locking the rwlock as a writer. */ -static int -test_locking_writer (pthread_rwlock_t *rwlock) -{ - int result = FAIL; - - if (pthread_rwlock_init (rwlock, NULL) == 0 - && pthread_rwlock_wrlock (rwlock) == 0 /* Test locking (writer). */ - && pthread_rwlock_unlock (rwlock) == 0 - && pthread_rwlock_destroy (rwlock) == 0) - result = PASS; - - return result; -} diff --git a/nptl/test-rwlock-printers.py b/nptl/test-rwlock-printers.py deleted file mode 100644 index c19c92d48f..0000000000 --- a/nptl/test-rwlock-printers.py +++ /dev/null @@ -1,64 +0,0 @@ -# Common tests for the RWLockPrinter class. -# -# Copyright (C) 2016-2017 Free Software Foundation, Inc. -# This file is part of the GNU C Library. -# -# The GNU C Library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# The GNU C Library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with the GNU C Library; if not, see -# <http://www.gnu.org/licenses/>. - -import sys - -from test_printers_common import * - -test_source = sys.argv[1] -test_bin = sys.argv[2] -printer_files = sys.argv[3:] -printer_names = ['global glibc-pthread-locks'] - -try: - init_test(test_bin, printer_files, printer_names) - go_to_main() - - var = 'rwlock' - to_string = 'pthread_rwlock_t' - - break_at(test_source, 'Test locking (reader)') - continue_cmd() # Go to test_locking_reader - test_printer(var, to_string, {'Status': 'Not acquired'}) - next_cmd() - test_printer(var, to_string, {'Status': r'Acquired \(Read\)', 'Readers': '1'}) - next_cmd() - test_printer(var, to_string, {'Readers': '2'}) - next_cmd() - test_printer(var, to_string, {'Readers': '3'}) - - break_at(test_source, 'Test locking (writer)') - continue_cmd() # Go to test_locking_writer - test_printer(var, to_string, {'Status': 'Not acquired'}) - next_cmd() - thread_id = get_current_thread_lwpid() - test_printer(var, to_string, {'Status': r'Acquired \(Write\)', - 'Writer ID': thread_id}) - - continue_cmd() # Exit - -except (NoLineError, pexpect.TIMEOUT) as exception: - print('Error: {0}'.format(exception)) - result = FAIL - -else: - print('Test succeeded.') - result = PASS - -exit(result) diff --git a/nptl/test-rwlockattr-printers.c b/nptl/test-rwlockattr-printers.c deleted file mode 100644 index b2cfc26b9e..0000000000 --- a/nptl/test-rwlockattr-printers.c +++ /dev/null @@ -1,100 +0,0 @@ -/* Helper program for testing the pthread_rwlock_t and pthread_rwlockattr_t - pretty printers. - - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* Keep the calls to the pthread_* functions on separate lines to make it easy - to advance through the program using the gdb 'next' command. */ - -#include <pthread.h> - -#define PASS 0 -#define FAIL 1 - -/* Need these so we don't have lines longer than 79 chars. */ -#define SET_KIND(attr, kind) pthread_rwlockattr_setkind_np (attr, kind) -#define SET_SHARED(attr, shared) pthread_rwlockattr_setpshared (attr, shared) - -static int rwlock_reinit (pthread_rwlock_t *rwlock, - const pthread_rwlockattr_t *attr); -static int test_setkind_np (pthread_rwlock_t *rwlock, - pthread_rwlockattr_t *attr); -static int test_setpshared (pthread_rwlock_t *rwlock, - pthread_rwlockattr_t *attr); - -int -main (void) -{ - pthread_rwlock_t rwlock; - pthread_rwlockattr_t attr; - int result = FAIL; - - if (pthread_rwlockattr_init (&attr) == 0 - && pthread_rwlock_init (&rwlock, NULL) == 0 - && test_setkind_np (&rwlock, &attr) == PASS - && test_setpshared (&rwlock, &attr) == PASS) - result = PASS; - /* Else, one of the pthread_rwlock* functions failed. */ - - return result; -} - -/* Destroys RWLOCK and re-initializes it using ATTR. */ -static int -rwlock_reinit (pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr) -{ - int result = FAIL; - - if (pthread_rwlock_destroy (rwlock) == 0 - && pthread_rwlock_init (rwlock, attr) == 0) - result = PASS; - - return result; -} - -/* Tests setting whether the rwlock prefers readers or writers. */ -static int -test_setkind_np (pthread_rwlock_t *rwlock, pthread_rwlockattr_t *attr) -{ - int result = FAIL; - - if (SET_KIND (attr, PTHREAD_RWLOCK_PREFER_READER_NP) == 0 /* Set kind. */ - && rwlock_reinit (rwlock, attr) == PASS - && SET_KIND (attr, PTHREAD_RWLOCK_PREFER_WRITER_NP) == 0 - && rwlock_reinit (rwlock, attr) == PASS - && SET_KIND (attr, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP) == 0 - && rwlock_reinit (rwlock, attr) == PASS) - result = PASS; - - return result; -} - -/* Tests setting whether the rwlock can be shared between processes. */ -static int -test_setpshared (pthread_rwlock_t *rwlock, pthread_rwlockattr_t *attr) -{ - int result = FAIL; - - if (SET_SHARED (attr, PTHREAD_PROCESS_SHARED) == 0 /* Set shared. */ - && rwlock_reinit (rwlock, attr) == PASS - && SET_SHARED (attr, PTHREAD_PROCESS_PRIVATE) == 0 - && rwlock_reinit (rwlock, attr) == PASS) - result = PASS; - - return result; -} diff --git a/nptl/test-rwlockattr-printers.py b/nptl/test-rwlockattr-printers.py deleted file mode 100644 index e62e5c533f..0000000000 --- a/nptl/test-rwlockattr-printers.py +++ /dev/null @@ -1,76 +0,0 @@ -# Common tests for the RWLockPrinter and RWLockAttributesPrinter classes. -# -# Copyright (C) 2016-2017 Free Software Foundation, Inc. -# This file is part of the GNU C Library. -# -# The GNU C Library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# The GNU C Library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with the GNU C Library; if not, see -# <http://www.gnu.org/licenses/>. - -import sys - -from test_printers_common import * - -test_source = sys.argv[1] -test_bin = sys.argv[2] -printer_files = sys.argv[3:] -printer_names = ['global glibc-pthread-locks'] - -try: - init_test(test_bin, printer_files, printer_names) - go_to_main() - - check_debug_symbol('struct pthread_rwlockattr') - - rwlock_var = 'rwlock' - rwlock_to_string = 'pthread_rwlock_t' - - attr_var = 'attr' - attr_to_string = 'pthread_rwlockattr_t' - - break_at(test_source, 'Set kind') - continue_cmd() # Go to test_setkind_np - next_cmd(2) - test_printer(rwlock_var, rwlock_to_string, {'Prefers': 'Readers'}) - test_printer(attr_var, attr_to_string, {'Prefers': 'Readers'}) - next_cmd(2) - test_printer(rwlock_var, rwlock_to_string, {'Prefers': 'Writers'}) - test_printer(attr_var, attr_to_string, {'Prefers': 'Writers'}) - next_cmd(2) - test_printer(rwlock_var, rwlock_to_string, {'Prefers': 'Writers no recursive readers'}) - test_printer(attr_var, attr_to_string, {'Prefers': 'Writers no recursive readers'}) - - break_at(test_source, 'Set shared') - continue_cmd() # Go to test_setpshared - next_cmd(2) - test_printer(rwlock_var, rwlock_to_string, {'Shared': 'Yes'}) - test_printer(attr_var, attr_to_string, {'Shared': 'Yes'}) - next_cmd(2) - test_printer(rwlock_var, rwlock_to_string, {'Shared': 'No'}) - test_printer(attr_var, attr_to_string, {'Shared': 'No'}) - - continue_cmd() # Exit - -except (NoLineError, pexpect.TIMEOUT) as exception: - print('Error: {0}'.format(exception)) - result = FAIL - -except DebugError as exception: - print(exception) - result = UNSUPPORTED - -else: - print('Test succeeded.') - result = PASS - -exit(result) diff --git a/nptl/tpp.c b/nptl/tpp.c deleted file mode 100644 index 57eb026088..0000000000 --- a/nptl/tpp.c +++ /dev/null @@ -1,195 +0,0 @@ -/* Thread Priority Protect helpers. - Copyright (C) 2006-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2006. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <atomic.h> -#include <errno.h> -#include <pthreadP.h> -#include <sched.h> -#include <stdlib.h> -#include <atomic.h> - - -int __sched_fifo_min_prio = -1; -int __sched_fifo_max_prio = -1; - -/* We only want to initialize __sched_fifo_min_prio and __sched_fifo_max_prio - once. The standard solution would be similar to pthread_once, but then - readers would need to use an acquire fence. In this specific case, - initialization is comprised of just idempotent writes to two variables - that have an initial value of -1. Therefore, we can treat each variable as - a separate, at-least-once initialized value. This enables using just - relaxed MO loads and stores, but requires that consumers check for - initialization of each value that is to be used; see - __pthread_tpp_change_priority for an example. - */ -void -__init_sched_fifo_prio (void) -{ - atomic_store_relaxed (&__sched_fifo_max_prio, - sched_get_priority_max (SCHED_FIFO)); - atomic_store_relaxed (&__sched_fifo_min_prio, - sched_get_priority_min (SCHED_FIFO)); -} - -int -__pthread_tpp_change_priority (int previous_prio, int new_prio) -{ - struct pthread *self = THREAD_SELF; - struct priority_protection_data *tpp = THREAD_GETMEM (self, tpp); - int fifo_min_prio = atomic_load_relaxed (&__sched_fifo_min_prio); - int fifo_max_prio = atomic_load_relaxed (&__sched_fifo_max_prio); - - if (tpp == NULL) - { - /* See __init_sched_fifo_prio. We need both the min and max prio, - so need to check both, and run initialization if either one is - not initialized. The memory model's write-read coherence rule - makes this work. */ - if (fifo_min_prio == -1 || fifo_max_prio == -1) - { - __init_sched_fifo_prio (); - fifo_min_prio = atomic_load_relaxed (&__sched_fifo_min_prio); - fifo_max_prio = atomic_load_relaxed (&__sched_fifo_max_prio); - } - - size_t size = sizeof *tpp; - size += (fifo_max_prio - fifo_min_prio + 1) - * sizeof (tpp->priomap[0]); - tpp = calloc (size, 1); - if (tpp == NULL) - return ENOMEM; - tpp->priomax = fifo_min_prio - 1; - THREAD_SETMEM (self, tpp, tpp); - } - - assert (new_prio == -1 - || (new_prio >= fifo_min_prio - && new_prio <= fifo_max_prio)); - assert (previous_prio == -1 - || (previous_prio >= fifo_min_prio - && previous_prio <= fifo_max_prio)); - - int priomax = tpp->priomax; - int newpriomax = priomax; - if (new_prio != -1) - { - if (tpp->priomap[new_prio - fifo_min_prio] + 1 == 0) - return EAGAIN; - ++tpp->priomap[new_prio - fifo_min_prio]; - if (new_prio > priomax) - newpriomax = new_prio; - } - - if (previous_prio != -1) - { - if (--tpp->priomap[previous_prio - fifo_min_prio] == 0 - && priomax == previous_prio - && previous_prio > new_prio) - { - int i; - for (i = previous_prio - 1; i >= fifo_min_prio; --i) - if (tpp->priomap[i - fifo_min_prio]) - break; - newpriomax = i; - } - } - - if (priomax == newpriomax) - return 0; - - /* See CREATE THREAD NOTES in nptl/pthread_create.c. */ - lll_lock (self->lock, LLL_PRIVATE); - - tpp->priomax = newpriomax; - - int result = 0; - - if ((self->flags & ATTR_FLAG_SCHED_SET) == 0) - { - if (__sched_getparam (self->tid, &self->schedparam) != 0) - result = errno; - else - self->flags |= ATTR_FLAG_SCHED_SET; - } - - if ((self->flags & ATTR_FLAG_POLICY_SET) == 0) - { - self->schedpolicy = __sched_getscheduler (self->tid); - if (self->schedpolicy == -1) - result = errno; - else - self->flags |= ATTR_FLAG_POLICY_SET; - } - - if (result == 0) - { - struct sched_param sp = self->schedparam; - if (sp.sched_priority < newpriomax || sp.sched_priority < priomax) - { - if (sp.sched_priority < newpriomax) - sp.sched_priority = newpriomax; - - if (__sched_setscheduler (self->tid, self->schedpolicy, &sp) < 0) - result = errno; - } - } - - lll_unlock (self->lock, LLL_PRIVATE); - - return result; -} - -int -__pthread_current_priority (void) -{ - struct pthread *self = THREAD_SELF; - if ((self->flags & (ATTR_FLAG_POLICY_SET | ATTR_FLAG_SCHED_SET)) - == (ATTR_FLAG_POLICY_SET | ATTR_FLAG_SCHED_SET)) - return self->schedparam.sched_priority; - - int result = 0; - - /* See CREATE THREAD NOTES in nptl/pthread_create.c. */ - lll_lock (self->lock, LLL_PRIVATE); - - if ((self->flags & ATTR_FLAG_SCHED_SET) == 0) - { - if (__sched_getparam (self->tid, &self->schedparam) != 0) - result = -1; - else - self->flags |= ATTR_FLAG_SCHED_SET; - } - - if ((self->flags & ATTR_FLAG_POLICY_SET) == 0) - { - self->schedpolicy = __sched_getscheduler (self->tid); - if (self->schedpolicy == -1) - result = -1; - else - self->flags |= ATTR_FLAG_POLICY_SET; - } - - if (result != -1) - result = self->schedparam.sched_priority; - - lll_unlock (self->lock, LLL_PRIVATE); - - return result; -} diff --git a/nptl/tst-_res1.c b/nptl/tst-_res1.c deleted file mode 100644 index 75d3d9d8ea..0000000000 --- a/nptl/tst-_res1.c +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* Test whether _res in glibc 2.1.x and earlier (before __res_state() - was introduced) works. Portable programs should never do the - dirty things below. */ - -#include <pthread.h> -#include <resolv.h> -#include <stdlib.h> -#include <stdio.h> - -void *tf (void *resp) -{ - if (resp == &_res || resp == __res_state ()) - abort (); - _res.retry = 24; - return NULL; -} - -void do_test (struct __res_state *resp) -{ - if (resp != &_res || resp != __res_state ()) - abort (); - if (_res.retry != 12) - abort (); -} - -int main (void) -{ -#undef _res - extern struct __res_state _res; - pthread_t th; - - _res.retry = 12; - if (pthread_create (&th, NULL, tf, &_res) != 0) - { - puts ("create failed"); - exit (1); - } - - do_test (&_res); - - if (pthread_join (th, NULL) != 0) - { - puts ("join failed"); - exit (1); - } - - do_test (&_res); - - exit (0); -} diff --git a/nptl/tst-_res1mod1.c b/nptl/tst-_res1mod1.c deleted file mode 100644 index 72a315d124..0000000000 --- a/nptl/tst-_res1mod1.c +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <resolv.h> -#undef _res - -struct __res_state _res; diff --git a/nptl/tst-_res1mod2.c b/nptl/tst-_res1mod2.c deleted file mode 100644 index d2a3509c6d..0000000000 --- a/nptl/tst-_res1mod2.c +++ /dev/null @@ -1 +0,0 @@ -/* Nothing. */ diff --git a/nptl/tst-abstime.c b/nptl/tst-abstime.c deleted file mode 100644 index 42eac63334..0000000000 --- a/nptl/tst-abstime.c +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (C) 2010-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Andreas Schwab <schwab@redhat.com>, 2010. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <semaphore.h> -#include <stdio.h> - -static pthread_cond_t c = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER; -static pthread_mutex_t m2 = PTHREAD_MUTEX_INITIALIZER; -static pthread_rwlock_t rw1 = PTHREAD_RWLOCK_INITIALIZER; -static pthread_rwlock_t rw2 = PTHREAD_RWLOCK_INITIALIZER; -static sem_t sem; - -static void * -th (void *arg) -{ - long int res = 0; - int r; - struct timespec t = { -2, 0 }; - - r = pthread_mutex_timedlock (&m1, &t); - if (r != ETIMEDOUT) - { - puts ("pthread_mutex_timedlock did not return ETIMEDOUT"); - res = 1; - } - r = pthread_rwlock_timedrdlock (&rw1, &t); - if (r != ETIMEDOUT) - { - puts ("pthread_rwlock_timedrdlock did not return ETIMEDOUT"); - res = 1; - } - r = pthread_rwlock_timedwrlock (&rw2, &t); - if (r != ETIMEDOUT) - { - puts ("pthread_rwlock_timedwrlock did not return ETIMEDOUT"); - res = 1; - } - return (void *) res; -} - -static int -do_test (void) -{ - int res = 0; - int r; - struct timespec t = { -2, 0 }; - pthread_t pth; - - sem_init (&sem, 0, 0); - r = sem_timedwait (&sem, &t); - if (r != -1 || errno != ETIMEDOUT) - { - puts ("sem_timedwait did not fail with ETIMEDOUT"); - res = 1; - } - - pthread_mutex_lock (&m1); - pthread_rwlock_wrlock (&rw1); - pthread_rwlock_rdlock (&rw2); - pthread_mutex_lock (&m2); - if (pthread_create (&pth, 0, th, 0) != 0) - { - puts ("cannot create thread"); - return 1; - } - r = pthread_cond_timedwait (&c, &m2, &t); - if (r != ETIMEDOUT) - { - puts ("pthread_cond_timedwait did not return ETIMEDOUT"); - res = 1; - } - void *thres; - pthread_join (pth, &thres); - return res | (thres != NULL); -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-align.c b/nptl/tst-align.c deleted file mode 100644 index 1f44d11a9e..0000000000 --- a/nptl/tst-align.c +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdbool.h> -#include <stdint.h> -#include <stdio.h> -#include <tst-stack-align.h> - -static void * -tf (void *arg) -{ - bool ok = true; - - puts ("in thread"); - - if (TEST_STACK_ALIGN ()) - ok = false; - - return ok ? NULL : (void *) -1l; -} - -static int -do_test (void) -{ - bool ok = true; - - puts ("in main"); - - if (TEST_STACK_ALIGN ()) - ok = false; - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - void *res; - if (pthread_join (th, &res) != 0) - { - puts ("join failed"); - return 1; - } - - if (res != NULL) - ok = false; - - return ok ? 0 : 1; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-align3.c b/nptl/tst-align3.c deleted file mode 100644 index ee24557881..0000000000 --- a/nptl/tst-align3.c +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (C) 2005-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2005. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdbool.h> -#include <stdint.h> -#include <stdio.h> -#include <tst-stack-align.h> - -static bool ok = true; -static pthread_once_t once = PTHREAD_ONCE_INIT; - -static void -once_test (void) -{ - puts ("in once_test"); - - if (TEST_STACK_ALIGN ()) - ok = false; -} - -static int -do_test (void) -{ - puts ("in main"); - - if (TEST_STACK_ALIGN ()) - ok = false; - - if (pthread_once (&once, once_test)) - { - puts ("pthread once failed"); - return 1; - } - - return ok ? 0 : 1; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-atfork1.c b/nptl/tst-atfork1.c deleted file mode 100644 index 55f46f075b..0000000000 --- a/nptl/tst-atfork1.c +++ /dev/null @@ -1,120 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/wait.h> - - -static int val; - - -static void -prepare1 (void) -{ - val *= 2; -} - -static void -prepare2 (void) -{ - ++val; -} - -static void -parent1 (void) -{ - val += 4; -} - -static void -parent2 (void) -{ - val *= 4; -} - -static void -child1 (void) -{ - val += 8; -} - -static void -child2 (void) -{ - val *= 8; -} - - -static int -do_test (void) -{ - pid_t pid; - int status = 0; - - if (pthread_atfork (prepare1, parent1, child1) != 0) - { - puts ("1st atfork failed"); - exit (1); - } - if (pthread_atfork (prepare2, parent2, child2) != 0) - { - puts ("2nd atfork failed"); - exit (1); - } - - pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - exit (1); - } - - if (pid != 0) - { - /* Parent. */ - if (val != 24) - { - printf ("expected val=%d, got %d\n", 24, val); - exit (1); - } - - if (TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)) != pid) - { - puts ("waitpid failed"); - exit (1); - } - } - else - { - /* Child. */ - if (val != 80) - { - printf ("expected val=%d, got %d\n", 80, val); - exit (2); - } - } - - return status; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-atfork2.c b/nptl/tst-atfork2.c deleted file mode 100644 index 7b3333e255..0000000000 --- a/nptl/tst-atfork2.c +++ /dev/null @@ -1,158 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <dlfcn.h> -#include <errno.h> -#include <mcheck.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/wait.h> - - -/* Must be exported. */ -int val; - -static void -prepare (void) -{ - val *= 2; -} - -static void -parent (void) -{ - val += 4; -} - -static void -child (void) -{ - val += 8; -} - - -static int -do_test (void) -{ - mtrace (); - - if (pthread_atfork (prepare, parent, child) != 0) - { - puts ("do_test: atfork failed"); - exit (1); - } - - void *h = dlopen ("tst-atfork2mod.so", RTLD_LAZY); - if (h == NULL) - { - printf ("dlopen failed: %s\n", dlerror ()); - exit (1); - } - - /* First trial of fork. */ - pid_t pid = fork (); - if (pid == -1) - { - puts ("1st fork failed"); - exit (1); - } - - if (pid == 0) - { - /* Child. */ - if (val != 80) - { - printf ("1st: expected val=%d, got %d\n", 80, val); - exit (2); - } - - exit (0); - } - - /* Parent. */ - if (val != 24) - { - printf ("1st: expected val=%d, got %d\n", 24, val); - exit (1); - } - - int status; - if (TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)) != pid) - { - puts ("1st waitpid failed"); - exit (1); - } - - if (status != 0) - exit (status); - - puts ("unloading now"); - - /* Unload the module. */ - if (dlclose (h) != 0) - { - puts ("dlclose failed"); - exit (1); - } - - puts ("2nd fork"); - - /* Second fork trial. */ - val = 1; - pid = fork (); - if (pid == -1) - { - puts ("2nd fork failed"); - exit (1); - } - - if (pid == 0) - { - /* Child. */ - if (val != 10) - { - printf ("2nd: expected val=%d, got %d\n", 10, val); - exit (3); - } - - exit (0); - } - - /* Parent. */ - if (val != 6) - { - printf ("2nd: expected val=%d, got %d\n", 6, val); - exit (1); - } - - if (TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)) != pid) - { - puts ("2nd waitpid failed"); - exit (1); - } - - if (status != 0) - exit (status); - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-atfork2mod.c b/nptl/tst-atfork2mod.c deleted file mode 100644 index fe64046d3c..0000000000 --- a/nptl/tst-atfork2mod.c +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - - -extern int val; - - -static void -prepare (void) -{ - ++val; -} - -static void -parent (void) -{ - val *= 4; -} - -static void -child (void) -{ - val *= 8; -} - -static void -__attribute__ ((constructor)) -init (void) -{ - extern void *__dso_handle; - printf ("dsohandle = %p\n", __dso_handle); - - if (pthread_atfork (prepare, parent, child) != 0) - { - puts ("init: atfork failed"); - exit (1); - } -} diff --git a/nptl/tst-attr1.c b/nptl/tst-attr1.c deleted file mode 100644 index 1da7f3ba01..0000000000 --- a/nptl/tst-attr1.c +++ /dev/null @@ -1,305 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -int -do_test (void) -{ - int i; - pthread_attr_t a; - - if (pthread_attr_init (&a) != 0) - { - puts ("attr_init failed"); - exit (1); - } - - pthread_mutexattr_t ma; - - if (pthread_mutexattr_init (&ma) != 0) - { - puts ("mutexattr_init failed"); - exit (1); - } - - pthread_rwlockattr_t rwa; - - if (pthread_rwlockattr_init (&rwa) != 0) - { - puts ("rwlockattr_init failed"); - exit (1); - } - - /* XXX Remove if default value is clear. */ - pthread_attr_setinheritsched (&a, PTHREAD_INHERIT_SCHED); - pthread_attr_setschedpolicy (&a, SCHED_OTHER); - pthread_attr_setscope (&a, PTHREAD_SCOPE_SYSTEM); - - for (i = 0; i < 10000; ++i) - { - long int r = random (); - - if (r != PTHREAD_CREATE_DETACHED && r != PTHREAD_CREATE_JOINABLE) - { - int e = pthread_attr_setdetachstate (&a, r); - - if (e == 0) - { - printf ("attr_setdetachstate with value %ld succeeded\n", r); - exit (1); - } - if (e != EINVAL) - { - puts ("attr_setdetachstate didn't return EINVAL"); - exit (1); - } - - int s; - if (pthread_attr_getdetachstate (&a, &s) != 0) - { - puts ("attr_getdetachstate failed"); - exit (1); - } - - if (s != PTHREAD_CREATE_JOINABLE) - { - printf ("\ -detach state changed to %d by invalid setdetachstate call\n", s); - exit (1); - } - } - - if (r != PTHREAD_INHERIT_SCHED && r != PTHREAD_EXPLICIT_SCHED) - { - int e = pthread_attr_setinheritsched (&a, r); - - if (e == 0) - { - printf ("attr_setinheritsched with value %ld succeeded\n", r); - exit (1); - } - if (e != EINVAL) - { - puts ("attr_setinheritsched didn't return EINVAL"); - exit (1); - } - - int s; - if (pthread_attr_getinheritsched (&a, &s) != 0) - { - puts ("attr_getinheritsched failed"); - exit (1); - } - - if (s != PTHREAD_INHERIT_SCHED) - { - printf ("\ -inheritsched changed to %d by invalid setinheritsched call\n", s); - exit (1); - } - } - - if (r != SCHED_OTHER && r != SCHED_RR && r != SCHED_FIFO) - { - int e = pthread_attr_setschedpolicy (&a, r); - - if (e == 0) - { - printf ("attr_setschedpolicy with value %ld succeeded\n", r); - exit (1); - } - if (e != EINVAL) - { - puts ("attr_setschedpolicy didn't return EINVAL"); - exit (1); - } - - int s; - if (pthread_attr_getschedpolicy (&a, &s) != 0) - { - puts ("attr_getschedpolicy failed"); - exit (1); - } - - if (s != SCHED_OTHER) - { - printf ("\ -schedpolicy changed to %d by invalid setschedpolicy call\n", s); - exit (1); - } - } - - if (r != PTHREAD_SCOPE_SYSTEM && r != PTHREAD_SCOPE_PROCESS) - { - int e = pthread_attr_setscope (&a, r); - - if (e == 0) - { - printf ("attr_setscope with value %ld succeeded\n", r); - exit (1); - } - if (e != EINVAL) - { - puts ("attr_setscope didn't return EINVAL"); - exit (1); - } - - int s; - if (pthread_attr_getscope (&a, &s) != 0) - { - puts ("attr_getscope failed"); - exit (1); - } - - if (s != PTHREAD_SCOPE_SYSTEM) - { - printf ("\ -contentionscope changed to %d by invalid setscope call\n", s); - exit (1); - } - } - - if (r != PTHREAD_PROCESS_PRIVATE && r != PTHREAD_PROCESS_SHARED) - { - int e = pthread_mutexattr_setpshared (&ma, r); - - if (e == 0) - { - printf ("mutexattr_setpshared with value %ld succeeded\n", r); - exit (1); - } - if (e != EINVAL) - { - puts ("mutexattr_setpshared didn't return EINVAL"); - exit (1); - } - - int s; - if (pthread_mutexattr_getpshared (&ma, &s) != 0) - { - puts ("mutexattr_getpshared failed"); - exit (1); - } - - if (s != PTHREAD_PROCESS_PRIVATE) - { - printf ("\ -pshared changed to %d by invalid mutexattr_setpshared call\n", s); - exit (1); - } - - e = pthread_rwlockattr_setpshared (&rwa, r); - - if (e == 0) - { - printf ("rwlockattr_setpshared with value %ld succeeded\n", r); - exit (1); - } - if (e != EINVAL) - { - puts ("rwlockattr_setpshared didn't return EINVAL"); - exit (1); - } - - if (pthread_rwlockattr_getpshared (&rwa, &s) != 0) - { - puts ("rwlockattr_getpshared failed"); - exit (1); - } - - if (s != PTHREAD_PROCESS_PRIVATE) - { - printf ("\ -pshared changed to %d by invalid rwlockattr_setpshared call\n", s); - exit (1); - } - } - - if (r != PTHREAD_CANCEL_ENABLE && r != PTHREAD_CANCEL_DISABLE) - { - int e = pthread_setcancelstate (r, NULL); - - if (e == 0) - { - printf ("setcancelstate with value %ld succeeded\n", r); - exit (1); - } - - if (e != EINVAL) - { - puts ("setcancelstate didn't return EINVAL"); - exit (1); - } - - int s; - if (pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, &s) != 0) - { - puts ("setcancelstate failed for PTHREAD_CANCEL_ENABLE"); - exit (1); - } - - if (s != PTHREAD_CANCEL_ENABLE) - { - puts ("invalid setcancelstate changed state"); - exit (1); - } - } - - if (r != PTHREAD_CANCEL_DEFERRED && r != PTHREAD_CANCEL_ASYNCHRONOUS) - { - int e = pthread_setcanceltype (r, NULL); - - if (e == 0) - { - printf ("setcanceltype with value %ld succeeded\n", r); - exit (1); - } - - if (e != EINVAL) - { - puts ("setcanceltype didn't return EINVAL"); - exit (1); - } - - int s; - if (pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &s) != 0) - { - puts ("setcanceltype failed for PTHREAD_CANCEL_DEFERRED"); - exit (1); - } - - if (s != PTHREAD_CANCEL_DEFERRED) - { - puts ("invalid setcanceltype changed state"); - exit (1); - } - } - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-attr2.c b/nptl/tst-attr2.c deleted file mode 100644 index 9967b69773..0000000000 --- a/nptl/tst-attr2.c +++ /dev/null @@ -1,316 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -int -do_test (void) -{ - pthread_attr_t a; - - if (pthread_attr_init (&a) != 0) - { - puts ("attr_init failed"); - exit (1); - } - - /* Check default value of detach state. */ - int s; - if (pthread_attr_getdetachstate (&a, &s) != 0) - { - puts ("1st attr_getdestachstate failed"); - exit (1); - } - if (s != PTHREAD_CREATE_JOINABLE) - { - printf ("\ -default detach state wrong: %d, expected %d (PTHREAD_CREATE_JOINABLE)\n", - s, PTHREAD_CREATE_JOINABLE); - exit (1); - } - - int e = pthread_attr_setdetachstate (&a, PTHREAD_CREATE_DETACHED); - if (e != 0) - { - puts ("1st attr_setdetachstate failed"); - exit (1); - } - if (pthread_attr_getdetachstate (&a, &s) != 0) - { - puts ("2nd attr_getdestachstate failed"); - exit (1); - } - if (s != PTHREAD_CREATE_DETACHED) - { - puts ("PTHREAD_CREATE_DETACHED set, but not given back"); - exit (1); - } - - e = pthread_attr_setdetachstate (&a, PTHREAD_CREATE_JOINABLE); - if (e != 0) - { - puts ("2nd attr_setdetachstate failed"); - exit (1); - } - if (pthread_attr_getdetachstate (&a, &s) != 0) - { - puts ("3rd attr_getdestachstate failed"); - exit (1); - } - if (s != PTHREAD_CREATE_JOINABLE) - { - puts ("PTHREAD_CREATE_JOINABLE set, but not given back"); - exit (1); - } - - - size_t g; - if (pthread_attr_getguardsize (&a, &g) != 0) - { - puts ("1st attr_getguardsize failed"); - exit (1); - } - if (g != (size_t) sysconf (_SC_PAGESIZE)) - { - printf ("default guardsize %zu, expected %ld (PAGESIZE)\n", - g, sysconf (_SC_PAGESIZE)); - exit (1); - } - - e = pthread_attr_setguardsize (&a, 0); - if (e != 0) - { - puts ("1st attr_setguardsize failed"); - exit (1); - } - if (pthread_attr_getguardsize (&a, &g) != 0) - { - puts ("2nd attr_getguardsize failed"); - exit (1); - } - if (g != 0) - { - printf ("guardsize set to zero but %zu returned\n", g); - exit (1); - } - - e = pthread_attr_setguardsize (&a, 1); - if (e != 0) - { - puts ("2nd attr_setguardsize failed"); - exit (1); - } - if (pthread_attr_getguardsize (&a, &g) != 0) - { - puts ("3rd attr_getguardsize failed"); - exit (1); - } - if (g != 1) - { - printf ("guardsize set to 1 but %zu returned\n", g); - exit (1); - } - - - if (pthread_attr_getinheritsched (&a, &s) != 0) - { - puts ("1st attr_getinheritsched failed"); - exit (1); - } - /* XXX What is the correct default value. */ - if (s != PTHREAD_INHERIT_SCHED && s != PTHREAD_EXPLICIT_SCHED) - { - puts ("incorrect default value for inheritsched"); - exit (1); - } - - e = pthread_attr_setinheritsched (&a, PTHREAD_EXPLICIT_SCHED); - if (e != 0) - { - puts ("1st attr_setinheritsched failed"); - exit (1); - } - if (pthread_attr_getinheritsched (&a, &s) != 0) - { - puts ("2nd attr_getinheritsched failed"); - exit (1); - } - if (s != PTHREAD_EXPLICIT_SCHED) - { - printf ("inheritsched set to PTHREAD_EXPLICIT_SCHED, but got %d\n", s); - exit (1); - } - - e = pthread_attr_setinheritsched (&a, PTHREAD_INHERIT_SCHED); - if (e != 0) - { - puts ("2nd attr_setinheritsched failed"); - exit (1); - } - if (pthread_attr_getinheritsched (&a, &s) != 0) - { - puts ("3rd attr_getinheritsched failed"); - exit (1); - } - if (s != PTHREAD_INHERIT_SCHED) - { - printf ("inheritsched set to PTHREAD_INHERIT_SCHED, but got %d\n", s); - exit (1); - } - - - if (pthread_attr_getschedpolicy (&a, &s) != 0) - { - puts ("1st attr_getschedpolicy failed"); - exit (1); - } - /* XXX What is the correct default value. */ - if (s != SCHED_OTHER && s != SCHED_FIFO && s != SCHED_RR) - { - puts ("incorrect default value for schedpolicy"); - exit (1); - } - - e = pthread_attr_setschedpolicy (&a, SCHED_RR); - if (e != 0) - { - puts ("1st attr_setschedpolicy failed"); - exit (1); - } - if (pthread_attr_getschedpolicy (&a, &s) != 0) - { - puts ("2nd attr_getschedpolicy failed"); - exit (1); - } - if (s != SCHED_RR) - { - printf ("schedpolicy set to SCHED_RR, but got %d\n", s); - exit (1); - } - - e = pthread_attr_setschedpolicy (&a, SCHED_FIFO); - if (e != 0) - { - puts ("2nd attr_setschedpolicy failed"); - exit (1); - } - if (pthread_attr_getschedpolicy (&a, &s) != 0) - { - puts ("3rd attr_getschedpolicy failed"); - exit (1); - } - if (s != SCHED_FIFO) - { - printf ("schedpolicy set to SCHED_FIFO, but got %d\n", s); - exit (1); - } - - e = pthread_attr_setschedpolicy (&a, SCHED_OTHER); - if (e != 0) - { - puts ("3rd attr_setschedpolicy failed"); - exit (1); - } - if (pthread_attr_getschedpolicy (&a, &s) != 0) - { - puts ("4th attr_getschedpolicy failed"); - exit (1); - } - if (s != SCHED_OTHER) - { - printf ("schedpolicy set to SCHED_OTHER, but got %d\n", s); - exit (1); - } - - - if (pthread_attr_getscope (&a, &s) != 0) - { - puts ("1st attr_getscope failed"); - exit (1); - } - /* XXX What is the correct default value. */ - if (s != PTHREAD_SCOPE_SYSTEM && s != PTHREAD_SCOPE_PROCESS) - { - puts ("incorrect default value for contentionscope"); - exit (1); - } - - e = pthread_attr_setscope (&a, PTHREAD_SCOPE_PROCESS); - if (e != ENOTSUP) - { - if (e != 0) - { - puts ("1st attr_setscope failed"); - exit (1); - } - if (pthread_attr_getscope (&a, &s) != 0) - { - puts ("2nd attr_getscope failed"); - exit (1); - } - if (s != PTHREAD_SCOPE_PROCESS) - { - printf ("\ -contentionscope set to PTHREAD_SCOPE_PROCESS, but got %d\n", s); - exit (1); - } - } - - e = pthread_attr_setscope (&a, PTHREAD_SCOPE_SYSTEM); - if (e != 0) - { - puts ("2nd attr_setscope failed"); - exit (1); - } - if (pthread_attr_getscope (&a, &s) != 0) - { - puts ("3rd attr_getscope failed"); - exit (1); - } - if (s != PTHREAD_SCOPE_SYSTEM) - { - printf ("contentionscope set to PTHREAD_SCOPE_SYSTEM, but got %d\n", s); - exit (1); - } - - char buf[1]; - e = pthread_attr_setstack (&a, buf, 1); - if (e != EINVAL) - { - puts ("setstack with size 1 did not produce EINVAL"); - exit (1); - } - - e = pthread_attr_setstacksize (&a, 1); - if (e != EINVAL) - { - puts ("setstacksize with size 1 did not produce EINVAL"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-attr3.c b/nptl/tst-attr3.c deleted file mode 100644 index bc23386daf..0000000000 --- a/nptl/tst-attr3.c +++ /dev/null @@ -1,421 +0,0 @@ -/* pthread_getattr_np test. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <error.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <stackinfo.h> - -static void * -tf (void *arg) -{ - pthread_attr_t a, *ap, a2; - int err; - void *result = NULL; - - if (arg == NULL) - { - ap = &a2; - err = pthread_attr_init (ap); - if (err) - { - error (0, err, "pthread_attr_init failed"); - return tf; - } - } - else - ap = (pthread_attr_t *) arg; - - err = pthread_getattr_np (pthread_self (), &a); - if (err) - { - error (0, err, "pthread_getattr_np failed"); - result = tf; - } - - int detachstate1, detachstate2; - err = pthread_attr_getdetachstate (&a, &detachstate1); - if (err) - { - error (0, err, "pthread_attr_getdetachstate failed"); - result = tf; - } - else - { - err = pthread_attr_getdetachstate (ap, &detachstate2); - if (err) - { - error (0, err, "pthread_attr_getdetachstate failed"); - result = tf; - } - else if (detachstate1 != detachstate2) - { - error (0, 0, "detachstate differs %d != %d", - detachstate1, detachstate2); - result = tf; - } - } - - void *stackaddr; - size_t stacksize; - err = pthread_attr_getstack (&a, &stackaddr, &stacksize); - if (err) - { - error (0, err, "pthread_attr_getstack failed"); - result = tf; - } - else if ((void *) &a < stackaddr - || (void *) &a >= stackaddr + stacksize) - { - error (0, 0, "pthread_attr_getstack returned range does not cover thread's stack"); - result = tf; - } - else - printf ("thread stack %p-%p (0x%zx)\n", stackaddr, stackaddr + stacksize, - stacksize); - - size_t guardsize1, guardsize2; - err = pthread_attr_getguardsize (&a, &guardsize1); - if (err) - { - error (0, err, "pthread_attr_getguardsize failed"); - result = tf; - } - else - { - err = pthread_attr_getguardsize (ap, &guardsize2); - if (err) - { - error (0, err, "pthread_attr_getguardsize failed"); - result = tf; - } - else if (guardsize1 != guardsize2) - { - error (0, 0, "guardsize differs %zd != %zd", - guardsize1, guardsize2); - result = tf; - } - else - printf ("thread guardsize %zd\n", guardsize1); - } - - int scope1, scope2; - err = pthread_attr_getscope (&a, &scope1); - if (err) - { - error (0, err, "pthread_attr_getscope failed"); - result = tf; - } - else - { - err = pthread_attr_getscope (ap, &scope2); - if (err) - { - error (0, err, "pthread_attr_getscope failed"); - result = tf; - } - else if (scope1 != scope2) - { - error (0, 0, "scope differs %d != %d", - scope1, scope2); - result = tf; - } - } - - int inheritsched1, inheritsched2; - err = pthread_attr_getinheritsched (&a, &inheritsched1); - if (err) - { - error (0, err, "pthread_attr_getinheritsched failed"); - result = tf; - } - else - { - err = pthread_attr_getinheritsched (ap, &inheritsched2); - if (err) - { - error (0, err, "pthread_attr_getinheritsched failed"); - result = tf; - } - else if (inheritsched1 != inheritsched2) - { - error (0, 0, "inheritsched differs %d != %d", - inheritsched1, inheritsched2); - result = tf; - } - } - - cpu_set_t c1, c2; - err = pthread_getaffinity_np (pthread_self (), sizeof (c1), &c1); - if (err == 0) - { - err = pthread_attr_getaffinity_np (&a, sizeof (c2), &c2); - if (err) - { - error (0, err, "pthread_attr_getaffinity_np failed"); - result = tf; - } - else if (memcmp (&c1, &c2, sizeof (c1))) - { - error (0, 0, "pthread_attr_getaffinity_np returned different CPU mask than pthread_getattr_np"); - result = tf; - } - } - - err = pthread_attr_destroy (&a); - if (err) - { - error (0, err, "pthread_attr_destroy failed"); - result = tf; - } - - if (ap == &a2) - { - err = pthread_attr_destroy (ap); - if (err) - { - error (0, err, "pthread_attr_destroy failed"); - result = tf; - } - } - - return result; -} - - -static int -do_test (void) -{ - int result = 0; - pthread_attr_t a; - cpu_set_t c1, c2; - - int err = pthread_attr_init (&a); - if (err) - { - error (0, err, "pthread_attr_init failed"); - result = 1; - } - - err = pthread_attr_getaffinity_np (&a, sizeof (c1), &c1); - if (err && err != ENOSYS) - { - error (0, err, "pthread_attr_getaffinity_np failed"); - result = 1; - } - - err = pthread_attr_destroy (&a); - if (err) - { - error (0, err, "pthread_attr_destroy failed"); - result = 1; - } - - err = pthread_getattr_np (pthread_self (), &a); - if (err) - { - error (0, err, "pthread_getattr_np failed"); - result = 1; - } - - int detachstate; - err = pthread_attr_getdetachstate (&a, &detachstate); - if (err) - { - error (0, err, "pthread_attr_getdetachstate failed"); - result = 1; - } - else if (detachstate != PTHREAD_CREATE_JOINABLE) - { - error (0, 0, "initial thread not joinable"); - result = 1; - } - - void *stackaddr; - size_t stacksize; - err = pthread_attr_getstack (&a, &stackaddr, &stacksize); - if (err) - { - error (0, err, "pthread_attr_getstack failed"); - result = 1; - } - else if ((void *) &a < stackaddr - || (void *) &a >= stackaddr + stacksize) - { - error (0, 0, "pthread_attr_getstack returned range does not cover main's stack"); - result = 1; - } - else - printf ("initial thread stack %p-%p (0x%zx)\n", stackaddr, - stackaddr + stacksize, stacksize); - - size_t guardsize; - err = pthread_attr_getguardsize (&a, &guardsize); - if (err) - { - error (0, err, "pthread_attr_getguardsize failed"); - result = 1; - } - else if (guardsize != 0) - { - error (0, 0, "pthread_attr_getguardsize returned %zd != 0", - guardsize); - result = 1; - } - - int scope; - err = pthread_attr_getscope (&a, &scope); - if (err) - { - error (0, err, "pthread_attr_getscope failed"); - result = 1; - } - else if (scope != PTHREAD_SCOPE_SYSTEM) - { - error (0, 0, "pthread_attr_getscope returned %d != PTHREAD_SCOPE_SYSTEM", - scope); - result = 1; - } - - int inheritsched; - err = pthread_attr_getinheritsched (&a, &inheritsched); - if (err) - { - error (0, err, "pthread_attr_getinheritsched failed"); - result = 1; - } - else if (inheritsched != PTHREAD_INHERIT_SCHED) - { - error (0, 0, "pthread_attr_getinheritsched returned %d != PTHREAD_INHERIT_SCHED", - inheritsched); - result = 1; - } - - err = pthread_getaffinity_np (pthread_self (), sizeof (c1), &c1); - if (err == 0) - { - err = pthread_attr_getaffinity_np (&a, sizeof (c2), &c2); - if (err) - { - error (0, err, "pthread_attr_getaffinity_np failed"); - result = 1; - } - else if (memcmp (&c1, &c2, sizeof (c1))) - { - error (0, 0, "pthread_attr_getaffinity_np returned different CPU mask than pthread_getattr_np"); - result = 1; - } - } - - err = pthread_attr_destroy (&a); - if (err) - { - error (0, err, "pthread_attr_destroy failed"); - result = 1; - } - - pthread_t th; - err = pthread_create (&th, NULL, tf, NULL); - if (err) - { - error (0, err, "pthread_create #1 failed"); - result = 1; - } - else - { - void *ret; - err = pthread_join (th, &ret); - if (err) - { - error (0, err, "pthread_join #1 failed"); - result = 1; - } - else if (ret != NULL) - result = 1; - } - - err = pthread_attr_init (&a); - if (err) - { - error (0, err, "pthread_attr_init failed"); - result = 1; - } - - err = pthread_create (&th, &a, tf, &a); - if (err) - { - error (0, err, "pthread_create #2 failed"); - result = 1; - } - else - { - void *ret; - err = pthread_join (th, &ret); - if (err) - { - error (0, err, "pthread_join #2 failed"); - result = 1; - } - else if (ret != NULL) - result = 1; - } - - err = pthread_attr_setguardsize (&a, 16 * sysconf (_SC_PAGESIZE)); - if (err) - { - error (0, err, "pthread_attr_setguardsize failed"); - result = 1; - } - - err = pthread_create (&th, &a, tf, &a); - if (err) - { - error (0, err, "pthread_create #3 failed"); - result = 1; - } - else - { - void *ret; - err = pthread_join (th, &ret); - if (err) - { - error (0, err, "pthread_join #3 failed"); - result = 1; - } - else if (ret != NULL) - result = 1; - } - - err = pthread_attr_destroy (&a); - if (err) - { - error (0, err, "pthread_attr_destroy failed"); - result = 1; - } - - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-backtrace1.c b/nptl/tst-backtrace1.c deleted file mode 100644 index e1871628d3..0000000000 --- a/nptl/tst-backtrace1.c +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (C) 2004-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <execinfo.h> -#include <pthread.h> -#include <stdio.h> - -#define BT_SIZE 64 -void *bt_array[BT_SIZE]; -int bt_cnt; - -int -do_bt (void) -{ - bt_cnt = backtrace (bt_array, BT_SIZE); - return 56; -} - -int -call_do_bt (void) -{ - return do_bt () + 1; -} - -void * -tf (void *arg) -{ - if (call_do_bt () != 57) - return (void *) 1L; - return NULL; -} - -int -do_test (void) -{ - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL)) - { - puts ("create failed"); - return 1; - } - - void *res; - if (pthread_join (th, &res)) - { - puts ("join failed"); - return 1; - } - - if (res != NULL) - { - puts ("thread failed"); - return 1; - } - - char **text = backtrace_symbols (bt_array, bt_cnt); - if (text == NULL) - { - puts ("backtrace_symbols failed"); - return 1; - } - - for (int i = 0; i < bt_cnt; ++i) - puts (text[i]); - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-bad-schedattr.c b/nptl/tst-bad-schedattr.c deleted file mode 100644 index 85d541b276..0000000000 --- a/nptl/tst-bad-schedattr.c +++ /dev/null @@ -1,97 +0,0 @@ -/* Test that pthread_create diagnoses invalid scheduling parameters. - Copyright (C) 2014-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - - -static void * -thread_function (void *arg) -{ - abort (); -} - - -static int -do_test (void) -{ -#if !defined SCHED_FIFO || !defined SCHED_OTHER - puts ("SCHED_FIFO or SCHED_OTHER not available at compile time"); - return 0; /* 77 */ -#else - - int err; - -#define TRY(func, arglist) \ - if ((err = func arglist) != 0) \ - { \ - printf ("%s: %s\n", #func, strerror (err)); \ - return 2; \ - } - - int fifo_max = sched_get_priority_max (SCHED_FIFO); - if (fifo_max == -1) - { - assert (errno == ENOTSUP || errno == ENOSYS); - puts ("SCHED_FIFO not supported, cannot test"); - return 0; /* 77 */ - } - - int other_max = sched_get_priority_max (SCHED_OTHER); - if (other_max == -1) - { - assert (errno == ENOTSUP || errno == ENOSYS); - puts ("SCHED_OTHER not supported, cannot test"); - return 0; /* 77 */ - } - - assert (fifo_max > other_max); - - pthread_attr_t attr; - TRY (pthread_attr_init, (&attr)); - TRY (pthread_attr_setinheritsched, (&attr, PTHREAD_EXPLICIT_SCHED)); - TRY (pthread_attr_setschedpolicy, (&attr, SCHED_FIFO)); - - /* This value is chosen so as to be valid for SCHED_FIFO but invalid for - SCHED_OTHER. */ - struct sched_param param = { .sched_priority = other_max + 1 }; - TRY (pthread_attr_setschedparam, (&attr, ¶m)); - - TRY (pthread_attr_setschedpolicy, (&attr, SCHED_OTHER)); - - /* Now ATTR has a sched_param that is invalid for its policy. */ - pthread_t th; - err = pthread_create (&th, &attr, &thread_function, NULL); - if (err != EINVAL) - { - printf ("pthread_create returned %d (%s), expected %d (EINVAL: %s)\n", - err, strerror (err), EINVAL, strerror (EINVAL)); - return 1; - } - - return 0; -#endif -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-barrier1.c b/nptl/tst-barrier1.c deleted file mode 100644 index b0e574fe1d..0000000000 --- a/nptl/tst-barrier1.c +++ /dev/null @@ -1,71 +0,0 @@ -/* Tests barrier initialization. - Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> - - -static int -do_test (void) -{ - pthread_barrier_t b; - int e; - int cnt; - - e = pthread_barrier_init (&b, NULL, 0); - if (e == 0) - { - puts ("barrier_init with count 0 succeeded"); - return 1; - } - if (e != EINVAL) - { - puts ("barrier_init with count 0 didn't return EINVAL"); - return 1; - } - - if (pthread_barrier_init (&b, NULL, 1) != 0) - { - puts ("real barrier_init failed"); - return 1; - } - - for (cnt = 0; cnt < 10; ++cnt) - { - e = pthread_barrier_wait (&b); - - if (e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait didn't return PTHREAD_BARRIER_SERIAL_THREAD"); - return 1; - } - } - - if (pthread_barrier_destroy (&b) != 0) - { - puts ("barrier_destroy failed"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-barrier2.c b/nptl/tst-barrier2.c deleted file mode 100644 index d55f704d78..0000000000 --- a/nptl/tst-barrier2.c +++ /dev/null @@ -1,185 +0,0 @@ -/* Tests process-shared barriers. - Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/wait.h> - - -static int -do_test (void) -{ - size_t ps = sysconf (_SC_PAGESIZE); - char tmpfname[] = "/tmp/tst-barrier2.XXXXXX"; - char data[ps]; - void *mem; - int fd; - pthread_barrier_t *b; - pthread_barrierattr_t a; - pid_t pid; - int serials = 0; - int cnt; - int status; - int p; - - fd = mkstemp (tmpfname); - if (fd == -1) - { - printf ("cannot open temporary file: %m\n"); - return 1; - } - - /* Make sure it is always removed. */ - unlink (tmpfname); - - /* Create one page of data. */ - memset (data, '\0', ps); - - /* Write the data to the file. */ - if (write (fd, data, ps) != (ssize_t) ps) - { - puts ("short write"); - return 1; - } - - mem = mmap (NULL, ps, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (mem == MAP_FAILED) - { - printf ("mmap failed: %m\n"); - return 1; - } - - b = (pthread_barrier_t *) (((uintptr_t) mem + __alignof (pthread_barrier_t)) - & ~(__alignof (pthread_barrier_t) - 1)); - - if (pthread_barrierattr_init (&a) != 0) - { - puts ("barrierattr_init failed"); - return 1; - } - - if (pthread_barrierattr_getpshared (&a, &p) != 0) - { - puts ("1st barrierattr_getpshared failed"); - return 1; - } - - if (p != PTHREAD_PROCESS_PRIVATE) - { - puts ("default pshared value wrong"); - return 1; - } - - if (pthread_barrierattr_setpshared (&a, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("barrierattr_setpshared failed"); - return 1; - } - - if (pthread_barrierattr_getpshared (&a, &p) != 0) - { - puts ("2nd barrierattr_getpshared failed"); - return 1; - } - - if (p != PTHREAD_PROCESS_SHARED) - { - puts ("pshared value after setpshared call wrong"); - return 1; - } - - if (pthread_barrier_init (b, &a, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - if (pthread_barrierattr_destroy (&a) != 0) - { - puts ("barrierattr_destroy failed"); - return 1; - } - - puts ("going to fork now"); - pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - return 1; - } - - /* Just to be sure we don't hang forever. */ - alarm (4); - -#define N 30 - for (cnt = 0; cnt < N; ++cnt) - { - int e; - - e = pthread_barrier_wait (b); - if (e == PTHREAD_BARRIER_SERIAL_THREAD) - ++serials; - else if (e != 0) - { - printf ("%s: barrier_wait returned value %d != 0 and PTHREAD_BARRIER_SERIAL_THREAD\n", - pid == 0 ? "child" : "parent", e); - return 1; - } - } - - alarm (0); - - printf ("%s: was %d times the serial thread\n", - pid == 0 ? "child" : "parent", serials); - - if (pid == 0) - /* The child. Pass the number of times we had the serializing - thread back to the parent. */ - exit (serials); - - if (waitpid (pid, &status, 0) != pid) - { - puts ("waitpid failed"); - return 1; - } - - if (!WIFEXITED (status)) - { - puts ("child exited abnormally"); - return 1; - } - - if (WEXITSTATUS (status) + serials != N) - { - printf ("total number of serials is %d, expected %d\n", - WEXITSTATUS (status) + serials, N); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-barrier3.c b/nptl/tst-barrier3.c deleted file mode 100644 index ceec90cd2e..0000000000 --- a/nptl/tst-barrier3.c +++ /dev/null @@ -1,152 +0,0 @@ -/* Test of POSIX barriers. - Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#define NTHREADS 20 - -#define ROUNDS 20 - -static pthread_barrier_t barriers[NTHREADS]; - -static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; -static int counters[NTHREADS]; -static int serial[NTHREADS]; - -static void * -worker (void *arg) -{ - void *result = NULL; - int nr = (long int) arg; - int i; - - for (i = 0; i < ROUNDS; ++i) - { - int j; - int retval; - - if (nr == 0) - { - memset (counters, '\0', sizeof (counters)); - memset (serial, '\0', sizeof (serial)); - } - - retval = pthread_barrier_wait (&barriers[NTHREADS - 1]); - if (retval != 0 && retval != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("thread %d failed to wait for all the others\n", nr); - result = (void *) 1; - } - - for (j = nr; j < NTHREADS; ++j) - { - /* Increment the counter for this round. */ - pthread_mutex_lock (&lock); - ++counters[j]; - pthread_mutex_unlock (&lock); - - /* Wait for the rest. */ - retval = pthread_barrier_wait (&barriers[j]); - - /* Test the result. */ - if (nr == 0 && counters[j] != j + 1) - { - printf ("barrier in round %d released but count is %d\n", - j, counters[j]); - result = (void *) 1; - } - - if (retval != 0) - { - if (retval != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("thread %d in round %d has nonzero return value != PTHREAD_BARRIER_SERIAL_THREAD\n", - nr, j); - result = (void *) 1; - } - else - { - pthread_mutex_lock (&lock); - ++serial[j]; - pthread_mutex_unlock (&lock); - } - } - - /* Wait for the rest again. */ - retval = pthread_barrier_wait (&barriers[j]); - - /* Now we can check whether exactly one thread was serializing. */ - if (nr == 0 && serial[j] != 1) - { - printf ("not exactly one serial thread in round %d\n", j); - result = (void *) 1; - } - } - } - - return result; -} - - -#define TEST_FUNCTION do_test () -#define TIMEOUT 60 -static int -do_test (void) -{ - pthread_t threads[NTHREADS]; - int i; - void *res; - int result = 0; - - /* Initialized the barrier variables. */ - for (i = 0; i < NTHREADS; ++i) - if (pthread_barrier_init (&barriers[i], NULL, i + 1) != 0) - { - printf ("Failed to initialize barrier %d\n", i); - exit (1); - } - - /* Start the threads. */ - for (i = 0; i < NTHREADS; ++i) - if (pthread_create (&threads[i], NULL, worker, (void *) (long int) i) != 0) - { - printf ("Failed to start thread %d\n", i); - exit (1); - } - - /* And wait for them. */ - for (i = 0; i < NTHREADS; ++i) - if (pthread_join (threads[i], &res) != 0 || res != NULL) - { - printf ("thread %d returned a failure\n", i); - result = 1; - } - else - printf ("joined threads %d\n", i); - - if (result == 0) - puts ("all OK"); - - return result; -} - -#include "../test-skeleton.c" diff --git a/nptl/tst-barrier4.c b/nptl/tst-barrier4.c deleted file mode 100644 index dfb4b1432b..0000000000 --- a/nptl/tst-barrier4.c +++ /dev/null @@ -1,121 +0,0 @@ -/* This tests destruction of a barrier right after waiting on it. - Copyright (C) 2004-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - - -static pthread_barrier_t b1; -static pthread_barrier_t b2; - - -#define N 20 - -static void * -tf (void *arg) -{ - int round = 0; - - while (round++ < 30) - { - if (pthread_barrier_wait (&b1) == PTHREAD_BARRIER_SERIAL_THREAD) - { - pthread_barrier_destroy (&b1); - if (pthread_barrier_init (&b1, NULL, N) != 0) - { - puts ("tf: 1st barrier_init failed"); - exit (1); - } - } - - if (pthread_barrier_wait (&b2) == PTHREAD_BARRIER_SERIAL_THREAD) - { - pthread_barrier_destroy (&b2); - if (pthread_barrier_init (&b2, NULL, N) != 0) - { - puts ("tf: 2nd barrier_init failed"); - exit (1); - } - } - } - - return NULL; -} - - -static int -do_test (void) -{ - pthread_attr_t at; - int cnt; - - if (pthread_attr_init (&at) != 0) - { - puts ("attr_init failed"); - return 1; - } - - if (pthread_attr_setstacksize (&at, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - if (pthread_barrier_init (&b1, NULL, N) != 0) - { - puts ("1st barrier_init failed"); - return 1; - } - - if (pthread_barrier_init (&b2, NULL, N) != 0) - { - puts ("2nd barrier_init failed"); - return 1; - } - - pthread_t th[N - 1]; - for (cnt = 0; cnt < N - 1; ++cnt) - if (pthread_create (&th[cnt], &at, tf, NULL) != 0) - { - puts ("pthread_create failed"); - return 1; - } - - if (pthread_attr_destroy (&at) != 0) - { - puts ("attr_destroy failed"); - return 1; - } - - tf (NULL); - - for (cnt = 0; cnt < N - 1; ++cnt) - if (pthread_join (th[cnt], NULL) != 0) - { - puts ("pthread_join failed"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-barrier5.c b/nptl/tst-barrier5.c deleted file mode 100644 index 4311aec22f..0000000000 --- a/nptl/tst-barrier5.c +++ /dev/null @@ -1,145 +0,0 @@ -/* This tests the barrier reset mechanism. - Copyright (C) 2004-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <internaltypes.h> - - -static pthread_barrier_t b1; -static pthread_barrier_t b2; - - -#define N 20 -#define ROUNDS_PER_RUN 20 -#define START ((BARRIER_IN_THRESHOLD / N - ROUNDS_PER_RUN / 2) * N) - -static void * -tf (void *arg) -{ - int runs = 0; - - while (runs++ < 30) - { - /* In each run, we execute a number of rounds and initialize the barrier - so that we will go over the reset threshold with those rounds. */ - for (int rounds = 0; rounds < ROUNDS_PER_RUN; rounds++) - pthread_barrier_wait (&b1); - - if (pthread_barrier_wait (&b1) == PTHREAD_BARRIER_SERIAL_THREAD) - { - pthread_barrier_destroy (&b1); - if (pthread_barrier_init (&b1, NULL, N) != 0) - { - puts ("tf: 1st barrier_init failed"); - exit (1); - } - puts ("b1 reinitialized"); - /* Trigger a reset. */ - struct pthread_barrier *bar = (struct pthread_barrier *) &b1; - bar->in = START; - bar->out = START; - /* We deliberately don't set bar->current_round so that we also - test whether the helping for the updates of current_round - works correctly. */ - } - - /* Same as above, just for b2. */ - for (int rounds = 0; rounds < ROUNDS_PER_RUN; rounds++) - pthread_barrier_wait (&b2); - - if (pthread_barrier_wait (&b2) == PTHREAD_BARRIER_SERIAL_THREAD) - { - pthread_barrier_destroy (&b2); - if (pthread_barrier_init (&b2, NULL, N) != 0) - { - puts ("tf: 2nd barrier_init failed"); - exit (1); - } - puts ("b2 reinitialized"); - /* Trigger a reset. See above. */ - struct pthread_barrier *bar = (struct pthread_barrier *) &b2; - bar->in = START; - bar->out = START; - } - } - - return NULL; -} - - -static int -do_test (void) -{ - pthread_attr_t at; - int cnt; - - if (pthread_attr_init (&at) != 0) - { - puts ("attr_init failed"); - return 1; - } - - if (pthread_attr_setstacksize (&at, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - if (pthread_barrier_init (&b1, NULL, N) != 0) - { - puts ("1st barrier_init failed"); - return 1; - } - - if (pthread_barrier_init (&b2, NULL, N) != 0) - { - puts ("2nd barrier_init failed"); - return 1; - } - - pthread_t th[N - 1]; - for (cnt = 0; cnt < N - 1; ++cnt) - if (pthread_create (&th[cnt], &at, tf, NULL) != 0) - { - puts ("pthread_create failed"); - return 1; - } - - if (pthread_attr_destroy (&at) != 0) - { - puts ("attr_destroy failed"); - return 1; - } - - tf (NULL); - - for (cnt = 0; cnt < N - 1; ++cnt) - if (pthread_join (th[cnt], NULL) != 0) - { - puts ("pthread_join failed"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-basic1.c b/nptl/tst-basic1.c deleted file mode 100644 index 2296ac7ecb..0000000000 --- a/nptl/tst-basic1.c +++ /dev/null @@ -1,82 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <unistd.h> -#include <sys/types.h> - - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static pid_t pid; - -static void * -tf (void *a) -{ - if (getpid () != pid) - { - write_message ("pid mismatch\n"); - _exit (1); - } - - return a; -} - - -int -do_test (void) -{ - pid = getpid (); - -#define N 2 - pthread_t t[N]; - int i; - - for (i = 0; i < N; ++i) - if (pthread_create (&t[i], NULL, tf, (void *) (long int) (i + 1)) != 0) - { - write_message ("create failed\n"); - _exit (1); - } - else - printf ("created thread %d\n", i); - - for (i = 0; i < N; ++i) - { - void *r; - int e; - if ((e = pthread_join (t[i], &r)) != 0) - { - printf ("join failed: %d\n", e); - _exit (1); - } - else if (r != (void *) (long int) (i + 1)) - { - write_message ("result wrong\n"); - _exit (1); - } - else - printf ("joined thread %d\n", i); - } - - return 0; -} diff --git a/nptl/tst-basic2.c b/nptl/tst-basic2.c deleted file mode 100644 index fc07506688..0000000000 --- a/nptl/tst-basic2.c +++ /dev/null @@ -1,120 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdint.h> -#include <stdlib.h> -#include <unistd.h> - - -#define N 20 - -static pthread_t th[N]; -static pthread_mutex_t lock[N]; - - -static void *tf (void *a) -{ - uintptr_t idx = (uintptr_t) a; - - pthread_mutex_lock (&lock[idx]); - - return pthread_equal (pthread_self (), th[idx]) ? NULL : (void *) 1l; -} - - -int -do_test (void) -{ - if (pthread_equal (pthread_self (), pthread_self ()) == 0) - { - puts ("pthread_equal (pthread_self (), pthread_self ()) failed"); - exit (1); - } - - pthread_attr_t at; - - if (pthread_attr_init (&at) != 0) - { - puts ("attr_init failed"); - return 1; - } - - if (pthread_attr_setstacksize (&at, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - int i; - for (i = 0; i < N; ++i) - { - if (pthread_mutex_init (&lock[i], NULL) != 0) - { - puts ("mutex_init failed"); - exit (1); - } - - if (pthread_mutex_lock (&lock[i]) != 0) - { - puts ("mutex_lock failed"); - exit (1); - } - - if (pthread_create (&th[i], &at, tf, (void *) (long int) i) != 0) - { - puts ("create failed"); - exit (1); - } - - if (pthread_mutex_unlock (&lock[i]) != 0) - { - puts ("mutex_unlock failed"); - exit (1); - } - - printf ("created thread %d\n", i); - } - - if (pthread_attr_destroy (&at) != 0) - { - puts ("attr_destroy failed"); - return 1; - } - - int result = 0; - for (i = 0; i < N; ++i) - { - void *r; - int e; - if ((e = pthread_join (th[i], &r)) != 0) - { - printf ("join failed: %d\n", e); - _exit (1); - } - else if (r != NULL) - result = 1; - } - - return result; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-basic3.c b/nptl/tst-basic3.c deleted file mode 100644 index c753f1ebb1..0000000000 --- a/nptl/tst-basic3.c +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static int nrunning = 1; - - -static void -final_test (void) -{ - puts ("final_test has been called"); - -#define THE_SIGNAL SIGUSR1 - kill (getpid (), SIGUSR1); -} - - -static void * -tf (void *a) -{ - if (pthread_join ((pthread_t) a, NULL) != 0) - { - printf ("join failed while %d are running\n", nrunning); - _exit (1); - } - - printf ("%2d left\n", --nrunning); - - return NULL; -} - - -int -do_test (void) -{ -#define N 20 - pthread_t t[N]; - pthread_t last = pthread_self (); - int i; - - atexit (final_test); - - printf ("starting %d + 1 threads\n", N); - for (i = 0; i < N; ++i) - { - if (pthread_create (&t[i], NULL, tf, (void *) last) != 0) - { - puts ("create failed"); - _exit (1); - } - - ++nrunning; - - last = t[i]; - } - - printf ("%2d left\n", --nrunning); - - pthread_exit (NULL); -} - - -#define EXPECTED_SIGNAL THE_SIGNAL -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-basic4.c b/nptl/tst-basic4.c deleted file mode 100644 index 97a8b2c414..0000000000 --- a/nptl/tst-basic4.c +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/wait.h> - - -static void -final_test (void) -{ - puts ("final_test has been called"); - -#define THE_SIGNAL SIGUSR1 - kill (getpid (), SIGUSR1); -} - - -static void * -tf (void *a) -{ - pid_t pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - exit (1); - } - - if (pid == 0) - { - atexit (final_test); - - pthread_exit (NULL); - } - - int r; - int e = TEMP_FAILURE_RETRY (waitpid (pid, &r, 0)); - if (e != pid) - { - puts ("waitpid failed"); - exit (1); - } - - if (! WIFSIGNALED (r)) - { - puts ("child not signled"); - exit (1); - } - - if (WTERMSIG (r) != THE_SIGNAL) - { - puts ("child's termination signal wrong"); - exit (1); - } - - return NULL; -} - - -int -do_test (void) -{ - pthread_t th; - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - _exit (1); - } - - if (pthread_join (th, NULL) != 0) - { - puts ("join failed"); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-basic5.c b/nptl/tst-basic5.c deleted file mode 100644 index 8b9e03516f..0000000000 --- a/nptl/tst-basic5.c +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - - - -int -do_test (void) -{ - int c = pthread_getconcurrency (); - if (c != 0) - { - puts ("initial concurrencylevel wrong"); - exit (1); - } - - if (pthread_setconcurrency (1) != 0) - { - puts ("setconcurrency failed"); - exit (1); - } - - c = pthread_getconcurrency (); - if (c != 1) - { - puts ("getconcurrency didn't return the value previous set"); - exit (1); - } - - int e = pthread_setconcurrency (-1); - if (e == 0) - { - puts ("setconcurrency of negative value didn't failed"); - exit (1); - } - if (e != EINVAL) - { - puts ("setconcurrency didn't return EINVAL for negative value"); - exit (1); - } - - c = pthread_getconcurrency (); - if (c != 1) - { - puts ("invalid getconcurrency changed level"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-basic6.c b/nptl/tst-basic6.c deleted file mode 100644 index 58a715b4be..0000000000 --- a/nptl/tst-basic6.c +++ /dev/null @@ -1,131 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - - -static char *p; - -static pthread_barrier_t b; -#define BT \ - e = pthread_barrier_wait (&b); \ - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) \ - { \ - puts ("barrier_wait failed"); \ - exit (1); \ - } - - -static void * -tf (void *a) -{ - int e; - - BT; - - char *p2 = getcwd (NULL, 0); - if (p2 == NULL) - { - puts ("2nd getcwd failed"); - exit (1); - } - - if (strcmp (p, p2) != 0) - { - printf ("initial cwd mismatch: \"%s\" vs \"%s\"\n", p, p2); - exit (1); - } - - free (p); - free (p2); - - if (chdir ("..") != 0) - { - puts ("chdir failed"); - exit (1); - } - - p = getcwd (NULL, 0); - if (p == NULL) - { - puts ("getcwd failed"); - exit (1); - } - - return a; -} - - -int -do_test (void) -{ - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - p = getcwd (NULL, 0); - if (p == NULL) - { - puts ("getcwd failed"); - exit (1); - } - - int e; - BT; - - if (pthread_join (th, NULL) != 0) - { - puts ("join failed"); - exit (1); - } - - char *p2 = getcwd (NULL, 0); - if (p2 == NULL) - { - puts ("2nd getcwd failed"); - exit (1); - } - - if (strcmp (p, p2) != 0) - { - printf ("cwd after chdir mismatch: \"%s\" vs \"%s\"\n", p, p2); - exit (1); - } - - free (p); - free (p2); - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-basic7.c b/nptl/tst-basic7.c deleted file mode 100644 index 29a2461efe..0000000000 --- a/nptl/tst-basic7.c +++ /dev/null @@ -1,75 +0,0 @@ -#include <errno.h> -#include <limits.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/resource.h> - -static void use_stack (size_t needed); - -void (*use_stack_ptr) (size_t) = use_stack; - -static void -use_stack (size_t needed) -{ - size_t sz = sysconf (_SC_PAGESIZE); - char *buf = alloca (sz); - memset (buf, '\0', sz); - - if (needed > sz) - use_stack_ptr (needed - sz); -} - -static void -use_up_memory (void) -{ - struct rlimit rl; - getrlimit (RLIMIT_AS, &rl); - rl.rlim_cur = 10 * 1024 * 1024; - setrlimit (RLIMIT_AS, &rl); - - char *c; - int PAGESIZE = getpagesize (); - while (1) - { - c = mmap (NULL, PAGESIZE, PROT_NONE, MAP_ANON | MAP_PRIVATE, -1, 0); - if (c == MAP_FAILED) - break; - } -} - -static void * -child (void *arg) -{ - sleep (1); - return arg; -} - -static int -do_test (void) -{ - int err; - pthread_t tid; - - /* Allocate the memory needed for the stack. */ - use_stack_ptr (PTHREAD_STACK_MIN); - - use_up_memory (); - - err = pthread_create (&tid, NULL, child, NULL); - if (err != 0) - { - printf ("pthread_create returns %d: %s\n", err, - err == EAGAIN ? "OK" : "FAIL"); - return err != EAGAIN; - } - - /* We did not fail to allocate memory despite the preparation. Oh well. */ - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel-self-cancelstate.c b/nptl/tst-cancel-self-cancelstate.c deleted file mode 100644 index 5f6fbefaf5..0000000000 --- a/nptl/tst-cancel-self-cancelstate.c +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright (C) 2012-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include "tst-cancel-self-cleanup.c" - - -static int -do_test (void) -{ - int ret = 0; - volatile int should_fail = 1; - - pthread_cleanup_push (cleanup, (void *) &should_fail); - - if ((ret = pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, NULL)) != 0) - { - printf ("setcancelstate(disable) failed: %s\n", strerror (ret)); - exit (1); - } - - if ((ret = pthread_cancel (pthread_self ())) != 0) - { - printf ("cancel failed: %s\n", strerror (ret)); - exit (1); - } - - usleep (100); - should_fail = 0; - - if ((ret = pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL)) != 0) - { - printf ("setcancelstate(enable) failed: %s\n", strerror (ret)); - exit (1); - } - - /* The write syscall within this printf should give us our cancellation - point. */ - printf ("Could not cancel self.\n"); - pthread_cleanup_pop (0); - - return 1; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel-self-canceltype.c b/nptl/tst-cancel-self-canceltype.c deleted file mode 100644 index 155e1380f9..0000000000 --- a/nptl/tst-cancel-self-canceltype.c +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (C) 2012-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include "tst-cancel-self-cleanup.c" - - -static int -do_test (void) -{ - int ret = 0, should_fail = 0; - - pthread_cleanup_push (cleanup, &should_fail); - - if ((ret = pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL)) != 0) - { - printf ("setcanceltype failed: %s\n", strerror (ret)); - exit (1); - } - - if ((ret = pthread_cancel (pthread_self ())) != 0) - { - printf ("cancel failed: %s\n", strerror (ret)); - exit (1); - } - - /* Wait to be canceled. Don't give any cancellation points to play with. */ - while (1); - pthread_cleanup_pop (0); - - return 1; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel-self-cleanup.c b/nptl/tst-cancel-self-cleanup.c deleted file mode 100644 index d22941c8c9..0000000000 --- a/nptl/tst-cancel-self-cleanup.c +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright (C) 2012-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -static void -cleanup (void *cleanup_should_fail) -{ - printf ("Main thread got cancelled and is being cleaned up now\n"); - exit (*(int *)cleanup_should_fail); -} diff --git a/nptl/tst-cancel-self-testcancel.c b/nptl/tst-cancel-self-testcancel.c deleted file mode 100644 index 1af71ed5b1..0000000000 --- a/nptl/tst-cancel-self-testcancel.c +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 2012-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include "tst-cancel-self-cleanup.c" - - -static int -do_test (void) -{ - int ret = 0, should_fail = 0; - - pthread_cleanup_push (cleanup, &should_fail); - if ((ret = pthread_cancel (pthread_self ())) != 0) - { - printf ("cancel failed: %s\n", strerror (ret)); - exit (1); - } - - pthread_testcancel (); - - printf ("Could not cancel self.\n"); - pthread_cleanup_pop (0); - - return 1; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel-self.c b/nptl/tst-cancel-self.c deleted file mode 100644 index de02bc63f3..0000000000 --- a/nptl/tst-cancel-self.c +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 2012-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include "tst-cancel-self-cleanup.c" - - -static int -do_test (void) -{ - int ret = 0, should_fail = 0; - - pthread_cleanup_push (cleanup, &should_fail); - if ((ret = pthread_cancel (pthread_self ())) != 0) - { - printf ("cancel failed: %s\n", strerror (ret)); - exit (1); - } - - /* The write syscall within this printf should give us our cancellation - point. */ - printf ("Could not cancel self.\n"); - pthread_cleanup_pop (0); - - return 1; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel-wrappers.sh b/nptl/tst-cancel-wrappers.sh deleted file mode 100644 index 1795e3d86e..0000000000 --- a/nptl/tst-cancel-wrappers.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/sh -# Test whether all cancelable functions are cancelable. -# Copyright (C) 2002-2017 Free Software Foundation, Inc. -# This file is part of the GNU C Library. -# Contributed by Jakub Jelinek <jakub@redhat.com>, 2002. - -# The GNU C Library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. - -# The GNU C Library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. - -# You should have received a copy of the GNU Lesser General Public -# License along with the GNU C Library; if not, see -# <http://www.gnu.org/licenses/>. - -NM="$1"; shift -while [ $# -gt 0 ]; do - ( $NM -P $1; echo 'end[end]:' ) | gawk ' BEGIN { -C["accept"]=1 -C["close"]=1 -C["connect"]=1 -C["creat"]=1 -C["fcntl"]=1 -C["fdatasync"]=1 -C["fsync"]=1 -C["msgrcv"]=1 -C["msgsnd"]=1 -C["msync"]=1 -C["nanosleep"]=1 -C["open"]=1 -C["open64"]=1 -C["pause"]=1 -C["poll"]=1 -C["pread"]=1 -C["pread64"]=1 -C["pselect"]=1 -C["pwrite"]=1 -C["pwrite64"]=1 -C["read"]=1 -C["readv"]=1 -C["recv"]=1 -C["recvfrom"]=1 -C["recvmsg"]=1 -C["select"]=1 -C["send"]=1 -C["sendmsg"]=1 -C["sendto"]=1 -C["sigpause"]=1 -C["sigsuspend"]=1 -C["sigwait"]=1 -C["sigwaitinfo"]=1 -C["tcdrain"]=1 -C["wait"]=1 -C["waitid"]=1 -C["waitpid"]=1 -C["write"]=1 -C["writev"]=1 -C["__xpg_sigpause"]=1 -} -/:$/ { - if (seen) - { - if (!seen_enable || !seen_disable) - { - printf "in '$1'(%s) %s'\''s cancellation missing\n", object, seen - ret = 1 - } - } - seen="" - seen_enable="" - seen_disable="" - object=gensub(/^.*\[(.*)\]:$/, "\\1", 1, $0) - next -} -{ - if (C[$1] && $2 ~ /^[TW]$/) - seen=$1 - else if ($1 ~ /^([.]|)__(libc|pthread)_enable_asynccancel$/ && $2 == "U") - seen_enable=1 - else if ($1 ~ /^([.]|)__(libc|pthread)_disable_asynccancel$/ && $2 == "U") - seen_disable=1 -} -END { - exit ret -}' || exit - shift -done diff --git a/nptl/tst-cancel1.c b/nptl/tst-cancel1.c deleted file mode 100644 index 99454e33bd..0000000000 --- a/nptl/tst-cancel1.c +++ /dev/null @@ -1,162 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - - -static pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER; -static pthread_mutex_t m2 = PTHREAD_MUTEX_INITIALIZER; - -static int cntr; - - -static void -cleanup (void *arg) -{ - if (arg != (void *) 42l) - cntr = 42; - else - cntr = 1; -} - - -static void * -tf (void *arg) -{ - /* Ignore all signals. This must not have any effect on delivering - the cancellation signal. */ - sigset_t ss; - - sigfillset (&ss); - - if (pthread_sigmask (SIG_BLOCK, &ss, NULL) != 0) - { - puts ("pthread_sigmask failed"); - exit (1); - } - - pthread_cleanup_push (cleanup, (void *) 42l); - - int err = pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL); - if (err != 0) - { - printf ("setcanceltype failed: %s\n", strerror (err)); - exit (1); - } - /* The following code is not standard compliant: the mutex functions - must not be called with asynchronous cancellation enabled. */ - - err = pthread_mutex_unlock (&m2); - if (err != 0) - { - printf ("child: mutex_unlock failed: %s\n", strerror (err)); - exit (1); - } - - err = pthread_mutex_lock (&m1); - if (err != 0) - { - printf ("child: 1st mutex_lock failed: %s\n", strerror (err)); - exit (1); - } - - /* We should never come here. */ - - pthread_cleanup_pop (0); - - return NULL; -} - - -static int -do_test (void) -{ - int err; - pthread_t th; - int result = 0; - void *retval; - - /* Get the mutexes. */ - err = pthread_mutex_lock (&m1); - if (err != 0) - { - printf ("parent: 1st mutex_lock failed: %s\n", strerror (err)); - return 1; - } - err = pthread_mutex_lock (&m2); - if (err != 0) - { - printf ("parent: 2nd mutex_lock failed: %s\n", strerror (err)); - return 1; - } - - err = pthread_create (&th, NULL, tf, NULL); - if (err != 0) - { - printf ("create failed: %s\n", strerror (err)); - return 1; - } - - err = pthread_mutex_lock (&m2); - if (err != 0) - { - printf ("parent: 3rd mutex_lock failed: %s\n", strerror (err)); - return 1; - } - - err = pthread_cancel (th); - if (err != 0) - { - printf ("cancel failed: %s\n", strerror (err)); - return 1; - } - - err = pthread_join (th, &retval); - if (err != 0) - { - printf ("join failed: %s\n", strerror (err)); - return 1; - } - - if (retval != PTHREAD_CANCELED) - { - printf ("wrong return value: %p\n", retval); - result = 1; - } - - if (cntr == 42) - { - puts ("cleanup handler called with wrong argument"); - result = 1; - } - else if (cntr != 1) - { - puts ("cleanup handling not called"); - result = 1; - } - - return result; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel10.c b/nptl/tst-cancel10.c deleted file mode 100644 index 5fb6e091dc..0000000000 --- a/nptl/tst-cancel10.c +++ /dev/null @@ -1,125 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - - -static void -cleanup (void *arg) -{ - /* Just for fun. */ - if (pthread_cancel (pthread_self ()) != 0) - { - puts ("cleanup: cancel failed"); - exit (1); - } - - printf ("cleanup for %ld\n", (long int) arg); -} - - -static void * -tf (void *arg) -{ - long int n = (long int) arg; - - pthread_cleanup_push (cleanup, arg); - - if (pthread_setcanceltype ((n & 1) == 0 - ? PTHREAD_CANCEL_DEFERRED - : PTHREAD_CANCEL_ASYNCHRONOUS, NULL) != 0) - { - puts ("setcanceltype failed"); - exit (1); - } - - if (pthread_cancel (pthread_self ()) != 0) - { - puts ("cancel failed"); - exit (1); - } - - pthread_testcancel (); - - /* We should never come here. */ - - pthread_cleanup_pop (0); - - return NULL; -} - - -static int -do_test (void) -{ - pthread_attr_t at; - - if (pthread_attr_init (&at) != 0) - { - puts ("attr_init failed"); - return 1; - } - - if (pthread_attr_setstacksize (&at, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - -#define N 20 - int i; - pthread_t th[N]; - - for (i = 0; i < N; ++i) - if (pthread_create (&th[i], &at, tf, (void *) (long int) i) != 0) - { - puts ("create failed"); - exit (1); - } - - if (pthread_attr_destroy (&at) != 0) - { - puts ("attr_destroy failed"); - return 1; - } - - for (i = 0; i < N; ++i) - { - void *r; - if (pthread_join (th[i], &r) != 0) - { - puts ("join failed"); - exit (1); - } - - if (r != PTHREAD_CANCELED) - { - puts ("thread not canceled"); - exit (1); - } - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel11.c b/nptl/tst-cancel11.c deleted file mode 100644 index f5ebab012b..0000000000 --- a/nptl/tst-cancel11.c +++ /dev/null @@ -1,122 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - - -static pthread_barrier_t bar; -static int fd[2]; - - -static void -cleanup (void *arg) -{ - static int ncall; - - if (++ncall != 1) - { - puts ("second call to cleanup"); - exit (1); - } - - printf ("cleanup call #%d\n", ncall); -} - - -static void * -tf (void *arg) -{ - pthread_cleanup_push (cleanup, NULL); - - int e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("tf: 1st barrier_wait failed"); - exit (1); - } - - /* This call should block and be cancelable. */ - char buf[20]; - read (fd[0], buf, sizeof (buf)); - - pthread_cleanup_pop (0); - - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - - if (pthread_barrier_init (&bar, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - if (pipe (fd) != 0) - { - puts ("pipe failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - int e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("1st barrier_wait failed"); - exit (1); - } - - if (pthread_cancel (th) != 0) - { - puts ("1st cancel failed"); - exit (1); - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("join failed"); - exit (1); - } - - if (r != PTHREAD_CANCELED) - { - puts ("thread not canceled"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel12.c b/nptl/tst-cancel12.c deleted file mode 100644 index ff8c4241a4..0000000000 --- a/nptl/tst-cancel12.c +++ /dev/null @@ -1,123 +0,0 @@ -/* Test sem_wait cancellation for uncontended case. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <semaphore.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - - -static pthread_barrier_t bar; -static sem_t sem; - - -static void -cleanup (void *arg) -{ - static int ncall; - - if (++ncall != 1) - { - puts ("second call to cleanup"); - exit (1); - } -} - - -static void * -tf (void *arg) -{ - pthread_cleanup_push (cleanup, NULL); - - int e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("error: tf: 1st barrier_wait failed"); - exit (1); - } - - /* This call should be cancelable. */ - sem_wait (&sem); - - pthread_cleanup_pop (0); - - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - - if (pthread_barrier_init (&bar, NULL, 2) != 0) - { - puts ("error: barrier_init failed"); - exit (1); - } - - /* A value higher than 0 will check for uncontended pthread cancellation, - where the sem_wait operation will return immediatelly. */ - if (sem_init (&sem, 0, 1) != 0) - { - puts ("error: sem_init failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("error: create failed"); - exit (1); - } - - if (pthread_cancel (th) != 0) - { - puts ("error: pthread_cancel failed"); - exit (1); - } - - int e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("error: 1st barrier_wait failed"); - exit (1); - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("error: pthread_join failed"); - exit (1); - } - - if (r != PTHREAD_CANCELED) - { - puts ("error: thread not canceled"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel13.c b/nptl/tst-cancel13.c deleted file mode 100644 index e6362628c9..0000000000 --- a/nptl/tst-cancel13.c +++ /dev/null @@ -1,127 +0,0 @@ -/* Test sem_wait cancellation for contended case. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <semaphore.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - - -static pthread_barrier_t bar; -static sem_t sem; - - -static void -cleanup (void *arg) -{ - static int ncall; - - if (++ncall != 1) - { - puts ("second call to cleanup"); - exit (1); - } -} - - -static void * -tf (void *arg) -{ - pthread_cleanup_push (cleanup, NULL); - - int e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("error: tf: 1st barrier_wait failed"); - exit (1); - } - - /* This call should block and be cancelable. */ - sem_wait (&sem); - - pthread_cleanup_pop (0); - - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - - if (pthread_barrier_init (&bar, NULL, 2) != 0) - { - puts ("error: barrier_init failed"); - exit (1); - } - - /* A value equal to 0 will check for contended pthread cancellation, - where the sem_wait operation will block. */ - if (sem_init (&sem, 0, 0) != 0) - { - puts ("error: sem_init failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("error: create failed"); - exit (1); - } - - int e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("error: 1st barrier_wait failed"); - exit (1); - } - - /* Give the child a chance to go to sleep in sem_wait. */ - sleep (1); - - /* Check whether cancellation is honored when waiting in sem_wait. */ - if (pthread_cancel (th) != 0) - { - puts ("error: 1st cancel failed"); - exit (1); - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("error: join failed"); - exit (1); - } - - if (r != PTHREAD_CANCELED) - { - puts ("thread not canceled"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel14.c b/nptl/tst-cancel14.c deleted file mode 100644 index 75e2c3b3ab..0000000000 --- a/nptl/tst-cancel14.c +++ /dev/null @@ -1,133 +0,0 @@ -/* Test sem_timedwait cancellation for uncontended case. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <semaphore.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/time.h> - - -static pthread_barrier_t bar; -static sem_t sem; - - -static void -cleanup (void *arg) -{ - static int ncall; - - if (++ncall != 1) - { - puts ("second call to cleanup"); - exit (1); - } -} - - -static void * -tf (void *arg) -{ - pthread_cleanup_push (cleanup, NULL); - - int e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("error: tf: 1st barrier_wait failed"); - exit (1); - } - - struct timeval tv; - (void) gettimeofday (&tv, NULL); - - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - - /* Timeout in 5 seconds. */ - ts.tv_sec += 5; - - /* This call should block and be cancelable. */ - sem_timedwait (&sem, &ts); - - pthread_cleanup_pop (0); - - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - - if (pthread_barrier_init (&bar, NULL, 2) != 0) - { - puts ("error: barrier_init failed"); - exit (1); - } - - if (sem_init (&sem, 0, 1) != 0) - { - puts ("error: sem_init failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("error: create failed"); - exit (1); - } - - /* Check whether cancellation is honored even before sem_timedwait does - anything. */ - if (pthread_cancel (th) != 0) - { - puts ("error: 1st cancel failed"); - exit (1); - } - - int e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("1st barrier_wait failed"); - exit (1); - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("join failed"); - exit (1); - } - - if (r != PTHREAD_CANCELED) - { - puts ("thread not canceled"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel15.c b/nptl/tst-cancel15.c deleted file mode 100644 index b507390b43..0000000000 --- a/nptl/tst-cancel15.c +++ /dev/null @@ -1,138 +0,0 @@ -/* Test sem_timedwait cancellation for contended case. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <semaphore.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/time.h> - - -static pthread_barrier_t bar; -static sem_t sem; - - -static void -cleanup (void *arg) -{ - static int ncall; - - if (++ncall != 1) - { - puts ("second call to cleanup"); - exit (1); - } -} - - -static void * -tf (void *arg) -{ - int e; - - pthread_cleanup_push (cleanup, NULL); - - e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("error: tf: 1st barrier_wait failed"); - exit (1); - } - - struct timeval tv; - (void) gettimeofday (&tv, NULL); - - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - - /* Timeout in 5 seconds. */ - ts.tv_sec += 5; - - /* This call should block and be cancelable. */ - errno = 0; - e = sem_timedwait (&sem, &ts); - - pthread_cleanup_pop (0); - - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - - if (pthread_barrier_init (&bar, NULL, 2) != 0) - { - puts ("error: barrier_init failed"); - exit (1); - } - - if (sem_init (&sem, 0, 0) != 0) - { - puts ("error: sem_init failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("error: create failed"); - exit (1); - } - - int e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("error: 1st barrier_wait failed"); - exit (1); - } - - /* Give the child a chance to go to sleep in sem_wait. */ - sleep (1); - - /* Check whether cancellation is honored when waiting in sem_timedwait. */ - if (pthread_cancel (th) != 0) - { - puts ("error: 1st cancel failed"); - exit (1); - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("error: join failed"); - exit (1); - } - - if (r != PTHREAD_CANCELED) - { - puts ("error: thread not canceled"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel16.c b/nptl/tst-cancel16.c deleted file mode 100644 index a84ed7a0bb..0000000000 --- a/nptl/tst-cancel16.c +++ /dev/null @@ -1,230 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/wait.h> - - -static pthread_barrier_t b2; -static int fd; -static int called; - - -static void -cl (void *arg) -{ - called = 1; -} - - -static void * -tf (void *arg) -{ - int r = pthread_barrier_wait (&b2); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child thread: barrier_wait failed"); - exit (1); - } - - pthread_cleanup_push (cl, NULL); - - /* This call should never return. */ - (void) lockf (fd, F_LOCK, 0); - - pthread_cleanup_pop (0); - - return NULL; -} - - -static int -do_test (void) -{ - char fname[] = "/tmp/cancel16XXXXXX"; - fd = mkstemp (fname); - if (fd == -1) - { - puts ("mkstemp failed"); - return 1; - } - unlink (fname); - - char mem[sizeof (pthread_barrier_t)]; - memset (mem, '\0', sizeof (mem)); - if (TEMP_FAILURE_RETRY (pwrite (fd, mem, sizeof (mem), 0)) != sizeof (mem)) - { - puts ("pwrite failed"); - return 1; - } - - void *p = mmap (NULL, sizeof (mem), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); - if (p == MAP_FAILED) - { - puts ("mmap failed"); - return 1; - } - pthread_barrier_t *b = (pthread_barrier_t *) p; - - pthread_barrierattr_t ba; - if (pthread_barrierattr_init (&ba) != 0) - { - puts ("barrierattr_init failed"); - return 1; - } - if (pthread_barrierattr_setpshared (&ba, 1) != 0) - { - puts ("barrierattr_setshared failed"); - return 1; - } - - if (pthread_barrier_init (b, &ba, 2) != 0) - { - puts ("1st barrier_init failed"); - return 1; - } - if (pthread_barrierattr_destroy (&ba) != 0) - { - puts ("barrier_destroy failed"); - return 1; - } - - pid_t pid = fork (); - if (pid == 0) - { - /* Child. Lock the file and wait. */ - if (lockf (fd, F_LOCK, 0) != 0) - { - puts ("child process: lockf failed"); - _exit (1); - } - - int r = pthread_barrier_wait (b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child process: 1st barrier_wait failed"); - _exit (1); - } - - /* Make sure the process dies. */ - alarm (5); - - r = pthread_barrier_wait (b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child process: 2nd barrier_wait failed"); - _exit (1); - } - - _exit (0); - } - if (pid == -1) - { - puts ("fork failed"); - return 1; - } - - int r = pthread_barrier_wait (b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("main: 1st barrier_wait failed"); - _exit (1); - } - - if (pthread_barrier_init (&b2, NULL, 2) != 0) - { - puts ("2nd barrier_init failed"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - r = pthread_barrier_wait (&b2); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("main: 2nd barrier_wait failed"); - return 1; - } - - /* Delay. */ - sleep (1); - - if (pthread_cancel (th) != 0) - { - puts ("cancel failed"); - return 1; - } - - void *result; - if (pthread_join (th, &result) != 0) - { - puts ("join failed"); - return 1; - } - if (result != PTHREAD_CANCELED) - { - puts ("thread not canceled"); - return 1; - } - if (called == 0) - { - puts ("cleanup handler not called"); - return 1; - } - - r = pthread_barrier_wait (b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("main: 3rd barrier_wait failed"); - return 1; - } - - int status; - if (TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)) != pid) - { - puts ("waitpid failed"); - return 1; - } - if (WEXITSTATUS (status) != 0) - { - printf ("child process exits with %d\n", WEXITSTATUS (status)); - return 1; - } - - if (lockf (fd, F_LOCK, 0) != 0) - { - puts ("main: lockf failed"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel17.c b/nptl/tst-cancel17.c deleted file mode 100644 index 33204978e5..0000000000 --- a/nptl/tst-cancel17.c +++ /dev/null @@ -1,356 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <aio.h> -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - - -static pthread_barrier_t b; - - -/* Cleanup handling test. */ -static int cl_called; - -static void -cl (void *arg) -{ - ++cl_called; -} - - -static void * -tf (void *arg) -{ - int r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("tf: barrier_wait failed"); - exit (1); - } - - pthread_cleanup_push (cl, NULL); - - const struct aiocb *l[1] = { arg }; - - TEMP_FAILURE_RETRY (aio_suspend (l, 1, NULL)); - - pthread_cleanup_pop (0); - - puts ("tf: aio_suspend returned"); - - exit (1); -} - - -static void * -tf2 (void *arg) -{ - int r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("tf2: barrier_wait failed"); - exit (1); - } - - pthread_cleanup_push (cl, NULL); - - const struct aiocb *l[1] = { arg }; - struct timespec ts = { .tv_sec = 1000, .tv_nsec = 0 }; - - TEMP_FAILURE_RETRY (aio_suspend (l, 1, &ts)); - - pthread_cleanup_pop (0); - - puts ("tf2: aio_suspend returned"); - - exit (1); -} - - -static int -do_test (void) -{ - int fds[2]; - if (pipe (fds) != 0) - { - puts ("pipe failed"); - return 1; - } - - struct aiocb a, a2, *ap; - char mem[1]; - memset (&a, '\0', sizeof (a)); - a.aio_fildes = fds[0]; - a.aio_buf = mem; - a.aio_nbytes = sizeof (mem); - if (aio_read (&a) != 0) - { - puts ("aio_read failed"); - return 1; - } - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, &a) != 0) - { - puts ("1st create failed"); - return 1; - } - - int r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 }; - while (nanosleep (&ts, &ts) != 0) - continue; - - puts ("going to cancel tf in-time"); - if (pthread_cancel (th) != 0) - { - puts ("1st cancel failed"); - return 1; - } - - void *status; - if (pthread_join (th, &status) != 0) - { - puts ("1st join failed"); - return 1; - } - if (status != PTHREAD_CANCELED) - { - puts ("1st thread not canceled"); - return 1; - } - - if (cl_called == 0) - { - puts ("tf cleanup handler not called"); - return 1; - } - if (cl_called > 1) - { - puts ("tf cleanup handler called more than once"); - return 1; - } - - cl_called = 0; - - if (pthread_create (&th, NULL, tf2, &a) != 0) - { - puts ("2nd create failed"); - return 1; - } - - r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("2nd barrier_wait failed"); - exit (1); - } - - ts.tv_sec = 0; - ts.tv_nsec = 100000000; - while (nanosleep (&ts, &ts) != 0) - continue; - - puts ("going to cancel tf2 in-time"); - if (pthread_cancel (th) != 0) - { - puts ("2nd cancel failed"); - return 1; - } - - if (pthread_join (th, &status) != 0) - { - puts ("2nd join failed"); - return 1; - } - if (status != PTHREAD_CANCELED) - { - puts ("2nd thread not canceled"); - return 1; - } - - if (cl_called == 0) - { - puts ("tf2 cleanup handler not called"); - return 1; - } - if (cl_called > 1) - { - puts ("tf2 cleanup handler called more than once"); - return 1; - } - - puts ("in-time cancellation succeeded"); - - ap = &a; - if (aio_cancel (fds[0], &a) != AIO_CANCELED) - { - puts ("aio_cancel failed"); - /* If aio_cancel failed, we cannot reuse aiocb a. */ - ap = &a2; - } - - - cl_called = 0; - - size_t len2 = fpathconf (fds[1], _PC_PIPE_BUF); - size_t page_size = sysconf (_SC_PAGESIZE); - len2 = 20 * (len2 < page_size ? page_size : len2) + sizeof (mem) + 1; - char *mem2 = malloc (len2); - if (mem2 == NULL) - { - puts ("could not allocate memory for pipe write"); - return 1; - } - - memset (ap, '\0', sizeof (*ap)); - ap->aio_fildes = fds[1]; - ap->aio_buf = mem2; - ap->aio_nbytes = len2; - if (aio_write (ap) != 0) - { - puts ("aio_write failed"); - return 1; - } - - if (pthread_create (&th, NULL, tf, ap) != 0) - { - puts ("3rd create failed"); - return 1; - } - - puts ("going to cancel tf early"); - if (pthread_cancel (th) != 0) - { - puts ("3rd cancel failed"); - return 1; - } - - r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("3rd barrier_wait failed"); - exit (1); - } - - if (pthread_join (th, &status) != 0) - { - puts ("3rd join failed"); - return 1; - } - if (status != PTHREAD_CANCELED) - { - puts ("3rd thread not canceled"); - return 1; - } - - if (cl_called == 0) - { - puts ("tf cleanup handler not called"); - return 1; - } - if (cl_called > 1) - { - puts ("tf cleanup handler called more than once"); - return 1; - } - - cl_called = 0; - - if (pthread_create (&th, NULL, tf2, ap) != 0) - { - puts ("4th create failed"); - return 1; - } - - puts ("going to cancel tf2 early"); - if (pthread_cancel (th) != 0) - { - puts ("4th cancel failed"); - return 1; - } - - r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("4th barrier_wait failed"); - exit (1); - } - - if (pthread_join (th, &status) != 0) - { - puts ("4th join failed"); - return 1; - } - if (status != PTHREAD_CANCELED) - { - puts ("4th thread not canceled"); - return 1; - } - - if (cl_called == 0) - { - puts ("tf2 cleanup handler not called"); - return 1; - } - if (cl_called > 1) - { - puts ("tf2 cleanup handler called more than once"); - return 1; - } - - puts ("early cancellation succeeded"); - - if (ap == &a2) - { - /* The aio_read(&a) was not canceled because the read request was - already in progress. In the meanwhile aio_write(ap) wrote something - to the pipe and the read request either has already been finished or - is able to read the requested byte. - Wait for the read request before returning from this function because - the return value and error code from the read syscall will be written - to the struct aiocb a, which lies on the stack of this function. - Otherwise the stack from subsequent function calls - e.g. _dl_fini - - will be corrupted, which can lead to undefined behaviour like a - segmentation fault. */ - const struct aiocb *l[1] = { &a }; - TEMP_FAILURE_RETRY (aio_suspend(l, 1, NULL)); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel18.c b/nptl/tst-cancel18.c deleted file mode 100644 index 5a46f0929c..0000000000 --- a/nptl/tst-cancel18.c +++ /dev/null @@ -1,173 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <unistd.h> - - -static pthread_barrier_t b; - - -/* Cleanup handling test. */ -static int cl_called; - -static void -cl (void *arg) -{ - ++cl_called; -} - - -static void * -tf (void *arg) -{ - int r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - pthread_cleanup_push (cl, NULL); - - struct timespec ts = { .tv_sec = arg == NULL ? 10000000 : 0, .tv_nsec = 0 }; - TEMP_FAILURE_RETRY (clock_nanosleep (CLOCK_REALTIME, 0, &ts, &ts)); - - pthread_cleanup_pop (0); - - puts ("clock_nanosleep returned"); - - exit (1); -} - - -static int -do_test (void) -{ - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("1st create failed"); - return 1; - } - - int r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 }; - while (nanosleep (&ts, &ts) != 0) - continue; - - puts ("going to cancel in-time"); - if (pthread_cancel (th) != 0) - { - puts ("1st cancel failed"); - return 1; - } - - void *status; - if (pthread_join (th, &status) != 0) - { - puts ("1st join failed"); - return 1; - } - if (status != PTHREAD_CANCELED) - { - puts ("1st thread not canceled"); - return 1; - } - - if (cl_called == 0) - { - puts ("cleanup handler not called"); - return 1; - } - if (cl_called > 1) - { - puts ("cleanup handler called more than once"); - return 1; - } - - puts ("in-time cancellation succeeded"); - - - cl_called = 0; - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("2nd create failed"); - return 1; - } - - puts ("going to cancel early"); - if (pthread_cancel (th) != 0) - { - puts ("2nd cancel failed"); - return 1; - } - - r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - if (pthread_join (th, &status) != 0) - { - puts ("2nd join failed"); - return 1; - } - if (status != PTHREAD_CANCELED) - { - puts ("2nd thread not canceled"); - return 1; - } - - if (cl_called == 0) - { - printf ("cleanup handler not called\n"); - return 1; - } - if (cl_called > 1) - { - printf ("cleanup handler called more than once\n"); - return 1; - } - - puts ("early cancellation succeeded"); - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel19.c b/nptl/tst-cancel19.c deleted file mode 100644 index 1c214c5967..0000000000 --- a/nptl/tst-cancel19.c +++ /dev/null @@ -1,286 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <error.h> -#include <fcntl.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/select.h> -#include <sys/time.h> -#include <unistd.h> - -static void * -tf (void *arg) -{ - return NULL; -} - -static void -handler (int sig) -{ -} - -static void __attribute__ ((noinline)) -clobber_lots_of_regs (void) -{ -#define X1(n) long r##n = 10##n; __asm __volatile ("" : "+r" (r##n)); -#define X2(n) X1(n##0) X1(n##1) X1(n##2) X1(n##3) X1(n##4) -#define X3(n) X2(n##0) X2(n##1) X2(n##2) X2(n##3) X2(n##4) - X3(0) X3(1) X3(2) X3(3) X3(4) -#undef X1 -#define X1(n) __asm __volatile ("" : : "r" (r##n)); - X3(0) X3(1) X3(2) X3(3) X3(4) -#undef X1 -#undef X2 -#undef X3 -} - -static int -do_test (void) -{ - pthread_t th; - int old, rc; - int ret = 0; - int fd[2]; - - rc = pipe (fd); - if (rc < 0) - error (EXIT_FAILURE, errno, "couldn't create pipe"); - - rc = pthread_create (&th, NULL, tf, NULL); - if (rc) - error (EXIT_FAILURE, rc, "couldn't create thread"); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &old); - if (rc) - { - error (0, rc, "1st pthread_setcanceltype failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_DEFERRED && old != PTHREAD_CANCEL_ASYNCHRONOUS) - { - error (0, 0, "1st pthread_setcanceltype returned invalid value %d", - old); - ret = 1; - } - - clobber_lots_of_regs (); - close (fd[0]); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after close failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_DEFERRED) - { - error (0, 0, "pthread_setcanceltype after close returned invalid value %d", - old); - ret = 1; - } - - clobber_lots_of_regs (); - close (fd[1]); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after 2nd close failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_ASYNCHRONOUS) - { - error (0, 0, "pthread_setcanceltype after 2nd close returned invalid value %d", - old); - ret = 1; - } - - struct sigaction sa = { .sa_handler = handler, .sa_flags = 0 }; - sigemptyset (&sa.sa_mask); - sigaction (SIGALRM, &sa, NULL); - - struct itimerval it; - it.it_value.tv_sec = 1; - it.it_value.tv_usec = 0; - it.it_interval = it.it_value; - setitimer (ITIMER_REAL, &it, NULL); - - clobber_lots_of_regs (); - pause (); - - memset (&it, 0, sizeof (it)); - setitimer (ITIMER_REAL, &it, NULL); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after pause failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_DEFERRED) - { - error (0, 0, "pthread_setcanceltype after pause returned invalid value %d", - old); - ret = 1; - } - - it.it_value.tv_sec = 1; - it.it_value.tv_usec = 0; - it.it_interval = it.it_value; - setitimer (ITIMER_REAL, &it, NULL); - - clobber_lots_of_regs (); - pause (); - - memset (&it, 0, sizeof (it)); - setitimer (ITIMER_REAL, &it, NULL); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after 2nd pause failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_ASYNCHRONOUS) - { - error (0, 0, "pthread_setcanceltype after 2nd pause returned invalid value %d", - old); - ret = 1; - } - - char fname[] = "/tmp/tst-cancel19-dir-XXXXXX\0foo/bar"; - char *enddir = strchr (fname, '\0'); - if (mkdtemp (fname) == NULL) - { - error (0, errno, "mkdtemp failed"); - ret = 1; - } - *enddir = '/'; - - clobber_lots_of_regs (); - creat (fname, 0400); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after creat failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_DEFERRED) - { - error (0, 0, "pthread_setcanceltype after creat returned invalid value %d", - old); - ret = 1; - } - - clobber_lots_of_regs (); - creat (fname, 0400); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after 2nd creat failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_ASYNCHRONOUS) - { - error (0, 0, "pthread_setcanceltype after 2nd creat returned invalid value %d", - old); - ret = 1; - } - - clobber_lots_of_regs (); - open (fname, O_CREAT, 0400); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after open failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_DEFERRED) - { - error (0, 0, "pthread_setcanceltype after open returned invalid value %d", - old); - ret = 1; - } - - clobber_lots_of_regs (); - open (fname, O_CREAT, 0400); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after 2nd open failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_ASYNCHRONOUS) - { - error (0, 0, "pthread_setcanceltype after 2nd open returned invalid value %d", - old); - ret = 1; - } - - *enddir = '\0'; - rmdir (fname); - - clobber_lots_of_regs (); - select (-1, NULL, NULL, NULL, NULL); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after select failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_DEFERRED) - { - error (0, 0, "pthread_setcanceltype after select returned invalid value %d", - old); - ret = 1; - } - - clobber_lots_of_regs (); - select (-1, NULL, NULL, NULL, NULL); - - rc = pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &old); - if (rc) - { - error (0, rc, "pthread_setcanceltype after 2nd select failed"); - ret = 1; - } - if (old != PTHREAD_CANCEL_ASYNCHRONOUS) - { - error (0, 0, "pthread_setcanceltype after 2nd select returned invalid value %d", - old); - ret = 1; - } - - pthread_join (th, NULL); - - return ret; -} - -#define TIMEOUT 20 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel2.c b/nptl/tst-cancel2.c deleted file mode 100644 index bf7946ceca..0000000000 --- a/nptl/tst-cancel2.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <unistd.h> - - -static int fd[2]; - - -static void * -tf (void *arg) -{ - /* The buffer size must be larger than the pipe size so that the - write blocks. */ - char buf[100000]; - - while (write (fd[1], buf, sizeof (buf)) > 0); - - return (void *) 42l; -} - - -static int -do_test (void) -{ - pthread_t th; - void *r; - struct sigaction sa; - - sa.sa_handler = SIG_IGN; - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - - if (sigaction (SIGPIPE, &sa, NULL) != 0) - { - puts ("sigaction failed"); - return 1; - } - - if (pipe (fd) != 0) - { - puts ("pipe failed"); - return 1; - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - if (pthread_cancel (th) != 0) - { - puts ("cancel failed"); - return 1; - } - - /* This will cause the write in the child to return. */ - close (fd[0]); - - if (pthread_join (th, &r) != 0) - { - puts ("join failed"); - return 1; - } - - if (r != PTHREAD_CANCELED) - { - printf ("result is wrong: expected %p, got %p\n", PTHREAD_CANCELED, r); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel20.c b/nptl/tst-cancel20.c deleted file mode 100644 index 89cf9eaada..0000000000 --- a/nptl/tst-cancel20.c +++ /dev/null @@ -1,268 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static int fd[4]; -static pthread_barrier_t b; -volatile int in_sh_body; -unsigned long cleanups; - -static void -cl (void *arg) -{ - cleanups = (cleanups << 4) | (long) arg; -} - - -static void __attribute__((noinline)) -sh_body (void) -{ - char c; - - pthread_cleanup_push (cl, (void *) 1L); - - in_sh_body = 1; - if (read (fd[2], &c, 1) == 1) - { - puts ("read succeeded"); - exit (1); - } - - pthread_cleanup_pop (0); -} - - -static void -sh (int sig) -{ - pthread_cleanup_push (cl, (void *) 2L); - sh_body (); - in_sh_body = 0; - - pthread_cleanup_pop (0); -} - - -static void __attribute__((noinline)) -tf_body (void) -{ - char c; - - pthread_cleanup_push (cl, (void *) 3L); - - int r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child thread: barrier_wait failed"); - exit (1); - } - - if (read (fd[0], &c, 1) == 1) - { - puts ("read succeeded"); - exit (1); - } - - read (fd[0], &c, 1); - - pthread_cleanup_pop (0); -} - - -static void * -tf (void *arg) -{ - pthread_cleanup_push (cl, (void *) 4L); - tf_body (); - pthread_cleanup_pop (0); - return NULL; -} - - -static int -do_one_test (void) -{ - in_sh_body = 0; - cleanups = 0; - if (pipe (fd) != 0 || pipe (fd + 2) != 0) - { - puts ("pipe failed"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - int r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("parent thread: barrier_wait failed"); - return 1; - } - - sleep (1); - - r = pthread_kill (th, SIGHUP); - if (r) - { - errno = r; - printf ("pthread_kill failed %m\n"); - return 1; - } - - while (in_sh_body == 0) - sleep (1); - - if (pthread_cancel (th) != 0) - { - puts ("cancel failed"); - return 1; - } - - void *ret; - if (pthread_join (th, &ret) != 0) - { - puts ("join failed"); - return 1; - } - - if (ret != PTHREAD_CANCELED) - { - puts ("result is wrong"); - return 1; - } - - if (cleanups != 0x1234L) - { - printf ("called cleanups %lx\n", cleanups); - return 1; - } - - /* The pipe closing must be issued after the cancellation handling to avoid - a race condition where the cancellation runs after both pipe ends are - closed. In this case the read syscall returns EOF and the cancellation - must not act. */ - close (fd[0]); - close (fd[1]); - close (fd[2]); - close (fd[3]); - - return 0; -} - - -static int -do_test (void) -{ - stack_t ss; - ss.ss_sp = malloc (2 * SIGSTKSZ); - if (ss.ss_sp == NULL) - { - puts ("failed to allocate alternate stack"); - return 1; - } - ss.ss_flags = 0; - ss.ss_size = 2 * SIGSTKSZ; - if (sigaltstack (&ss, NULL) < 0) - { - printf ("sigaltstack failed %m\n"); - return 1; - } - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - struct sigaction sa; - sa.sa_handler = sh; - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - - if (sigaction (SIGHUP, &sa, NULL) != 0) - { - puts ("sigaction failed"); - return 1; - } - - puts ("sa_flags = 0 test"); - if (do_one_test ()) - return 1; - - sa.sa_handler = sh; - sigemptyset (&sa.sa_mask); - sa.sa_flags = SA_ONSTACK; - - if (sigaction (SIGHUP, &sa, NULL) != 0) - { - puts ("sigaction failed"); - return 1; - } - - puts ("sa_flags = SA_ONSTACK test"); - if (do_one_test ()) - return 1; - -#ifdef SA_SIGINFO - sa.sa_sigaction = (void (*)(int, siginfo_t *, void *)) sh; - sigemptyset (&sa.sa_mask); - sa.sa_flags = SA_SIGINFO; - - if (sigaction (SIGHUP, &sa, NULL) != 0) - { - puts ("sigaction failed"); - return 1; - } - - puts ("sa_flags = SA_SIGINFO test"); - if (do_one_test ()) - return 1; - - sa.sa_sigaction = (void (*)(int, siginfo_t *, void *)) sh; - sigemptyset (&sa.sa_mask); - sa.sa_flags = SA_SIGINFO | SA_ONSTACK; - - if (sigaction (SIGHUP, &sa, NULL) != 0) - { - puts ("sigaction failed"); - return 1; - } - - puts ("sa_flags = SA_SIGINFO|SA_ONSTACK test"); - if (do_one_test ()) - return 1; -#endif - - return 0; -} - -#define TIMEOUT 40 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel21-static.c b/nptl/tst-cancel21-static.c deleted file mode 100644 index 2a01061ea8..0000000000 --- a/nptl/tst-cancel21-static.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel21.c" diff --git a/nptl/tst-cancel21.c b/nptl/tst-cancel21.c deleted file mode 100644 index afeefab6ce..0000000000 --- a/nptl/tst-cancel21.c +++ /dev/null @@ -1,298 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <sys/wait.h> -#include <unistd.h> - - -static int fd[4]; -static pthread_barrier_t b; -volatile int in_sh_body; -unsigned long cleanups; - -static void -cl (void *arg) -{ - cleanups = (cleanups << 4) | (long) arg; -} - - -static void __attribute__((noinline)) -sh_body (void) -{ - char c; - - pthread_cleanup_push (cl, (void *) 1L); - - in_sh_body = 1; - if (read (fd[2], &c, 1) == 1) - { - puts ("read succeeded"); - exit (1); - } - - pthread_cleanup_pop (0); -} - - -static void -sh (int sig) -{ - pthread_cleanup_push (cl, (void *) 2L); - sh_body (); - in_sh_body = 0; - - pthread_cleanup_pop (0); -} - - -static void __attribute__((noinline)) -tf_body (void) -{ - char c; - - pthread_cleanup_push (cl, (void *) 3L); - - int r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child thread: barrier_wait failed"); - exit (1); - } - - if (read (fd[0], &c, 1) == 1) - { - puts ("read succeeded"); - exit (1); - } - - read (fd[0], &c, 1); - - pthread_cleanup_pop (0); -} - - -static void * -tf (void *arg) -{ - pthread_t th = (pthread_t) arg; - - int r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("parent thread: barrier_wait failed"); - exit (1); - } - - sleep (1); - - r = pthread_kill (th, SIGHUP); - if (r) - { - errno = r; - printf ("pthread_kill failed %m\n"); - exit (1); - } - - while (in_sh_body == 0) - sleep (1); - - if (pthread_cancel (th) != 0) - { - puts ("cancel failed"); - exit (1); - } - - void *ret; - if (pthread_join (th, &ret) != 0) - { - puts ("join failed"); - exit (1); - } - - if (ret != PTHREAD_CANCELED) - { - puts ("result is wrong"); - exit (1); - } - - if (cleanups != 0x1234L) - { - printf ("called cleanups %lx\n", cleanups); - exit (1); - } - - if (pthread_barrier_destroy (&b)) - { - puts ("barrier destroy failed"); - exit (1); - } - - /* The pipe closing must be issued after the cancellation handling to avoid - a race condition where the cancellation runs after both pipe ends are - closed. In this case the read syscall returns EOF and the cancellation - must not act. */ - close (fd[0]); - close (fd[1]); - close (fd[2]); - close (fd[3]); - - exit (0); -} - - -static int -do_one_test (void) -{ - in_sh_body = 0; - - pid_t pid = fork (); - - if (pid == -1) - { - printf ("fork failed: %m\n"); - return 1; - } - - if (pid) - { - int status; - if (waitpid (pid, &status, 0) < 0) - { - printf ("waitpid failed %m\n"); - return 1; - } - - return !WIFEXITED (status) || WEXITSTATUS (status); - } - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - cleanups = 0; - if (pipe (fd) != 0 || pipe (fd + 2) != 0) - { - puts ("pipe failed"); - exit (1); - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, (void *) pthread_self ()) != 0) - { - puts ("create failed"); - exit (1); - } - - pthread_cleanup_push (cl, (void *) 4L); - tf_body (); - pthread_cleanup_pop (0); - exit (1); -} - - -static int -do_test (void) -{ - stack_t ss; - ss.ss_sp = malloc (2 * SIGSTKSZ); - if (ss.ss_sp == NULL) - { - puts ("failed to allocate alternate stack"); - return 1; - } - ss.ss_flags = 0; - ss.ss_size = 2 * SIGSTKSZ; - if (sigaltstack (&ss, NULL) < 0) - { - printf ("sigaltstack failed %m\n"); - return 1; - } - - struct sigaction sa; - sa.sa_handler = sh; - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - - if (sigaction (SIGHUP, &sa, NULL) != 0) - { - puts ("sigaction failed"); - return 1; - } - - puts ("sa_flags = 0 test"); - if (do_one_test ()) - return 1; - - sa.sa_handler = sh; - sigemptyset (&sa.sa_mask); - sa.sa_flags = SA_ONSTACK; - - if (sigaction (SIGHUP, &sa, NULL) != 0) - { - puts ("sigaction failed"); - return 1; - } - - puts ("sa_flags = SA_ONSTACK test"); - if (do_one_test ()) - return 1; - -#ifdef SA_SIGINFO - sa.sa_sigaction = (void (*)(int, siginfo_t *, void *)) sh; - sigemptyset (&sa.sa_mask); - sa.sa_flags = SA_SIGINFO; - - if (sigaction (SIGHUP, &sa, NULL) != 0) - { - puts ("sigaction failed"); - return 1; - } - - puts ("sa_flags = SA_SIGINFO test"); - if (do_one_test ()) - return 1; - - sa.sa_sigaction = (void (*)(int, siginfo_t *, void *)) sh; - sigemptyset (&sa.sa_mask); - sa.sa_flags = SA_SIGINFO | SA_ONSTACK; - - if (sigaction (SIGHUP, &sa, NULL) != 0) - { - puts ("sigaction failed"); - return 1; - } - - puts ("sa_flags = SA_SIGINFO|SA_ONSTACK test"); - if (do_one_test ()) - return 1; -#endif - - return 0; -} - -#define TIMEOUT 40 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel22.c b/nptl/tst-cancel22.c deleted file mode 100644 index 5b768bd669..0000000000 --- a/nptl/tst-cancel22.c +++ /dev/null @@ -1,120 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -pthread_barrier_t b; -int seen; - -static void * -tf (void *arg) -{ - int old; - int r = pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &old); - if (r != 0) - { - puts ("setcancelstate failed"); - exit (1); - } - - r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - for (int i = 0; i < 10; ++i) - { - struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 }; - TEMP_FAILURE_RETRY (nanosleep (&ts, &ts)); - } - - seen = 1; - pthread_setcancelstate (old, NULL); - - struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 }; - TEMP_FAILURE_RETRY (nanosleep (&ts, &ts)); - - exit (1); -} - - -static int -do_test (void) -{ - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier init failed"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("thread creation failed"); - return 1; - } - - int r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - return 1; - } - - if (pthread_cancel (th) != 0) - { - puts ("cancel failed"); - return 1; - } - - void *status; - if (pthread_join (th, &status) != 0) - { - puts ("join failed"); - return 1; - } - if (status != PTHREAD_CANCELED) - { - puts ("thread not canceled"); - return 1; - } - - if (pthread_barrier_destroy (&b) != 0) - { - puts ("barrier_destroy failed"); - return 1; - } - - if (seen != 1) - { - puts ("thread cancelled when PTHREAD_CANCEL_DISABLED"); - return 1; - } - - return 0; -} - -#define TIMEOUT 5 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel23.c b/nptl/tst-cancel23.c deleted file mode 100644 index 211168748e..0000000000 --- a/nptl/tst-cancel23.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel22.c" diff --git a/nptl/tst-cancel24-static.cc b/nptl/tst-cancel24-static.cc deleted file mode 100644 index 3f97de5d5a..0000000000 --- a/nptl/tst-cancel24-static.cc +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel24.cc" diff --git a/nptl/tst-cancel24.cc b/nptl/tst-cancel24.cc deleted file mode 100644 index 1af709a8ca..0000000000 --- a/nptl/tst-cancel24.cc +++ /dev/null @@ -1,113 +0,0 @@ -#include <pthread.h> -#include <semaphore.h> -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> - - -static volatile bool destr_called; -static volatile bool except_caught; - -static pthread_barrier_t b; - - -struct monitor -{ - // gcc is broken and would generate a warning without this dummy - // constructor. - monitor () { } - ~monitor() { destr_called = true; } -}; - - -static void * -tf (void *arg) -{ - sem_t *s = static_cast<sem_t *> (arg); - - try - { - monitor m; - - pthread_barrier_wait (&b); - - while (1) - sem_wait (s); - } - catch (...) - { - except_caught = true; - throw; - } - - return NULL; -} - - -static int -do_test () -{ - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - sem_t s; - if (sem_init (&s, 0, 0) != 0) - { - puts ("sem_init failed"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, &s) != 0) - { - puts ("pthread_create failed"); - return 1; - } - - pthread_barrier_wait (&b); - - /* There is unfortunately no better method to try to assure the - child thread reached the sem_wait call and is actually waiting - than to sleep here. */ - sleep (1); - - if (pthread_cancel (th) != 0) - { - puts ("cancel failed"); - return 1; - } - - void *res; - if (pthread_join (th, &res) != 0) - { - puts ("join failed"); - return 1; - } - - if (res != PTHREAD_CANCELED) - { - puts ("thread was not canceled"); - return 1; - } - - if (! except_caught) - { - puts ("exception not caught"); - return 1; - } - - if (! destr_called) - { - puts ("destructor not called"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#define TIMEOUT 3 -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel25.c b/nptl/tst-cancel25.c deleted file mode 100644 index c724d8ae2d..0000000000 --- a/nptl/tst-cancel25.c +++ /dev/null @@ -1,173 +0,0 @@ -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> - - -static pthread_barrier_t b; -static pthread_t th2; - - -static void * -tf2 (void *arg) -{ -#ifdef SIGCANCEL - sigset_t mask; - if (pthread_sigmask (SIG_SETMASK, NULL, &mask) != 0) - { - puts ("pthread_sigmask failed"); - exit (1); - } - if (sigismember (&mask, SIGCANCEL)) - { - puts ("SIGCANCEL blocked in new thread"); - exit (1); - } -#endif - - /* Sync with the main thread so that we do not test anything else. */ - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - while (1) - { - /* Just a cancelable call. */ - struct timespec ts = { 10000, 0 }; - nanosleep (&ts, 0); - } - - return NULL; -} - - -static void -unwhand (void *arg) -{ - if (pthread_create (&th2, NULL, tf2, NULL) != 0) - { - puts ("unwhand: create failed"); - exit (1); - } -} - - -static void * -tf (void *arg) -{ - pthread_cleanup_push (unwhand, NULL); - - /* Sync with the main thread so that we do not test anything else. */ - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - while (1) - { - /* Just a cancelable call. */ - struct timespec ts = { 10000, 0 }; - nanosleep (&ts, 0); - } - - pthread_cleanup_pop (0); - - return NULL; -} - - -static int -do_test (void) -{ - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - pthread_t th1; - if (pthread_create (&th1, NULL, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - return 1; - } - - /* Make sure tf1 enters nanosleep. */ - struct timespec ts = { 0, 500000000 }; - while (nanosleep (&ts, &ts) != 0) - ; - - if (pthread_cancel (th1) != 0) - { - puts ("1st cancel failed"); - return 1; - } - - void *res; - if (pthread_join (th1, &res) != 0) - { - puts ("1st join failed"); - return 1; - } - if (res != PTHREAD_CANCELED) - { - puts ("1st thread not canceled"); - return 1; - } - - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - return 1; - } - - /* Make sure tf2 enters nanosleep. */ - ts.tv_sec = 0; - ts.tv_nsec = 500000000; - while (nanosleep (&ts, &ts) != 0) - ; - - puts ("calling pthread_cancel the second time"); - if (pthread_cancel (th2) != 0) - { - puts ("2nd cancel failed"); - return 1; - } - - puts ("calling pthread_join the second time"); - if (pthread_join (th2, &res) != 0) - { - puts ("2nd join failed"); - return 1; - } - if (res != PTHREAD_CANCELED) - { - puts ("2nd thread not canceled"); - return 1; - } - - if (pthread_barrier_destroy (&b) != 0) - { - puts ("barrier_destroy failed"); - return 0; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#define TIMEOUT 4 -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel26.c b/nptl/tst-cancel26.c deleted file mode 100644 index 07dafff0ce..0000000000 --- a/nptl/tst-cancel26.c +++ /dev/null @@ -1,68 +0,0 @@ -/* Check for failure paths handling for cancellation points. - Copyright (C) 2015-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -/* Check that the cancel syscall points handles both the errno and return code - correctly for invalid arguments. */ -static void * -tf (void *arg) -{ -#ifdef SET_CANCEL_DISABLE - pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, NULL); -#endif - - /* This is a cancellation point, but we should not be cancelled. */ - int r = write (-1, 0, 0); - - if (r != -1 || errno != EBADF) - { - printf ("error: write returned %d, errno %d\n", r, errno); - exit (1); - } - - return NULL; -} - -static int -do_test (void) -{ - pthread_t th; - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("error: pthread_create failed"); - exit (1); - } - - if (pthread_join (th, NULL) != 0) - { - puts ("error: pthread_join failed"); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel27.c b/nptl/tst-cancel27.c deleted file mode 100644 index e8dd55ae96..0000000000 --- a/nptl/tst-cancel27.c +++ /dev/null @@ -1,23 +0,0 @@ -/* Check for failure paths handling for cancellation points. - Copyright (C) 2015-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* Similar to tst-cancel26.c but with pthread cancel state set to - PTHREAD_CANCEL_DISABLE. */ - -#define SET_CANCEL_DISABLE 1 -#include "tst-cancel26.c" diff --git a/nptl/tst-cancel3.c b/nptl/tst-cancel3.c deleted file mode 100644 index 228c4781a9..0000000000 --- a/nptl/tst-cancel3.c +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <unistd.h> - - -static int fd[2]; - - -static void * -tf (void *arg) -{ - char buf[100]; - - if (read (fd[0], buf, sizeof (buf)) == sizeof (buf)) - { - puts ("read succeeded"); - return (void *) 1l; - } - - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - void *r; - struct sigaction sa; - - sa.sa_handler = SIG_IGN; - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - - if (sigaction (SIGPIPE, &sa, NULL) != 0) - { - puts ("sigaction failed"); - return 1; - } - - if (pipe (fd) != 0) - { - puts ("pipe failed"); - return 1; - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - if (pthread_cancel (th) != 0) - { - puts ("cancel failed"); - return 1; - } - - /* This will cause the read in the child to return. */ - close (fd[0]); - - if (pthread_join (th, &r) != 0) - { - puts ("join failed"); - return 1; - } - - if (r != PTHREAD_CANCELED) - { - puts ("result is wrong"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel4-common.c b/nptl/tst-cancel4-common.c deleted file mode 100644 index eb3211721c..0000000000 --- a/nptl/tst-cancel4-common.c +++ /dev/null @@ -1,262 +0,0 @@ -/* Common file for all tst-cancel4_* - - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -static int -do_test (void) -{ - int val; - socklen_t len; - - if (socketpair (AF_UNIX, SOCK_STREAM, PF_UNIX, fds) != 0) - { - perror ("socketpair"); - exit (1); - } - - val = 1; - len = sizeof(val); - setsockopt (fds[1], SOL_SOCKET, SO_SNDBUF, &val, sizeof(val)); - if (getsockopt (fds[1], SOL_SOCKET, SO_SNDBUF, &val, &len) < 0) - { - perror ("getsockopt"); - exit (1); - } - if (val >= WRITE_BUFFER_SIZE) - { - puts ("minimum write buffer size too large"); - exit (1); - } - setsockopt (fds[1], SOL_SOCKET, SO_SNDBUF, &val, sizeof(val)); - - if (mktemp (fifoname) == NULL) - { - printf ("%s: cannot generate temp file name: %m\n", __func__); - exit (1); - } - - int result = 0; - size_t cnt; - for (cnt = 0; cnt < ntest_tf; ++cnt) - { - if (tests[cnt].only_early) - continue; - - if (pthread_barrier_init (&b2, NULL, tests[cnt].nb) != 0) - { - puts ("b2 init failed"); - exit (1); - } - - /* Reset the counter for the cleanup handler. */ - cl_called = 0; - - pthread_t th; - if (pthread_create (&th, NULL, tests[cnt].tf, NULL) != 0) - { - printf ("create for '%s' test failed\n", tests[cnt].name); - result = 1; - continue; - } - - int r = pthread_barrier_wait (&b2); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("%s: barrier_wait failed\n", __func__); - result = 1; - continue; - } - - struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 }; - while (nanosleep (&ts, &ts) != 0) - continue; - - if (pthread_cancel (th) != 0) - { - printf ("cancel for '%s' failed\n", tests[cnt].name); - result = 1; - continue; - } - - void *status; - if (pthread_join (th, &status) != 0) - { - printf ("join for '%s' failed\n", tests[cnt].name); - result = 1; - continue; - } - if (status != PTHREAD_CANCELED) - { - printf ("thread for '%s' not canceled\n", tests[cnt].name); - result = 1; - continue; - } - - if (pthread_barrier_destroy (&b2) != 0) - { - puts ("barrier_destroy failed"); - result = 1; - continue; - } - - if (cl_called == 0) - { - printf ("cleanup handler not called for '%s'\n", tests[cnt].name); - result = 1; - continue; - } - if (cl_called > 1) - { - printf ("cleanup handler called more than once for '%s'\n", - tests[cnt].name); - result = 1; - continue; - } - - printf ("in-time cancel test of '%s' successful\n", tests[cnt].name); - - if (tempfd != -1) - { - close (tempfd); - tempfd = -1; - } - if (tempfd2 != -1) - { - close (tempfd2); - tempfd2 = -1; - } - if (tempfname != NULL) - { - unlink (tempfname); - free (tempfname); - tempfname = NULL; - } - if (tempmsg != -1) - { - msgctl (tempmsg, IPC_RMID, NULL); - tempmsg = -1; - } - } - - for (cnt = 0; cnt < ntest_tf; ++cnt) - { - if (pthread_barrier_init (&b2, NULL, tests[cnt].nb) != 0) - { - puts ("b2 init failed"); - exit (1); - } - - /* Reset the counter for the cleanup handler. */ - cl_called = 0; - - pthread_t th; - if (pthread_create (&th, NULL, tests[cnt].tf, (void *) 1l) != 0) - { - printf ("create for '%s' test failed\n", tests[cnt].name); - result = 1; - continue; - } - - int r = pthread_barrier_wait (&b2); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("%s: barrier_wait failed\n", __func__); - result = 1; - continue; - } - - if (pthread_cancel (th) != 0) - { - printf ("cancel for '%s' failed\n", tests[cnt].name); - result = 1; - continue; - } - - r = pthread_barrier_wait (&b2); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("%s: barrier_wait failed\n", __func__); - result = 1; - continue; - } - - void *status; - if (pthread_join (th, &status) != 0) - { - printf ("join for '%s' failed\n", tests[cnt].name); - result = 1; - continue; - } - if (status != PTHREAD_CANCELED) - { - printf ("thread for '%s' not canceled\n", tests[cnt].name); - result = 1; - continue; - } - - if (pthread_barrier_destroy (&b2) != 0) - { - puts ("barrier_destroy failed"); - result = 1; - continue; - } - - if (cl_called == 0) - { - printf ("cleanup handler not called for '%s'\n", tests[cnt].name); - result = 1; - continue; - } - if (cl_called > 1) - { - printf ("cleanup handler called more than once for '%s'\n", - tests[cnt].name); - result = 1; - continue; - } - - printf ("early cancel test of '%s' successful\n", tests[cnt].name); - - if (tempfd != -1) - { - close (tempfd); - tempfd = -1; - } - if (tempfd2 != -1) - { - close (tempfd2); - tempfd2 = -1; - } - if (tempfname != NULL) - { - unlink (tempfname); - free (tempfname); - tempfname = NULL; - } - if (tempmsg != -1) - { - msgctl (tempmsg, IPC_RMID, NULL); - tempmsg = -1; - } - } - - return result; -} - -#define TIMEOUT 60 -#include <support/test-driver.c> diff --git a/nptl/tst-cancel4-common.h b/nptl/tst-cancel4-common.h deleted file mode 100644 index 54b2f1e2d9..0000000000 --- a/nptl/tst-cancel4-common.h +++ /dev/null @@ -1,97 +0,0 @@ -/* Common definition for tst-cancel4_* tests. - - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> - -#include <support/check.h> -#include <support/xthread.h> -#include <support/xunistd.h> - -/* Pipe descriptors. */ -static int fds[2]; - -/* Temporary file descriptor, to be closed after each round. */ -static int tempfd = -1; -static int tempfd2 = -1; -/* Name of temporary file to be removed after each round. */ -static char *tempfname; -/* Temporary message queue. */ -static int tempmsg = -1; - -/* Often used barrier for two threads. */ -static pthread_barrier_t b2; - -/* The WRITE_BUFFER_SIZE value needs to be chosen such that if we set - the socket send buffer size to '1', a write of this size on that - socket will block. - - The Linux kernel imposes a minimum send socket buffer size which - has changed over the years. As of Linux 3.10 the value is: - - 2 * (2048 + SKB_DATA_ALIGN(sizeof(struct sk_buff))) - - which is attempting to make sure that with standard MTUs, - TCP can always queue up at least 2 full sized packets. - - Furthermore, there is logic in the socket send paths that - will allow one more packet (of any size) to be queued up as - long as some socket buffer space remains. Blocking only - occurs when we try to queue up a new packet and the send - buffer space has already been fully consumed. - - Therefore we must set this value to the largest possible value of - the formula above (and since it depends upon the size of "struct - sk_buff", it is dependent upon machine word size etc.) plus some - slack space. */ - -#define WRITE_BUFFER_SIZE 16384 - -/* Cleanup handling test. */ -static int cl_called; - -static void -cl (void *arg) -{ - ++cl_called; -} - -/* Named pipe used to check for blocking open. It should be closed - after the cancellation handling. */ -static char fifoname[] = "/tmp/tst-cancel4-fifo-XXXXXX"; -static int fifofd; - -static void -__attribute__ ((used)) -cl_fifo (void *arg) -{ - ++cl_called; - - unlink (fifoname); - close (fifofd); - fifofd = -1; -} - -struct cancel_tests -{ - const char *name; - void *(*tf) (void *); - int nb; - int only_early; -}; -#define ADD_TEST(name, nbar, early) { #name, tf_##name, nbar, early } diff --git a/nptl/tst-cancel4.c b/nptl/tst-cancel4.c deleted file mode 100644 index 7a560a1dda..0000000000 --- a/nptl/tst-cancel4.c +++ /dev/null @@ -1,1565 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* NOTE: this tests functionality beyond POSIX. POSIX does not allow - exit to be called more than once. */ - -#include <stddef.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <sys/ipc.h> -#include <sys/msg.h> -#include <unistd.h> -#include <errno.h> -#include <limits.h> -#include <pthread.h> -#include <fcntl.h> -#include <termios.h> -#include <sys/mman.h> -#include <sys/poll.h> -#include <sys/wait.h> -#include <sys/stat.h> -#include <sys/uio.h> - - -/* Since STREAMS are not supported in the standard Linux kernel and - there we don't advertise STREAMS as supported is no need to test - the STREAMS related functions. This affects - getmsg() getpmsg() putmsg() - putpmsg() - - lockf() and fcntl() are tested in tst-cancel16. - - pthread_join() is tested in tst-join5. - - pthread_testcancel()'s only purpose is to allow cancellation. This - is tested in several places. - - sem_wait() and sem_timedwait() are checked in tst-cancel1[2345] tests. - - mq_send(), mq_timedsend(), mq_receive() and mq_timedreceive() are checked - in tst-mqueue8{,x} tests. - - aio_suspend() is tested in tst-cancel17. - - clock_nanosleep() is tested in tst-cancel18. - - Linux sendmmsg and recvmmsg are checked in tst-cancel4_1.c and - tst-cancel4_2.c respectively. -*/ - -#include "tst-cancel4-common.h" - - -#ifndef IPC_ADDVAL -# define IPC_ADDVAL 0 -#endif - - -static void * -tf_read (void *arg) -{ - int fd; - - if (arg == NULL) - fd = fds[0]; - else - { - char fname[] = "/tmp/tst-cancel4-fd-XXXXXX"; - tempfd = fd = mkstemp (fname); - if (fd == -1) - FAIL_EXIT1 ("mkstemp failed: %m"); - unlink (fname); - - xpthread_barrier_wait (&b2); - } - - xpthread_barrier_wait (&b2); - - ssize_t s; - pthread_cleanup_push (cl, NULL); - - char buf[100]; - s = read (fd, buf, sizeof (buf)); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("read returns with %zd", s); -} - - -static void * -tf_readv (void *arg) -{ - int fd; - - if (arg == NULL) - fd = fds[0]; - else - { - char fname[] = "/tmp/tst-cancel4-fd-XXXXXX"; - tempfd = fd = mkstemp (fname); - if (fd == -1) - FAIL_EXIT1 ("mkstemp failed: %m"); - unlink (fname); - - xpthread_barrier_wait (&b2); - } - - xpthread_barrier_wait (&b2); - - ssize_t s; - pthread_cleanup_push (cl, NULL); - - char buf[100]; - struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } }; - s = readv (fd, iov, 1); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("readv returns with %zd", s); -} - - -static void * -tf_write (void *arg) -{ - int fd; - - if (arg == NULL) - fd = fds[1]; - else - { - char fname[] = "/tmp/tst-cancel4-fd-XXXXXX"; - tempfd = fd = mkstemp (fname); - if (fd == -1) - FAIL_EXIT1 ("mkstemp failed: %m"); - unlink (fname); - - xpthread_barrier_wait (&b2); - } - - xpthread_barrier_wait (&b2); - - ssize_t s; - pthread_cleanup_push (cl, NULL); - - char buf[WRITE_BUFFER_SIZE]; - memset (buf, '\0', sizeof (buf)); - s = write (fd, buf, sizeof (buf)); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("write returns with %zd", s); -} - - -static void * -tf_writev (void *arg) -{ - int fd; - - if (arg == NULL) - fd = fds[1]; - else - { - char fname[] = "/tmp/tst-cancel4-fd-XXXXXX"; - tempfd = fd = mkstemp (fname); - if (fd == -1) - FAIL_EXIT1 ("mkstemp failed: %m"); - unlink (fname); - - xpthread_barrier_wait (&b2); - } - - xpthread_barrier_wait (&b2); - - ssize_t s; - pthread_cleanup_push (cl, NULL); - - char buf[WRITE_BUFFER_SIZE]; - memset (buf, '\0', sizeof (buf)); - struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } }; - s = writev (fd, iov, 1); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("writev returns with %zd", s); -} - - -static void * -tf_sleep (void *arg) -{ - xpthread_barrier_wait (&b2); - - if (arg != NULL) - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - sleep (arg == NULL ? 1000000 : 0); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("sleep returns"); -} - - -static void * -tf_usleep (void *arg) -{ - xpthread_barrier_wait (&b2); - - if (arg != NULL) - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - usleep (arg == NULL ? (useconds_t) ULONG_MAX : 0); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("usleep returns"); -} - - -static void * -tf_nanosleep (void *arg) -{ - xpthread_barrier_wait (&b2); - - if (arg != NULL) - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - struct timespec ts = { .tv_sec = arg == NULL ? 10000000 : 0, .tv_nsec = 0 }; - TEMP_FAILURE_RETRY (nanosleep (&ts, &ts)); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("nanosleep returns"); -} - - -static void * -tf_select (void *arg) -{ - int fd; - - if (arg == NULL) - fd = fds[0]; - else - { - char fname[] = "/tmp/tst-cancel4-fd-XXXXXX"; - tempfd = fd = mkstemp (fname); - if (fd == -1) - FAIL_EXIT1 ("mkstemp failed: %m"); - unlink (fname); - - xpthread_barrier_wait (&b2); - } - - xpthread_barrier_wait (&b2); - - fd_set rfs; - FD_ZERO (&rfs); - FD_SET (fd, &rfs); - - int s; - pthread_cleanup_push (cl, NULL); - - s = select (fd + 1, &rfs, NULL, NULL, NULL); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("select returns with %d: %m", s); -} - - -static void * -tf_pselect (void *arg) -{ - int fd; - - if (arg == NULL) - fd = fds[0]; - else - { - char fname[] = "/tmp/tst-cancel4-fd-XXXXXX"; - tempfd = fd = mkstemp (fname); - if (fd == -1) - FAIL_EXIT1 ("mkstemp failed: %m"); - unlink (fname); - - xpthread_barrier_wait (&b2); - } - - xpthread_barrier_wait (&b2); - - fd_set rfs; - FD_ZERO (&rfs); - FD_SET (fd, &rfs); - - int s; - pthread_cleanup_push (cl, NULL); - - s = pselect (fd + 1, &rfs, NULL, NULL, NULL, NULL); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("pselect returns with %d: %m", s); -} - - -static void * -tf_poll (void *arg) -{ - int fd; - - if (arg == NULL) - fd = fds[0]; - else - { - char fname[] = "/tmp/tst-cancel4-fd-XXXXXX"; - tempfd = fd = mkstemp (fname); - if (fd == -1) - FAIL_EXIT1 ("mkstemp failed: %m"); - unlink (fname); - - xpthread_barrier_wait (&b2); - } - - xpthread_barrier_wait (&b2); - - struct pollfd rfs[1] = { [0] = { .fd = fd, .events = POLLIN } }; - - int s; - pthread_cleanup_push (cl, NULL); - - s = poll (rfs, 1, -1); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("poll returns with %d: %m", s); -} - - -static void * -tf_ppoll (void *arg) -{ - int fd; - - if (arg == NULL) - fd = fds[0]; - else - { - char fname[] = "/tmp/tst-cancel4-fd-XXXXXX"; - tempfd = fd = mkstemp (fname); - if (fd == -1) - FAIL_EXIT1 ("mkstemp failed: %m"); - unlink (fname); - - xpthread_barrier_wait (&b2); - } - - xpthread_barrier_wait (&b2); - - struct pollfd rfs[1] = { [0] = { .fd = fd, .events = POLLIN } }; - - int s; - pthread_cleanup_push (cl, NULL); - - s = ppoll (rfs, 1, NULL, NULL); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("ppoll returns with %d: %m", s); -} - - -static void * -tf_wait (void *arg) -{ - pid_t pid = fork (); - if (pid == -1) - FAIL_EXIT1 ("fork: %m"); - - if (pid == 0) - { - /* Make the program disappear after a while. */ - if (arg == NULL) - sleep (10); - exit (0); - } - - if (arg != NULL) - { - struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 }; - while (nanosleep (&ts, &ts) != 0) - continue; - - xpthread_barrier_wait (&b2); - } - - xpthread_barrier_wait (&b2); - - int s; - pthread_cleanup_push (cl, NULL); - - s = wait (NULL); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("wait returns with %d: %m", s); -} - - -static void * -tf_waitpid (void *arg) -{ - pid_t pid = fork (); - if (pid == -1) - FAIL_EXIT1 ("fork: %m"); - - if (pid == 0) - { - /* Make the program disappear after a while. */ - if (arg == NULL) - sleep (10); - exit (0); - } - - if (arg != NULL) - { - struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 }; - while (nanosleep (&ts, &ts) != 0) - continue; - - xpthread_barrier_wait (&b2); - } - - xpthread_barrier_wait (&b2); - - int s; - pthread_cleanup_push (cl, NULL); - - s = waitpid (-1, NULL, 0); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("waitpid returns with %d: %m", s); -} - - -static void * -tf_waitid (void *arg) -{ - pid_t pid = fork (); - if (pid == -1) - FAIL_EXIT1 ("fork: %m"); - - if (pid == 0) - { - /* Make the program disappear after a while. */ - if (arg == NULL) - sleep (10); - exit (0); - } - - if (arg != NULL) - { - struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 }; - while (nanosleep (&ts, &ts) != 0) - continue; - - xpthread_barrier_wait (&b2); - } - - xpthread_barrier_wait (&b2); - - int s; - pthread_cleanup_push (cl, NULL); - -#ifndef WEXITED -# define WEXITED 0 -#endif - siginfo_t si; - s = waitid (P_PID, pid, &si, WEXITED); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("waitid returns with %d: %m", s); -} - - -static void * -tf_sigpause (void *arg) -{ - xpthread_barrier_wait (&b2); - - if (arg != NULL) - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - sigpause (sigmask (SIGINT)); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("sigpause returned"); -} - - -static void * -tf_sigsuspend (void *arg) -{ - xpthread_barrier_wait (&b2); - - if (arg != NULL) - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - /* Just for fun block all signals. */ - sigset_t mask; - sigfillset (&mask); - sigsuspend (&mask); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("sigsuspend returned"); -} - - -static void * -tf_sigwait (void *arg) -{ - xpthread_barrier_wait (&b2); - - if (arg != NULL) - xpthread_barrier_wait (&b2); - - /* Block SIGUSR1. */ - sigset_t mask; - sigemptyset (&mask); - sigaddset (&mask, SIGUSR1); - TEST_VERIFY_EXIT (pthread_sigmask (SIG_BLOCK, &mask, NULL) == 0); - - int sig; - pthread_cleanup_push (cl, NULL); - - /* Wait for SIGUSR1. */ - sigwait (&mask, &sig); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("sigwait returned with signal %d", sig); -} - - -static void * -tf_sigwaitinfo (void *arg) -{ - xpthread_barrier_wait (&b2); - - if (arg != NULL) - xpthread_barrier_wait (&b2); - - /* Block SIGUSR1. */ - sigset_t mask; - sigemptyset (&mask); - sigaddset (&mask, SIGUSR1); - TEST_VERIFY_EXIT (pthread_sigmask (SIG_BLOCK, &mask, NULL) == 0); - - siginfo_t info; - pthread_cleanup_push (cl, NULL); - - /* Wait for SIGUSR1. */ - sigwaitinfo (&mask, &info); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("sigwaitinfo returned with signal %d", info.si_signo); -} - - -static void * -tf_sigtimedwait (void *arg) -{ - xpthread_barrier_wait (&b2); - - if (arg != NULL) - xpthread_barrier_wait (&b2); - - /* Block SIGUSR1. */ - sigset_t mask; - sigemptyset (&mask); - sigaddset (&mask, SIGUSR1); - TEST_VERIFY_EXIT (pthread_sigmask (SIG_BLOCK, &mask, NULL) == 0); - - /* Wait for SIGUSR1. */ - siginfo_t info; - struct timespec ts = { .tv_sec = 60, .tv_nsec = 0 }; - pthread_cleanup_push (cl, NULL); - - sigtimedwait (&mask, &info, &ts); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("sigtimedwait returned with signal %d", info.si_signo); -} - - -static void * -tf_pause (void *arg) -{ - xpthread_barrier_wait (&b2); - - if (arg != NULL) - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - pause (); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("pause returned"); -} - - -static void * -tf_accept (void *arg) -{ - struct sockaddr_un sun; - /* To test a non-blocking accept call we make the call file by using - a datagrame socket. */ - int pf = arg == NULL ? SOCK_STREAM : SOCK_DGRAM; - - tempfd = socket (AF_UNIX, pf, 0); - if (tempfd == -1) - FAIL_EXIT1 ("socket (AF_UNIX, %s, 0): %m", arg == NULL ? "SOCK_STREAM" - : "SOCK_DGRAM"); - - int tries = 0; - do - { - TEST_VERIFY_EXIT (tries++ < 10); - - strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-1-XXXXXX"); - TEST_VERIFY_EXIT (mktemp (sun.sun_path) != NULL); - - sun.sun_family = AF_UNIX; - } - while (bind (tempfd, (struct sockaddr *) &sun, - offsetof (struct sockaddr_un, sun_path) - + strlen (sun.sun_path) + 1) != 0); - - unlink (sun.sun_path); - - listen (tempfd, 5); - - socklen_t len = sizeof (sun); - - xpthread_barrier_wait (&b2); - - if (arg != NULL) - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - accept (tempfd, (struct sockaddr *) &sun, &len); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("accept returned"); -} - - -static void * -tf_send (void *arg) -{ - struct sockaddr_un sun; - - tempfd = socket (AF_UNIX, SOCK_STREAM, 0); - if (tempfd == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m"); - - int tries = 0; - do - { - TEST_VERIFY_EXIT (tries++ < 10); - - strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-2-XXXXXX"); - TEST_VERIFY_EXIT (mktemp (sun.sun_path) != NULL); - - sun.sun_family = AF_UNIX; - } - while (bind (tempfd, (struct sockaddr *) &sun, - offsetof (struct sockaddr_un, sun_path) - + strlen (sun.sun_path) + 1) != 0); - - listen (tempfd, 5); - - tempfd2 = socket (AF_UNIX, SOCK_STREAM, 0); - if (tempfd2 == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m"); - - if (connect (tempfd2, (struct sockaddr *) &sun, sizeof (sun)) != 0) - FAIL_EXIT1 ("connect: %m"); - - unlink (sun.sun_path); - - xpthread_barrier_wait (&b2); - - if (arg != NULL) - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - /* Very large block, so that the send call blocks. */ - char mem[700000]; - - send (tempfd2, mem, arg == NULL ? sizeof (mem) : 1, 0); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("send returned"); -} - - -static void * -tf_recv (void *arg) -{ - struct sockaddr_un sun; - - tempfd = socket (AF_UNIX, SOCK_STREAM, 0); - if (tempfd == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m"); - - int tries = 0; - do - { - TEST_VERIFY_EXIT (tries++ < 10); - - strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-3-XXXXXX"); - TEST_VERIFY_EXIT (mktemp (sun.sun_path) != NULL); - - sun.sun_family = AF_UNIX; - } - while (bind (tempfd, (struct sockaddr *) &sun, - offsetof (struct sockaddr_un, sun_path) - + strlen (sun.sun_path) + 1) != 0); - - listen (tempfd, 5); - - tempfd2 = socket (AF_UNIX, SOCK_STREAM, 0); - if (tempfd2 == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m"); - - if (connect (tempfd2, (struct sockaddr *) &sun, sizeof (sun)) != 0) - FAIL_EXIT1 ("connect: %m"); - - unlink (sun.sun_path); - - xpthread_barrier_wait (&b2); - - if (arg != NULL) - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - char mem[70]; - - recv (tempfd2, mem, arg == NULL ? sizeof (mem) : 0, 0); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("recv returned"); -} - - -static void * -tf_recvfrom (void *arg) -{ - struct sockaddr_un sun; - - tempfd = socket (AF_UNIX, SOCK_DGRAM, 0); - if (tempfd == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m"); - - int tries = 0; - do - { - TEST_VERIFY_EXIT (tries++ < 10); - - strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-4-XXXXXX"); - TEST_VERIFY_EXIT (mktemp (sun.sun_path) != NULL); - - sun.sun_family = AF_UNIX; - } - while (bind (tempfd, (struct sockaddr *) &sun, - offsetof (struct sockaddr_un, sun_path) - + strlen (sun.sun_path) + 1) != 0); - - tempfname = strdup (sun.sun_path); - - tempfd2 = socket (AF_UNIX, SOCK_DGRAM, 0); - if (tempfd2 == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m"); - - xpthread_barrier_wait (&b2); - - if (arg != NULL) - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - char mem[70]; - socklen_t len = sizeof (sun); - - recvfrom (tempfd2, mem, arg == NULL ? sizeof (mem) : 0, 0, - (struct sockaddr *) &sun, &len); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("recvfrom returned"); -} - - -static void * -tf_recvmsg (void *arg) -{ - struct sockaddr_un sun; - - tempfd = socket (AF_UNIX, SOCK_DGRAM, 0); - if (tempfd == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m"); - - int tries = 0; - do - { - TEST_VERIFY_EXIT (tries++ < 10); - - strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-5-XXXXXX"); - TEST_VERIFY_EXIT (mktemp (sun.sun_path) != NULL); - - sun.sun_family = AF_UNIX; - } - while (bind (tempfd, (struct sockaddr *) &sun, - offsetof (struct sockaddr_un, sun_path) - + strlen (sun.sun_path) + 1) != 0); - - tempfname = strdup (sun.sun_path); - - tempfd2 = socket (AF_UNIX, SOCK_DGRAM, 0); - if (tempfd2 == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m"); - - xpthread_barrier_wait (&b2); - - if (arg != NULL) - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - char mem[70]; - struct iovec iov[1]; - iov[0].iov_base = mem; - iov[0].iov_len = arg == NULL ? sizeof (mem) : 0; - - struct msghdr m; - m.msg_name = &sun; - m.msg_namelen = sizeof (sun); - m.msg_iov = iov; - m.msg_iovlen = 1; - m.msg_control = NULL; - m.msg_controllen = 0; - - recvmsg (tempfd2, &m, 0); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("recvmsg returned"); -} - -static void * -tf_open (void *arg) -{ - if (arg == NULL) - { - fifofd = mkfifo (fifoname, S_IWUSR | S_IRUSR); - if (fifofd == -1) - FAIL_EXIT1 ("mkfifo: %m"); - } - else - { - xpthread_barrier_wait (&b2); - } - - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl_fifo, NULL); - - open (arg ? "Makefile" : fifoname, O_RDONLY); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("open returned"); -} - - -static void * -tf_close (void *arg) -{ - if (arg == NULL) - // XXX If somebody can provide a portable test case in which close() - // blocks we can enable this test to run in both rounds. - abort (); - - char fname[] = "/tmp/tst-cancel-fd-XXXXXX"; - tempfd = mkstemp (fname); - if (tempfd == -1) - FAIL_EXIT1 ("mkstemp failed: %m"); - unlink (fname); - - xpthread_barrier_wait (&b2); - - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - close (tempfd); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("close returned"); -} - - -static void * -tf_pread (void *arg) -{ - if (arg == NULL) - // XXX If somebody can provide a portable test case in which pread() - // blocks we can enable this test to run in both rounds. - abort (); - - tempfd = open ("Makefile", O_RDONLY); - if (tempfd == -1) - FAIL_EXIT1 ("open (\"Makefile\", O_RDONLY): %m"); - - xpthread_barrier_wait (&b2); - - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - char mem[10]; - pread (tempfd, mem, sizeof (mem), 0); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("pread returned"); -} - - -static void * -tf_pwrite (void *arg) -{ - if (arg == NULL) - // XXX If somebody can provide a portable test case in which pwrite() - // blocks we can enable this test to run in both rounds. - abort (); - - char fname[] = "/tmp/tst-cancel4-fd-XXXXXX"; - tempfd = mkstemp (fname); - if (tempfd == -1) - FAIL_EXIT1 ("mkstemp failed: %m"); - unlink (fname); - - xpthread_barrier_wait (&b2); - - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - char mem[10]; - pwrite (tempfd, mem, sizeof (mem), 0); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("pwrite returned"); -} - -static void * -tf_preadv (void *arg) -{ - int fd; - - if (arg == NULL) - /* XXX If somebody can provide a portable test case in which preadv - blocks we can enable this test to run in both rounds. */ - abort (); - - char fname[] = "/tmp/tst-cancel4-fd-XXXXXX"; - tempfd = fd = mkstemp (fname); - if (fd == -1) - FAIL_EXIT1 ("mkstemp failed: %m"); - unlink (fname); - - xpthread_barrier_wait (&b2); - - xpthread_barrier_wait (&b2); - - ssize_t s; - pthread_cleanup_push (cl, NULL); - - char buf[100]; - struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } }; - s = preadv (fd, iov, 1, 0); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("preadv returns with %zd", s); -} - -static void * -tf_pwritev (void *arg) -{ - int fd; - - if (arg == NULL) - /* XXX If somebody can provide a portable test case in which pwritev - blocks we can enable this test to run in both rounds. */ - abort (); - - char fname[] = "/tmp/tst-cancel4-fd-XXXXXX"; - tempfd = fd = mkstemp (fname); - if (fd == -1) - FAIL_EXIT1 ("mkstemp failed: %m"); - unlink (fname); - - xpthread_barrier_wait (&b2); - - xpthread_barrier_wait (&b2); - - ssize_t s; - pthread_cleanup_push (cl, NULL); - - char buf[WRITE_BUFFER_SIZE]; - memset (buf, '\0', sizeof (buf)); - struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } }; - s = pwritev (fd, iov, 1, 0); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("pwritev returns with %zd", s); -} - -static void * -tf_pwritev2 (void *arg) -{ - int fd; - - if (arg == NULL) - /* XXX If somebody can provide a portable test case in which pwritev2 - blocks we can enable this test to run in both rounds. */ - abort (); - - errno = 0; - - char fname[] = "/tmp/tst-cancel4-fd-XXXXXX"; - tempfd = fd = mkstemp (fname); - if (fd == -1) - FAIL_EXIT1 ("mkstemp: %m"); - unlink (fname); - - xpthread_barrier_wait (&b2); - - xpthread_barrier_wait (&b2); - - ssize_t s; - pthread_cleanup_push (cl, NULL); - - char buf[WRITE_BUFFER_SIZE]; - memset (buf, '\0', sizeof (buf)); - struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } }; - s = pwritev2 (fd, iov, 1, 0, 0); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("pwritev2 returns with %zd", s); -} - -static void * -tf_preadv2 (void *arg) -{ - int fd; - - if (arg == NULL) - /* XXX If somebody can provide a portable test case in which preadv2 - blocks we can enable this test to run in both rounds. */ - abort (); - - errno = 0; - - char fname[] = "/tmp/tst-cancel4-fd-XXXXXX"; - tempfd = fd = mkstemp (fname); - if (fd == -1) - FAIL_EXIT1 ("mkstemp failed: %m"); - unlink (fname); - - xpthread_barrier_wait (&b2); - - xpthread_barrier_wait (&b2); - - ssize_t s; - pthread_cleanup_push (cl, NULL); - - char buf[100]; - struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } }; - s = preadv2 (fd, iov, 1, 0, 0); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("preadv2 returns with %zd", s); -} - -static void * -tf_fsync (void *arg) -{ - if (arg == NULL) - // XXX If somebody can provide a portable test case in which fsync() - // blocks we can enable this test to run in both rounds. - abort (); - - tempfd = open ("Makefile", O_RDONLY); - if (tempfd == -1) - FAIL_EXIT1 ("open (\"Makefile\", O_RDONLY): %m"); - - xpthread_barrier_wait (&b2); - - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - fsync (tempfd); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("fsync returned"); -} - - -static void * -tf_fdatasync (void *arg) -{ - if (arg == NULL) - // XXX If somebody can provide a portable test case in which fdatasync() - // blocks we can enable this test to run in both rounds. - abort (); - - tempfd = open ("Makefile", O_RDONLY); - if (tempfd == -1) - FAIL_EXIT1 ("open (\"Makefile\", O_RDONLY): %m"); - - xpthread_barrier_wait (&b2); - - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - fdatasync (tempfd); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("fdatasync returned"); -} - - -static void * -tf_msync (void *arg) -{ - if (arg == NULL) - // XXX If somebody can provide a portable test case in which msync() - // blocks we can enable this test to run in both rounds. - abort (); - - tempfd = open ("Makefile", O_RDONLY); - if (tempfd == -1) - FAIL_EXIT1 ("open (\"Makefile\", O_RDONLY): %m"); - - void *p = xmmap (NULL, 10, PROT_READ, MAP_SHARED, tempfd); - - xpthread_barrier_wait (&b2); - - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - msync (p, 10, 0); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("msync returned"); -} - - -static void * -tf_sendto (void *arg) -{ - if (arg == NULL) - // XXX If somebody can provide a portable test case in which sendto() - // blocks we can enable this test to run in both rounds. - abort (); - - struct sockaddr_un sun; - - tempfd = socket (AF_UNIX, SOCK_DGRAM, 0); - if (tempfd == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m"); - - int tries = 0; - do - { - TEST_VERIFY_EXIT (tries++ < 10); - - strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-6-XXXXXX"); - TEST_VERIFY_EXIT (mktemp (sun.sun_path) != NULL); - - sun.sun_family = AF_UNIX; - } - while (bind (tempfd, (struct sockaddr *) &sun, - offsetof (struct sockaddr_un, sun_path) - + strlen (sun.sun_path) + 1) != 0); - tempfname = strdup (sun.sun_path); - - tempfd2 = socket (AF_UNIX, SOCK_DGRAM, 0); - if (tempfd2 == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m"); - - xpthread_barrier_wait (&b2); - - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - char mem[1]; - - sendto (tempfd2, mem, arg == NULL ? sizeof (mem) : 1, 0, - (struct sockaddr *) &sun, - offsetof (struct sockaddr_un, sun_path) + strlen (sun.sun_path) + 1); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("sendto returned"); -} - - -static void * -tf_sendmsg (void *arg) -{ - if (arg == NULL) - // XXX If somebody can provide a portable test case in which sendmsg() - // blocks we can enable this test to run in both rounds. - abort (); - - struct sockaddr_un sun; - - tempfd = socket (AF_UNIX, SOCK_DGRAM, 0); - if (tempfd == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m"); - - int tries = 0; - do - { - TEST_VERIFY_EXIT (tries++ < 10); - - strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-7-XXXXXX"); - TEST_VERIFY_EXIT (mktemp (sun.sun_path) != NULL); - - sun.sun_family = AF_UNIX; - } - while (bind (tempfd, (struct sockaddr *) &sun, - offsetof (struct sockaddr_un, sun_path) - + strlen (sun.sun_path) + 1) != 0); - tempfname = strdup (sun.sun_path); - - tempfd2 = socket (AF_UNIX, SOCK_DGRAM, 0); - if (tempfd2 == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m"); - - xpthread_barrier_wait (&b2); - - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - char mem[1]; - struct iovec iov[1]; - iov[0].iov_base = mem; - iov[0].iov_len = 1; - - struct msghdr m; - m.msg_name = &sun; - m.msg_namelen = (offsetof (struct sockaddr_un, sun_path) - + strlen (sun.sun_path) + 1); - m.msg_iov = iov; - m.msg_iovlen = 1; - m.msg_control = NULL; - m.msg_controllen = 0; - - sendmsg (tempfd2, &m, 0); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("sendmsg returned"); -} - - -static void * -tf_creat (void *arg) -{ - if (arg == NULL) - // XXX If somebody can provide a portable test case in which sendmsg() - // blocks we can enable this test to run in both rounds. - abort (); - - xpthread_barrier_wait (&b2); - - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - creat ("tmp/tst-cancel-4-should-not-exist", 0666); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("creat returned"); -} - - -static void * -tf_connect (void *arg) -{ - if (arg == NULL) - // XXX If somebody can provide a portable test case in which connect() - // blocks we can enable this test to run in both rounds. - abort (); - - struct sockaddr_un sun; - - tempfd = socket (AF_UNIX, SOCK_STREAM, 0); - if (tempfd == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m"); - - int tries = 0; - do - { - TEST_VERIFY_EXIT (tries++ < 10); - - strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-2-XXXXXX"); - TEST_VERIFY_EXIT (mktemp (sun.sun_path) != NULL); - - sun.sun_family = AF_UNIX; - } - while (bind (tempfd, (struct sockaddr *) &sun, - offsetof (struct sockaddr_un, sun_path) - + strlen (sun.sun_path) + 1) != 0); - tempfname = strdup (sun.sun_path); - - listen (tempfd, 5); - - tempfd2 = socket (AF_UNIX, SOCK_STREAM, 0); - if (tempfd2 == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m"); - - xpthread_barrier_wait (&b2); - - if (arg != NULL) - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - connect (tempfd2, (struct sockaddr *) &sun, sizeof (sun)); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("connect returned"); -} - - -static void * -tf_tcdrain (void *arg) -{ - if (arg == NULL) - // XXX If somebody can provide a portable test case in which tcdrain() - // blocks we can enable this test to run in both rounds. - abort (); - - xpthread_barrier_wait (&b2); - - if (arg != NULL) - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - /* Regardless of stderr being a terminal, the tcdrain call should be - canceled. */ - tcdrain (STDERR_FILENO); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("tcdrain returned"); -} - - -static void * -tf_msgrcv (void *arg) -{ - tempmsg = msgget (IPC_PRIVATE, 0666 | IPC_CREAT); - if (tempmsg == -1) - FAIL_EXIT1 ("msgget (IPC_PRIVATE, 0666 | IPC_CREAT): %m"); - - xpthread_barrier_wait (&b2); - - if (arg != NULL) - xpthread_barrier_wait (&b2); - - ssize_t s; - - pthread_cleanup_push (cl, NULL); - - struct - { - long int type; - char mem[10]; - } m; - int randnr; - /* We need a positive random number. */ - do - randnr = random () % 64000; - while (randnr <= 0); - do - { - errno = 0; - s = msgrcv (tempmsg, (struct msgbuf *) &m, 10, randnr, 0); - } - while (errno == EIDRM || errno == EINTR); - - pthread_cleanup_pop (0); - - msgctl (tempmsg, IPC_RMID, NULL); - - FAIL_EXIT1 ("msgrcv returned %zd", s); -} - - -static void * -tf_msgsnd (void *arg) -{ - if (arg == NULL) - // XXX If somebody can provide a portable test case in which msgsnd() - // blocks we can enable this test to run in both rounds. - abort (); - - tempmsg = msgget (IPC_PRIVATE, 0666 | IPC_CREAT); - if (tempmsg == -1) - FAIL_EXIT1 ("msgget (IPC_PRIVATE, 0666 | IPC_CREAT): %m"); - - xpthread_barrier_wait (&b2); - - xpthread_barrier_wait (&b2); - - pthread_cleanup_push (cl, NULL); - - struct - { - long int type; - char mem[1]; - } m; - /* We need a positive random number. */ - do - m.type = random () % 64000; - while (m.type <= 0); - msgsnd (tempmsg, (struct msgbuf *) &m, sizeof (m.mem), 0); - - pthread_cleanup_pop (0); - - msgctl (tempmsg, IPC_RMID, NULL); - - FAIL_EXIT1 ("msgsnd returned"); -} - - -struct cancel_tests tests[] = -{ - ADD_TEST (read, 2, 0), - ADD_TEST (readv, 2, 0), - ADD_TEST (select, 2, 0), - ADD_TEST (pselect, 2, 0), - ADD_TEST (poll, 2, 0), - ADD_TEST (ppoll, 2, 0), - ADD_TEST (write, 2, 0), - ADD_TEST (writev, 2, 0), - ADD_TEST (sleep, 2, 0), - ADD_TEST (usleep, 2, 0), - ADD_TEST (nanosleep, 2, 0), - ADD_TEST (wait, 2, 0), - ADD_TEST (waitid, 2, 0), - ADD_TEST (waitpid, 2, 0), - ADD_TEST (sigpause, 2, 0), - ADD_TEST (sigsuspend, 2, 0), - ADD_TEST (sigwait, 2, 0), - ADD_TEST (sigwaitinfo, 2, 0), - ADD_TEST (sigtimedwait, 2, 0), - ADD_TEST (pause, 2, 0), - ADD_TEST (accept, 2, 0), - ADD_TEST (send, 2, 0), - ADD_TEST (recv, 2, 0), - ADD_TEST (recvfrom, 2, 0), - ADD_TEST (recvmsg, 2, 0), - ADD_TEST (preadv, 2, 1), - ADD_TEST (preadv2, 2, 1), - ADD_TEST (pwritev, 2, 1), - ADD_TEST (pwritev2, 2, 1), - ADD_TEST (open, 2, 1), - ADD_TEST (close, 2, 1), - ADD_TEST (pread, 2, 1), - ADD_TEST (pwrite, 2, 1), - ADD_TEST (fsync, 2, 1), - ADD_TEST (fdatasync, 2, 1), - ADD_TEST (msync, 2, 1), - ADD_TEST (sendto, 2, 1), - ADD_TEST (sendmsg, 2, 1), - ADD_TEST (creat, 2, 1), - ADD_TEST (connect, 2, 1), - ADD_TEST (tcdrain, 2, 1), - ADD_TEST (msgrcv, 2, 0), - ADD_TEST (msgsnd, 2, 1), -}; -#define ntest_tf (sizeof (tests) / sizeof (tests[0])) - -#include "tst-cancel4-common.c" diff --git a/nptl/tst-cancel4_1.c b/nptl/tst-cancel4_1.c deleted file mode 100644 index 0f41965ed1..0000000000 --- a/nptl/tst-cancel4_1.c +++ /dev/null @@ -1,109 +0,0 @@ -/* Check sendmmsg cancellation. - - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <stddef.h> -#include <stdlib.h> -#include <string.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <sys/ipc.h> -#include <sys/msg.h> -#include <unistd.h> -#include <errno.h> -#include <pthread.h> - -#include "tst-cancel4-common.h" - -static void * -tf_sendmmsg (void *arg) -{ - if (arg == NULL) - // XXX If somebody can provide a portable test case in which sendmmsg() - // blocks we can enable this test to run in both rounds. - abort (); - - struct sockaddr_un sun; - - tempfd = socket (AF_UNIX, SOCK_DGRAM, 0); - if (tempfd == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m"); - - int tries = 0; - do - { - if (++tries > 10) - FAIL_EXIT1 ("too many unsuccessful bind calls"); - - strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-7-XXXXXX"); - if (mktemp (sun.sun_path) == NULL) - FAIL_EXIT1 ("cannot generate temp file name"); - - sun.sun_family = AF_UNIX; - } - while (bind (tempfd, (struct sockaddr *) &sun, - offsetof (struct sockaddr_un, sun_path) - + strlen (sun.sun_path) + 1) != 0); - tempfname = strdup (sun.sun_path); - - tempfd2 = socket (AF_UNIX, SOCK_DGRAM, 0); - if (tempfd2 == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m"); - - int r = pthread_barrier_wait (&b2); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - FAIL_EXIT1 ("pthread_barrier_wait"); - - r = pthread_barrier_wait (&b2); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - FAIL_EXIT1 ("pthread_barrier_wait"); - - pthread_cleanup_push (cl, NULL); - - char mem[1]; - struct iovec iov[1]; - iov[0].iov_base = mem; - iov[0].iov_len = 1; - - struct mmsghdr mm; - mm.msg_hdr.msg_name = &sun; - mm.msg_hdr.msg_namelen = (offsetof (struct sockaddr_un, sun_path) - + strlen (sun.sun_path) + 1); - mm.msg_hdr.msg_iov = iov; - mm.msg_hdr.msg_iovlen = 1; - mm.msg_hdr.msg_control = NULL; - mm.msg_hdr.msg_controllen = 0; - - ssize_t ret = sendmmsg (tempfd2, &mm, 1, 0); - if (ret == -1 && errno == ENOSYS) - exit (77); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("sendmmsg returned"); -} - -struct cancel_tests tests[] = -{ - ADD_TEST (sendmmsg, 2, 1), -}; -#define ntest_tf (sizeof (tests) / sizeof (tests[0])) - -#include "tst-cancel4-common.c" diff --git a/nptl/tst-cancel4_2.c b/nptl/tst-cancel4_2.c deleted file mode 100644 index 1158609e7a..0000000000 --- a/nptl/tst-cancel4_2.c +++ /dev/null @@ -1,107 +0,0 @@ -/* Check recvmmsg cancellation. - - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <stddef.h> -#include <stdlib.h> -#include <string.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <sys/ipc.h> -#include <sys/msg.h> -#include <unistd.h> -#include <errno.h> -#include <pthread.h> - -#include "tst-cancel4-common.h" - -static void * -tf_recvmmsg (void *arg) -{ - struct sockaddr_un sun; - - tempfd = socket (AF_UNIX, SOCK_DGRAM, 0); - if (tempfd == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m"); - - int tries = 0; - do - { - if (++tries > 10) - FAIL_EXIT1 ("too many unsuccessful bind calls"); - - strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-5-XXXXXX"); - if (mktemp (sun.sun_path) == NULL) - FAIL_EXIT1 ("cannot generate temp file name"); - - sun.sun_family = AF_UNIX; - } - while (bind (tempfd, (struct sockaddr *) &sun, - offsetof (struct sockaddr_un, sun_path) - + strlen (sun.sun_path) + 1) != 0); - - tempfname = strdup (sun.sun_path); - - tempfd2 = socket (AF_UNIX, SOCK_DGRAM, 0); - if (tempfd2 == -1) - FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m"); - - int r = pthread_barrier_wait (&b2); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - FAIL_EXIT1 ("pthread_barrier_wait"); - - if (arg != NULL) - { - r = pthread_barrier_wait (&b2); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - FAIL_EXIT1 ("pthread_barrier_wait"); - } - - pthread_cleanup_push (cl, NULL); - - char mem[70]; - struct iovec iov[1]; - iov[0].iov_base = mem; - iov[0].iov_len = arg == NULL ? sizeof (mem) : 0; - - struct mmsghdr mm; - mm.msg_hdr.msg_name = &sun; - mm.msg_hdr.msg_namelen = sizeof (sun); - mm.msg_hdr.msg_iov = iov; - mm.msg_hdr.msg_iovlen = 1; - mm.msg_hdr.msg_control = NULL; - mm.msg_hdr.msg_controllen = 0; - - ssize_t ret = recvmmsg (tempfd2, &mm, 1, 0, NULL); - if (ret == -1 && errno == ENOSYS) - exit (77); - - pthread_cleanup_pop (0); - - FAIL_EXIT1 ("recvmmsg returned"); -} - -struct cancel_tests tests[] = -{ - ADD_TEST (recvmmsg, 2, 1), -}; -#define ntest_tf (sizeof (tests) / sizeof (tests[0])) - -#include "tst-cancel4-common.c" diff --git a/nptl/tst-cancel5.c b/nptl/tst-cancel5.c deleted file mode 100644 index 1c879eba8b..0000000000 --- a/nptl/tst-cancel5.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel4.c" diff --git a/nptl/tst-cancel6.c b/nptl/tst-cancel6.c deleted file mode 100644 index 0fab406fc4..0000000000 --- a/nptl/tst-cancel6.c +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static void * -tf (void *arg) -{ - char buf[100]; - fgets (buf, sizeof (buf), arg); - /* This call should never return. */ - return NULL; -} - - -static int -do_test (void) -{ - int fd[2]; - if (pipe (fd) != 0) - { - puts ("pipe failed"); - return 1; - } - - FILE *fp = fdopen (fd[0], "r"); - if (fp == NULL) - { - puts ("fdopen failed"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, fp) != 0) - { - puts ("pthread_create failed"); - return 1; - } - - sleep (1); - - if (pthread_cancel (th) != 0) - { - puts ("pthread_cancel failed"); - return 1; - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("pthread_join failed"); - return 1; - } - - return r != PTHREAD_CANCELED; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel7.c b/nptl/tst-cancel7.c deleted file mode 100644 index 7cbe04f2e2..0000000000 --- a/nptl/tst-cancel7.c +++ /dev/null @@ -1,209 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <fcntl.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <getopt.h> - -#include <support/xthread.h> - -const char *command; -const char *pidfile; -char pidfilename[] = "/tmp/tst-cancel7-XXXXXX"; - -static void * -tf (void *arg) -{ - const char *args = " --direct --pidfile "; - char *cmd = alloca (strlen (command) + strlen (args) - + strlen (pidfilename) + 1); - - strcpy (stpcpy (stpcpy (cmd, command), args), pidfilename); - system (cmd); - /* This call should never return. */ - return NULL; -} - - -static void -sl (void) -{ - FILE *f = fopen (pidfile, "w"); - if (f == NULL) - exit (1); - - fprintf (f, "%lld\n", (long long) getpid ()); - fflush (f); - - struct flock fl = - { - .l_type = F_WRLCK, - .l_start = 0, - .l_whence = SEEK_SET, - .l_len = 1 - }; - if (fcntl (fileno (f), F_SETLK, &fl) != 0) - exit (1); - - sigset_t ss; - sigfillset (&ss); - sigsuspend (&ss); - exit (0); -} - - -static void -do_prepare (int argc, char *argv[]) -{ - if (command == NULL) - command = argv[0]; - - if (pidfile) - sl (); - - int fd = mkstemp (pidfilename); - if (fd == -1) - { - puts ("mkstemp failed"); - exit (1); - } - - write (fd, " ", 1); - close (fd); -} - - -static int -do_test (void) -{ - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("pthread_create failed"); - return 1; - } - - do - sleep (1); - while (access (pidfilename, R_OK) != 0); - - xpthread_cancel (th); - void *r = xpthread_join (th); - - sleep (1); - - FILE *f = fopen (pidfilename, "r+"); - if (f == NULL) - { - puts ("no pidfile"); - return 1; - } - - long long ll; - if (fscanf (f, "%lld\n", &ll) != 1) - { - puts ("could not read pid"); - unlink (pidfilename); - return 1; - } - - struct flock fl = - { - .l_type = F_WRLCK, - .l_start = 0, - .l_whence = SEEK_SET, - .l_len = 1 - }; - if (fcntl (fileno (f), F_GETLK, &fl) != 0) - { - puts ("F_GETLK failed"); - unlink (pidfilename); - return 1; - } - - if (fl.l_type != F_UNLCK) - { - printf ("child %lld still running\n", (long long) fl.l_pid); - if (fl.l_pid == ll) - kill (fl.l_pid, SIGKILL); - - unlink (pidfilename); - return 1; - } - - fclose (f); - - unlink (pidfilename); - - return r != PTHREAD_CANCELED; -} - -static void -do_cleanup (void) -{ - FILE *f = fopen (pidfilename, "r+"); - long long ll; - - if (f != NULL && fscanf (f, "%lld\n", &ll) == 1) - { - struct flock fl = - { - .l_type = F_WRLCK, - .l_start = 0, - .l_whence = SEEK_SET, - .l_len = 1 - }; - if (fcntl (fileno (f), F_GETLK, &fl) == 0 && fl.l_type != F_UNLCK - && fl.l_pid == ll) - kill (fl.l_pid, SIGKILL); - - fclose (f); - } - - unlink (pidfilename); -} - -#define OPT_COMMAND 10000 -#define OPT_PIDFILE 10001 -#define CMDLINE_OPTIONS \ - { "command", required_argument, NULL, OPT_COMMAND }, \ - { "pidfile", required_argument, NULL, OPT_PIDFILE }, -static void -cmdline_process (int c) -{ - switch (c) - { - case OPT_COMMAND: - command = optarg; - break; - case OPT_PIDFILE: - pidfile = optarg; - break; - } -} -#define CMDLINE_PROCESS cmdline_process -#define CLEANUP_HANDLER do_cleanup -#define PREPARE do_prepare -#define TIMEOUT 5 -#include <support/test-driver.c> diff --git a/nptl/tst-cancel8.c b/nptl/tst-cancel8.c deleted file mode 100644 index 693ec0c67f..0000000000 --- a/nptl/tst-cancel8.c +++ /dev/null @@ -1,142 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static pthread_barrier_t bar; - -static int global; - - -static void -cleanup (void *arg) -{ - global = 1; -} - - -static void * -tf (void *arg) -{ - /* Enable cancellation, but defer it. */ - if (pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL) != 0) - { - puts ("setcancelstate failed"); - exit (1); - } - if (pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, NULL) != 0) - { - puts ("setcanceltype failed"); - exit (1); - } - - /* Add cleanup handler. */ - pthread_cleanup_push (cleanup, NULL); - - /* Synchronize with the main thread. */ - int r = pthread_barrier_wait (&bar); - if (r != 0 && r!= PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("tf: first barrier_wait failed"); - exit (1); - } - - /* And again. Once this is done the main thread should have canceled - this thread. */ - r = pthread_barrier_wait (&bar); - if (r != 0 && r!= PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("tf: second barrier_wait failed"); - exit (1); - } - - /* Remove the cleanup handler without executing it. */ - pthread_cleanup_pop (0); - - /* Now react on the cancellation. */ - pthread_testcancel (); - - /* This call should never return. */ - return NULL; -} - - -static int -do_test (void) -{ - if (pthread_barrier_init (&bar, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("pthread_create failed"); - return 1; - } - - int r = pthread_barrier_wait (&bar); - if (r != 0 && r!= PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("first barrier_wait failed"); - exit (1); - } - - if (pthread_cancel (th) != 0) - { - puts ("pthread_cancel failed"); - return 1; - } - - r = pthread_barrier_wait (&bar); - if (r != 0 && r!= PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("second barrier_wait failed"); - exit (1); - } - - void *result; - if (pthread_join (th, &result) != 0) - { - puts ("pthread_join failed"); - return 1; - } - - if (result != PTHREAD_CANCELED) - { - puts ("thread was not canceled"); - exit (1); - } - - if (global != 0) - { - puts ("cancellation handler has been called"); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancel9.c b/nptl/tst-cancel9.c deleted file mode 100644 index a60cebea6f..0000000000 --- a/nptl/tst-cancel9.c +++ /dev/null @@ -1,125 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <fcntl.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - - -static pthread_barrier_t b; - - -static void -cleanup (void *arg) -{ - fputs ("in cleanup\n", stdout); -} - - -static void * -tf (void *arg) -{ - int fd = open ("/dev/null", O_RDWR); - if (fd == -1) - { - puts ("cannot open /dev/null"); - exit (1); - } - FILE *fp = fdopen (fd, "w"); - if (fp == NULL) - { - puts ("fdopen failed"); - exit (1); - } - - pthread_cleanup_push (cleanup, NULL); - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - while (1) - /* fprintf() uses write() which is a cancallation point. */ - fprintf (fp, "foo"); - - pthread_cleanup_pop (0); - - return NULL; -} - - -static int -do_test (void) -{ - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - sleep (1); - - puts ("cancel now"); - - if (pthread_cancel (th) != 0) - { - puts ("cancel failed"); - exit (1); - } - - puts ("waiting for the child"); - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("join failed"); - exit (1); - } - - if (r != PTHREAD_CANCELED) - { - puts ("thread wasn't canceled"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cancelx1.c b/nptl/tst-cancelx1.c deleted file mode 100644 index 594f095592..0000000000 --- a/nptl/tst-cancelx1.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel1.c" diff --git a/nptl/tst-cancelx10.c b/nptl/tst-cancelx10.c deleted file mode 100644 index e5bbb34e62..0000000000 --- a/nptl/tst-cancelx10.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel10.c" diff --git a/nptl/tst-cancelx11.c b/nptl/tst-cancelx11.c deleted file mode 100644 index ffcc2eefc1..0000000000 --- a/nptl/tst-cancelx11.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel11.c" diff --git a/nptl/tst-cancelx12.c b/nptl/tst-cancelx12.c deleted file mode 100644 index f90ae61bac..0000000000 --- a/nptl/tst-cancelx12.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel12.c" diff --git a/nptl/tst-cancelx13.c b/nptl/tst-cancelx13.c deleted file mode 100644 index 37c4c39c35..0000000000 --- a/nptl/tst-cancelx13.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel13.c" diff --git a/nptl/tst-cancelx14.c b/nptl/tst-cancelx14.c deleted file mode 100644 index ba4e77584e..0000000000 --- a/nptl/tst-cancelx14.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel14.c" diff --git a/nptl/tst-cancelx15.c b/nptl/tst-cancelx15.c deleted file mode 100644 index 005c1f6e3f..0000000000 --- a/nptl/tst-cancelx15.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel15.c" diff --git a/nptl/tst-cancelx16.c b/nptl/tst-cancelx16.c deleted file mode 100644 index 99af3b197c..0000000000 --- a/nptl/tst-cancelx16.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel16.c" diff --git a/nptl/tst-cancelx17.c b/nptl/tst-cancelx17.c deleted file mode 100644 index c6c833b60c..0000000000 --- a/nptl/tst-cancelx17.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel17.c" diff --git a/nptl/tst-cancelx18.c b/nptl/tst-cancelx18.c deleted file mode 100644 index 56da18f382..0000000000 --- a/nptl/tst-cancelx18.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel18.c" diff --git a/nptl/tst-cancelx2.c b/nptl/tst-cancelx2.c deleted file mode 100644 index 95dc8a8575..0000000000 --- a/nptl/tst-cancelx2.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel2.c" diff --git a/nptl/tst-cancelx20.c b/nptl/tst-cancelx20.c deleted file mode 100644 index 6bd86376ca..0000000000 --- a/nptl/tst-cancelx20.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel20.c" diff --git a/nptl/tst-cancelx21.c b/nptl/tst-cancelx21.c deleted file mode 100644 index 2a01061ea8..0000000000 --- a/nptl/tst-cancelx21.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel21.c" diff --git a/nptl/tst-cancelx3.c b/nptl/tst-cancelx3.c deleted file mode 100644 index 3937f10b9c..0000000000 --- a/nptl/tst-cancelx3.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel3.c" diff --git a/nptl/tst-cancelx4.c b/nptl/tst-cancelx4.c deleted file mode 100644 index 1c879eba8b..0000000000 --- a/nptl/tst-cancelx4.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel4.c" diff --git a/nptl/tst-cancelx5.c b/nptl/tst-cancelx5.c deleted file mode 100644 index c0a18840a0..0000000000 --- a/nptl/tst-cancelx5.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel5.c" diff --git a/nptl/tst-cancelx6.c b/nptl/tst-cancelx6.c deleted file mode 100644 index 6926e21c2d..0000000000 --- a/nptl/tst-cancelx6.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel6.c" diff --git a/nptl/tst-cancelx7.c b/nptl/tst-cancelx7.c deleted file mode 100644 index 4df1a58818..0000000000 --- a/nptl/tst-cancelx7.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel7.c" diff --git a/nptl/tst-cancelx8.c b/nptl/tst-cancelx8.c deleted file mode 100644 index 0555c7ceb0..0000000000 --- a/nptl/tst-cancelx8.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel8.c" diff --git a/nptl/tst-cancelx9.c b/nptl/tst-cancelx9.c deleted file mode 100644 index 9d84663d77..0000000000 --- a/nptl/tst-cancelx9.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cancel9.c" diff --git a/nptl/tst-cleanup0.c b/nptl/tst-cleanup0.c deleted file mode 100644 index ca541c1f9e..0000000000 --- a/nptl/tst-cleanup0.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static int global; - - -static void -ch (void *arg) -{ - int val = (long int) arg; - - printf ("ch (%d)\n", val); - - global *= val; - global += val; -} - - -static void -endfct (void) -{ - /* We force exit right here. */ - _exit (global); -} - - -static int -do_test (void) -{ - atexit (endfct); - - pthread_cancel (pthread_self ()); - - pthread_cleanup_push (ch, (void *) 1l); - - pthread_cleanup_push (ch, (void *) 2l); - - pthread_cleanup_push (ch, (void *) 3l); - - pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL); - - pthread_cleanup_pop (1); - - pthread_cleanup_pop (1); - - pthread_cleanup_pop (1); - - return 100; -} - - -#define EXPECTED_STATUS 9 -#include <support/test-driver.c> diff --git a/nptl/tst-cleanup0.expect b/nptl/tst-cleanup0.expect deleted file mode 100644 index 4e3c581802..0000000000 --- a/nptl/tst-cleanup0.expect +++ /dev/null @@ -1,3 +0,0 @@ -ch (3) -ch (2) -ch (1) diff --git a/nptl/tst-cleanup1.c b/nptl/tst-cleanup1.c deleted file mode 100644 index 7aaf995fe6..0000000000 --- a/nptl/tst-cleanup1.c +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static int global; - - -static void -ch (void *arg) -{ - int val = (long int) arg; - - printf ("ch (%d)\n", val); - - global *= val; - global += val; -} - - -static void * -tf (void *a) -{ - pthread_cancel (pthread_self ()); - - pthread_cleanup_push (ch, (void *) 1l); - - pthread_cleanup_push (ch, (void *) 2l); - - pthread_cleanup_push (ch, (void *) 3l); - - pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL); - - pthread_cleanup_pop (1); - - pthread_cleanup_pop (1); - - pthread_cleanup_pop (1); - - return NULL; -} - - -int -do_test (void) -{ - pthread_t th; - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - write_message ("create failed\n"); - _exit (1); - } - - void *r; - int e; - if ((e = pthread_join (th, &r)) != 0) - { - printf ("join failed: %d\n", e); - _exit (1); - } - - if (r != PTHREAD_CANCELED) - { - puts ("thread not canceled"); - exit (1); - } - - if (global != 9) - { - printf ("global = %d, expected 9\n", global); - exit (1); - } - - return 0; -} diff --git a/nptl/tst-cleanup2.c b/nptl/tst-cleanup2.c deleted file mode 100644 index 982f50824a..0000000000 --- a/nptl/tst-cleanup2.c +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Bao Duong <bduong@progress.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <setjmp.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <sys/types.h> - -static sigjmp_buf jmpbuf; - -static void -sig_handler (int signo) -{ - siglongjmp (jmpbuf, 1); -} - -static int -do_test (void) -{ - char *p = NULL; - /* gcc can overwrite the success written value by scheduling instructions - around sprintf. It is allowed to do this since according to C99 the first - argument of sprintf is a character array and NULL is not a valid character - array. Mark the return value as volatile so that it gets reloaded on - return. */ - volatile int ret = 0; - - if (signal (SIGSEGV, &sig_handler) == SIG_ERR) - { - perror ("installing SIGSEGV handler"); - return 1; - } - - puts ("Attempting to sprintf to null ptr"); - if (setjmp (jmpbuf)) - { - puts ("Exiting main..."); - return ret; - } - - sprintf (p, "This should segv\n"); - - return 1; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cleanup3.c b/nptl/tst-cleanup3.c deleted file mode 100644 index dc13cb6c81..0000000000 --- a/nptl/tst-cleanup3.c +++ /dev/null @@ -1,98 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static int global; - - -static void -ch (void *arg) -{ - int val = (long int) arg; - - printf ("ch (%d)\n", val); - - global *= val; - global += val; -} - - -static void * -tf (void *a) -{ - pthread_cleanup_push (ch, (void *) 1l); - - pthread_cleanup_push (ch, (void *) 2l); - - pthread_cleanup_push (ch, (void *) 3l); - - pthread_exit ((void *) 1l); - - pthread_cleanup_pop (1); - - pthread_cleanup_pop (1); - - pthread_cleanup_pop (1); - - return NULL; -} - - -int -do_test (void) -{ - pthread_t th; - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - write_message ("create failed\n"); - _exit (1); - } - - void *r; - int e; - if ((e = pthread_join (th, &r)) != 0) - { - printf ("join failed: %d\n", e); - _exit (1); - } - - if (r != (void *) 1l) - { - puts ("thread not canceled"); - exit (1); - } - - if (global != 9) - { - printf ("global = %d, expected 9\n", global); - exit (1); - } - - return 0; -} diff --git a/nptl/tst-cleanup4.c b/nptl/tst-cleanup4.c deleted file mode 100644 index 5ffe81df5f..0000000000 --- a/nptl/tst-cleanup4.c +++ /dev/null @@ -1,197 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -/* LinuxThreads pthread_cleanup_{push,pop} helpers. */ -extern void _pthread_cleanup_push (struct _pthread_cleanup_buffer *__buffer, - void (*__routine) (void *), - void *__arg); -extern void _pthread_cleanup_pop (struct _pthread_cleanup_buffer *__buffer, - int __execute); - -static int fds[2]; -static pthread_barrier_t b2; -static int global; - -/* Defined in tst-cleanup4aux.c, never compiled with -fexceptions. */ -extern void fn5 (void); -extern void fn7 (void); -extern void fn9 (void); - -void -clh (void *arg) -{ - int val = (long int) arg; - - printf ("clh (%d)\n", val); - - global *= val; - global += val; -} - - -static __attribute__((noinline)) void -fn_read (void) -{ - int r = pthread_barrier_wait (&b2); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("%s: barrier_wait failed\n", __FUNCTION__); - exit (1); - } - - char c; - read (fds[0], &c, 1); -} - - -__attribute__((noinline)) void -fn0 (void) -{ - pthread_cleanup_push (clh, (void *) 1l); - - fn_read (); - - pthread_cleanup_pop (1); -} - - -__attribute__((noinline)) void -fn1 (void) -{ - /* This is the old LinuxThreads pthread_cleanup_{push,pop}. */ - struct _pthread_cleanup_buffer b; - _pthread_cleanup_push (&b, clh, (void *) 2l); - - fn0 (); - - _pthread_cleanup_pop (&b, 1); -} - - -static __attribute__((noinline)) void -fn2 (void) -{ - pthread_cleanup_push (clh, (void *) 3l); - - fn1 (); - - pthread_cleanup_pop (1); -} - - -static void * -tf (void *a) -{ - switch ((long) a) - { - case 0: - fn2 (); - break; - case 1: - fn5 (); - break; - case 2: - fn7 (); - break; - case 3: - fn9 (); - break; - } - - return NULL; -} - - -int -do_test (void) -{ - int result = 0; - - if (pipe (fds) != 0) - { - puts ("pipe failed"); - exit (1); - } - - if (pthread_barrier_init (&b2, NULL, 2) != 0) - { - puts ("b2 init failed"); - exit (1); - } - - const int expect[] = - { - 15, /* 1 2 3 */ - 276, /* 1 4 5 6 */ - 120, /* 1 7 8 */ - 460 /* 1 2 9 10 */ - }; - - long i; - for (i = 0; i < 4; ++i) - { - global = 0; - - printf ("test %ld\n", i); - - pthread_t th; - if (pthread_create (&th, NULL, tf, (void *) i) != 0) - { - puts ("create failed"); - exit (1); - } - - int e = pthread_barrier_wait (&b2); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("%s: barrier_wait failed\n", __FUNCTION__); - exit (1); - } - - pthread_cancel (th); - - void *r; - if ((e = pthread_join (th, &r)) != 0) - { - printf ("join failed: %d\n", e); - _exit (1); - } - - if (r != PTHREAD_CANCELED) - { - puts ("thread not canceled"); - exit (1); - } - - if (global != expect[i]) - { - printf ("global = %d, expected %d\n", global, expect[i]); - result = 1; - } - } - - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cleanup4aux.c b/nptl/tst-cleanup4aux.c deleted file mode 100644 index c1b9ab99ed..0000000000 --- a/nptl/tst-cleanup4aux.c +++ /dev/null @@ -1,120 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -extern void _pthread_cleanup_push (struct _pthread_cleanup_buffer *__buffer, - void (*__routine) (void *), - void *__arg); -extern void _pthread_cleanup_pop (struct _pthread_cleanup_buffer *__buffer, - int __execute); - -extern void clh (void *arg); -extern void fn0 (void); -extern void fn1 (void); -extern void fn5 (void); -extern void fn7 (void); -extern void fn9 (void); - - -static __attribute__((noinline)) void -fn3 (void) -{ - /* This is the old LinuxThreads pthread_cleanup_{push,pop}. */ - struct _pthread_cleanup_buffer b; - _pthread_cleanup_push (&b, clh, (void *) 4l); - - fn0 (); - - _pthread_cleanup_pop (&b, 1); -} - - -static __attribute__((noinline)) void -fn4 (void) -{ - pthread_cleanup_push (clh, (void *) 5l); - - fn3 (); - - pthread_cleanup_pop (1); -} - - -void -fn5 (void) -{ - /* This is the old LinuxThreads pthread_cleanup_{push,pop}. */ - struct _pthread_cleanup_buffer b; - _pthread_cleanup_push (&b, clh, (void *) 6l); - - fn4 (); - - _pthread_cleanup_pop (&b, 1); -} - - -static __attribute__((noinline)) void -fn6 (void) -{ - pthread_cleanup_push (clh, (void *) 7l); - - fn0 (); - - pthread_cleanup_pop (1); -} - - -void -fn7 (void) -{ - /* This is the old LinuxThreads pthread_cleanup_{push,pop}. */ - struct _pthread_cleanup_buffer b; - _pthread_cleanup_push (&b, clh, (void *) 8l); - - fn6 (); - - _pthread_cleanup_pop (&b, 1); -} - - -static __attribute__((noinline)) void -fn8 (void) -{ - pthread_cleanup_push (clh, (void *) 9l); - - fn1 (); - - pthread_cleanup_pop (1); -} - - -void -fn9 (void) -{ - /* This is the old LinuxThreads pthread_cleanup_{push,pop}. */ - struct _pthread_cleanup_buffer b; - _pthread_cleanup_push (&b, clh, (void *) 10l); - - fn8 (); - - _pthread_cleanup_pop (&b, 1); -} diff --git a/nptl/tst-cleanupx0.c b/nptl/tst-cleanupx0.c deleted file mode 100644 index 0012ab1b25..0000000000 --- a/nptl/tst-cleanupx0.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cleanup0.c" diff --git a/nptl/tst-cleanupx0.expect b/nptl/tst-cleanupx0.expect deleted file mode 100644 index 4e3c581802..0000000000 --- a/nptl/tst-cleanupx0.expect +++ /dev/null @@ -1,3 +0,0 @@ -ch (3) -ch (2) -ch (1) diff --git a/nptl/tst-cleanupx1.c b/nptl/tst-cleanupx1.c deleted file mode 100644 index 21e9e58bd6..0000000000 --- a/nptl/tst-cleanupx1.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cleanup1.c" diff --git a/nptl/tst-cleanupx2.c b/nptl/tst-cleanupx2.c deleted file mode 100644 index 8b9e350935..0000000000 --- a/nptl/tst-cleanupx2.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cleanup2.c" diff --git a/nptl/tst-cleanupx3.c b/nptl/tst-cleanupx3.c deleted file mode 100644 index 90baf904f9..0000000000 --- a/nptl/tst-cleanupx3.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cleanup3.c" diff --git a/nptl/tst-cleanupx4.c b/nptl/tst-cleanupx4.c deleted file mode 100644 index 8dea954b55..0000000000 --- a/nptl/tst-cleanupx4.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cleanup4.c" diff --git a/nptl/tst-cleanupx4aux.c b/nptl/tst-cleanupx4aux.c deleted file mode 100644 index 00bafe4580..0000000000 --- a/nptl/tst-cleanupx4aux.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cleanup4aux.c" diff --git a/nptl/tst-clock1.c b/nptl/tst-clock1.c deleted file mode 100644 index 2235eceed3..0000000000 --- a/nptl/tst-clock1.c +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <unistd.h> - - -int -do_test (void) -{ -#if defined _POSIX_THREAD_CPUTIME && _POSIX_THREAD_CPUTIME >= 0 - clockid_t cl; - /* This is really only a linking-test here. */ - int e = pthread_getcpuclockid (pthread_self (), &cl); - if (e != 0) - { -# if _POSIX_THREAD_CPUTIME == 0 - if (sysconf (_SC_THREAD_CPUTIME) >= 0) -# endif - { - puts ("cpuclock advertized, but cannot get ID"); - exit (1); - } - } -#endif - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-clock2.c b/nptl/tst-clock2.c deleted file mode 100644 index aa946efd26..0000000000 --- a/nptl/tst-clock2.c +++ /dev/null @@ -1,201 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <unistd.h> - - -#if defined _POSIX_THREAD_CPUTIME && _POSIX_THREAD_CPUTIME >= 0 -static pthread_barrier_t b2; -static pthread_barrier_t bN; - - -static void * -tf (void *arg) -{ - int e = pthread_barrier_wait (&b2); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - e = pthread_barrier_wait (&bN); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - return NULL; -} -#endif - - -int -do_test (void) -{ -#if defined _POSIX_THREAD_CPUTIME && _POSIX_THREAD_CPUTIME >= 0 -# define N 10 - -# if _POSIX_THREAD_CPUTIME == 0 - if (sysconf (_SC_THREAD_CPUTIME) < 0) - { - puts ("_POSIX_THREAD_CPUTIME option not available"); - return 0; - } -# endif - - if (pthread_barrier_init (&b2, NULL, 2) != 0 - || pthread_barrier_init (&bN, NULL, N + 1) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 }; - TEMP_FAILURE_RETRY (nanosleep (&ts, &ts)); - - pthread_t th[N + 1]; - clockid_t cl[N + 1]; -# ifndef CLOCK_THREAD_CPUTIME_ID - if (pthread_getcpuclockid (pthread_self (), &cl[0]) != 0) - { - puts ("own pthread_getcpuclockid failed"); - return 1; - } -# else - cl[0] = CLOCK_THREAD_CPUTIME_ID; -# endif - - pthread_attr_t at; - - if (pthread_attr_init (&at) != 0) - { - puts ("attr_init failed"); - return 1; - } - - if (pthread_attr_setstacksize (&at, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - int i; - int e; - for (i = 0; i < N; ++i) - { - if (pthread_create (&th[i], &at, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - e = pthread_barrier_wait (&b2); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - return 1; - } - - ts.tv_sec = 0; - ts.tv_nsec = 100000000; - TEMP_FAILURE_RETRY (nanosleep (&ts, &ts)); - - if (pthread_getcpuclockid (th[i], &cl[i + 1]) != 0) - { - puts ("pthread_getcpuclockid failed"); - return 1; - } - } - - if (pthread_attr_destroy (&at) != 0) - { - puts ("attr_destroy failed"); - return 1; - } - - struct timespec t[N + 1]; - for (i = 0; i < N + 1; ++i) - if (clock_gettime (cl[i], &t[i]) != 0) - { - printf ("clock_gettime round %d failed\n", i); - return 1; - } - - for (i = 0; i < N; ++i) - { - struct timespec diff; - - diff.tv_sec = t[i].tv_sec - t[i + 1].tv_sec; - diff.tv_nsec = t[i].tv_nsec - t[i + 1].tv_nsec; - if (diff.tv_nsec < 0) - { - diff.tv_nsec += 1000000000; - --diff.tv_sec; - } - - if (diff.tv_sec < 0 || (diff.tv_sec == 0 && diff.tv_nsec < 100000000)) - { - printf ("\ -difference between thread %d and %d too small (%ld.%09ld)\n", - i, i + 1, (long int) diff.tv_sec, (long int) diff.tv_nsec); - return 1; - } - - printf ("diff %d->%d: %ld.%09ld\n", - i, i + 1, (long int) diff.tv_sec, (long int) diff.tv_nsec); - } - - ts.tv_sec = 0; - ts.tv_nsec = 0; - for (i = 0; i < N + 1; ++i) - if (clock_settime (cl[i], &ts) != 0) - { - printf ("clock_settime(%d) round %d failed\n", cl[i], i); - return 1; - } - - for (i = 0; i < N + 1; ++i) - { - if (clock_gettime (cl[i], &ts) != 0) - { - puts ("clock_gettime failed"); - return 1; - } - - if (ts.tv_sec > t[i].tv_sec - || (ts.tv_sec == t[i].tv_sec && ts.tv_nsec > t[i].tv_nsec)) - { - puts ("clock_settime didn't reset clock"); - return 1; - } - } -#endif - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cond-except.c b/nptl/tst-cond-except.c deleted file mode 100644 index 35222197df..0000000000 --- a/nptl/tst-cond-except.c +++ /dev/null @@ -1,110 +0,0 @@ -/* Verify that exception table for pthread_cond_wait is correct. - Copyright (C) 2012-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdint.h> -#include <string.h> -#include <unistd.h> - -pthread_mutex_t mutex; -pthread_cond_t cond; - -#define CHECK_RETURN_VAL_OR_FAIL(ret,str) \ - ({ if ((ret) != 0) \ - { \ - printf ("%s failed: %s\n", (str), strerror (ret)); \ - ret = 1; \ - goto out; \ - } \ - }) - - -void -clean (void *arg) -{ - puts ("clean: Unlocking mutex..."); - pthread_mutex_unlock ((pthread_mutex_t *) arg); - puts ("clean: Mutex unlocked..."); -} - -void * -thr (void *arg) -{ - int ret = 0; - pthread_mutexattr_t mutexAttr; - ret = pthread_mutexattr_init (&mutexAttr); - CHECK_RETURN_VAL_OR_FAIL (ret, "pthread_mutexattr_init"); - - ret = pthread_mutexattr_setprotocol (&mutexAttr, PTHREAD_PRIO_INHERIT); - CHECK_RETURN_VAL_OR_FAIL (ret, "pthread_mutexattr_setprotocol"); - - ret = pthread_mutex_init (&mutex, &mutexAttr); - CHECK_RETURN_VAL_OR_FAIL (ret, "pthread_mutex_init"); - - ret = pthread_cond_init (&cond, 0); - CHECK_RETURN_VAL_OR_FAIL (ret, "pthread_cond_init"); - - puts ("th: Init done, entering wait..."); - - pthread_cleanup_push (clean, (void *) &mutex); - ret = pthread_mutex_lock (&mutex); - CHECK_RETURN_VAL_OR_FAIL (ret, "pthread_mutex_lock"); - while (1) - { - ret = pthread_cond_wait (&cond, &mutex); - CHECK_RETURN_VAL_OR_FAIL (ret, "pthread_cond_wait"); - } - pthread_cleanup_pop (1); - -out: - return (void *) (uintptr_t) ret; -} - -int -do_test (void) -{ - pthread_t thread; - int ret = 0; - void *thr_ret = 0; - ret = pthread_create (&thread, 0, thr, &thr_ret); - CHECK_RETURN_VAL_OR_FAIL (ret, "pthread_create"); - - puts ("main: Thread created, waiting a bit..."); - sleep (2); - - puts ("main: Cancelling thread..."); - ret = pthread_cancel (thread); - CHECK_RETURN_VAL_OR_FAIL (ret, "pthread_cancel"); - - puts ("main: Joining th..."); - ret = pthread_join (thread, NULL); - CHECK_RETURN_VAL_OR_FAIL (ret, "pthread_join"); - - if (thr_ret != NULL) - return 1; - - puts ("main: Joined thread, done!"); - -out: - return ret; -} - -#define TEST_FUNCTION do_test () -#define TIMEOUT 5 -#include "../test-skeleton.c" diff --git a/nptl/tst-cond1.c b/nptl/tst-cond1.c deleted file mode 100644 index 790eaea377..0000000000 --- a/nptl/tst-cond1.c +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <error.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - - -static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; - - -static void * -tf (void *p) -{ - int err; - - err = pthread_mutex_lock (&mut); - if (err != 0) - error (EXIT_FAILURE, err, "child: cannot get mutex"); - - puts ("child: got mutex; signalling"); - - pthread_cond_signal (&cond); - - puts ("child: unlock"); - - err = pthread_mutex_unlock (&mut); - if (err != 0) - error (EXIT_FAILURE, err, "child: cannot unlock"); - - puts ("child: done"); - - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - int err; - - printf ("&cond = %p\n&mut = %p\n", &cond, &mut); - - puts ("parent: get mutex"); - - err = pthread_mutex_lock (&mut); - if (err != 0) - error (EXIT_FAILURE, err, "parent: cannot get mutex"); - - puts ("parent: create child"); - - err = pthread_create (&th, NULL, tf, NULL); - if (err != 0) - error (EXIT_FAILURE, err, "parent: cannot create thread"); - - puts ("parent: wait for condition"); - - /* This test will fail on spurious wake-ups, which are allowed; however, - the current implementation shouldn't produce spurious wake-ups in the - scenario we are testing here. */ - err = pthread_cond_wait (&cond, &mut); - if (err != 0) - error (EXIT_FAILURE, err, "parent: cannot wait fir signal"); - - puts ("parent: got signal"); - - err = pthread_join (th, NULL); - if (err != 0) - error (EXIT_FAILURE, err, "parent: failed to join"); - - puts ("done"); - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cond10.c b/nptl/tst-cond10.c deleted file mode 100644 index 3176b847d7..0000000000 --- a/nptl/tst-cond10.c +++ /dev/null @@ -1,172 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <error.h> -#include <pthread.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> - - -#define N 10 -#define ROUNDS 100 - -static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; -static pthread_barrier_t bN1; -static pthread_barrier_t b2; - - -static void * -tf (void *p) -{ - if (pthread_mutex_lock (&mut) != 0) - { - puts ("child: 1st mutex_lock failed"); - exit (1); - } - - int e = pthread_barrier_wait (&b2); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child: 1st barrier_wait failed"); - exit (1); - } - - if (pthread_cond_wait (&cond, &mut) != 0) - { - puts ("child: cond_wait failed"); - exit (1); - } - - if (pthread_mutex_unlock (&mut) != 0) - { - puts ("child: mutex_unlock failed"); - exit (1); - } - - e = pthread_barrier_wait (&bN1); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child: 2nd barrier_wait failed"); - exit (1); - } - - return NULL; -} - - -static int -do_test (void) -{ - if (pthread_barrier_init (&bN1, NULL, N + 1) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - if (pthread_barrier_init (&b2, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - pthread_attr_t at; - - if (pthread_attr_init (&at) != 0) - { - puts ("attr_init failed"); - return 1; - } - - if (pthread_attr_setstacksize (&at, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - int r; - for (r = 0; r < ROUNDS; ++r) - { - printf ("round %d\n", r + 1); - - int i; - pthread_t th[N]; - for (i = 0; i < N; ++i) - { - if (pthread_create (&th[i], &at, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - int e = pthread_barrier_wait (&b2); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("parent: 1st barrier_wait failed"); - exit (1); - } - } - - if (pthread_mutex_lock (&mut) != 0) - { - puts ("parent: mutex_lock failed"); - exit (1); - } - if (pthread_mutex_unlock (&mut) != 0) - { - puts ("parent: mutex_unlock failed"); - exit (1); - } - - /* N single signal calls. Without locking. This tests that no - signal gets lost. */ - for (i = 0; i < N; ++i) - if (pthread_cond_signal (&cond) != 0) - { - puts ("cond_signal failed"); - exit (1); - } - - int e = pthread_barrier_wait (&bN1); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("parent: 2nd barrier_wait failed"); - exit (1); - } - - for (i = 0; i < N; ++i) - if (pthread_join (th[i], NULL) != 0) - { - puts ("join failed"); - exit (1); - } - } - - if (pthread_attr_destroy (&at) != 0) - { - puts ("attr_destroy failed"); - return 1; - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cond11.c b/nptl/tst-cond11.c deleted file mode 100644 index 58db7652c2..0000000000 --- a/nptl/tst-cond11.c +++ /dev/null @@ -1,204 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <time.h> -#include <unistd.h> - - -#if defined _POSIX_CLOCK_SELECTION && _POSIX_CLOCK_SELECTION >= 0 -static int -run_test (clockid_t cl) -{ - pthread_condattr_t condattr; - pthread_cond_t cond; - pthread_mutexattr_t mutattr; - pthread_mutex_t mut; - - printf ("clock = %d\n", (int) cl); - - if (pthread_condattr_init (&condattr) != 0) - { - puts ("condattr_init failed"); - return 1; - } - - if (pthread_condattr_setclock (&condattr, cl) != 0) - { - puts ("condattr_setclock failed"); - return 1; - } - - clockid_t cl2; - if (pthread_condattr_getclock (&condattr, &cl2) != 0) - { - puts ("condattr_getclock failed"); - return 1; - } - if (cl != cl2) - { - printf ("condattr_getclock returned wrong value: %d, expected %d\n", - (int) cl2, (int) cl); - return 1; - } - - if (pthread_cond_init (&cond, &condattr) != 0) - { - puts ("cond_init failed"); - return 1; - } - - if (pthread_condattr_destroy (&condattr) != 0) - { - puts ("condattr_destroy failed"); - return 1; - } - - if (pthread_mutexattr_init (&mutattr) != 0) - { - puts ("mutexattr_init failed"); - return 1; - } - - if (pthread_mutexattr_settype (&mutattr, PTHREAD_MUTEX_ERRORCHECK) != 0) - { - puts ("mutexattr_settype failed"); - return 1; - } - - if (pthread_mutex_init (&mut, &mutattr) != 0) - { - puts ("mutex_init failed"); - return 1; - } - - if (pthread_mutexattr_destroy (&mutattr) != 0) - { - puts ("mutexattr_destroy failed"); - return 1; - } - - if (pthread_mutex_lock (&mut) != 0) - { - puts ("mutex_lock failed"); - return 1; - } - - if (pthread_mutex_lock (&mut) != EDEADLK) - { - puts ("2nd mutex_lock did not return EDEADLK"); - return 1; - } - - struct timespec ts; - if (clock_gettime (cl, &ts) != 0) - { - puts ("clock_gettime failed"); - return 1; - } - - /* Wait one second. */ - ++ts.tv_sec; - - int e = pthread_cond_timedwait (&cond, &mut, &ts); - if (e == 0) - { - puts ("cond_timedwait succeeded"); - return 1; - } - else if (e != ETIMEDOUT) - { - puts ("cond_timedwait did not return ETIMEDOUT"); - return 1; - } - - struct timespec ts2; - if (clock_gettime (cl, &ts2) != 0) - { - puts ("second clock_gettime failed"); - return 1; - } - - if (ts2.tv_sec < ts.tv_sec - || (ts2.tv_sec == ts.tv_sec && ts2.tv_nsec < ts.tv_nsec)) - { - puts ("timeout too short"); - return 1; - } - - if (pthread_mutex_unlock (&mut) != 0) - { - puts ("mutex_unlock failed"); - return 1; - } - - if (pthread_mutex_destroy (&mut) != 0) - { - puts ("mutex_destroy failed"); - return 1; - } - - if (pthread_cond_destroy (&cond) != 0) - { - puts ("cond_destroy failed"); - return 1; - } - - return 0; -} -#endif - - -static int -do_test (void) -{ -#if !defined _POSIX_CLOCK_SELECTION || _POSIX_CLOCK_SELECTION == -1 - - puts ("_POSIX_CLOCK_SELECTION not supported, test skipped"); - return 0; - -#else - - int res = run_test (CLOCK_REALTIME); - -# if defined _POSIX_MONOTONIC_CLOCK && _POSIX_MONOTONIC_CLOCK >= 0 -# if _POSIX_MONOTONIC_CLOCK == 0 - int e = sysconf (_SC_MONOTONIC_CLOCK); - if (e < 0) - puts ("CLOCK_MONOTONIC not supported"); - else if (e == 0) - { - puts ("sysconf (_SC_MONOTONIC_CLOCK) must not return 0"); - res = 1; - } - else -# endif - res |= run_test (CLOCK_MONOTONIC); -# else - puts ("_POSIX_MONOTONIC_CLOCK not defined"); -# endif - - return res; -#endif -} - -#define TIMEOUT 3 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cond12.c b/nptl/tst-cond12.c deleted file mode 100644 index 0714b33c49..0000000000 --- a/nptl/tst-cond12.c +++ /dev/null @@ -1,195 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/wait.h> - - -static char fname[] = "/tmp/tst-cond12-XXXXXX"; -static int fd; - - -static void prepare (void); -#define PREPARE(argc, argv) prepare () - -static int do_test (void); -#define TEST_FUNCTION do_test () - -#include "../test-skeleton.c" - - -static void -prepare (void) -{ - fd = mkstemp (fname); - if (fd == -1) - { - printf ("mkstemp failed: %m\n"); - exit (1); - } - add_temp_file (fname); - if (ftruncate (fd, 1000) < 0) - { - printf ("ftruncate failed: %m\n"); - exit (1); - } -} - - -static int -do_test (void) -{ - struct - { - pthread_mutex_t m; - pthread_cond_t c; - int var; - } *p = mmap (NULL, sizeof (*p), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); - if (p == MAP_FAILED) - { - printf ("initial mmap failed: %m\n"); - return 1; - } - - pthread_mutexattr_t ma; - if (pthread_mutexattr_init (&ma) != 0) - { - puts ("mutexattr_init failed"); - return 1; - } - if (pthread_mutexattr_setpshared (&ma, 1) != 0) - { - puts ("mutexattr_setpshared failed"); - return 1; - } - if (pthread_mutex_init (&p->m, &ma) != 0) - { - puts ("mutex_init failed"); - return 1; - } - if (pthread_mutexattr_destroy (&ma) != 0) - { - puts ("mutexattr_destroy failed"); - return 1; - } - - pthread_condattr_t ca; - if (pthread_condattr_init (&ca) != 0) - { - puts ("condattr_init failed"); - return 1; - } - if (pthread_condattr_setpshared (&ca, 1) != 0) - { - puts ("condattr_setpshared failed"); - return 1; - } - if (pthread_cond_init (&p->c, &ca) != 0) - { - puts ("mutex_init failed"); - return 1; - } - if (pthread_condattr_destroy (&ca) != 0) - { - puts ("condattr_destroy failed"); - return 1; - } - - if (pthread_mutex_lock (&p->m) != 0) - { - puts ("initial mutex_lock failed"); - return 1; - } - - p->var = 42; - - pid_t pid = fork (); - if (pid == -1) - { - printf ("fork failed: %m\n"); - return 1; - } - - if (pid == 0) - { - void *oldp = p; - p = mmap (NULL, sizeof (*p), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); - - if (p == oldp) - { - puts ("child: mapped to same address"); - kill (getppid (), SIGKILL); - exit (1); - } - - munmap (oldp, sizeof (*p)); - - if (pthread_mutex_lock (&p->m) != 0) - { - puts ("child: mutex_lock failed"); - kill (getppid (), SIGKILL); - exit (1); - } - - p->var = 0; - -#ifndef USE_COND_SIGNAL - if (pthread_cond_broadcast (&p->c) != 0) - { - puts ("child: cond_broadcast failed"); - kill (getppid (), SIGKILL); - exit (1); - } -#else - if (pthread_cond_signal (&p->c) != 0) - { - puts ("child: cond_signal failed"); - kill (getppid (), SIGKILL); - exit (1); - } -#endif - - if (pthread_mutex_unlock (&p->m) != 0) - { - puts ("child: mutex_unlock failed"); - kill (getppid (), SIGKILL); - exit (1); - } - - exit (0); - } - - do - pthread_cond_wait (&p->c, &p->m); - while (p->var != 0); - - if (TEMP_FAILURE_RETRY (waitpid (pid, NULL, 0)) != pid) - { - printf ("waitpid failed: %m\n"); - kill (pid, SIGKILL); - return 1; - } - - return 0; -} diff --git a/nptl/tst-cond13.c b/nptl/tst-cond13.c deleted file mode 100644 index 29d79b533e..0000000000 --- a/nptl/tst-cond13.c +++ /dev/null @@ -1,2 +0,0 @@ -#define USE_COND_SIGNAL 1 -#include "tst-cond12.c" diff --git a/nptl/tst-cond14.c b/nptl/tst-cond14.c deleted file mode 100644 index 065781ba07..0000000000 --- a/nptl/tst-cond14.c +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright (C) 2004-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - - -static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t mut = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; -static pthread_mutex_t mut2 = PTHREAD_MUTEX_INITIALIZER; - -static void * -tf (void *p) -{ - if (pthread_mutex_lock (&mut) != 0) - { - printf ("%s: 1st mutex_lock failed\n", __func__); - exit (1); - } - if (pthread_mutex_lock (&mut) != 0) - { - printf ("%s: 2nd mutex_lock failed\n", __func__); - exit (1); - } - if (pthread_mutex_lock (&mut) != 0) - { - printf ("%s: 3rd mutex_lock failed\n", __func__); - exit (1); - } - - if (pthread_mutex_unlock (&mut2) != 0) - { - printf ("%s: mutex_unlock failed\n", __func__); - exit (1); - } - - if (pthread_cond_wait (&cond, &mut) != 0) - { - printf ("%s: cond_wait failed\n", __func__); - exit (1); - } - - puts ("child: done"); - - return NULL; -} - - -static int -do_test (void) -{ - if (pthread_mutex_lock (&mut2) != 0) - { - puts ("1st mutex_lock failed"); - return 1; - } - - puts ("parent: create child"); - - pthread_t th; - int err = pthread_create (&th, NULL, tf, NULL); - if (err != 0) - { - printf ("parent: cannot create thread: %s\n", strerror (err)); - return 1; - } - - /* We have to synchronize with the child. */ - if (pthread_mutex_lock (&mut2) != 0) - { - puts ("2nd mutex_lock failed"); - return 1; - } - - /* Give the child to reach to pthread_cond_wait. */ - sleep (1); - - if (pthread_cond_signal (&cond) != 0) - { - puts ("cond_signal failed"); - return 1; - } - - err = pthread_join (th, NULL); - if (err != 0) - { - printf ("parent: failed to join: %s\n", strerror (err)); - return 1; - } - - puts ("done"); - - return 0; -} - - -#define TEST_FUNCTION do_test () -#define TIMEOUT 3 -#include "../test-skeleton.c" diff --git a/nptl/tst-cond15.c b/nptl/tst-cond15.c deleted file mode 100644 index b41bd6926a..0000000000 --- a/nptl/tst-cond15.c +++ /dev/null @@ -1,159 +0,0 @@ -/* Copyright (C) 2004-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/time.h> - - -static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t mut = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; -static pthread_mutex_t mut2 = PTHREAD_MUTEX_INITIALIZER; - -static void * -tf (void *p) -{ - if (pthread_mutex_lock (&mut) != 0) - { - printf ("%s: 1st mutex_lock failed\n", __func__); - exit (1); - } - if (pthread_mutex_lock (&mut) != 0) - { - printf ("%s: 2nd mutex_lock failed\n", __func__); - exit (1); - } - if (pthread_mutex_lock (&mut) != 0) - { - printf ("%s: 3rd mutex_lock failed\n", __func__); - exit (1); - } - - if (pthread_mutex_unlock (&mut2) != 0) - { - printf ("%s: mutex_unlock failed\n", __func__); - exit (1); - } - - struct timeval tv; - gettimeofday (&tv, NULL); - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_sec += p == NULL ? 100 : 1; - - int err = pthread_cond_timedwait (&cond, &mut, &ts); - if ((err != 0 && p == NULL) || (err != ETIMEDOUT && p != NULL)) - { - printf ("%s: cond_wait failed\n", __func__); - exit (1); - } - - if (pthread_mutex_unlock (&mut) != 0) - { - printf ("%s: 1st mutex_unlock failed\n", __func__); - exit (1); - } - if (pthread_mutex_unlock (&mut) != 0) - { - printf ("%s: 2nd mutex_unlock failed\n", __func__); - exit (1); - } - if (pthread_mutex_unlock (&mut) != 0) - { - printf ("%s: 3rd mutex_unlock failed\n", __func__); - exit (1); - } - - puts ("child: done"); - - return NULL; -} - - -static int -do_test (void) -{ - if (pthread_mutex_lock (&mut2) != 0) - { - puts ("1st mutex_lock failed"); - return 1; - } - - puts ("parent: create 1st child"); - - pthread_t th; - int err = pthread_create (&th, NULL, tf, NULL); - if (err != 0) - { - printf ("parent: cannot 1st create thread: %s\n", strerror (err)); - return 1; - } - - /* We have to synchronize with the child. */ - if (pthread_mutex_lock (&mut2) != 0) - { - puts ("2nd mutex_lock failed"); - return 1; - } - - /* Give the child to reach to pthread_cond_wait. */ - sleep (1); - - if (pthread_cond_signal (&cond) != 0) - { - puts ("cond_signal failed"); - return 1; - } - - err = pthread_join (th, NULL); - if (err != 0) - { - printf ("parent: failed to join: %s\n", strerror (err)); - return 1; - } - - - puts ("parent: create 2nd child"); - - err = pthread_create (&th, NULL, tf, (void *) 1l); - if (err != 0) - { - printf ("parent: cannot 2nd create thread: %s\n", strerror (err)); - return 1; - } - - err = pthread_join (th, NULL); - if (err != 0) - { - printf ("parent: failed to join: %s\n", strerror (err)); - return 1; - } - - puts ("done"); - - return 0; -} - - -#define TEST_FUNCTION do_test () -#define TIMEOUT 6 -#include "../test-skeleton.c" diff --git a/nptl/tst-cond16.c b/nptl/tst-cond16.c deleted file mode 100644 index 032677adcc..0000000000 --- a/nptl/tst-cond16.c +++ /dev/null @@ -1,111 +0,0 @@ -/* Copyright (C) 2004-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <limits.h> -#include <pthread.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -pthread_cond_t cv = PTHREAD_COND_INITIALIZER; -pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; -bool n, exiting; -FILE *f; -int count; - -void * -tf (void *dummy) -{ - bool loop = true; - - while (loop) - { - pthread_mutex_lock (&lock); - while (n && !exiting) - pthread_cond_wait (&cv, &lock); - n = true; - pthread_mutex_unlock (&lock); - - fputs (".", f); - - pthread_mutex_lock (&lock); - n = false; - if (exiting) - loop = false; -#ifdef UNLOCK_AFTER_BROADCAST - pthread_cond_broadcast (&cv); - pthread_mutex_unlock (&lock); -#else - pthread_mutex_unlock (&lock); - pthread_cond_broadcast (&cv); -#endif - } - - return NULL; -} - -int -do_test (void) -{ - f = fopen ("/dev/null", "w"); - if (f == NULL) - { - printf ("couldn't open /dev/null, %m\n"); - return 1; - } - - count = sysconf (_SC_NPROCESSORS_ONLN); - if (count <= 0) - count = 1; - count *= 4; - - pthread_t th[count]; - pthread_attr_t attr; - int i, ret, sz; - pthread_attr_init (&attr); - sz = sysconf (_SC_PAGESIZE); - if (sz < PTHREAD_STACK_MIN) - sz = PTHREAD_STACK_MIN; - pthread_attr_setstacksize (&attr, sz); - for (i = 0; i < count; ++i) - if ((ret = pthread_create (&th[i], &attr, tf, NULL)) != 0) - { - errno = ret; - printf ("pthread_create %d failed: %m\n", i); - return 1; - } - - struct timespec ts = { .tv_sec = 20, .tv_nsec = 0 }; - while (nanosleep (&ts, &ts) != 0); - - pthread_mutex_lock (&lock); - exiting = true; - pthread_mutex_unlock (&lock); - - for (i = 0; i < count; ++i) - pthread_join (th[i], NULL); - - fclose (f); - return 0; -} - -#define TEST_FUNCTION do_test () -#define TIMEOUT 40 -#include "../test-skeleton.c" diff --git a/nptl/tst-cond17.c b/nptl/tst-cond17.c deleted file mode 100644 index 0586fa59ac..0000000000 --- a/nptl/tst-cond17.c +++ /dev/null @@ -1,2 +0,0 @@ -#define UNLOCK_AFTER_BROADCAST 1 -#include "tst-cond16.c" diff --git a/nptl/tst-cond18.c b/nptl/tst-cond18.c deleted file mode 100644 index 187f3af1df..0000000000 --- a/nptl/tst-cond18.c +++ /dev/null @@ -1,123 +0,0 @@ -/* Copyright (C) 2004-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <limits.h> -#include <fcntl.h> -#include <pthread.h> -#include <stdbool.h> -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> - -pthread_cond_t cv = PTHREAD_COND_INITIALIZER; -pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; -bool exiting; -int fd, count, spins, nn; - -void * -tf (void *id) -{ - pthread_mutex_lock (&lock); - - if ((long) id == 0) - { - while (!exiting) - { - if ((spins++ % 1000) == 0) - write (fd, ".", 1); - pthread_mutex_unlock (&lock); - - pthread_mutex_lock (&lock); - int njobs = rand () % (count + 1); - nn = njobs; - if ((rand () % 30) == 0) - pthread_cond_broadcast (&cv); - else - while (njobs--) - pthread_cond_signal (&cv); - } - - pthread_cond_broadcast (&cv); - } - else - { - while (!exiting) - { - while (!nn && !exiting) - pthread_cond_wait (&cv, &lock); - --nn; - pthread_mutex_unlock (&lock); - - pthread_mutex_lock (&lock); - } - } - - pthread_mutex_unlock (&lock); - return NULL; -} - -int -do_test (void) -{ - fd = open ("/dev/null", O_WRONLY); - if (fd < 0) - { - printf ("couldn't open /dev/null, %m\n"); - return 1; - } - - count = sysconf (_SC_NPROCESSORS_ONLN); - if (count <= 0) - count = 1; - count *= 8; - - pthread_t th[count + 1]; - pthread_attr_t attr; - int i, ret, sz; - pthread_attr_init (&attr); - sz = sysconf (_SC_PAGESIZE); - if (sz < PTHREAD_STACK_MIN) - sz = PTHREAD_STACK_MIN; - pthread_attr_setstacksize (&attr, sz); - - for (i = 0; i <= count; ++i) - if ((ret = pthread_create (&th[i], &attr, tf, (void *) (long) i)) != 0) - { - errno = ret; - printf ("pthread_create %d failed: %m\n", i); - return 1; - } - - struct timespec ts = { .tv_sec = 20, .tv_nsec = 0 }; - while (nanosleep (&ts, &ts) != 0); - - pthread_mutex_lock (&lock); - exiting = true; - pthread_mutex_unlock (&lock); - - for (i = 0; i < count; ++i) - pthread_join (th[i], NULL); - - close (fd); - return 0; -} - -#define TEST_FUNCTION do_test () -#define TIMEOUT 40 -#include "../test-skeleton.c" diff --git a/nptl/tst-cond19.c b/nptl/tst-cond19.c deleted file mode 100644 index 9fee6bfdc8..0000000000 --- a/nptl/tst-cond19.c +++ /dev/null @@ -1,75 +0,0 @@ -/* Copyright (C) 2004-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> - - -static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; - - -static int -do_test (void) -{ - int result = 0; - struct timespec ts; - - if (clock_gettime (CLOCK_REALTIME, &ts) != 0) - { - puts ("clock_gettime failed"); - return 1; - } - - ts.tv_nsec = -1; - - int e = pthread_cond_timedwait (&cond, &mut, &ts); - if (e == 0) - { - puts ("first cond_timedwait did not fail"); - result = 1; - } - else if (e != EINVAL) - { - puts ("first cond_timedwait did not return EINVAL"); - result = 1; - } - - ts.tv_nsec = 2000000000; - - e = pthread_cond_timedwait (&cond, &mut, &ts); - if (e == 0) - { - puts ("second cond_timedwait did not fail"); - result = 1; - } - else if (e != EINVAL) - { - puts ("second cond_timedwait did not return EINVAL"); - result = 1; - } - - return result; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cond2.c b/nptl/tst-cond2.c deleted file mode 100644 index 29f47cd7dd..0000000000 --- a/nptl/tst-cond2.c +++ /dev/null @@ -1,162 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <error.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - - -static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; -static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; - -static pthread_barrier_t bar; - - -static void * -tf (void *a) -{ - int i = (long int) a; - int err; - - printf ("child %d: lock\n", i); - - err = pthread_mutex_lock (&mut); - if (err != 0) - error (EXIT_FAILURE, err, "locking in child failed"); - - printf ("child %d: sync\n", i); - - int e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child: barrier_wait failed"); - exit (1); - } - - printf ("child %d: wait\n", i); - - err = pthread_cond_wait (&cond, &mut); - if (err != 0) - error (EXIT_FAILURE, err, "child %d: failed to wait", i); - - printf ("child %d: woken up\n", i); - - err = pthread_mutex_unlock (&mut); - if (err != 0) - error (EXIT_FAILURE, err, "child %d: unlock[2] failed", i); - - printf ("child %d: done\n", i); - - return NULL; -} - - -#define N 10 - - -static int -do_test (void) -{ - pthread_t th[N]; - int i; - int err; - - printf ("&cond = %p\n&mut = %p\n", &cond, &mut); - - if (pthread_barrier_init (&bar, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - pthread_attr_t at; - - if (pthread_attr_init (&at) != 0) - { - puts ("attr_init failed"); - return 1; - } - - if (pthread_attr_setstacksize (&at, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - for (i = 0; i < N; ++i) - { - printf ("create thread %d\n", i); - - err = pthread_create (&th[i], &at, tf, (void *) (long int) i); - if (err != 0) - error (EXIT_FAILURE, err, "cannot create thread %d", i); - - printf ("wait for child %d\n", i); - - /* Wait for the child to start up and get the mutex for the - conditional variable. */ - int e = pthread_barrier_wait (&bar); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - } - - if (pthread_attr_destroy (&at) != 0) - { - puts ("attr_destroy failed"); - return 1; - } - - puts ("get lock outselves"); - - err = pthread_mutex_lock (&mut); - if (err != 0) - error (EXIT_FAILURE, err, "mut locking failed"); - - puts ("broadcast"); - - /* Wake up all threads. */ - err = pthread_cond_broadcast (&cond); - if (err != 0) - error (EXIT_FAILURE, err, "parent: broadcast failed"); - - err = pthread_mutex_unlock (&mut); - if (err != 0) - error (EXIT_FAILURE, err, "mut unlocking failed"); - - /* Join all threads. */ - for (i = 0; i < N; ++i) - { - printf ("join thread %d\n", i); - - err = pthread_join (th[i], NULL); - if (err != 0) - error (EXIT_FAILURE, err, "join of child %d failed", i); - } - - puts ("done"); - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cond20.c b/nptl/tst-cond20.c deleted file mode 100644 index ad9d6c34f3..0000000000 --- a/nptl/tst-cond20.c +++ /dev/null @@ -1,172 +0,0 @@ -/* Copyright (C) 2004-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#define N 10 -#define ROUNDS 1000 -static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; -static pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; -static pthread_barrier_t b; -static int count; - -static void * -tf (void *p) -{ - int i; - for (i = 0; i < ROUNDS; ++i) - { - pthread_mutex_lock (&mut); - - if (++count == N) - pthread_cond_signal (&cond2); - -#ifdef TIMED - struct timeval tv; - gettimeofday (&tv, NULL); - struct timespec ts; - /* Wait three seconds. */ - ts.tv_sec = tv.tv_sec + 3; - ts.tv_nsec = tv.tv_usec * 1000; - pthread_cond_timedwait (&cond, &mut, &ts); -#else - pthread_cond_wait (&cond, &mut); -#endif - - pthread_mutex_unlock (&mut); - - int err = pthread_barrier_wait (&b); - if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child: barrier_wait failed"); - exit (1); - } - - err = pthread_barrier_wait (&b); - if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child: barrier_wait failed"); - exit (1); - } - } - - return NULL; -} - - -static int -do_test (void) -{ - if (pthread_barrier_init (&b, NULL, N + 1) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - pthread_mutex_lock (&mut); - - int i, j, err; - pthread_t th[N]; - for (i = 0; i < N; ++i) - if ((err = pthread_create (&th[i], NULL, tf, NULL)) != 0) - { - printf ("cannot create thread %d: %s\n", i, strerror (err)); - return 1; - } - - for (i = 0; i < ROUNDS; ++i) - { - /* Make sure we discard spurious wake-ups. */ - do - pthread_cond_wait (&cond2, &mut); - while (count != N); - - if (i & 1) - pthread_mutex_unlock (&mut); - - if (i & 2) - pthread_cond_broadcast (&cond); - else if (i & 4) - for (j = 0; j < N; ++j) - pthread_cond_signal (&cond); - else - { - for (j = 0; j < (i / 8) % N; ++j) - pthread_cond_signal (&cond); - pthread_cond_broadcast (&cond); - } - - if ((i & 1) == 0) - pthread_mutex_unlock (&mut); - - err = pthread_cond_destroy (&cond); - if (err) - { - printf ("pthread_cond_destroy failed: %s\n", strerror (err)); - return 1; - } - - /* Now clobber the cond variable which has been successfully - destroyed above. */ - memset (&cond, (char) i, sizeof (cond)); - - err = pthread_barrier_wait (&b); - if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("parent: barrier_wait failed"); - return 1; - } - - pthread_mutex_lock (&mut); - - err = pthread_barrier_wait (&b); - if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("parent: barrier_wait failed"); - return 1; - } - - count = 0; - err = pthread_cond_init (&cond, NULL); - if (err) - { - printf ("pthread_cond_init failed: %s\n", strerror (err)); - return 1; - } - } - - for (i = 0; i < N; ++i) - if ((err = pthread_join (th[i], NULL)) != 0) - { - printf ("failed to join thread %d: %s\n", i, strerror (err)); - return 1; - } - - puts ("done"); - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cond21.c b/nptl/tst-cond21.c deleted file mode 100644 index 89cb771b57..0000000000 --- a/nptl/tst-cond21.c +++ /dev/null @@ -1,3 +0,0 @@ -#include <sys/time.h> -#define TIMED 1 -#include "tst-cond20.c" diff --git a/nptl/tst-cond22.c b/nptl/tst-cond22.c deleted file mode 100644 index 64f19ea0a5..0000000000 --- a/nptl/tst-cond22.c +++ /dev/null @@ -1,162 +0,0 @@ -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - - -static pthread_barrier_t b; -static pthread_cond_t c = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; - - -static void -cl (void *arg) -{ - pthread_mutex_unlock (&m); -} - - -static void * -tf (void *arg) -{ - if (pthread_mutex_lock (&m) != 0) - { - printf ("%s: mutex_lock failed\n", __func__); - exit (1); - } - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("%s: barrier_wait failed\n", __func__); - exit (1); - } - pthread_cleanup_push (cl, NULL); - /* We have to loop here because the cancellation might come after - the cond_wait call left the cancelable area and is then waiting - on the mutex. In this case the beginning of the second cond_wait - call will cause the cancellation to happen. */ - do - if (pthread_cond_wait (&c, &m) != 0) - { - printf ("%s: cond_wait failed\n", __func__); - exit (1); - } - while (arg == NULL); - pthread_cleanup_pop (0); - if (pthread_mutex_unlock (&m) != 0) - { - printf ("%s: mutex_unlock failed\n", __func__); - exit (1); - } - return NULL; -} - - -static int -do_test (void) -{ - int status = 0; - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("1st create failed"); - return 1; - } - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("1st barrier_wait failed"); - return 1; - } - if (pthread_mutex_lock (&m) != 0) - { - puts ("1st mutex_lock failed"); - return 1; - } - if (pthread_cond_signal (&c) != 0) - { - puts ("1st cond_signal failed"); - return 1; - } - if (pthread_cancel (th) != 0) - { - puts ("cancel failed"); - return 1; - } - if (pthread_mutex_unlock (&m) != 0) - { - puts ("1st mutex_unlock failed"); - return 1; - } - void *res; - if (pthread_join (th, &res) != 0) - { - puts ("1st join failed"); - return 1; - } - if (res != PTHREAD_CANCELED) - { - puts ("first thread not canceled"); - status = 1; - } - - printf ("cond = { %llu, %llu, %u/%u/%u, %u/%u/%u, %u, %u }\n", - c.__data.__wseq, c.__data.__g1_start, - c.__data.__g_signals[0], c.__data.__g_refs[0], c.__data.__g_size[0], - c.__data.__g_signals[1], c.__data.__g_refs[1], c.__data.__g_size[1], - c.__data.__g1_orig_size, c.__data.__wrefs); - - if (pthread_create (&th, NULL, tf, (void *) 1l) != 0) - { - puts ("2nd create failed"); - return 1; - } - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("2nd barrier_wait failed"); - return 1; - } - if (pthread_mutex_lock (&m) != 0) - { - puts ("2nd mutex_lock failed"); - return 1; - } - if (pthread_cond_signal (&c) != 0) - { - puts ("2nd cond_signal failed"); - return 1; - } - if (pthread_mutex_unlock (&m) != 0) - { - puts ("2nd mutex_unlock failed"); - return 1; - } - if (pthread_join (th, &res) != 0) - { - puts ("2nd join failed"); - return 1; - } - if (res != NULL) - { - puts ("2nd thread canceled"); - status = 1; - } - - printf ("cond = { %llu, %llu, %u/%u/%u, %u/%u/%u, %u, %u }\n", - c.__data.__wseq, c.__data.__g1_start, - c.__data.__g_signals[0], c.__data.__g_refs[0], c.__data.__g_size[0], - c.__data.__g_signals[1], c.__data.__g_refs[1], c.__data.__g_size[1], - c.__data.__g1_orig_size, c.__data.__wrefs); - - return status; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cond23.c b/nptl/tst-cond23.c deleted file mode 100644 index 7ce4564841..0000000000 --- a/nptl/tst-cond23.c +++ /dev/null @@ -1,183 +0,0 @@ -/* Copyright (C) 2008-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2008. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <time.h> -#include <unistd.h> - - -#if defined _POSIX_CLOCK_SELECTION && _POSIX_CLOCK_SELECTION >= 0 -static int -check (pthread_condattr_t *condattr, int pshared, clockid_t cl) -{ - clockid_t cl2; - if (pthread_condattr_getclock (condattr, &cl2) != 0) - { - puts ("condattr_getclock failed"); - return 1; - } - if (cl != cl2) - { - printf ("condattr_getclock returned wrong value: %d, expected %d\n", - (int) cl2, (int) cl); - return 1; - } - - int p; - if (pthread_condattr_getpshared (condattr, &p) != 0) - { - puts ("condattr_getpshared failed"); - return 1; - } - else if (p != pshared) - { - printf ("condattr_getpshared returned wrong value: %d, expected %d\n", - p, pshared); - return 1; - } - - return 0; -} - -static int -run_test (clockid_t cl) -{ - pthread_condattr_t condattr; - - printf ("clock = %d\n", (int) cl); - - if (pthread_condattr_init (&condattr) != 0) - { - puts ("condattr_init failed"); - return 1; - } - - if (check (&condattr, PTHREAD_PROCESS_PRIVATE, CLOCK_REALTIME)) - return 1; - - if (pthread_condattr_setpshared (&condattr, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("1st condattr_setpshared failed"); - return 1; - } - - if (check (&condattr, PTHREAD_PROCESS_SHARED, CLOCK_REALTIME)) - return 1; - - if (pthread_condattr_setclock (&condattr, cl) != 0) - { - puts ("1st condattr_setclock failed"); - return 1; - } - - if (check (&condattr, PTHREAD_PROCESS_SHARED, cl)) - return 1; - - if (pthread_condattr_setpshared (&condattr, PTHREAD_PROCESS_PRIVATE) != 0) - { - puts ("2nd condattr_setpshared failed"); - return 1; - } - - if (check (&condattr, PTHREAD_PROCESS_PRIVATE, cl)) - return 1; - - if (pthread_condattr_setclock (&condattr, CLOCK_REALTIME) != 0) - { - puts ("2nd condattr_setclock failed"); - return 1; - } - - if (check (&condattr, PTHREAD_PROCESS_PRIVATE, CLOCK_REALTIME)) - return 1; - - if (pthread_condattr_setclock (&condattr, cl) != 0) - { - puts ("3rd condattr_setclock failed"); - return 1; - } - - if (check (&condattr, PTHREAD_PROCESS_PRIVATE, cl)) - return 1; - - if (pthread_condattr_setpshared (&condattr, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("3rd condattr_setpshared failed"); - return 1; - } - - if (check (&condattr, PTHREAD_PROCESS_SHARED, cl)) - return 1; - - if (pthread_condattr_setclock (&condattr, CLOCK_REALTIME) != 0) - { - puts ("4th condattr_setclock failed"); - return 1; - } - - if (check (&condattr, PTHREAD_PROCESS_SHARED, CLOCK_REALTIME)) - return 1; - - if (pthread_condattr_destroy (&condattr) != 0) - { - puts ("condattr_destroy failed"); - return 1; - } - - return 0; -} -#endif - - -static int -do_test (void) -{ -#if !defined _POSIX_CLOCK_SELECTION || _POSIX_CLOCK_SELECTION == -1 - - puts ("_POSIX_CLOCK_SELECTION not supported, test skipped"); - return 0; - -#else - - int res = run_test (CLOCK_REALTIME); - -# if defined _POSIX_MONOTONIC_CLOCK && _POSIX_MONOTONIC_CLOCK >= 0 -# if _POSIX_MONOTONIC_CLOCK == 0 - int e = sysconf (_SC_MONOTONIC_CLOCK); - if (e < 0) - puts ("CLOCK_MONOTONIC not supported"); - else if (e == 0) - { - puts ("sysconf (_SC_MONOTONIC_CLOCK) must not return 0"); - res = 1; - } - else -# endif - res |= run_test (CLOCK_MONOTONIC); -# else - puts ("_POSIX_MONOTONIC_CLOCK not defined"); -# endif - - return res; -#endif -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cond24.c b/nptl/tst-cond24.c deleted file mode 100644 index 93be2b0977..0000000000 --- a/nptl/tst-cond24.c +++ /dev/null @@ -1,249 +0,0 @@ -/* Verify that condition variables synchronized by PI mutexes don't hang. - Copyright (C) 2012-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/syscall.h> -#include <unistd.h> -#include <sys/time.h> -#include <time.h> - -#define THREADS_NUM 5 -#define MAXITER 50000 - -static pthread_mutex_t mutex; -static pthread_mutexattr_t mutex_attr; -static pthread_cond_t cond; -static pthread_t threads[THREADS_NUM]; -static int pending = 0; - -typedef void * (*threadfunc) (void *); - -void * -thread_fun_timed (void *arg) -{ - int *ret = arg; - int rv, i; - - printf ("Started thread_fun_timed[%d]\n", *ret); - - for (i = 0; i < MAXITER / THREADS_NUM; i++) - { - rv = pthread_mutex_lock (&mutex); - if (rv) - { - printf ("pthread_mutex_lock: %s(%d)\n", strerror (rv), rv); - *ret = 1; - goto out; - } - - while (!pending) - { - struct timespec ts; - clock_gettime(CLOCK_REALTIME, &ts); - ts.tv_sec += 20; - rv = pthread_cond_timedwait (&cond, &mutex, &ts); - - /* There should be no timeout either. */ - if (rv) - { - printf ("pthread_cond_wait: %s(%d)\n", strerror (rv), rv); - *ret = 1; - goto out; - } - } - - pending--; - - rv = pthread_mutex_unlock (&mutex); - if (rv) - { - printf ("pthread_mutex_unlock: %s(%d)\n", strerror (rv), rv); - *ret = 1; - goto out; - } - } - - *ret = 0; - -out: - return ret; -} - -void * -thread_fun (void *arg) -{ - int *ret = arg; - int rv, i; - - printf ("Started thread_fun[%d]\n", *ret); - - for (i = 0; i < MAXITER / THREADS_NUM; i++) - { - rv = pthread_mutex_lock (&mutex); - if (rv) - { - printf ("pthread_mutex_lock: %s(%d)\n", strerror (rv), rv); - *ret = 1; - goto out; - } - - while (!pending) - { - rv = pthread_cond_wait (&cond, &mutex); - - if (rv) - { - printf ("pthread_cond_wait: %s(%d)\n", strerror (rv), rv); - *ret = 1; - goto out; - } - } - - pending--; - - rv = pthread_mutex_unlock (&mutex); - if (rv) - { - printf ("pthread_mutex_unlock: %s(%d)\n", strerror (rv), rv); - *ret = 1; - goto out; - } - } - - *ret = 0; - -out: - return ret; -} - -static int -do_test_wait (threadfunc f) -{ - int i; - int rv; - int counter = 0; - int retval[THREADS_NUM]; - - puts ("Starting test"); - - rv = pthread_mutexattr_init (&mutex_attr); - if (rv) - { - printf ("pthread_mutexattr_init: %s(%d)\n", strerror (rv), rv); - return 1; - } - - rv = pthread_mutexattr_setprotocol (&mutex_attr, PTHREAD_PRIO_INHERIT); - if (rv) - { - printf ("pthread_mutexattr_setprotocol: %s(%d)\n", strerror (rv), rv); - return 1; - } - - rv = pthread_mutex_init (&mutex, &mutex_attr); - if (rv) - { - printf ("pthread_mutex_init: %s(%d)\n", strerror (rv), rv); - return 1; - } - - rv = pthread_cond_init (&cond, NULL); - if (rv) - { - printf ("pthread_cond_init: %s(%d)\n", strerror (rv), rv); - return 1; - } - - for (i = 0; i < THREADS_NUM; i++) - { - retval[i] = i; - rv = pthread_create (&threads[i], NULL, f, &retval[i]); - if (rv) - { - printf ("pthread_create: %s(%d)\n", strerror (rv), rv); - return 1; - } - } - - for (; counter < MAXITER; counter++) - { - rv = pthread_mutex_lock (&mutex); - if (rv) - { - printf ("pthread_mutex_lock: %s(%d)\n", strerror (rv), rv); - return 1; - } - - if (!(counter % 100)) - printf ("counter: %d\n", counter); - pending += 1; - - rv = pthread_cond_signal (&cond); - if (rv) - { - printf ("pthread_cond_signal: %s(%d)\n", strerror (rv), rv); - return 1; - } - - rv = pthread_mutex_unlock (&mutex); - if (rv) - { - printf ("pthread_mutex_unlock: %s(%d)\n", strerror (rv), rv); - return 1; - } - } - - for (i = 0; i < THREADS_NUM; i++) - { - void *ret; - rv = pthread_join (threads[i], &ret); - if (rv) - { - printf ("pthread_join: %s(%d)\n", strerror (rv), rv); - return 1; - } - if (ret && *(int *)ret) - { - printf ("Thread %d returned with an error\n", i); - return 1; - } - } - - return 0; -} - -static int -do_test (void) -{ - puts ("Testing pthread_cond_wait"); - int ret = do_test_wait (thread_fun); - if (ret) - return ret; - - puts ("Testing pthread_cond_timedwait"); - return do_test_wait (thread_fun_timed); -} - -#define TIMEOUT 20 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cond25.c b/nptl/tst-cond25.c deleted file mode 100644 index 5dfd3845fd..0000000000 --- a/nptl/tst-cond25.c +++ /dev/null @@ -1,289 +0,0 @@ -/* Verify that condition variables synchronized by PI mutexes don't hang on - on cancellation. - Copyright (C) 2012-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <string.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/syscall.h> -#include <unistd.h> -#include <sys/time.h> -#include <time.h> - -#define NUM 5 -#define ITERS 10000 -#define COUNT 100 - -typedef void *(*thr_func) (void *); - -pthread_mutex_t mutex; -pthread_cond_t cond; - -void cleanup (void *u) -{ - /* pthread_cond_wait should always return with the mutex locked. The - pthread_mutex_unlock implementation does not actually check whether we - own the mutex for several mutex kinds, so check this explicitly. */ - int ret = pthread_mutex_trylock (&mutex); - if (ret != EDEADLK && ret != EBUSY) - { - printf ("mutex not locked in cleanup %d\n", ret); - abort (); - } - if (pthread_mutex_unlock (&mutex)) - abort (); -} - -void * -signaller (void *u) -{ - int i, ret = 0; - void *tret = NULL; - - for (i = 0; i < ITERS; i++) - { - if ((ret = pthread_mutex_lock (&mutex)) != 0) - { - tret = (void *)1; - printf ("signaller:mutex_lock failed: %s\n", strerror (ret)); - goto out; - } - if ((ret = pthread_cond_signal (&cond)) != 0) - { - tret = (void *)1; - printf ("signaller:signal failed: %s\n", strerror (ret)); - goto unlock_out; - } - if ((ret = pthread_mutex_unlock (&mutex)) != 0) - { - tret = (void *)1; - printf ("signaller:mutex_unlock failed: %s\n", strerror (ret)); - goto out; - } - pthread_testcancel (); - } - -out: - return tret; - -unlock_out: - if ((ret = pthread_mutex_unlock (&mutex)) != 0) - printf ("signaller:mutex_unlock[2] failed: %s\n", strerror (ret)); - goto out; -} - -void * -waiter (void *u) -{ - int i, ret = 0; - void *tret = NULL; - int seq = (uintptr_t) u; - - for (i = 0; i < ITERS / NUM; i++) - { - if ((ret = pthread_mutex_lock (&mutex)) != 0) - { - tret = (void *) (uintptr_t) 1; - printf ("waiter[%u]:mutex_lock failed: %s\n", seq, strerror (ret)); - goto out; - } - pthread_cleanup_push (cleanup, NULL); - - if ((ret = pthread_cond_wait (&cond, &mutex)) != 0) - { - tret = (void *) (uintptr_t) 1; - printf ("waiter[%u]:wait failed: %s\n", seq, strerror (ret)); - goto unlock_out; - } - - if ((ret = pthread_mutex_unlock (&mutex)) != 0) - { - tret = (void *) (uintptr_t) 1; - printf ("waiter[%u]:mutex_unlock failed: %s\n", seq, strerror (ret)); - goto out; - } - pthread_cleanup_pop (0); - } - -out: - puts ("waiter tests done"); - return tret; - -unlock_out: - if ((ret = pthread_mutex_unlock (&mutex)) != 0) - printf ("waiter:mutex_unlock[2] failed: %s\n", strerror (ret)); - goto out; -} - -void * -timed_waiter (void *u) -{ - int i, ret; - void *tret = NULL; - int seq = (uintptr_t) u; - - for (i = 0; i < ITERS / NUM; i++) - { - struct timespec ts; - - if ((ret = clock_gettime(CLOCK_REALTIME, &ts)) != 0) - { - tret = (void *) (uintptr_t) 1; - printf ("%u:clock_gettime failed: %s\n", seq, strerror (errno)); - goto out; - } - ts.tv_sec += 20; - - if ((ret = pthread_mutex_lock (&mutex)) != 0) - { - tret = (void *) (uintptr_t) 1; - printf ("waiter[%u]:mutex_lock failed: %s\n", seq, strerror (ret)); - goto out; - } - pthread_cleanup_push (cleanup, NULL); - - /* We should not time out either. */ - if ((ret = pthread_cond_timedwait (&cond, &mutex, &ts)) != 0) - { - tret = (void *) (uintptr_t) 1; - printf ("waiter[%u]:timedwait failed: %s\n", seq, strerror (ret)); - goto unlock_out; - } - if ((ret = pthread_mutex_unlock (&mutex)) != 0) - { - tret = (void *) (uintptr_t) 1; - printf ("waiter[%u]:mutex_unlock failed: %s\n", seq, strerror (ret)); - goto out; - } - pthread_cleanup_pop (0); - } - -out: - puts ("timed_waiter tests done"); - return tret; - -unlock_out: - if ((ret = pthread_mutex_unlock (&mutex)) != 0) - printf ("waiter[%u]:mutex_unlock[2] failed: %s\n", seq, strerror (ret)); - goto out; -} - -int -do_test_wait (thr_func f) -{ - pthread_t w[NUM]; - pthread_t s; - pthread_mutexattr_t attr; - int i, j, ret = 0; - void *thr_ret; - - for (i = 0; i < COUNT; i++) - { - if ((ret = pthread_mutexattr_init (&attr)) != 0) - { - printf ("mutexattr_init failed: %s\n", strerror (ret)); - goto out; - } - - if ((ret = pthread_mutexattr_setprotocol (&attr, - PTHREAD_PRIO_INHERIT)) != 0) - { - printf ("mutexattr_setprotocol failed: %s\n", strerror (ret)); - goto out; - } - - if ((ret = pthread_cond_init (&cond, NULL)) != 0) - { - printf ("cond_init failed: %s\n", strerror (ret)); - goto out; - } - - if ((ret = pthread_mutex_init (&mutex, &attr)) != 0) - { - printf ("mutex_init failed: %s\n", strerror (ret)); - goto out; - } - - for (j = 0; j < NUM; j++) - if ((ret = pthread_create (&w[j], NULL, - f, (void *) (uintptr_t) j)) != 0) - { - printf ("waiter[%d]: create failed: %s\n", j, strerror (ret)); - goto out; - } - - if ((ret = pthread_create (&s, NULL, signaller, NULL)) != 0) - { - printf ("signaller: create failed: %s\n", strerror (ret)); - goto out; - } - - for (j = 0; j < NUM; j++) - { - pthread_cancel (w[j]); - - if ((ret = pthread_join (w[j], &thr_ret)) != 0) - { - printf ("waiter[%d]: join failed: %s\n", j, strerror (ret)); - goto out; - } - - if (thr_ret != NULL && thr_ret != PTHREAD_CANCELED) - { - ret = 1; - goto out; - } - } - - /* The signalling thread could have ended before it was cancelled. */ - pthread_cancel (s); - - if ((ret = pthread_join (s, &thr_ret)) != 0) - { - printf ("signaller: join failed: %s\n", strerror (ret)); - goto out; - } - - if (thr_ret != NULL && thr_ret != PTHREAD_CANCELED) - { - ret = 1; - goto out; - } - } - -out: - return ret; -} - -int -do_test (int argc, char **argv) -{ - int ret = do_test_wait (waiter); - - if (ret) - return ret; - - return do_test_wait (timed_waiter); -} - -#define TIMEOUT 5 -#include "../test-skeleton.c" diff --git a/nptl/tst-cond3.c b/nptl/tst-cond3.c deleted file mode 100644 index 84d84c22b0..0000000000 --- a/nptl/tst-cond3.c +++ /dev/null @@ -1,111 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -/* Note that this test requires more than the standard. It is - required that there are no spurious wakeups if only more readers - are added. This is a reasonable demand. */ - - -static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; - - -#define N 10 - - -static void * -tf (void *arg) -{ - int i = (long int) arg; - int err; - - /* Get the mutex. */ - err = pthread_mutex_lock (&mut); - if (err != 0) - { - printf ("child %d mutex_lock failed: %s\n", i, strerror (err)); - exit (1); - } - - /* This call should never return. */ - xpthread_cond_wait (&cond, &mut); - puts ("error: pthread_cond_wait in tf returned"); - - /* We should never get here. */ - exit (1); - - return NULL; -} - - -static int -do_test (void) -{ - int err; - int i; - - for (i = 0; i < N; ++i) - { - pthread_t th; - - if (i != 0) - { - /* Release the mutex. */ - err = pthread_mutex_unlock (&mut); - if (err != 0) - { - printf ("mutex_unlock %d failed: %s\n", i, strerror (err)); - return 1; - } - } - - err = pthread_create (&th, NULL, tf, (void *) (long int) i); - if (err != 0) - { - printf ("create %d failed: %s\n", i, strerror (err)); - return 1; - } - - /* Get the mutex. */ - err = pthread_mutex_lock (&mut); - if (err != 0) - { - printf ("mutex_lock %d failed: %s\n", i, strerror (err)); - return 1; - } - } - - delayed_exit (1); - - /* This call should never return. */ - xpthread_cond_wait (&cond, &mut); - - puts ("error: pthread_cond_wait in do_test returned"); - return 1; -} diff --git a/nptl/tst-cond4.c b/nptl/tst-cond4.c deleted file mode 100644 index cc9c5c908a..0000000000 --- a/nptl/tst-cond4.c +++ /dev/null @@ -1,263 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/wait.h> - - -int *condition; - -static int -do_test (void) -{ - size_t ps = sysconf (_SC_PAGESIZE); - char tmpfname[] = "/tmp/tst-cond4.XXXXXX"; - char data[ps]; - void *mem; - int fd; - pthread_mutexattr_t ma; - pthread_mutex_t *mut1; - pthread_mutex_t *mut2; - pthread_condattr_t ca; - pthread_cond_t *cond; - pid_t pid; - int result = 0; - int p; - - fd = mkstemp (tmpfname); - if (fd == -1) - { - printf ("cannot open temporary file: %m\n"); - return 1; - } - - /* Make sure it is always removed. */ - unlink (tmpfname); - - /* Create one page of data. */ - memset (data, '\0', ps); - - /* Write the data to the file. */ - if (write (fd, data, ps) != (ssize_t) ps) - { - puts ("short write"); - return 1; - } - - mem = mmap (NULL, ps, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (mem == MAP_FAILED) - { - printf ("mmap failed: %m\n"); - return 1; - } - - mut1 = (pthread_mutex_t *) (((uintptr_t) mem - + __alignof (pthread_mutex_t)) - & ~(__alignof (pthread_mutex_t) - 1)); - mut2 = mut1 + 1; - - cond = (pthread_cond_t *) (((uintptr_t) (mut2 + 1) - + __alignof (pthread_cond_t)) - & ~(__alignof (pthread_cond_t) - 1)); - - condition = (int *) (((uintptr_t) (cond + 1) + __alignof (int)) - & ~(__alignof (int) - 1)); - - if (pthread_mutexattr_init (&ma) != 0) - { - puts ("mutexattr_init failed"); - return 1; - } - - if (pthread_mutexattr_getpshared (&ma, &p) != 0) - { - puts ("1st mutexattr_getpshared failed"); - return 1; - } - - if (p != PTHREAD_PROCESS_PRIVATE) - { - puts ("default pshared value wrong"); - return 1; - } - - if (pthread_mutexattr_setpshared (&ma, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("mutexattr_setpshared failed"); - return 1; - } - - if (pthread_mutexattr_getpshared (&ma, &p) != 0) - { - puts ("2nd mutexattr_getpshared failed"); - return 1; - } - - if (p != PTHREAD_PROCESS_SHARED) - { - puts ("pshared value after setpshared call wrong"); - return 1; - } - - if (pthread_mutex_init (mut1, &ma) != 0) - { - puts ("1st mutex_init failed"); - return 1; - } - - if (pthread_mutex_init (mut2, &ma) != 0) - { - puts ("2nd mutex_init failed"); - return 1; - } - - if (pthread_condattr_init (&ca) != 0) - { - puts ("condattr_init failed"); - return 1; - } - - if (pthread_condattr_getpshared (&ca, &p) != 0) - { - puts ("1st condattr_getpshared failed"); - return 1; - } - - if (p != PTHREAD_PROCESS_PRIVATE) - { - puts ("default value for pshared in condattr wrong"); - return 1; - } - - if (pthread_condattr_setpshared (&ca, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("condattr_setpshared failed"); - return 1; - } - - if (pthread_condattr_getpshared (&ca, &p) != 0) - { - puts ("2nd condattr_getpshared failed"); - return 1; - } - - if (p != PTHREAD_PROCESS_SHARED) - { - puts ("pshared condattr still not set"); - return 1; - } - - if (pthread_cond_init (cond, &ca) != 0) - { - puts ("cond_init failed"); - return 1; - } - - if (pthread_mutex_lock (mut1) != 0) - { - puts ("parent: 1st mutex_lock failed"); - return 1; - } - - puts ("going to fork now"); - pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - return 1; - } - else if (pid == 0) - { - if (pthread_mutex_lock (mut2) != 0) - { - puts ("child: mutex_lock failed"); - return 1; - } - - if (pthread_mutex_unlock (mut1) != 0) - { - puts ("child: 1st mutex_unlock failed"); - return 1; - } - - do - if (pthread_cond_wait (cond, mut2) != 0) - { - puts ("child: cond_wait failed"); - return 1; - } - while (*condition == 0); - - if (pthread_mutex_unlock (mut2) != 0) - { - puts ("child: 2nd mutex_unlock failed"); - return 1; - } - - puts ("child done"); - } - else - { - int status; - - if (pthread_mutex_lock (mut1) != 0) - { - puts ("parent: 2nd mutex_lock failed"); - return 1; - } - - if (pthread_mutex_lock (mut2) != 0) - { - puts ("parent: 3rd mutex_lock failed"); - return 1; - } - - if (pthread_cond_signal (cond) != 0) - { - puts ("parent: cond_signal failed"); - return 1; - } - - *condition = 1; - - if (pthread_mutex_unlock (mut2) != 0) - { - puts ("parent: mutex_unlock failed"); - return 1; - } - - puts ("waiting for child"); - - waitpid (pid, &status, 0); - result |= status; - - puts ("parent done"); - } - - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cond5.c b/nptl/tst-cond5.c deleted file mode 100644 index 43d75bd727..0000000000 --- a/nptl/tst-cond5.c +++ /dev/null @@ -1,105 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <sys/time.h> - - -static pthread_mutex_t mut; -static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; - - -static int -do_test (void) -{ - pthread_mutexattr_t ma; - int err; - struct timespec ts; - struct timeval tv; - - if (pthread_mutexattr_init (&ma) != 0) - { - puts ("mutexattr_init failed"); - exit (1); - } - - if (pthread_mutexattr_settype (&ma, PTHREAD_MUTEX_ERRORCHECK) != 0) - { - puts ("mutexattr_settype failed"); - exit (1); - } - - if (pthread_mutex_init (&mut, &ma) != 0) - { - puts ("mutex_init failed"); - exit (1); - } - - /* Get the mutex. */ - if (pthread_mutex_lock (&mut) != 0) - { - puts ("mutex_lock failed"); - exit (1); - } - - /* Waiting for the condition will fail. But we want the timeout here. */ - if (gettimeofday (&tv, NULL) != 0) - { - puts ("gettimeofday failed"); - exit (1); - } - - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_nsec += 500000000; - if (ts.tv_nsec >= 1000000000) - { - ts.tv_nsec -= 1000000000; - ++ts.tv_sec; - } - err = pthread_cond_timedwait (&cond, &mut, &ts); - if (err == 0) - { - /* This could in theory happen but here without any signal and - additional waiter it should not. */ - puts ("cond_timedwait succeeded"); - exit (1); - } - else if (err != ETIMEDOUT) - { - printf ("cond_timedwait returned with %s\n", strerror (err)); - exit (1); - } - - err = pthread_mutex_unlock (&mut); - if (err != 0) - { - printf ("mutex_unlock failed: %s\n", strerror (err)); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cond6.c b/nptl/tst-cond6.c deleted file mode 100644 index ebfd449ffb..0000000000 --- a/nptl/tst-cond6.c +++ /dev/null @@ -1,233 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/time.h> -#include <sys/wait.h> - - -int *condition; - -static int -do_test (void) -{ - size_t ps = sysconf (_SC_PAGESIZE); - char tmpfname[] = "/tmp/tst-cond6.XXXXXX"; - char data[ps]; - void *mem; - int fd; - pthread_mutexattr_t ma; - pthread_mutex_t *mut1; - pthread_mutex_t *mut2; - pthread_condattr_t ca; - pthread_cond_t *cond; - pid_t pid; - int result = 0; - - fd = mkstemp (tmpfname); - if (fd == -1) - { - printf ("cannot open temporary file: %m\n"); - exit (1); - } - - /* Make sure it is always removed. */ - unlink (tmpfname); - - /* Create one page of data. */ - memset (data, '\0', ps); - - /* Write the data to the file. */ - if (write (fd, data, ps) != (ssize_t) ps) - { - puts ("short write"); - exit (1); - } - - mem = mmap (NULL, ps, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (mem == MAP_FAILED) - { - printf ("mmap failed: %m\n"); - exit (1); - } - - mut1 = (pthread_mutex_t *) (((uintptr_t) mem - + __alignof (pthread_mutex_t)) - & ~(__alignof (pthread_mutex_t) - 1)); - mut2 = mut1 + 1; - - cond = (pthread_cond_t *) (((uintptr_t) (mut2 + 1) - + __alignof (pthread_cond_t)) - & ~(__alignof (pthread_cond_t) - 1)); - - condition = (int *) (((uintptr_t) (cond + 1) + __alignof (int)) - & ~(__alignof (int) - 1)); - - if (pthread_mutexattr_init (&ma) != 0) - { - puts ("mutexattr_init failed"); - exit (1); - } - - if (pthread_mutexattr_setpshared (&ma, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("mutexattr_setpshared failed"); - exit (1); - } - - if (pthread_mutex_init (mut1, &ma) != 0) - { - puts ("1st mutex_init failed"); - exit (1); - } - - if (pthread_mutex_init (mut2, &ma) != 0) - { - puts ("2nd mutex_init failed"); - exit (1); - } - - if (pthread_condattr_init (&ca) != 0) - { - puts ("condattr_init failed"); - exit (1); - } - - if (pthread_condattr_setpshared (&ca, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("condattr_setpshared failed"); - exit (1); - } - - if (pthread_cond_init (cond, &ca) != 0) - { - puts ("cond_init failed"); - exit (1); - } - - if (pthread_mutex_lock (mut1) != 0) - { - puts ("parent: 1st mutex_lock failed"); - exit (1); - } - - puts ("going to fork now"); - pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - exit (1); - } - else if (pid == 0) - { - struct timespec ts; - struct timeval tv; - - if (pthread_mutex_lock (mut2) != 0) - { - puts ("child: mutex_lock failed"); - exit (1); - } - - if (pthread_mutex_unlock (mut1) != 0) - { - puts ("child: 1st mutex_unlock failed"); - exit (1); - } - - if (gettimeofday (&tv, NULL) != 0) - { - puts ("gettimeofday failed"); - exit (1); - } - - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_nsec += 500000000; - if (ts.tv_nsec >= 1000000000) - { - ts.tv_nsec -= 1000000000; - ++ts.tv_sec; - } - - do - if (pthread_cond_timedwait (cond, mut2, &ts) != 0) - { - puts ("child: cond_wait failed"); - exit (1); - } - while (*condition == 0); - - if (pthread_mutex_unlock (mut2) != 0) - { - puts ("child: 2nd mutex_unlock failed"); - exit (1); - } - - puts ("child done"); - } - else - { - int status; - - if (pthread_mutex_lock (mut1) != 0) - { - puts ("parent: 2nd mutex_lock failed"); - exit (1); - } - - if (pthread_mutex_lock (mut2) != 0) - { - puts ("parent: 3rd mutex_lock failed"); - exit (1); - } - - if (pthread_cond_signal (cond) != 0) - { - puts ("parent: cond_signal failed"); - exit (1); - } - - *condition = 1; - - if (pthread_mutex_unlock (mut2) != 0) - { - puts ("parent: mutex_unlock failed"); - exit (1); - } - - puts ("waiting for child"); - - waitpid (pid, &status, 0); - result |= status; - - puts ("parent done"); - } - - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cond7.c b/nptl/tst-cond7.c deleted file mode 100644 index 566141758d..0000000000 --- a/nptl/tst-cond7.c +++ /dev/null @@ -1,167 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <sys/time.h> - - -typedef struct - { - pthread_cond_t cond; - pthread_mutex_t lock; - pthread_t h; - } T; - - -static volatile bool done; - - -static void * -tf (void *arg) -{ - puts ("child created"); - - if (pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL) != 0 - || pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, NULL) != 0) - { - puts ("cannot set cancellation options"); - exit (1); - } - - T *t = (T *) arg; - - if (pthread_mutex_lock (&t->lock) != 0) - { - puts ("child: lock failed"); - exit (1); - } - - done = true; - - if (pthread_cond_signal (&t->cond) != 0) - { - puts ("child: cond_signal failed"); - exit (1); - } - - if (pthread_cond_wait (&t->cond, &t->lock) != 0) - { - puts ("child: cond_wait failed"); - exit (1); - } - - if (pthread_mutex_unlock (&t->lock) != 0) - { - puts ("child: unlock failed"); - exit (1); - } - - return NULL; -} - - -static int -do_test (void) -{ - int i; -#define N 100 - T *t[N]; - for (i = 0; i < N; ++i) - { - printf ("round %d\n", i); - - t[i] = (T *) malloc (sizeof (T)); - if (t[i] == NULL) - { - puts ("out of memory"); - exit (1); - } - - if (pthread_mutex_init (&t[i]->lock, NULL) != 0 - || pthread_cond_init (&t[i]->cond, NULL) != 0) - { - puts ("an _init function failed"); - exit (1); - } - - if (pthread_mutex_lock (&t[i]->lock) != 0) - { - puts ("initial mutex_lock failed"); - exit (1); - } - - done = false; - - if (pthread_create (&t[i]->h, NULL, tf, t[i]) != 0) - { - puts ("pthread_create failed"); - exit (1); - } - - do - if (pthread_cond_wait (&t[i]->cond, &t[i]->lock) != 0) - { - puts ("cond_wait failed"); - exit (1); - } - while (! done); - - /* Release the lock since the cancel handler will get it. */ - if (pthread_mutex_unlock (&t[i]->lock) != 0) - { - puts ("mutex_unlock failed"); - exit (1); - } - - if (pthread_cancel (t[i]->h) != 0) - { - puts ("cancel failed"); - exit (1); - } - - puts ("parent: joining now"); - - void *result; - if (pthread_join (t[i]->h, &result) != 0) - { - puts ("join failed"); - exit (1); - } - - if (result != PTHREAD_CANCELED) - { - puts ("result != PTHREAD_CANCELED"); - exit (1); - } - } - - for (i = 0; i < N; ++i) - free (t[i]); - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cond8-static.c b/nptl/tst-cond8-static.c deleted file mode 100644 index fed35db60d..0000000000 --- a/nptl/tst-cond8-static.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-cond8.c" diff --git a/nptl/tst-cond8.c b/nptl/tst-cond8.c deleted file mode 100644 index 7a0a8eeecb..0000000000 --- a/nptl/tst-cond8.c +++ /dev/null @@ -1,276 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <sys/time.h> - - -static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t mut = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; - -static pthread_barrier_t bar; - - -static void -ch (void *arg) -{ - int e = pthread_mutex_lock (&mut); - if (e == 0) - { - puts ("mutex not locked at all by cond_wait"); - exit (1); - } - - if (e != EDEADLK) - { - puts ("no deadlock error signaled"); - exit (1); - } - - if (pthread_mutex_unlock (&mut) != 0) - { - puts ("ch: cannot unlock mutex"); - exit (1); - } - - puts ("ch done"); -} - - -static void * -tf1 (void *p) -{ - int err; - - if (pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL) != 0 - || pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, NULL) != 0) - { - puts ("cannot set cancellation options"); - exit (1); - } - - err = pthread_mutex_lock (&mut); - if (err != 0) - { - puts ("child: cannot get mutex"); - exit (1); - } - - err = pthread_barrier_wait (&bar); - if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("barrier_wait returned %d\n", err); - exit (1); - } - - puts ("child: got mutex; waiting"); - - pthread_cleanup_push (ch, NULL); - - pthread_cond_wait (&cond, &mut); - - pthread_cleanup_pop (0); - - puts ("child: cond_wait should not have returned"); - - return NULL; -} - - -static void * -tf2 (void *p) -{ - int err; - - if (pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL) != 0 - || pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, NULL) != 0) - { - puts ("cannot set cancellation options"); - exit (1); - } - - err = pthread_mutex_lock (&mut); - if (err != 0) - { - puts ("child: cannot get mutex"); - exit (1); - } - - err = pthread_barrier_wait (&bar); - if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("barrier_wait returned %d\n", err); - exit (1); - } - - puts ("child: got mutex; waiting"); - - pthread_cleanup_push (ch, NULL); - - /* Current time. */ - struct timeval tv; - (void) gettimeofday (&tv, NULL); - /* +1000 seconds in correct format. */ - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_sec += 1000; - - pthread_cond_timedwait (&cond, &mut, &ts); - - pthread_cleanup_pop (0); - - puts ("child: cond_wait should not have returned"); - - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - int err; - - printf ("&cond = %p\n&mut = %p\n", &cond, &mut); - - puts ("parent: get mutex"); - - err = pthread_barrier_init (&bar, NULL, 2); - if (err != 0) - { - puts ("parent: cannot init barrier"); - exit (1); - } - - puts ("parent: create child"); - - err = pthread_create (&th, NULL, tf1, NULL); - if (err != 0) - { - puts ("parent: cannot create thread"); - exit (1); - } - - puts ("parent: wait for child to lock mutex"); - - err = pthread_barrier_wait (&bar); - if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("parent: cannot wait for barrier"); - exit (1); - } - - err = pthread_mutex_lock (&mut); - if (err != 0) - { - puts ("parent: mutex_lock failed"); - exit (1); - } - - err = pthread_mutex_unlock (&mut); - if (err != 0) - { - puts ("parent: mutex_unlock failed"); - exit (1); - } - - if (pthread_cancel (th) != 0) - { - puts ("cannot cancel thread"); - exit (1); - } - - void *r; - err = pthread_join (th, &r); - if (err != 0) - { - puts ("parent: failed to join"); - exit (1); - } - - if (r != PTHREAD_CANCELED) - { - puts ("child hasn't been canceled"); - exit (1); - } - - - - puts ("parent: create 2nd child"); - - err = pthread_create (&th, NULL, tf2, NULL); - if (err != 0) - { - puts ("parent: cannot create thread"); - exit (1); - } - - puts ("parent: wait for child to lock mutex"); - - err = pthread_barrier_wait (&bar); - if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("parent: cannot wait for barrier"); - exit (1); - } - - err = pthread_mutex_lock (&mut); - if (err != 0) - { - puts ("parent: mutex_lock failed"); - exit (1); - } - - err = pthread_mutex_unlock (&mut); - if (err != 0) - { - puts ("parent: mutex_unlock failed"); - exit (1); - } - - if (pthread_cancel (th) != 0) - { - puts ("cannot cancel thread"); - exit (1); - } - - err = pthread_join (th, &r); - if (err != 0) - { - puts ("parent: failed to join"); - exit (1); - } - - if (r != PTHREAD_CANCELED) - { - puts ("child hasn't been canceled"); - exit (1); - } - - puts ("done"); - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-cond9.c b/nptl/tst-cond9.c deleted file mode 100644 index d9fc90e521..0000000000 --- a/nptl/tst-cond9.c +++ /dev/null @@ -1,149 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <sys/time.h> - - -static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t mut = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; - - -static void * -tf (void *arg) -{ - int err = pthread_cond_wait (&cond, &mut); - if (err == 0) - { - puts ("cond_wait did not fail"); - exit (1); - } - - if (err != EPERM) - { - printf ("cond_wait didn't return EPERM but %d\n", err); - exit (1); - } - - - /* Current time. */ - struct timeval tv; - (void) gettimeofday (&tv, NULL); - /* +1000 seconds in correct format. */ - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_sec += 1000; - - err = pthread_cond_timedwait (&cond, &mut, &ts); - if (err == 0) - { - puts ("cond_timedwait did not fail"); - exit (1); - } - - if (err != EPERM) - { - printf ("cond_timedwait didn't return EPERM but %d\n", err); - exit (1); - } - - return (void *) 1l; -} - - -static int -do_test (void) -{ - pthread_t th; - int err; - - printf ("&cond = %p\n&mut = %p\n", &cond, &mut); - - err = pthread_cond_wait (&cond, &mut); - if (err == 0) - { - puts ("cond_wait did not fail"); - exit (1); - } - - if (err != EPERM) - { - printf ("cond_wait didn't return EPERM but %d\n", err); - exit (1); - } - - - /* Current time. */ - struct timeval tv; - (void) gettimeofday (&tv, NULL); - /* +1000 seconds in correct format. */ - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_sec += 1000; - - err = pthread_cond_timedwait (&cond, &mut, &ts); - if (err == 0) - { - puts ("cond_timedwait did not fail"); - exit (1); - } - - if (err != EPERM) - { - printf ("cond_timedwait didn't return EPERM but %d\n", err); - exit (1); - } - - if (pthread_mutex_lock (&mut) != 0) - { - puts ("parent: mutex_lock failed"); - exit (1); - } - - puts ("creating thread"); - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("join failed"); - exit (1); - } - if (r != (void *) 1l) - { - puts ("thread has wrong return value"); - exit (1); - } - - puts ("done"); - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-context1.c b/nptl/tst-context1.c deleted file mode 100644 index eaccd9e88f..0000000000 --- a/nptl/tst-context1.c +++ /dev/null @@ -1,205 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <error.h> -#include <limits.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <ucontext.h> - -#define N 4 -#if __WORDSIZE == 64 -#define GUARD_PATTERN 0xdeadbeafdeadbeaf -#else -#define GUARD_PATTERN 0xdeadbeaf -#endif - -typedef struct { - ucontext_t uctx; - unsigned long guard[3]; - } tst_context_t; - -static char stacks[N][2 * PTHREAD_STACK_MIN]; -static tst_context_t ctx[N][2]; -static volatile int failures; - - -static void -fct (long int n) -{ - char on_stack[1]; - - /* Just to use the thread local descriptor. */ - printf ("%ld: in %s now, on_stack = %p\n", n, __FUNCTION__, on_stack); - errno = 0; - - if (ctx[n][1].uctx.uc_link != &ctx[n][0].uctx) - { - printf ("context[%ld][1] uc_link damaged, = %p\n", n, - ctx[n][1].uctx.uc_link); - exit (1); - } - - if ((ctx[n][0].guard[0] != GUARD_PATTERN) - || (ctx[n][0].guard[1] != GUARD_PATTERN) - || (ctx[n][0].guard[2] != GUARD_PATTERN)) - { - printf ("%ld: %s context[0] overflow detected!\n", n, __FUNCTION__); - ++failures; - } - - if ((ctx[n][1].guard[0] != GUARD_PATTERN) - || (ctx[n][1].guard[1] != GUARD_PATTERN) - || (ctx[n][1].guard[2] != GUARD_PATTERN)) - { - printf ("%ld: %s context[1] overflow detected!\n", n, __FUNCTION__); - ++failures; - } - - if (n < 0 || n >= N) - { - printf ("%ld out of range\n", n); - exit (1); - } - - if (on_stack < stacks[n] || on_stack >= stacks[n] + sizeof (stacks[0])) - { - printf ("%ld: on_stack not on appropriate stack\n", n); - exit (1); - } -} - - -static void * -tf (void *arg) -{ - int n = (int) (long int) arg; - - ctx[n][0].guard[0] = GUARD_PATTERN; - ctx[n][0].guard[1] = GUARD_PATTERN; - ctx[n][0].guard[2] = GUARD_PATTERN; - - ctx[n][1].guard[0] = GUARD_PATTERN; - ctx[n][1].guard[1] = GUARD_PATTERN; - ctx[n][1].guard[2] = GUARD_PATTERN; - - if (getcontext (&ctx[n][1].uctx) != 0) - { - printf ("%d: cannot get context: %m\n", n); - exit (1); - } - - printf ("%d: %s: before makecontext\n", n, __FUNCTION__); - - ctx[n][1].uctx.uc_stack.ss_sp = stacks[n]; - ctx[n][1].uctx.uc_stack.ss_size = sizeof (stacks[n]); - ctx[n][1].uctx.uc_link = &ctx[n][0].uctx; - makecontext (&ctx[n][1].uctx, (void (*) (void)) fct, 1, (long int) n); - - printf ("%d: %s: before swapcontext\n", n, __FUNCTION__); - - if (swapcontext (&ctx[n][0].uctx, &ctx[n][1].uctx) != 0) - { - ++failures; - printf ("%d: %s: swapcontext failed\n", n, __FUNCTION__); - } - else - printf ("%d: back in %s\n", n, __FUNCTION__); - - return NULL; -} - - -static volatile int global; - - -static int -do_test (void) -{ - int n; - pthread_t th[N]; - ucontext_t mctx; - - puts ("making contexts"); - if (getcontext (&mctx) != 0) - { - if (errno == ENOSYS) - { - puts ("context handling not supported"); - exit (0); - } - - printf ("%s: getcontext: %m\n", __FUNCTION__); - exit (1); - } - - /* Play some tricks with this context. */ - if (++global == 1) - if (setcontext (&mctx) != 0) - { - puts ("setcontext failed"); - exit (1); - } - if (global != 2) - { - puts ("global not incremented twice"); - exit (1); - } - puts ("global OK"); - - pthread_attr_t at; - - if (pthread_attr_init (&at) != 0) - { - puts ("attr_init failed"); - return 1; - } - - if (pthread_attr_setstacksize (&at, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - for (n = 0; n < N; ++n) - if (pthread_create (&th[n], &at, tf, (void *) (long int) n) != 0) - { - puts ("create failed"); - exit (1); - } - - if (pthread_attr_destroy (&at) != 0) - { - puts ("attr_destroy failed"); - return 1; - } - - for (n = 0; n < N; ++n) - if (pthread_join (th[n], NULL) != 0) - { - puts ("join failed"); - exit (1); - } - - return failures; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-create-detached.c b/nptl/tst-create-detached.c deleted file mode 100644 index ea93e441c7..0000000000 --- a/nptl/tst-create-detached.c +++ /dev/null @@ -1,137 +0,0 @@ -/* Bug 20116: Test rapid creation of detached threads. - Copyright (C) 2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -/* The goal of the test is to trigger a failure if the parent touches - any part of the thread descriptor after the detached thread has - exited. We test this by creating many detached threads with large - stacks. The stacks quickly fill the the stack cache and subsequent - threads will start to cause the thread stacks to be immediately - unmapped to satisfy the stack cache max. With the stacks being - unmapped the parent's read of any part of the thread descriptor will - trigger a segfault. That segfault is what we are trying to cause, - since any segfault is a defect in the implementation. */ - -#include <pthread.h> -#include <stdio.h> -#include <errno.h> -#include <unistd.h> -#include <stdbool.h> -#include <sys/resource.h> -#include <support/xthread.h> - -/* Number of threads to create. */ -enum { threads_to_create = 100000 }; - -/* Number of threads which should spawn other threads. */ -enum { creator_threads = 2 }; - -/* Counter of threads created so far. This is incremented by all the - running creator threads. */ -static unsigned threads_created; - -/* Thread callback which does nothing, so that the thread exits - immediatedly. */ -static void * -do_nothing (void *arg) -{ - return NULL; -} - -/* Attribute indicating that the thread should be created in a detached - fashion. */ -static pthread_attr_t detached; - -/* Barrier to synchronize initialization. */ -static pthread_barrier_t barrier; - -static void * -creator_thread (void *arg) -{ - int ret; - xpthread_barrier_wait (&barrier); - - while (true) - { - pthread_t thr; - /* Thread creation will fail if the kernel does not free old - threads quickly enough, so we do not report errors. */ - ret = pthread_create (&thr, &detached, do_nothing, NULL); - if (ret == 0 && __atomic_add_fetch (&threads_created, 1, __ATOMIC_SEQ_CST) - >= threads_to_create) - break; - } - - return NULL; -} - -static int -do_test (void) -{ - /* Limit the size of the process, so that memory allocation will - fail without impacting the entire system. */ - { - struct rlimit limit; - if (getrlimit (RLIMIT_AS, &limit) != 0) - { - printf ("FAIL: getrlimit (RLIMIT_AS) failed: %m\n"); - return 1; - } - /* This limit, 800MB, is just a heuristic. Any value can be - picked. */ - long target = 800 * 1024 * 1024; - if (limit.rlim_cur == RLIM_INFINITY || limit.rlim_cur > target) - { - limit.rlim_cur = target; - if (setrlimit (RLIMIT_AS, &limit) != 0) - { - printf ("FAIL: setrlimit (RLIMIT_AS) failed: %m\n"); - return 1; - } - } - } - - xpthread_attr_init (&detached); - - xpthread_attr_setdetachstate (&detached, PTHREAD_CREATE_DETACHED); - - /* A large thread stack seems beneficial for reproducing a race - condition in detached thread creation. The goal is to reach the - limit of the runtime thread stack cache such that the detached - thread's stack is unmapped after exit and causes a segfault when - the parent reads the thread descriptor data stored on the the - unmapped stack. */ - xpthread_attr_setstacksize (&detached, 16 * 1024 * 1024); - - xpthread_barrier_init (&barrier, NULL, creator_threads); - - pthread_t threads[creator_threads]; - - for (int i = 0; i < creator_threads; ++i) - threads[i] = xpthread_create (NULL, creator_thread, NULL); - - for (int i = 0; i < creator_threads; ++i) - xpthread_join (threads[i]); - - xpthread_attr_destroy (&detached); - - xpthread_barrier_destroy (&barrier); - - return 0; -} - -#include <support/test-driver.c> diff --git a/nptl/tst-default-attr.c b/nptl/tst-default-attr.c deleted file mode 100644 index eff703ca23..0000000000 --- a/nptl/tst-default-attr.c +++ /dev/null @@ -1,385 +0,0 @@ -/* Verify that pthread_[gs]etattr_default_np work correctly. - - Copyright (C) 2013-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdint.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> -#include <stdbool.h> - -#define RETURN_IF_FAIL(f, ...) \ - ({ \ - int ret = f (__VA_ARGS__); \ - if (ret != 0) \ - { \ - printf ("%s:%d: %s returned %d (errno = %d)\n", __FILE__, __LINE__, \ - #f, ret, errno); \ - return ret; \ - } \ - }) - -static int (*verify_result) (pthread_attr_t *); -static size_t stacksize = 1024 * 1024; -static size_t guardsize; -static bool do_join = true; -static int running = 0; -static int detach_failed = 0; -static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; -static pthread_cond_t c = PTHREAD_COND_INITIALIZER; - -static void * -thr (void *unused __attribute__ ((unused))) -{ - pthread_attr_t attr; - int ret; - - memset (&attr, 0xab, sizeof attr); - /* To verify that the pthread_setattr_default_np worked. */ - if ((ret = pthread_getattr_default_np (&attr)) != 0) - { - printf ("pthread_getattr_default_np failed: %s\n", strerror (ret)); - goto out; - } - - if ((ret = (*verify_result) (&attr)) != 0) - goto out; - - memset (&attr, 0xab, sizeof attr); - /* To verify that the attributes actually got applied. */ - if ((ret = pthread_getattr_np (pthread_self (), &attr)) != 0) - { - printf ("pthread_getattr_default_np failed: %s\n", strerror (ret)); - goto out; - } - - ret = (*verify_result) (&attr); - -out: - if (!do_join) - { - pthread_mutex_lock (&m); - running--; - pthread_cond_signal (&c); - pthread_mutex_unlock (&m); - - detach_failed |= ret; - } - - return (void *) (uintptr_t) ret; -} - -static int -run_threads (const pthread_attr_t *attr) -{ - pthread_t t; - void *tret = NULL; - - RETURN_IF_FAIL (pthread_setattr_default_np, attr); - - /* Run twice to ensure that the attributes do not get overwritten in the - first run somehow. */ - for (int i = 0; i < 2; i++) - { - RETURN_IF_FAIL (pthread_create, &t, NULL, thr, NULL); - if (do_join) - RETURN_IF_FAIL (pthread_join, t, &tret); - else - { - pthread_mutex_lock (&m); - running++; - pthread_mutex_unlock (&m); - } - - if (tret != NULL) - { - puts ("Thread failed"); - return 1; - } - } - - /* Stay in sync for detached threads and get their status. */ - while (!do_join) - { - pthread_mutex_lock (&m); - if (running == 0) - { - pthread_mutex_unlock (&m); - break; - } - pthread_cond_wait (&c, &m); - pthread_mutex_unlock (&m); - } - - return 0; -} - -static int -verify_detach_result (pthread_attr_t *attr) -{ - int state; - - RETURN_IF_FAIL (pthread_attr_getdetachstate, attr, &state); - - if (state != PTHREAD_CREATE_DETACHED) - { - puts ("failed to set detach state"); - return 1; - } - - return 0; -} - -static int -do_detach_test (void) -{ - pthread_attr_t attr; - - do_join = false; - RETURN_IF_FAIL (pthread_attr_init, &attr); - RETURN_IF_FAIL (pthread_attr_setdetachstate, &attr, PTHREAD_CREATE_DETACHED); - - RETURN_IF_FAIL (run_threads, &attr); - return detach_failed; -} - -static int -verify_affinity_result (pthread_attr_t *attr) -{ - cpu_set_t cpuset; - - RETURN_IF_FAIL (pthread_attr_getaffinity_np, attr, sizeof (cpuset), &cpuset); - if (!CPU_ISSET (0, &cpuset)) - { - puts ("failed to set cpu affinity"); - return 1; - } - - return 0; -} - -static int -do_affinity_test (void) -{ - pthread_attr_t attr; - - RETURN_IF_FAIL (pthread_attr_init, &attr); - - /* Processor affinity. Like scheduling policy, this could fail if the user - does not have the necessary privileges. So we only spew a warning if - pthread_create fails with EPERM. A computer has at least one CPU. */ - cpu_set_t cpuset; - CPU_ZERO (&cpuset); - CPU_SET (0, &cpuset); - RETURN_IF_FAIL (pthread_attr_setaffinity_np, &attr, sizeof (cpuset), &cpuset); - - int ret = run_threads (&attr); - - if (ret == EPERM) - { - printf ("Skipping CPU Affinity test: %s\n", strerror (ret)); - return 0; - } - else if (ret != 0) - return ret; - - return 0; -} - -static int -verify_sched_result (pthread_attr_t *attr) -{ - int inherited, policy; - struct sched_param param; - - RETURN_IF_FAIL (pthread_attr_getinheritsched, attr, &inherited); - if (inherited != PTHREAD_EXPLICIT_SCHED) - { - puts ("failed to set EXPLICIT_SCHED (%d != %d)"); - return 1; - } - - RETURN_IF_FAIL (pthread_attr_getschedpolicy, attr, &policy); - if (policy != SCHED_RR) - { - printf ("failed to set SCHED_RR (%d != %d)\n", policy, SCHED_RR); - return 1; - } - - RETURN_IF_FAIL (pthread_attr_getschedparam, attr, ¶m); - if (param.sched_priority != 42) - { - printf ("failed to set sched_priority (%d != %d)\n", - param.sched_priority, 42); - return 1; - } - - return 0; -} - -static int -do_sched_test (void) -{ - pthread_attr_t attr; - - RETURN_IF_FAIL (pthread_attr_init, &attr); - - /* Scheduling policy. Note that we don't always test these since it's - possible that the user the tests run as don't have the appropriate - privileges. */ - RETURN_IF_FAIL (pthread_attr_setinheritsched, &attr, PTHREAD_EXPLICIT_SCHED); - RETURN_IF_FAIL (pthread_attr_setschedpolicy, &attr, SCHED_RR); - - struct sched_param param; - param.sched_priority = 42; - RETURN_IF_FAIL (pthread_attr_setschedparam, &attr, ¶m); - - int ret = run_threads (&attr); - - if (ret == EPERM) - { - printf ("Skipping Scheduler Attributes test: %s\n", strerror (ret)); - return 0; - } - else if (ret != 0) - return ret; - - return 0; -} - -static int -verify_guardsize_result (pthread_attr_t *attr) -{ - size_t guard; - - RETURN_IF_FAIL (pthread_attr_getguardsize, attr, &guard); - - if (guardsize != guard) - { - printf ("failed to set guardsize (%zu, %zu)\n", guardsize, guard); - return 1; - } - - return 0; -} - -static int -do_guardsize_test (void) -{ - long int pagesize = sysconf (_SC_PAGESIZE); - pthread_attr_t attr; - - if (pagesize < 0) - { - printf ("sysconf failed: %s\n", strerror (errno)); - return 1; - } - - RETURN_IF_FAIL (pthread_getattr_default_np, &attr); - - /* Increase default guardsize by a page. */ - RETURN_IF_FAIL (pthread_attr_getguardsize, &attr, &guardsize); - guardsize += pagesize; - RETURN_IF_FAIL (pthread_attr_setguardsize, &attr, guardsize); - RETURN_IF_FAIL (run_threads, &attr); - - return 0; -} - -static int -verify_stacksize_result (pthread_attr_t *attr) -{ - size_t stack; - - RETURN_IF_FAIL (pthread_attr_getstacksize, attr, &stack); - - if (stacksize != stack) - { - printf ("failed to set default stacksize (%zu, %zu)\n", stacksize, stack); - return 1; - } - - return 0; -} - -static int -do_stacksize_test (void) -{ - long int pagesize = sysconf (_SC_PAGESIZE); - pthread_attr_t attr; - - if (pagesize < 0) - { - printf ("sysconf failed: %s\n", strerror (errno)); - return 1; - } - - /* Perturb the size by a page so that we're not aligned on the 64K boundary. - pthread_create does this perturbation on x86 to avoid causing the 64k - aliasing conflict. We want to prevent pthread_create from doing that - since it is not consistent for all architectures. */ - stacksize += pagesize; - - RETURN_IF_FAIL (pthread_attr_init, &attr); - - /* Run twice to ensure that we don't give a false positive. */ - RETURN_IF_FAIL (pthread_attr_setstacksize, &attr, stacksize); - RETURN_IF_FAIL (run_threads, &attr); - stacksize *= 2; - RETURN_IF_FAIL (pthread_attr_setstacksize, &attr, stacksize); - RETURN_IF_FAIL (run_threads, &attr); - return 0; -} - -/* We test each attribute separately because sched and affinity tests may need - additional user privileges that may not be available during the test run. - Each attribute test is a set of two functions, viz. a function to set the - default attribute (do_foo_test) and another to verify its result - (verify_foo_result). Each test spawns a thread and checks (1) if the - attribute values were applied correctly and (2) if the change in the default - value reflected. */ -static int -do_test (void) -{ - puts ("stacksize test"); - verify_result = verify_stacksize_result; - RETURN_IF_FAIL (do_stacksize_test); - - puts ("guardsize test"); - verify_result = verify_guardsize_result; - RETURN_IF_FAIL (do_guardsize_test); - - puts ("sched test"); - verify_result = verify_sched_result; - RETURN_IF_FAIL (do_sched_test); - - puts ("affinity test"); - verify_result = verify_affinity_result; - RETURN_IF_FAIL (do_affinity_test); - - puts ("detach test"); - verify_result = verify_detach_result; - RETURN_IF_FAIL (do_detach_test); - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-detach1.c b/nptl/tst-detach1.c deleted file mode 100644 index 6e0e85fced..0000000000 --- a/nptl/tst-detach1.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static void * -tf (void *arg) -{ - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - if (pthread_create (&th, NULL, tf, (void *) pthread_self ()) != 0) - { - puts ("create failed"); - exit (1); - } - - /* Give the child a chance to finish. */ - sleep (1); - - if (pthread_detach (th) != 0) - { - puts ("detach failed"); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-dlsym1.c b/nptl/tst-dlsym1.c deleted file mode 100644 index 3744570c7f..0000000000 --- a/nptl/tst-dlsym1.c +++ /dev/null @@ -1,66 +0,0 @@ -/* Test case by Hui Huang <hui.huang@sun.com>. */ -#include <dlfcn.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - - -static void * -start_routine (void *args) -{ - int i; - void **addrs = (void **) args; - for (i = 0; i < 10000; ++i) - addrs[i % 1024] = dlsym (NULL, "does_not_exist"); - - return addrs; -} - - -static int -do_test (void) -{ - pthread_t tid1, tid2, tid3; - - void *addrs1[1024]; - void *addrs2[1024]; - void *addrs3[1024]; - - if (pthread_create (&tid1, NULL, start_routine, addrs1) != 0) - { - puts ("1st create failed"); - exit (1); - } - if (pthread_create (&tid2, NULL, start_routine, addrs2) != 0) - { - puts ("2nd create failed"); - exit (1); - } - if (pthread_create (&tid3, NULL, start_routine, addrs3) != 0) - { - puts ("3rd create failed"); - exit (1); - } - - if (pthread_join (tid1, NULL) != 0) - { - puts ("1st join failed"); - exit (1); - } - if (pthread_join (tid2, NULL) != 0) - { - puts ("2nd join failed"); - exit (1); - } - if (pthread_join (tid3, NULL) != 0) - { - puts ("2rd join failed"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-eintr1.c b/nptl/tst-eintr1.c deleted file mode 100644 index 761f8901d8..0000000000 --- a/nptl/tst-eintr1.c +++ /dev/null @@ -1,104 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -#include "eintr.c" - - -static void * -tf2 (void *arg) -{ - return arg; -} - - -static void * -tf1 (void *arg) -{ - while (1) - { - pthread_t th; - - int e = pthread_create (&th, NULL, tf2, NULL); - if (e != 0) - { - if (e == EINTR) - { - puts ("pthread_create returned EINTR"); - exit (1); - } - - char buf[100]; - printf ("tf1: pthread_create failed: %s\n", - strerror_r (e, buf, sizeof (buf))); - exit (1); - } - - e = pthread_join (th, NULL); - if (e != 0) - { - if (e == EINTR) - { - puts ("pthread_join returned EINTR"); - exit (1); - } - - char buf[100]; - printf ("tf1: pthread_join failed: %s\n", - strerror_r (e, buf, sizeof (buf))); - exit (1); - } - } -} - - -static int -do_test (void) -{ - setup_eintr (SIGUSR1, NULL); - - int i; - for (i = 0; i < 10; ++i) - { - pthread_t th; - int e = pthread_create (&th, NULL, tf1, NULL); - if (e != 0) - { - char buf[100]; - printf ("main: pthread_create failed: %s\n", - strerror_r (e, buf, sizeof (buf))); - exit (1); - } - } - - delayed_exit (3); - /* This call must never return. */ - (void) tf1 (NULL); - return 1; -} diff --git a/nptl/tst-eintr2.c b/nptl/tst-eintr2.c deleted file mode 100644 index af6f2ba026..0000000000 --- a/nptl/tst-eintr2.c +++ /dev/null @@ -1,118 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/time.h> - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -#include "eintr.c" - - -static pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER; -static pthread_mutex_t m2 = PTHREAD_MUTEX_INITIALIZER; - - -static void * -tf1 (void *arg) -{ - struct timespec ts; - struct timeval tv; - - gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_sec += 10000; - - /* This call must never return. */ - int e = pthread_mutex_timedlock (&m1, &ts); - char buf[100]; - printf ("tf1: mutex_timedlock returned: %s\n", - strerror_r (e, buf, sizeof (buf))); - - exit (1); -} - - -static void * -tf2 (void *arg) -{ - while (1) - { - int e = pthread_mutex_lock (&m2); - if (e != 0) - { - puts ("tf2: mutex_lock failed"); - exit (1); - } - e = pthread_mutex_unlock (&m2); - if (e != 0) - { - puts ("tf2: mutex_unlock failed"); - exit (1); - } - struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 }; - nanosleep (&ts, NULL); - } -} - - -static int -do_test (void) -{ - if (pthread_mutex_lock (&m1) != 0) - { - puts ("mutex_lock failed"); - exit (1); - } - - setup_eintr (SIGUSR1, NULL); - - pthread_t th; - char buf[100]; - int e = pthread_create (&th, NULL, tf1, NULL); - if (e != 0) - { - printf ("main: 1st pthread_create failed: %s\n", - strerror_r (e, buf, sizeof (buf))); - exit (1); - } - - e = pthread_create (&th, NULL, tf2, NULL); - if (e != 0) - { - printf ("main: 2nd pthread_create failed: %s\n", - strerror_r (e, buf, sizeof (buf))); - exit (1); - } - - delayed_exit (3); - /* This call must never return. */ - e = pthread_mutex_lock (&m1); - printf ("main: mutex_lock returned: %s\n", - strerror_r (e, buf, sizeof (buf))); - - return 1; -} diff --git a/nptl/tst-eintr3.c b/nptl/tst-eintr3.c deleted file mode 100644 index f231f745b3..0000000000 --- a/nptl/tst-eintr3.c +++ /dev/null @@ -1,69 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -#include "eintr.c" - - -static void * -tf (void *arg) -{ - pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; - pthread_mutex_lock (&m); - /* This call must not return. */ - pthread_mutex_lock (&m); - - puts ("tf: mutex_lock returned"); - exit (1); -} - - -static int -do_test (void) -{ - pthread_t self = pthread_self (); - - setup_eintr (SIGUSR1, &self); - - pthread_t th; - char buf[100]; - int e = pthread_create (&th, NULL, tf, NULL); - if (e != 0) - { - printf ("main: pthread_create failed: %s\n", - strerror_r (e, buf, sizeof (buf))); - exit (1); - } - - delayed_exit (1); - /* This call must never return. */ - xpthread_join (th); - puts ("error: pthread_join returned"); - return 1; -} diff --git a/nptl/tst-eintr4.c b/nptl/tst-eintr4.c deleted file mode 100644 index f2ccecc098..0000000000 --- a/nptl/tst-eintr4.c +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -#include "eintr.c" - - -static int -do_test (void) -{ - pthread_t self = pthread_self (); - - setup_eintr (SIGUSR1, &self); - - pthread_barrier_t b; - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - delayed_exit (1); - /* This call must never return. */ - xpthread_barrier_wait (&b); - puts ("error: pthread_barrier_wait returned"); - return 1; -} diff --git a/nptl/tst-eintr5.c b/nptl/tst-eintr5.c deleted file mode 100644 index 616dd71bf9..0000000000 --- a/nptl/tst-eintr5.c +++ /dev/null @@ -1,79 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/time.h> - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -#include "eintr.c" - - -static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; -static pthread_cond_t c = PTHREAD_COND_INITIALIZER; - - -static void * -tf (void *arg) -{ - struct timespec ts; - struct timeval tv; - - gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_sec += 10000; - - /* This call must never return. */ - int e = pthread_cond_timedwait (&c, &m, &ts); - char buf[100]; - printf ("tf: cond_timedwait returned: %s\n", - strerror_r (e, buf, sizeof (buf))); - - exit (1); -} - - -static int -do_test (void) -{ - setup_eintr (SIGUSR1, NULL); - - pthread_t th; - char buf[100]; - int e = pthread_create (&th, NULL, tf, NULL); - if (e != 0) - { - printf ("main: pthread_create failed: %s\n", - strerror_r (e, buf, sizeof (buf))); - exit (1); - } - - delayed_exit (3); - /* This call must never return. */ - xpthread_cond_wait (&c, &m); - puts ("error: pthread_cond_wait returned"); - return 1; -} diff --git a/nptl/tst-exec1.c b/nptl/tst-exec1.c deleted file mode 100644 index 5143185d49..0000000000 --- a/nptl/tst-exec1.c +++ /dev/null @@ -1,159 +0,0 @@ -/* Simple exec test, only a thread in the parent. - Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <paths.h> -#include <pthread.h> -#include <signal.h> -#include <spawn.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/wait.h> - - -static void * -tf (void *arg) -{ - pthread_t th = (pthread_t) arg; - - if (pthread_join (th, NULL) == 0) - { - puts ("thread in parent joined!?"); - exit (1); - } - - puts ("join in thread in parent returned!?"); - exit (1); -} - - -static int -do_test (void) -{ - int fd[2]; - if (pipe (fd) != 0) - { - puts ("pipe failed"); - exit (1); - } - - /* Not interested in knowing when the pipe is closed. */ - if (sigignore (SIGPIPE) != 0) - { - puts ("sigignore failed"); - exit (1); - } - - posix_spawn_file_actions_t a; - if (posix_spawn_file_actions_init (&a) != 0) - { - puts ("spawn_file_actions_init failed"); - exit (1); - } - - if (posix_spawn_file_actions_adddup2 (&a, fd[1], STDOUT_FILENO) != 0) - { - puts ("spawn_file_actions_adddup2 failed"); - exit (1); - } - - if (posix_spawn_file_actions_addclose (&a, fd[0]) != 0) - { - puts ("spawn_file_actions_addclose"); - exit (1); - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, (void *) pthread_self ()) != 0) - { - puts ("create failed"); - exit (1); - } - - pid_t pid; - char *argv[] = { (char *) _PATH_BSHELL, (char *) "-c", (char *) "echo $$", - NULL }; - if (posix_spawn (&pid, _PATH_BSHELL, &a, NULL, argv, NULL) != 0) - { - puts ("spawn failed"); - exit (1); - } - - close (fd[1]); - - char buf[200]; - ssize_t n; - bool seen_pid = false; - while (TEMP_FAILURE_RETRY ((n = read (fd[0], buf, sizeof (buf)))) > 0) - { - /* We only expect to read the PID. */ - char *endp; - long int rpid = strtol (buf, &endp, 10); - - if (*endp != '\n') - { - printf ("didn't parse whole line: \"%s\"\n", buf); - exit (1); - } - if (endp == buf) - { - puts ("read empty line"); - exit (1); - } - - if (rpid != pid) - { - printf ("found \"%s\", expected PID %ld\n", buf, (long int) pid); - exit (1); - } - - if (seen_pid) - { - puts ("found more than one PID line"); - exit (1); - } - - seen_pid = true; - } - - close (fd[0]); - - int status; - int err = waitpid (pid, &status, 0); - if (err != pid) - { - puts ("waitpid failed"); - exit (1); - } - - if (!seen_pid) - { - puts ("didn't get PID"); - exit (1); - } - - puts ("read correct PID"); - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-exec2.c b/nptl/tst-exec2.c deleted file mode 100644 index ffeaef8c74..0000000000 --- a/nptl/tst-exec2.c +++ /dev/null @@ -1,154 +0,0 @@ -/* Thread with running thread calls exec. - Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <paths.h> -#include <pthread.h> -#include <signal.h> -#include <spawn.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/wait.h> - - -static void * -tf (void *arg) -{ - pthread_t th = (pthread_t) arg; - - if (pthread_join (th, NULL) == 0) - { - puts ("thread in parent joined!?"); - exit (1); - } - - puts ("join in thread in parent returned!?"); - exit (1); -} - - -static int -do_test (void) -{ - int fd[2]; - if (pipe (fd) != 0) - { - puts ("pipe failed"); - exit (1); - } - - /* Not interested in knowing when the pipe is closed. */ - if (sigignore (SIGPIPE) != 0) - { - puts ("sigignore failed"); - exit (1); - } - - pid_t pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - exit (1); - } - - if (pid == 0) - { - /* Use the fd for stdout. This is kind of ugly because it - substitutes the fd of stdout but we know what we are doing - here... */ - if (dup2 (fd[1], STDOUT_FILENO) != STDOUT_FILENO) - { - puts ("dup2 failed"); - exit (1); - } - - close (fd[0]); - - pthread_t th; - if (pthread_create (&th, NULL, tf, (void *) pthread_self ()) != 0) - { - puts ("create failed"); - exit (1); - } - - execl (_PATH_BSHELL, _PATH_BSHELL, "-c", "echo $$", NULL); - - puts ("execl failed"); - exit (1); - } - - close (fd[1]); - - char buf[200]; - ssize_t n; - bool seen_pid = false; - while (TEMP_FAILURE_RETRY ((n = read (fd[0], buf, sizeof (buf)))) > 0) - { - /* We only expect to read the PID. */ - char *endp; - long int rpid = strtol (buf, &endp, 10); - - if (*endp != '\n') - { - printf ("didn't parse whole line: \"%s\"\n", buf); - exit (1); - } - if (endp == buf) - { - puts ("read empty line"); - exit (1); - } - - if (rpid != pid) - { - printf ("found \"%s\", expected PID %ld\n", buf, (long int) pid); - exit (1); - } - - if (seen_pid) - { - puts ("found more than one PID line"); - exit (1); - } - seen_pid = true; - } - - close (fd[0]); - - int status; - int err = waitpid (pid, &status, 0); - if (err != pid) - { - puts ("waitpid failed"); - exit (1); - } - - if (!seen_pid) - { - puts ("didn't get PID"); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-exec3.c b/nptl/tst-exec3.c deleted file mode 100644 index 814c79e596..0000000000 --- a/nptl/tst-exec3.c +++ /dev/null @@ -1,152 +0,0 @@ -/* Thread calls exec. - Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <paths.h> -#include <pthread.h> -#include <signal.h> -#include <spawn.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/wait.h> - - -static void * -tf (void *arg) -{ - execl (_PATH_BSHELL, _PATH_BSHELL, "-c", "echo $$", NULL); - - puts ("execl failed"); - exit (1); -} - - -static int -do_test (void) -{ - int fd[2]; - if (pipe (fd) != 0) - { - puts ("pipe failed"); - exit (1); - } - - /* Not interested in knowing when the pipe is closed. */ - if (sigignore (SIGPIPE) != 0) - { - puts ("sigignore failed"); - exit (1); - } - - pid_t pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - exit (1); - } - - if (pid == 0) - { - /* Use the fd for stdout. This is kind of ugly because it - substitutes the fd of stdout but we know what we are doing - here... */ - if (dup2 (fd[1], STDOUT_FILENO) != STDOUT_FILENO) - { - puts ("dup2 failed"); - exit (1); - } - - close (fd[0]); - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - if (pthread_join (th, NULL) == 0) - { - puts ("join succeeded!?"); - exit (1); - } - - puts ("join returned!?"); - exit (1); - } - - close (fd[1]); - - char buf[200]; - ssize_t n; - bool seen_pid = false; - while (TEMP_FAILURE_RETRY ((n = read (fd[0], buf, sizeof (buf)))) > 0) - { - /* We only expect to read the PID. */ - char *endp; - long int rpid = strtol (buf, &endp, 10); - - if (*endp != '\n') - { - printf ("didn't parse whole line: \"%s\"\n", buf); - exit (1); - } - if (endp == buf) - { - puts ("read empty line"); - exit (1); - } - - if (rpid != pid) - { - printf ("found \"%s\", expected PID %ld\n", buf, (long int) pid); - exit (1); - } - - if (seen_pid) - { - puts ("found more than one PID line"); - exit (1); - } - seen_pid = true; - } - - close (fd[0]); - - int status; - int err = waitpid (pid, &status, 0); - if (err != pid) - { - puts ("waitpid failed"); - exit (1); - } - - if (!seen_pid) - { - puts ("didn't get PID"); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-exec4.c b/nptl/tst-exec4.c deleted file mode 100644 index 38725a2c6a..0000000000 --- a/nptl/tst-exec4.c +++ /dev/null @@ -1,115 +0,0 @@ -/* Signal handler and mask set in thread which calls exec. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static void * -tf (void *arg) -{ - /* Ignore SIGUSR1 and block SIGUSR2. */ - if (sigignore (SIGUSR1) != 0) - { - puts ("sigignore failed"); - exit (1); - } - - sigset_t ss; - sigemptyset (&ss); - sigaddset (&ss, SIGUSR2); - if (pthread_sigmask (SIG_BLOCK, &ss, NULL) != 0) - { - puts ("1st run: sigmask failed"); - exit (1); - } - - char **oldargv = (char **) arg; - size_t n = 1; - while (oldargv[n] != NULL) - ++n; - - char **argv = (char **) alloca ((n + 1) * sizeof (char *)); - for (n = 0; oldargv[n + 1] != NULL; ++n) - argv[n] = oldargv[n + 1]; - argv[n++] = (char *) "--direct"; - argv[n] = NULL; - - execv (argv[0], argv); - - puts ("execv failed"); - - exit (1); -} - - -static int -do_test (int argc, char *argv[]) -{ - if (argc == 1) - { - /* This is the second call. Perform the test. */ - struct sigaction sa; - - if (sigaction (SIGUSR1, NULL, &sa) != 0) - { - puts ("2nd run: sigaction failed"); - return 1; - } - if (sa.sa_handler != SIG_IGN) - { - puts ("SIGUSR1 not ignored"); - return 1; - } - - sigset_t ss; - if (pthread_sigmask (SIG_SETMASK, NULL, &ss) != 0) - { - puts ("2nd run: sigmask failed"); - return 1; - } - if (! sigismember (&ss, SIGUSR2)) - { - puts ("SIGUSR2 not blocked"); - return 1; - } - - return 0; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, argv) != 0) - { - puts ("create failed"); - exit (1); - } - - /* This call should never return. */ - pthread_join (th, NULL); - - puts ("join returned"); - - return 1; -} - -#define TEST_FUNCTION do_test (argc, argv) -#include "../test-skeleton.c" diff --git a/nptl/tst-exec5.c b/nptl/tst-exec5.c deleted file mode 100644 index e93e58d8b0..0000000000 --- a/nptl/tst-exec5.c +++ /dev/null @@ -1,176 +0,0 @@ -/* Check if posix_spawn does not act as a cancellation entrypoint. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <paths.h> -#include <pthread.h> -#include <signal.h> -#include <spawn.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/wait.h> - -static int do_test (void); -#define TEST_FUNCTION do_test () -#include <test-skeleton.c> - -static pthread_barrier_t b; - -static pid_t pid; -static int pipefd[2]; - -static void * -tf (void *arg) -{ - xpthread_barrier_wait (&b); - - posix_spawn_file_actions_t a; - if (posix_spawn_file_actions_init (&a) != 0) - { - puts ("error: spawn_file_actions_init failed"); - exit (1); - } - - if (posix_spawn_file_actions_adddup2 (&a, pipefd[1], STDOUT_FILENO) != 0) - { - puts ("error: spawn_file_actions_adddup2 failed"); - exit (1); - } - - if (posix_spawn_file_actions_addclose (&a, pipefd[0]) != 0) - { - puts ("error: spawn_file_actions_addclose"); - exit (1); - } - - char *argv[] = { (char *) _PATH_BSHELL, (char *) "-c", (char *) "echo $$", - NULL }; - if (posix_spawn (&pid, _PATH_BSHELL, &a, NULL, argv, NULL) != 0) - { - puts ("error: spawn failed"); - exit (1); - } - - return NULL; -} - - -static int -do_test (void) -{ - /* The test basically pipe a 'echo $$' created by a thread with a - cancellation pending. It then checks if the thread is not cancelled, - the process is created and if the output is the expected one. */ - - if (pipe (pipefd) != 0) - { - puts ("error: pipe failed"); - exit (1); - } - - /* Not interested in knowing when the pipe is closed. */ - if (sigignore (SIGPIPE) != 0) - { - puts ("error: sigignore failed"); - exit (1); - } - - /* To synchronize with the thread. */ - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("error: pthread_barrier_init failed"); - exit (1); - } - - pthread_t th = xpthread_create (NULL, &tf, NULL); - - if (pthread_cancel (th) != 0) - { - puts ("error: pthread_cancel failed"); - return 1; - } - - xpthread_barrier_wait (&b); - - if (xpthread_join (th) == PTHREAD_CANCELED) - { - puts ("error: thread cancelled"); - exit (1); - } - - close (pipefd[1]); - - /* The global 'pid' should be set by thread posix_spawn calling. Check - below if it was executed correctly and with expected output. */ - - char buf[64]; - ssize_t n; - bool seen_pid = false; - while (TEMP_FAILURE_RETRY ((n = read (pipefd[0], buf, sizeof (buf)))) > 0) - { - /* We only expect to read the PID. */ - char *endp; - long int rpid = strtol (buf, &endp, 10); - - if (*endp != '\n') - { - printf ("error: didn't parse whole line: \"%s\"\n", buf); - exit (1); - } - if (endp == buf) - { - puts ("error: read empty line"); - exit (1); - } - - if (rpid != pid) - { - printf ("error: found \"%s\", expected PID %ld\n", buf, - (long int) pid); - exit (1); - } - - if (seen_pid) - { - puts ("error: found more than one PID line"); - exit (1); - } - - seen_pid = true; - } - - close (pipefd[0]); - - int status; - int err = waitpid (pid, &status, 0); - if (err != pid) - { - puts ("errnor: waitpid failed"); - exit (1); - } - - if (!seen_pid) - { - puts ("error: didn't get PID"); - exit (1); - } - - return 0; -} diff --git a/nptl/tst-execstack-mod.c b/nptl/tst-execstack-mod.c deleted file mode 100644 index 5b9812c258..0000000000 --- a/nptl/tst-execstack-mod.c +++ /dev/null @@ -1 +0,0 @@ -#include "../elf/tst-execstack-mod.c" diff --git a/nptl/tst-execstack.c b/nptl/tst-execstack.c deleted file mode 100644 index 6e45c1a5e6..0000000000 --- a/nptl/tst-execstack.c +++ /dev/null @@ -1,2 +0,0 @@ -#define USE_PTHREADS 1 -#include "../elf/tst-execstack.c" diff --git a/nptl/tst-exit1.c b/nptl/tst-exit1.c deleted file mode 100644 index 1685ccd603..0000000000 --- a/nptl/tst-exit1.c +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* NOTE: this tests functionality beyond POSIX. POSIX does not allow - exit to be called more than once. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - -static pthread_barrier_t b; - - -static void * -tf (void *arg) -{ - int r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - exit (0); -} - - -static int -do_test (void) -{ - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - int r = pthread_barrier_wait (&b); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - /* Do nothing. */ - if (pthread_join (th, NULL) == 0) - { - puts ("join succeeded!?"); - exit (1); - } - - puts ("join returned!?"); - exit (1); -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-exit2.c b/nptl/tst-exit2.c deleted file mode 100644 index 0b7a2caf6a..0000000000 --- a/nptl/tst-exit2.c +++ /dev/null @@ -1,42 +0,0 @@ -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static void * -tf (void *arg) -{ - while (1) - sleep (100); - - /* NOTREACHED */ - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - - int e = pthread_create (&th, NULL, tf, NULL); - if (e != 0) - { - printf ("create failed: %s\n", strerror (e)); - return 1; - } - - delayed_exit (1); - - /* Terminate only this thread. */ - pthread_exit (NULL); - - /* NOTREACHED */ - return 1; -} diff --git a/nptl/tst-exit3.c b/nptl/tst-exit3.c deleted file mode 100644 index 9481ed9b42..0000000000 --- a/nptl/tst-exit3.c +++ /dev/null @@ -1,83 +0,0 @@ -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static pthread_barrier_t b; - - -static void * -tf2 (void *arg) -{ - while (1) - sleep (100); - - /* NOTREACHED */ - return NULL; -} - - -static void * -tf (void *arg) -{ - pthread_t th; - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - e = pthread_create (&th, NULL, tf2, NULL); - if (e != 0) - { - printf ("create failed: %s\n", strerror (e)); - exit (1); - } - - /* Terminate only this thread. */ - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th; - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - int e = pthread_create (&th, NULL, tf, NULL); - if (e != 0) - { - printf ("create failed: %s\n", strerror (e)); - exit (1); - } - - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - delayed_exit (3); - - /* Terminate only this thread. */ - pthread_exit (NULL); - - /* NOTREACHED */ - return 1; -} diff --git a/nptl/tst-fini1.c b/nptl/tst-fini1.c deleted file mode 100644 index b1e13e285f..0000000000 --- a/nptl/tst-fini1.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (C) 2004-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <unistd.h> - -extern void m (void); - -int -main (void) -{ - alarm (5); - - m (); - - /* The destructor is supposed to run now. Make sure that if it is - not we will notice it by using 42 as the exit code. In case the - destructor is run it will terminate with status zero. */ - return 42; -} diff --git a/nptl/tst-fini1mod.c b/nptl/tst-fini1mod.c deleted file mode 100644 index 1206ac5209..0000000000 --- a/nptl/tst-fini1mod.c +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright (C) 2004-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static void * -tf (void *arg) -{ - int fds[2]; - if (pipe (fds) != 0) - { - puts ("pipe failed"); - exit (1); - } - - char buf[10]; - read (fds[0], buf, sizeof (buf)); - - puts ("read returned"); - exit (1); -} - -static pthread_t th; - -static void -__attribute ((destructor)) -dest (void) -{ - if (pthread_cancel (th) != 0) - { - puts ("cancel failed"); - _exit (1); - } - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("join failed"); - _exit (1); - } - /* Exit successfully. */ - _exit (0); -} - -void -m (void) -{ - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - _exit (1); - } -} diff --git a/nptl/tst-flock1.c b/nptl/tst-flock1.c deleted file mode 100644 index 6c80d05575..0000000000 --- a/nptl/tst-flock1.c +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/file.h> - - -static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; - -static int fd; - - -static void * -tf (void *arg) -{ - if (flock (fd, LOCK_SH | LOCK_NB) != 0) - { - puts ("second flock failed"); - exit (1); - } - - pthread_mutex_unlock (&lock); - - return NULL; -} - - -static int -do_test (void) -{ - char tmp[] = "/tmp/tst-flock1-XXXXXX"; - - fd = mkstemp (tmp); - if (fd == -1) - { - puts ("mkstemp failed"); - exit (1); - } - - unlink (tmp); - - write (fd, "foobar xyzzy", 12); - - if (flock (fd, LOCK_EX | LOCK_NB) != 0) - { - puts ("first flock failed"); - exit (1); - } - - pthread_mutex_lock (&lock); - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("pthread_create failed"); - exit (1); - } - - pthread_mutex_lock (&lock); - - void *result; - if (pthread_join (th, &result) != 0) - { - puts ("pthread_join failed"); - exit (1); - } - - close (fd); - - return result != NULL; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-flock2.c b/nptl/tst-flock2.c deleted file mode 100644 index fec815522d..0000000000 --- a/nptl/tst-flock2.c +++ /dev/null @@ -1,259 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/file.h> -#include <sys/mman.h> -#include <sys/wait.h> - - -static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; -static pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER; -static int fd; - - -static void * -tf (void *arg) -{ - struct flock fl = - { - .l_type = F_WRLCK, - .l_start = 0, - .l_whence = SEEK_SET, - .l_len = 10 - }; - if (TEMP_FAILURE_RETRY (fcntl (fd, F_SETLKW, &fl)) != 0) - { - puts ("fourth fcntl failed"); - exit (1); - } - - pthread_mutex_unlock (&lock); - - pthread_mutex_lock (&lock2); - - return NULL; -} - - -static int -do_test (void) -{ - char tmp[] = "/tmp/tst-flock2-XXXXXX"; - - fd = mkstemp (tmp); - if (fd == -1) - { - puts ("mkstemp failed"); - return 1; - } - - unlink (tmp); - - int i; - for (i = 0; i < 20; ++i) - write (fd, "foobar xyzzy", 12); - - pthread_barrier_t *b; - b = mmap (NULL, sizeof (pthread_barrier_t), PROT_READ | PROT_WRITE, - MAP_SHARED, fd, 0); - if (b == MAP_FAILED) - { - puts ("mmap failed"); - return 1; - } - - pthread_barrierattr_t ba; - if (pthread_barrierattr_init (&ba) != 0) - { - puts ("barrierattr_init failed"); - return 1; - } - - if (pthread_barrierattr_setpshared (&ba, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("barrierattr_setpshared failed"); - return 1; - } - - if (pthread_barrier_init (b, &ba, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - if (pthread_barrierattr_destroy (&ba) != 0) - { - puts ("barrierattr_destroy failed"); - return 1; - } - - struct flock fl = - { - .l_type = F_WRLCK, - .l_start = 0, - .l_whence = SEEK_SET, - .l_len = 10 - }; - if (TEMP_FAILURE_RETRY (fcntl (fd, F_SETLKW, &fl)) != 0) - { - puts ("first fcntl failed"); - return 1; - } - - pid_t pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - return 1; - } - - if (pid == 0) - { - /* Make sure the child does not stay around indefinitely. */ - alarm (10); - - /* Try to get the lock. */ - if (TEMP_FAILURE_RETRY (fcntl (fd, F_SETLK, &fl)) == 0) - { - puts ("child: second flock succeeded"); - return 1; - } - } - - pthread_barrier_wait (b); - - if (pid != 0) - { - fl.l_type = F_UNLCK; - if (TEMP_FAILURE_RETRY (fcntl (fd, F_SETLKW, &fl)) != 0) - { - puts ("third fcntl failed"); - return 1; - } - } - - pthread_barrier_wait (b); - - pthread_t th; - if (pid == 0) - { - if (pthread_mutex_lock (&lock) != 0) - { - puts ("1st locking of lock failed"); - return 1; - } - - if (pthread_mutex_lock (&lock2) != 0) - { - puts ("1st locking of lock2 failed"); - return 1; - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("pthread_create failed"); - return 1; - } - - if (pthread_mutex_lock (&lock) != 0) - { - puts ("2nd locking of lock failed"); - return 1; - } - - puts ("child locked file"); - } - - pthread_barrier_wait (b); - - if (pid != 0) - { - fl.l_type = F_WRLCK; - if (TEMP_FAILURE_RETRY (fcntl (fd, F_SETLK, &fl)) == 0) - { - puts ("fifth fcntl succeeded"); - return 1; - } - - puts ("file locked by child"); - } - - pthread_barrier_wait (b); - - if (pid == 0) - { - if (pthread_mutex_unlock (&lock2) != 0) - { - puts ("unlock of lock2 failed"); - return 1; - } - - if (pthread_join (th, NULL) != 0) - { - puts ("join failed"); - return 1; - } - - puts ("child's thread terminated"); - } - - pthread_barrier_wait (b); - - if (pid != 0) - { - fl.l_type = F_WRLCK; - if (TEMP_FAILURE_RETRY (fcntl (fd, F_SETLK, &fl)) == 0) - { - puts ("fifth fcntl succeeded"); - return 1; - } - - puts ("file still locked"); - } - - pthread_barrier_wait (b); - - if (pid == 0) - { - _exit (0); - } - - int status; - if (TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)) != pid) - { - puts ("waitpid failed"); - return 1; - } - puts ("child terminated"); - - if (TEMP_FAILURE_RETRY (fcntl (fd, F_SETLKW, &fl)) != 0) - { - puts ("sixth fcntl failed"); - return 1; - } - - return status; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-fork1.c b/nptl/tst-fork1.c deleted file mode 100644 index 86c0f555ac..0000000000 --- a/nptl/tst-fork1.c +++ /dev/null @@ -1,121 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Roland McGrath <roland@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/wait.h> - -static void * -thread_function (void * arg) -{ - int i = (intptr_t) arg; - int status; - pid_t pid; - pid_t pid2; - - pid = fork (); - switch (pid) - { - case 0: - printf ("%ld for %d\n", (long int) getpid (), i); - struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 * i }; - nanosleep (&ts, NULL); - _exit (i); - break; - case -1: - printf ("fork: %m\n"); - return (void *) 1l; - break; - } - - pid2 = TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)); - if (pid2 != pid) - { - printf ("waitpid returned %ld, expected %ld\n", - (long int) pid2, (long int) pid); - return (void *) 1l; - } - - printf ("%ld with %d, expected %d\n", - (long int) pid, WEXITSTATUS (status), i); - - return WEXITSTATUS (status) == i ? NULL : (void *) 1l; -} - -#define N 5 -static const int t[N] = { 7, 6, 5, 4, 3 }; - -static int -do_test (void) -{ - pthread_t th[N]; - int i; - int result = 0; - pthread_attr_t at; - - if (pthread_attr_init (&at) != 0) - { - puts ("attr_init failed"); - return 1; - } - - if (pthread_attr_setstacksize (&at, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - for (i = 0; i < N; ++i) - if (pthread_create (&th[i], NULL, thread_function, - (void *) (intptr_t) t[i]) != 0) - { - printf ("creation of thread %d failed\n", i); - exit (1); - } - - if (pthread_attr_destroy (&at) != 0) - { - puts ("attr_destroy failed"); - return 1; - } - - for (i = 0; i < N; ++i) - { - void *v; - if (pthread_join (th[i], &v) != 0) - { - printf ("join of thread %d failed\n", i); - result = 1; - } - else if (v != NULL) - { - printf ("join %d successful, but child failed\n", i); - result = 1; - } - else - printf ("join %d successful\n", i); - } - - return result; -} - -#include <support/test-driver.c> diff --git a/nptl/tst-fork2.c b/nptl/tst-fork2.c deleted file mode 100644 index 6342502247..0000000000 --- a/nptl/tst-fork2.c +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Roland McGrath <roland@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/wait.h> - - -static pid_t initial_pid; - - -static void * -tf (void *arg) -{ - if (getppid () != initial_pid) - { - printf ("getppid in thread returned %ld, expected %ld\n", - (long int) getppid (), (long int) initial_pid); - return (void *) -1; - } - - return NULL; -} - - -int -main (void) -{ - initial_pid = getpid (); - - pid_t child = fork (); - if (child == 0) - { - if (getppid () != initial_pid) - { - printf ("first getppid returned %ld, expected %ld\n", - (long int) getppid (), (long int) initial_pid); - exit (1); - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("pthread_create failed"); - exit (1); - } - - void *result; - if (pthread_join (th, &result) != 0) - { - puts ("pthread_join failed"); - exit (1); - } - - exit (result == NULL ? 0 : 1); - } - else if (child == -1) - { - puts ("initial fork failed"); - return 1; - } - - int status; - if (TEMP_FAILURE_RETRY (waitpid (child, &status, 0)) != child) - { - printf ("waitpid failed: %m\n"); - return 1; - } - - return status; -} diff --git a/nptl/tst-fork3.c b/nptl/tst-fork3.c deleted file mode 100644 index 33d93f2a04..0000000000 --- a/nptl/tst-fork3.c +++ /dev/null @@ -1,108 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Roland McGrath <roland@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/wait.h> - - -static pid_t initial_pid; - - -static void * -tf2 (void *arg) -{ - if (getppid () != initial_pid) - { - printf ("getppid in thread returned %ld, expected %ld\n", - (long int) getppid (), (long int) initial_pid); - return (void *) -1; - } - - return NULL; -} - - -static void * -tf1 (void *arg) -{ - pid_t child = fork (); - if (child == 0) - { - if (getppid () != initial_pid) - { - printf ("first getppid returned %ld, expected %ld\n", - (long int) getppid (), (long int) initial_pid); - exit (1); - } - - pthread_t th2; - if (pthread_create (&th2, NULL, tf2, NULL) != 0) - { - puts ("child: pthread_create failed"); - exit (1); - } - - void *result; - if (pthread_join (th2, &result) != 0) - { - puts ("pthread_join failed"); - exit (1); - } - - exit (result == NULL ? 0 : 1); - } - else if (child == -1) - { - puts ("initial fork failed"); - exit (1); - } - - int status; - if (TEMP_FAILURE_RETRY (waitpid (child, &status, 0)) != child) - { - printf ("waitpid failed: %m\n"); - exit (1); - } - - exit (status); -} - - -static int -do_test (void) -{ - initial_pid = getpid (); - - pthread_t th1; - if (pthread_create (&th1, NULL, tf1, NULL) != 0) - { - puts ("parent: pthread_create failed"); - exit (1); - } - - /* This call should never return. */ - pthread_join (th1, NULL); - - return 1; -} - -#include <support/test-driver.c> diff --git a/nptl/tst-fork4.c b/nptl/tst-fork4.c deleted file mode 100644 index 34a571da64..0000000000 --- a/nptl/tst-fork4.c +++ /dev/null @@ -1,64 +0,0 @@ -/* Test of fork updating child universe's pthread structures. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <string.h> - - -static int -do_test (void) -{ - pthread_t me = pthread_self (); - - pid_t pid = fork (); - - if (pid < 0) - { - printf ("fork: %m\n"); - return 1; - } - - if (pid == 0) - { - int err = pthread_kill (me, SIGTERM); - printf ("pthread_kill returned: %s\n", strerror (err)); - return 3; - } - - int status; - errno = 0; - if (wait (&status) != pid) - printf ("wait failed: %m\n"); - else if (WIFSIGNALED (status) && WTERMSIG (status) == SIGTERM) - { - printf ("child correctly died with SIGTERM\n"); - return 0; - } - else - printf ("child died with bad status %#x\n", status); - - return 1; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-getpid3.c b/nptl/tst-getpid3.c deleted file mode 100644 index f1e77f6b10..0000000000 --- a/nptl/tst-getpid3.c +++ /dev/null @@ -1,114 +0,0 @@ -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/wait.h> - - -static pid_t pid; - -static void * -pid_thread (void *arg) -{ - if (pid != getpid ()) - { - printf ("pid wrong in thread: should be %d, is %d\n", - (int) pid, (int) getpid ()); - return (void *) 1L; - } - - return NULL; -} - -static int -do_test (void) -{ - pid = getpid (); - - pthread_t thr; - int ret = pthread_create (&thr, NULL, pid_thread, NULL); - if (ret) - { - printf ("pthread_create failed: %d\n", ret); - return 1; - } - - void *thr_ret; - ret = pthread_join (thr, &thr_ret); - if (ret) - { - printf ("pthread_create failed: %d\n", ret); - return 1; - } - else if (thr_ret) - { - printf ("thread getpid failed\n"); - return 1; - } - - pid_t child = fork (); - if (child == -1) - { - printf ("fork failed: %m\n"); - return 1; - } - else if (child == 0) - { - if (pid == getpid ()) - { - puts ("pid did not change after fork"); - exit (1); - } - - pid = getpid (); - ret = pthread_create (&thr, NULL, pid_thread, NULL); - if (ret) - { - printf ("pthread_create failed: %d\n", ret); - return 1; - } - - ret = pthread_join (thr, &thr_ret); - if (ret) - { - printf ("pthread_create failed: %d\n", ret); - return 1; - } - else if (thr_ret) - { - printf ("thread getpid failed\n"); - return 1; - } - - return 0; - } - - int status; - if (TEMP_FAILURE_RETRY (waitpid (child, &status, 0)) != child) - { - puts ("waitpid failed"); - kill (child, SIGKILL); - return 1; - } - - if (!WIFEXITED (status)) - { - if (WIFSIGNALED (status)) - printf ("died from signal %s\n", strsignal (WTERMSIG (status))); - else - puts ("did not terminate correctly"); - return 1; - } - if (WEXITSTATUS (status) != 0) - { - printf ("exit code %d\n", WEXITSTATUS (status)); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-initializers1-c11.c b/nptl/tst-initializers1-c11.c deleted file mode 100644 index 7c27c1d545..0000000000 --- a/nptl/tst-initializers1-c11.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-initializers1.c" diff --git a/nptl/tst-initializers1-c89.c b/nptl/tst-initializers1-c89.c deleted file mode 100644 index 7c27c1d545..0000000000 --- a/nptl/tst-initializers1-c89.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-initializers1.c" diff --git a/nptl/tst-initializers1-c99.c b/nptl/tst-initializers1-c99.c deleted file mode 100644 index 7c27c1d545..0000000000 --- a/nptl/tst-initializers1-c99.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-initializers1.c" diff --git a/nptl/tst-initializers1-gnu11.c b/nptl/tst-initializers1-gnu11.c deleted file mode 100644 index 7c27c1d545..0000000000 --- a/nptl/tst-initializers1-gnu11.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-initializers1.c" diff --git a/nptl/tst-initializers1-gnu89.c b/nptl/tst-initializers1-gnu89.c deleted file mode 100644 index 7c27c1d545..0000000000 --- a/nptl/tst-initializers1-gnu89.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-initializers1.c" diff --git a/nptl/tst-initializers1-gnu99.c b/nptl/tst-initializers1-gnu99.c deleted file mode 100644 index 7c27c1d545..0000000000 --- a/nptl/tst-initializers1-gnu99.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-initializers1.c" diff --git a/nptl/tst-initializers1.c b/nptl/tst-initializers1.c deleted file mode 100644 index 5ceb683241..0000000000 --- a/nptl/tst-initializers1.c +++ /dev/null @@ -1,60 +0,0 @@ -/* Copyright (C) 2005-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2005. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* We test the code undef conditions outside of glibc. */ -#undef _LIBC - -#include <pthread.h> - -pthread_mutex_t mtx_normal = PTHREAD_MUTEX_INITIALIZER; -pthread_mutex_t mtx_recursive = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; -pthread_mutex_t mtx_errorchk = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; -pthread_mutex_t mtx_adaptive = PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP; -pthread_rwlock_t rwl_normal = PTHREAD_RWLOCK_INITIALIZER; -pthread_rwlock_t rwl_writer - = PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP; -pthread_cond_t cond = PTHREAD_COND_INITIALIZER; - -static int -do_test (void) -{ - if (mtx_normal.__data.__kind != PTHREAD_MUTEX_TIMED_NP) - return 1; - if (mtx_recursive.__data.__kind != PTHREAD_MUTEX_RECURSIVE_NP) - return 2; - if (mtx_errorchk.__data.__kind != PTHREAD_MUTEX_ERRORCHECK_NP) - return 3; - if (mtx_adaptive.__data.__kind != PTHREAD_MUTEX_ADAPTIVE_NP) - return 4; - if (rwl_normal.__data.__flags != PTHREAD_RWLOCK_PREFER_READER_NP) - return 5; - if (rwl_writer.__data.__flags - != PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP) - return 6; - /* <libc-lock.h> __libc_rwlock_init definition for libc.so - relies on PTHREAD_RWLOCK_INITIALIZER being all zeros. If - that ever changes, <libc-lock.h> needs updating. */ - size_t i; - for (i = 0; i < sizeof (rwl_normal); i++) - if (((char *) &rwl_normal)[i] != '\0') - return 7; - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-join1.c b/nptl/tst-join1.c deleted file mode 100644 index 84dd6e56d6..0000000000 --- a/nptl/tst-join1.c +++ /dev/null @@ -1,82 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - - -static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; - - -static void * -tf (void *arg) -{ - pthread_t mh = (pthread_t) arg; - void *result; - - if (pthread_mutex_unlock (&lock) != 0) - { - puts ("unlock failed"); - exit (1); - } - - if (pthread_join (mh, &result) != 0) - { - puts ("join failed"); - exit (1); - } - - if (result != (void *) 42l) - { - printf ("result wrong: expected %p, got %p\n", (void *) 42, result); - exit (1); - } - - exit (0); -} - - -static int -do_test (void) -{ - pthread_t th; - - if (pthread_mutex_lock (&lock) != 0) - { - puts ("1st lock failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, (void *) pthread_self ()) != 0) - { - puts ("create failed"); - exit (1); - } - - if (pthread_mutex_lock (&lock) != 0) - { - puts ("2nd lock failed"); - exit (1); - } - - pthread_exit ((void *) 42); -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-join2.c b/nptl/tst-join2.c deleted file mode 100644 index 54eee08de7..0000000000 --- a/nptl/tst-join2.c +++ /dev/null @@ -1,103 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - - -static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; - - -static void * -tf (void *arg) -{ - if (pthread_mutex_lock (&lock) != 0) - { - puts ("child: mutex_lock failed"); - return NULL; - } - - return (void *) 42l; -} - - -static int -do_test (void) -{ - pthread_t th; - - if (pthread_mutex_lock (&lock) != 0) - { - puts ("mutex_lock failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("mutex_create failed"); - exit (1); - } - - void *status; - int val = pthread_tryjoin_np (th, &status); - if (val == 0) - { - puts ("1st tryjoin succeeded"); - exit (1); - } - else if (val != EBUSY) - { - puts ("1st tryjoin didn't return EBUSY"); - exit (1); - } - - if (pthread_mutex_unlock (&lock) != 0) - { - puts ("mutex_unlock failed"); - exit (1); - } - - while ((val = pthread_tryjoin_np (th, &status)) != 0) - { - if (val != EBUSY) - { - printf ("tryjoin returned %s (%d), expected only 0 or EBUSY\n", - strerror (val), val); - exit (1); - } - - /* Delay minimally. */ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 }; - nanosleep (&ts, NULL); - } - - if (status != (void *) 42l) - { - printf ("return value %p, expected %p\n", status, (void *) 42l); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-join3.c b/nptl/tst-join3.c deleted file mode 100644 index 956342fef6..0000000000 --- a/nptl/tst-join3.c +++ /dev/null @@ -1,122 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/time.h> - - -static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; - - -static void * -tf (void *arg) -{ - if (pthread_mutex_lock (&lock) != 0) - { - puts ("child: mutex_lock failed"); - return NULL; - } - - return (void *) 42l; -} - - -static int -do_test (void) -{ - pthread_t th; - - if (pthread_mutex_lock (&lock) != 0) - { - puts ("mutex_lock failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("mutex_create failed"); - exit (1); - } - - void *status; - struct timespec ts; - struct timeval tv; - (void) gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_nsec += 200000000; - if (ts.tv_nsec >= 1000000000) - { - ts.tv_nsec -= 1000000000; - ++ts.tv_sec; - } - int val = pthread_timedjoin_np (th, &status, &ts); - if (val == 0) - { - puts ("1st timedjoin succeeded"); - exit (1); - } - else if (val != ETIMEDOUT) - { - puts ("1st timedjoin didn't return ETIMEDOUT"); - exit (1); - } - - if (pthread_mutex_unlock (&lock) != 0) - { - puts ("mutex_unlock failed"); - exit (1); - } - - while (1) - { - (void) gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_nsec += 200000000; - if (ts.tv_nsec >= 1000000000) - { - ts.tv_nsec -= 1000000000; - ++ts.tv_sec; - } - - val = pthread_timedjoin_np (th, &status, &ts); - if (val == 0) - break; - - if (val != ETIMEDOUT) - { - printf ("timedjoin returned %s (%d), expected only 0 or ETIMEDOUT\n", - strerror (val), val); - exit (1); - } - } - - if (status != (void *) 42l) - { - printf ("return value %p, expected %p\n", status, (void *) 42l); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-join4.c b/nptl/tst-join4.c deleted file mode 100644 index 0fbd83101f..0000000000 --- a/nptl/tst-join4.c +++ /dev/null @@ -1,124 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - - -static pthread_barrier_t bar; - - -static void * -tf (void *arg) -{ - if (pthread_barrier_wait (&bar) != 0) - { - puts ("tf: barrier_wait failed"); - exit (1); - } - - return (void *) 1l; -} - - -static int -do_test (void) -{ - if (pthread_barrier_init (&bar, NULL, 3) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - pthread_attr_t a; - - if (pthread_attr_init (&a) != 0) - { - puts ("attr_init failed"); - exit (1); - } - - if (pthread_attr_setstacksize (&a, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - pthread_t th[2]; - - if (pthread_create (&th[0], &a, tf, NULL) != 0) - { - puts ("1st create failed"); - exit (1); - } - - if (pthread_attr_setdetachstate (&a, PTHREAD_CREATE_DETACHED) != 0) - { - puts ("attr_setdetachstate failed"); - exit (1); - } - - if (pthread_create (&th[1], &a, tf, NULL) != 0) - { - puts ("1st create failed"); - exit (1); - } - - if (pthread_attr_destroy (&a) != 0) - { - puts ("attr_destroy failed"); - exit (1); - } - - if (pthread_detach (th[0]) != 0) - { - puts ("could not detach 1st thread"); - exit (1); - } - - int err = pthread_detach (th[0]); - if (err == 0) - { - puts ("second detach of 1st thread succeeded"); - exit (1); - } - if (err != EINVAL) - { - printf ("second detach of 1st thread returned %d, not EINVAL\n", err); - exit (1); - } - - err = pthread_detach (th[1]); - if (err == 0) - { - puts ("detach of 2nd thread succeeded"); - exit (1); - } - if (err != EINVAL) - { - printf ("detach of 2nd thread returned %d, not EINVAL\n", err); - exit (1); - } - - exit (0); -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-join5.c b/nptl/tst-join5.c deleted file mode 100644 index 7a9fa750fe..0000000000 --- a/nptl/tst-join5.c +++ /dev/null @@ -1,207 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <unistd.h> - - -static void -wait_code (void) -{ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 200000000 }; - while (nanosleep (&ts, &ts) < 0) - ; -} - - -#ifdef WAIT_IN_CHILD -static pthread_barrier_t b; -#endif - - -static void * -tf1 (void *arg) -{ -#ifdef WAIT_IN_CHILD - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("%s: barrier_wait failed\n", __func__); - exit (1); - } - - wait_code (); -#endif - - pthread_join ((pthread_t) arg, NULL); - - exit (42); -} - - -static void * -tf2 (void *arg) -{ -#ifdef WAIT_IN_CHILD - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("%s: barrier_wait failed\n", __func__); - exit (1); - } - - wait_code (); -#endif - pthread_join ((pthread_t) arg, NULL); - - exit (43); -} - - -static int -do_test (void) -{ -#ifdef WAIT_IN_CHILD - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } -#endif - - pthread_t th; - - int err = pthread_join (pthread_self (), NULL); - if (err == 0) - { - puts ("1st circular join succeeded"); - return 1; - } - if (err != EDEADLK) - { - printf ("1st circular join %d, not EDEADLK\n", err); - return 1; - } - - if (pthread_create (&th, NULL, tf1, (void *) pthread_self ()) != 0) - { - puts ("1st create failed"); - return 1; - } - -#ifndef WAIT_IN_CHILD - wait_code (); -#endif - - if (pthread_cancel (th) != 0) - { - puts ("cannot cancel 1st thread"); - return 1; - } - -#ifdef WAIT_IN_CHILD - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("%s: barrier_wait failed\n", __func__); - return 1; - } -#endif - - void *r; - err = pthread_join (th, &r); - if (err != 0) - { - printf ("cannot join 1st thread: %d\n", err); - return 1; - } - if (r != PTHREAD_CANCELED) - { - puts ("1st thread not canceled"); - return 1; - } - - err = pthread_join (pthread_self (), NULL); - if (err == 0) - { - puts ("2nd circular join succeeded"); - return 1; - } - if (err != EDEADLK) - { - printf ("2nd circular join %d, not EDEADLK\n", err); - return 1; - } - - if (pthread_create (&th, NULL, tf2, (void *) pthread_self ()) != 0) - { - puts ("2nd create failed"); - return 1; - } - -#ifndef WAIT_IN_CHILD - wait_code (); -#endif - - if (pthread_cancel (th) != 0) - { - puts ("cannot cancel 2nd thread"); - return 1; - } - -#ifdef WAIT_IN_CHILD - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("%s: barrier_wait failed\n", __func__); - return 1; - } -#endif - - if (pthread_join (th, &r) != 0) - { - puts ("cannot join 2nd thread"); - return 1; - } - if (r != PTHREAD_CANCELED) - { - puts ("2nd thread not canceled"); - return 1; - } - - err = pthread_join (pthread_self (), NULL); - if (err == 0) - { - puts ("3rd circular join succeeded"); - return 1; - } - if (err != EDEADLK) - { - printf ("3rd circular join %d, not EDEADLK\n", err); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-join6.c b/nptl/tst-join6.c deleted file mode 100644 index 0c9e7c056b..0000000000 --- a/nptl/tst-join6.c +++ /dev/null @@ -1,2 +0,0 @@ -#define WAIT_IN_CHILD 1 -#include "tst-join5.c" diff --git a/nptl/tst-join7.c b/nptl/tst-join7.c deleted file mode 100644 index af2c5d16dc..0000000000 --- a/nptl/tst-join7.c +++ /dev/null @@ -1,46 +0,0 @@ -/* Verify that TLS access in separate thread in a dlopened library does not - deadlock. - Copyright (C) 2015-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <dlfcn.h> - -/* When one dynamically loads a module, which spawns a thread to perform some - activities, it could be possible that TLS storage is accessed for the first - time in that thread. This results in an allocation request within the - thread, which could result in an attempt to take the rtld load_lock. This - is a problem because it would then deadlock with the dlopen (which owns the - lock), if the main thread is waiting for the spawned thread to exit. We can - at least ensure that this problem does not occur due to accesses within - libc.so, by marking TLS variables within libc.so as IE. The problem of an - arbitrary variable being accessed and constructed within such a thread still - exists but this test case does not verify that. */ - -int -do_test (void) -{ - void *f = dlopen ("tst-join7mod.so", RTLD_NOW | RTLD_GLOBAL); - if (f) - dlclose (f); - else - return 1; - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-join7mod.c b/nptl/tst-join7mod.c deleted file mode 100644 index 7b94af6d54..0000000000 --- a/nptl/tst-join7mod.c +++ /dev/null @@ -1,63 +0,0 @@ -/* Verify that TLS access in separate thread in a dlopened library does not - deadlock - the module. - Copyright (C) 2015-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <pthread.h> -#include <atomic.h> - -static pthread_t th; -static int running = 1; - -static void * -test_run (void *p) -{ - while (atomic_load_relaxed (&running)) - printf ("Test running\n"); - printf ("Test finished\n"); - return NULL; -} - -static void __attribute__ ((constructor)) -do_init (void) -{ - int ret = pthread_create (&th, NULL, test_run, NULL); - - if (ret != 0) - { - printf ("failed to create thread: %s (%d)\n", strerror (ret), ret); - exit (1); - } -} - -static void __attribute__ ((destructor)) -do_end (void) -{ - atomic_store_relaxed (&running, 0); - int ret = pthread_join (th, NULL); - - if (ret != 0) - { - printf ("pthread_join: %s(%d)\n", strerror (ret), ret); - exit (1); - } - - printf ("Thread joined\n"); -} diff --git a/nptl/tst-key1.c b/nptl/tst-key1.c deleted file mode 100644 index 0240bbb553..0000000000 --- a/nptl/tst-key1.c +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <limits.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -int -do_test (void) -{ - int max; -#ifdef PTHREAD_KEYS_MAX - max = PTHREAD_KEYS_MAX; -#else - max = _POSIX_THREAD_KEYS_MAX; -#endif - pthread_key_t *keys = alloca (max * sizeof (pthread_key_t)); - - int i; - for (i = 0; i < max; ++i) - if (pthread_key_create (&keys[i], NULL) != 0) - { - write_message ("key_create failed\n"); - _exit (1); - } - else - { - printf ("created key %d\n", i); - - if (pthread_setspecific (keys[i], (const void *) (i + 100l)) != 0) - { - write (2, "setspecific failed\n", 19); - _exit (1); - } - } - - for (i = 0; i < max; ++i) - { - if (pthread_getspecific (keys[i]) != (void *) (i + 100l)) - { - write (2, "getspecific failed\n", 19); - _exit (1); - } - - if (pthread_key_delete (keys[i]) != 0) - { - write (2, "key_delete failed\n", 18); - _exit (1); - } - } - - /* Now it must be once again possible to allocate keys. */ - if (pthread_key_create (&keys[0], NULL) != 0) - { - write (2, "2nd key_create failed\n", 22); - _exit (1); - } - - if (pthread_key_delete (keys[0]) != 0) - { - write (2, "2nd key_delete failed\n", 22); - _exit (1); - } - - return 0; -} diff --git a/nptl/tst-key2.c b/nptl/tst-key2.c deleted file mode 100644 index a067873aa6..0000000000 --- a/nptl/tst-key2.c +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <unistd.h> - -#define N 2 - - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static int cnt0; -static void -f0 (void *p) -{ - ++cnt0; -} - - -static int cnt1; -static void -f1 (void *p) -{ - ++cnt1; -} - - -static void (*fcts[N]) (void *) = -{ - f0, - f1 -}; - - -static void * -tf (void *arg) -{ - pthread_key_t *key = (pthread_key_t *) arg; - - if (pthread_setspecific (*key, (void *) -1l) != 0) - { - write_message ("setspecific failed\n"); - _exit (1); - } - - return NULL; -} - - -int -do_test (void) -{ - pthread_key_t keys[N]; - - int i; - for (i = 0; i < N; ++i) - if (pthread_key_create (&keys[i], fcts[i]) != 0) - { - write_message ("key_create failed\n"); - _exit (1); - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, &keys[1]) != 0) - { - write_message ("create failed\n"); - _exit (1); - } - - if (pthread_join (th, NULL) != 0) - { - write_message ("join failed\n"); - _exit (1); - } - - if (cnt0 != 0) - { - write_message ("cnt0 != 0\n"); - _exit (1); - } - - if (cnt1 != 1) - { - write_message ("cnt1 != 1\n"); - _exit (1); - } - - for (i = 0; i < N; ++i) - if (pthread_key_delete (keys[i]) != 0) - { - write_message ("key_delete failed\n"); - _exit (1); - } - - return 0; -} diff --git a/nptl/tst-key3.c b/nptl/tst-key3.c deleted file mode 100644 index d128477f31..0000000000 --- a/nptl/tst-key3.c +++ /dev/null @@ -1,156 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <unistd.h> - -#define N 2 - - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static int cnt0; -static void -f0 (void *p) -{ - ++cnt0; -} - - -static int cnt1; -static void -f1 (void *p) -{ - ++cnt1; -} - - -static void (*fcts[N]) (void *) = -{ - f0, - f1 -}; - - -static pthread_barrier_t b; - - -static void * -tf (void *arg) -{ - pthread_key_t *key = (pthread_key_t *) arg; - - if (pthread_setspecific (*key, (void *) -1l) != 0) - { - write_message ("setspecific failed\n"); - _exit (1); - } - - pthread_barrier_wait (&b); - - const struct timespec t = { .tv_sec = 1000, .tv_nsec = 0 }; - while (1) - nanosleep (&t, NULL); - - /* NOTREACHED */ - return NULL; -} - - -int -do_test (void) -{ - pthread_key_t keys[N]; - - int i; - for (i = 0; i < N; ++i) - if (pthread_key_create (&keys[i], fcts[i]) != 0) - { - write_message ("key_create failed\n"); - _exit (1); - } - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - write_message ("barrier_init failed\n"); - _exit (1); - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, &keys[1]) != 0) - { - write_message ("create failed\n"); - _exit (1); - } - - pthread_barrier_wait (&b); - - if (pthread_cancel (th) != 0) - { - write_message ("cancel failed\n"); - _exit (1); - } - - void *status; - if (pthread_join (th, &status) != 0) - { - write_message ("join failed\n"); - _exit (1); - } - - if (status != PTHREAD_CANCELED) - { - write_message ("thread not canceled\n"); - _exit (1); - } - - /* Note that the TSD destructors not necessarily have to have - finished by the time pthread_join returns. At least according to - POSIX. We implement the stronger requirement that they indeed - have run and therefore these tests succeed. */ - if (cnt0 != 0) - { - write_message ("cnt0 != 0\n"); - _exit (1); - } - - if (cnt1 != 1) - { - write_message ("cnt1 != 1\n"); - _exit (1); - } - - for (i = 0; i < N; ++i) - if (pthread_key_delete (keys[i]) != 0) - { - write_message ("key_delete failed\n"); - _exit (1); - } - - if (pthread_barrier_destroy (&b) != 0) - { - write_message ("barrier_destroy failed\n"); - _exit (1); - } - - return 0; -} diff --git a/nptl/tst-key4.c b/nptl/tst-key4.c deleted file mode 100644 index 2552be9c3e..0000000000 --- a/nptl/tst-key4.c +++ /dev/null @@ -1,136 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <limits.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -#ifdef PTHREAD_KEYS_MAX -const int max = PTHREAD_KEYS_MAX; -#else -const int max = _POSIX_THREAD_KEYS_MAX; -#endif -static pthread_key_t *keys; - - -static void * -tf1 (void *arg) -{ - int i; - for (i = 0; i < max; ++i) - if (pthread_setspecific (keys[i], (void *) (long int) (i + 1)) != 0) - { - puts ("setspecific failed"); - exit (1); - } - - return NULL; -} - - -static void * -tf2 (void *arg) -{ - int i; - for (i = 0; i < max; ++i) - if (pthread_getspecific (keys[i]) != NULL) - { - printf ("getspecific for key %d not NULL\n", i); - exit (1); - } - - return NULL; -} - - -static int -do_test (void) -{ - keys = alloca (max * sizeof (pthread_key_t)); - - int i; - for (i = 0; i < max; ++i) - if (pthread_key_create (&keys[i], NULL) != 0) - { - puts ("key_create failed"); - exit (1); - } - - pthread_attr_t a; - - if (pthread_attr_init (&a) != 0) - { - puts ("attr_init failed"); - exit (1); - } - - if (pthread_attr_setstacksize (&a, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - for (i = 0; i < 10; ++i) - { - int j; -#define N 2 - pthread_t th[N]; - for (j = 0; j < N; ++j) - if (pthread_create (&th[j], NULL, tf1, NULL) != 0) - { - puts ("1st create failed"); - exit (1); - } - - for (j = 0; j < N; ++j) - if (pthread_join (th[j], NULL) != 0) - { - puts ("1st join failed"); - exit (1); - } - - for (j = 0; j < N; ++j) - if (pthread_create (&th[j], NULL, tf2, NULL) != 0) - { - puts ("2nd create failed"); - exit (1); - } - - for (j = 0; j < N; ++j) - if (pthread_join (th[j], NULL) != 0) - { - puts ("2nd join failed"); - exit (1); - } - } - - if (pthread_attr_destroy (&a) != 0) - { - puts ("attr_destroy failed"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-kill1.c b/nptl/tst-kill1.c deleted file mode 100644 index 0a077e865a..0000000000 --- a/nptl/tst-kill1.c +++ /dev/null @@ -1,99 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> - - -static pthread_cond_t c = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; -static pthread_barrier_t b; - -static void * -tf (void *a) -{ - if (pthread_mutex_lock (&m) != 0) - { - puts ("child: mutex_lock failed"); - exit (1); - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child: barrier_wait failed"); - exit (1); - } - - /* This call should never return. */ - pthread_cond_wait (&c, &m); - - return NULL; -} - - -int -do_test (void) -{ - pthread_t th; - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("mutex_lock failed"); - exit (1); - } - - /* Send the thread a signal which it doesn't catch and which will - cause the process to terminate. */ - if (pthread_kill (th, SIGUSR1) != 0) - { - puts ("kill failed"); - exit (1); - } - - /* This call should never return. */ - pthread_join (th, NULL); - - return 0; -} - - -#define EXPECTED_SIGNAL SIGUSR1 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-kill2.c b/nptl/tst-kill2.c deleted file mode 100644 index 58391bdad2..0000000000 --- a/nptl/tst-kill2.c +++ /dev/null @@ -1,138 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <sys/time.h> - - -static pthread_cond_t c = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; -static pthread_barrier_t b; - -static void * -tf (void *a) -{ - /* Block SIGUSR1. */ - sigset_t ss; - - sigemptyset (&ss); - sigaddset (&ss, SIGUSR1); - if (pthread_sigmask (SIG_BLOCK, &ss, NULL) != 0) - { - puts ("child: sigmask failed"); - exit (1); - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("child: mutex_lock failed"); - exit (1); - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child: barrier_wait failed"); - exit (1); - } - - /* Compute timeout. */ - struct timeval tv; - (void) gettimeofday (&tv, NULL); - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - /* Timeout: 1sec. */ - ts.tv_sec += 1; - - /* This call should never return. */ - if (pthread_cond_timedwait (&c, &m, &ts) != ETIMEDOUT) - { - puts ("cond_timedwait didn't time out"); - exit (1); - } - - return NULL; -} - - -int -do_test (void) -{ - pthread_t th; - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("mutex_lock failed"); - exit (1); - } - - /* Send the thread a signal which it has blocked. */ - if (pthread_kill (th, SIGUSR1) != 0) - { - puts ("kill failed"); - exit (1); - } - - if (pthread_mutex_unlock (&m) != 0) - { - puts ("mutex_unlock failed"); - exit (1); - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("join failed"); - exit (1); - } - if (r != NULL) - { - puts ("return value wrong"); - exit (1); - } - - return 0; -} - - -#define TIMEOUT 5 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-kill3.c b/nptl/tst-kill3.c deleted file mode 100644 index 824304bde3..0000000000 --- a/nptl/tst-kill3.c +++ /dev/null @@ -1,159 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/time.h> - - -static int do_test (void); - -#define TIMEOUT 5 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static pthread_cond_t c = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; -static pthread_barrier_t b; - - -static void -handler (int sig) -{ - write_message ("handler called\n"); - _exit (1); -} - - -static void * -tf (void *a) -{ - /* Block SIGUSR1. */ - sigset_t ss; - - sigemptyset (&ss); - sigaddset (&ss, SIGUSR1); - if (pthread_sigmask (SIG_BLOCK, &ss, NULL) != 0) - { - puts ("child: sigmask failed"); - exit (1); - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("child: mutex_lock failed"); - exit (1); - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child: barrier_wait failed"); - exit (1); - } - - /* Compute timeout. */ - struct timeval tv; - (void) gettimeofday (&tv, NULL); - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - /* Timeout: 1sec. */ - ts.tv_sec += 1; - - /* This call should never return. */ - if (pthread_cond_timedwait (&c, &m, &ts) != ETIMEDOUT) - { - puts ("cond_timedwait didn't time out"); - exit (1); - } - - return NULL; -} - - -int -do_test (void) -{ - pthread_t th; - - struct sigaction sa; - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - sa.sa_handler = handler; - if (sigaction (SIGUSR1, &sa, NULL) != 0) - { - puts ("sigaction failed"); - exit (1); - } - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("mutex_lock failed"); - exit (1); - } - - /* Send the thread a signal which it has blocked. */ - if (pthread_kill (th, SIGUSR1) != 0) - { - puts ("kill failed"); - exit (1); - } - - if (pthread_mutex_unlock (&m) != 0) - { - puts ("mutex_unlock failed"); - exit (1); - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("join failed"); - exit (1); - } - if (r != NULL) - { - puts ("return value wrong"); - exit (1); - } - - return 0; -} diff --git a/nptl/tst-kill4.c b/nptl/tst-kill4.c deleted file mode 100644 index 81e5c726dc..0000000000 --- a/nptl/tst-kill4.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static void * -tf (void *a) -{ - return NULL; -} - - -int -do_test (void) -{ - pthread_attr_t at; - if (pthread_attr_init (&at) != 0) - { - puts ("attr_create failed"); - exit (1); - } - - /* Limit thread stack size, because if it is too large, pthread_join - will free it immediately rather than put it into stack cache. */ - if (pthread_attr_setstacksize (&at, 2 * 1024 * 1024) != 0) - { - puts ("setstacksize failed"); - exit (1); - } - - pthread_t th; - if (pthread_create (&th, &at, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - pthread_attr_destroy (&at); - - if (pthread_join (th, NULL) != 0) - { - puts ("join failed"); - exit (1); - } - - /* The following only works because we assume here something about - the implementation. Namely, that the memory allocated for the - thread descriptor is not going away, that the TID field is - cleared and therefore the signal is sent to process 0, and that - we can savely assume there is no other process with this ID at - that time. */ - int e = pthread_kill (th, 0); - if (e == 0) - { - puts ("pthread_kill succeeded"); - exit (1); - } - if (e != ESRCH) - { - puts ("pthread_kill didn't return ESRCH"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-kill5.c b/nptl/tst-kill5.c deleted file mode 100644 index fff69e747b..0000000000 --- a/nptl/tst-kill5.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <limits.h> - - -int -do_test (void) -{ - /* XXX This test might require architecture and system specific changes. - There is no guarantee that this signal number is invalid. */ - int e = pthread_kill (pthread_self (), INT_MAX); - if (e == 0) - { - puts ("kill didn't failed"); - exit (1); - } - if (e != EINVAL) - { - puts ("error not EINVAL"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-kill6.c b/nptl/tst-kill6.c deleted file mode 100644 index cdca19c149..0000000000 --- a/nptl/tst-kill6.c +++ /dev/null @@ -1,162 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <semaphore.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static pthread_t receiver; -static sem_t sem; -static pthread_barrier_t b; - -static void -handler (int sig) -{ - if (sig != SIGUSR1) - { - write_message ("wrong signal\n"); - _exit (1); - } - - if (pthread_self () != receiver) - { - write_message ("not the intended receiver\n"); - _exit (1); - } - - if (sem_post (&sem) != 0) - { - write_message ("sem_post failed\n"); - _exit (1); - } -} - - -static void * -tf (void *a) -{ - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child: barrier_wait failed"); - exit (1); - } - - return NULL; -} - - -int -do_test (void) -{ - struct sigaction sa; - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - sa.sa_handler = handler; - if (sigaction (SIGUSR1, &sa, NULL) != 0) - { - puts ("sigaction failed"); - exit (1); - } - -#define N 20 - - if (pthread_barrier_init (&b, NULL, N + 1) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - pthread_attr_t a; - - if (pthread_attr_init (&a) != 0) - { - puts ("attr_init failed"); - exit (1); - } - - if (pthread_attr_setstacksize (&a, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - pthread_t th[N]; - int i; - for (i = 0; i < N; ++i) - if (pthread_create (&th[i], &a, tf, NULL) != 0) - { - puts ("create failed"); - exit (1); - } - - if (pthread_attr_destroy (&a) != 0) - { - puts ("attr_destroy failed"); - exit (1); - } - - if (sem_init (&sem, 0, 0) != 0) - { - puts ("sem_init failed"); - exit (1); - } - - for (i = 0; i < N * 10; ++i) - { - receiver = th[i % N]; - - if (pthread_kill (receiver, SIGUSR1) != 0) - { - puts ("kill failed"); - exit (1); - } - - if (TEMP_FAILURE_RETRY (sem_wait (&sem)) != 0) - { - puts ("sem_wait failed"); - exit (1); - } - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - for (i = 0; i < N; ++i) - if (pthread_join (th[i], NULL) != 0) - { - puts ("join failed"); - exit (1); - } - - return 0; -} diff --git a/nptl/tst-locale1.c b/nptl/tst-locale1.c deleted file mode 100644 index 887b9a6dd7..0000000000 --- a/nptl/tst-locale1.c +++ /dev/null @@ -1,22 +0,0 @@ -/* Test that the thread-local locale works right in the main thread - when statically linked. */ - -#include "../locale/tst-C-locale.c" - -#include <pthread.h> -#include <signal.h> - -/* This is never called, just here to get pthreads linked in. */ -int -useless (void) -{ - pthread_t th; - pthread_create (&th, 0, (void *(*) (void *)) useless, 0); - int result = 0; -#ifdef SIGRTMIN - /* This is to check __libc_current_sigrt* can be used in statically - linked apps. */ - result = SIGRTMIN; -#endif - return result; -} diff --git a/nptl/tst-locale2.c b/nptl/tst-locale2.c deleted file mode 100644 index a238209f87..0000000000 --- a/nptl/tst-locale2.c +++ /dev/null @@ -1,15 +0,0 @@ -/* Test that the thread-local locale works right in the main thread - when statically linked. */ - -#include "../argp/tst-argp1.c" - -#include <pthread.h> - -/* This is never called, just here to get pthreads linked in. */ -void * -useless (void *a) -{ - pthread_t th; - pthread_create (&th, 0, useless, a); - return NULL; -} diff --git a/nptl/tst-mutex-errorcheck.c b/nptl/tst-mutex-errorcheck.c deleted file mode 100644 index a1614c7293..0000000000 --- a/nptl/tst-mutex-errorcheck.c +++ /dev/null @@ -1,61 +0,0 @@ -/* Check that error checking mutexes are not subject to lock elision. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <errno.h> -#include <time.h> -#include <pthread.h> - -static int -do_test (void) -{ - struct timespec tms = { 0 }; - pthread_mutex_t mutex; - pthread_mutexattr_t mutexattr; - int ret = 0; - - if (pthread_mutexattr_init (&mutexattr) != 0) - return 1; - if (pthread_mutexattr_settype (&mutexattr, PTHREAD_MUTEX_ERRORCHECK) != 0) - return 1; - - if (pthread_mutex_init (&mutex, &mutexattr) != 0) - return 1; - if (pthread_mutexattr_destroy (&mutexattr) != 0) - return 1; - - /* The call to pthread_mutex_timedlock erroneously enabled lock elision - on the mutex, which then triggered an assertion failure in - pthread_mutex_unlock. It would also defeat the error checking nature - of the mutex. */ - if (pthread_mutex_timedlock (&mutex, &tms) != 0) - return 1; - if (pthread_mutex_timedlock (&mutex, &tms) != EDEADLK) - { - printf ("Failed error checking on locked mutex\n"); - ret = 1; - } - - if (pthread_mutex_unlock (&mutex) != 0) - ret = 1; - - return ret; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-mutex1.c b/nptl/tst-mutex1.c deleted file mode 100644 index b2a4b5492a..0000000000 --- a/nptl/tst-mutex1.c +++ /dev/null @@ -1,83 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <errno.h> -#include <stdbool.h> -#include <libc-diag.h> - -#ifndef ATTR -# define ATTR NULL -# define ATTR_NULL true -#endif - - -static int -do_test (void) -{ - pthread_mutex_t m; - - int e = pthread_mutex_init (&m, ATTR); - if (!ATTR_NULL && e == ENOTSUP) - { - puts ("cannot support selected type of mutexes"); - return 0; - } - else if (e != 0) - { - puts ("mutex_init failed"); - return 1; - } - - /* This deliberately tests supplying a null pointer to a function whose - argument is marked __attribute__ ((nonnull)). */ - DIAG_PUSH_NEEDS_COMMENT; - DIAG_IGNORE_NEEDS_COMMENT (5, "-Wnonnull"); - if (!ATTR_NULL && pthread_mutexattr_destroy (ATTR) != 0) - { - puts ("mutexattr_destroy failed"); - return 1; - } - DIAG_POP_NEEDS_COMMENT; - - if (pthread_mutex_lock (&m) != 0) - { - puts ("mutex_lock failed"); - return 1; - } - - if (pthread_mutex_unlock (&m) != 0) - { - puts ("mutex_unlock failed"); - return 1; - } - - if (pthread_mutex_destroy (&m) != 0) - { - puts ("mutex_destroy failed"); - return 1; - } - - return 0; -} - -#ifndef TEST_FUNCTION -# define TEST_FUNCTION do_test () -#endif -#include "../test-skeleton.c" diff --git a/nptl/tst-mutex2.c b/nptl/tst-mutex2.c deleted file mode 100644 index 35df44eae5..0000000000 --- a/nptl/tst-mutex2.c +++ /dev/null @@ -1,241 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - - -static pthread_mutex_t m; -static pthread_barrier_t b; - - -static void * -tf (void *arg) -{ - int e = pthread_mutex_unlock (&m); - if (e == 0) - { - puts ("child: 1st mutex_unlock succeeded"); - exit (1); - } - else if (e != EPERM) - { - puts ("child: 1st mutex_unlock error != EPERM"); - exit (1); - } - - e = pthread_mutex_trylock (&m); - if (e == 0) - { - puts ("child: 1st trylock suceeded"); - exit (1); - } - if (e != EBUSY) - { - puts ("child: 1st trylock didn't return EBUSY"); - exit (1); - } - - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child: 1st barrier_wait failed"); - exit (1); - } - - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child: 2nd barrier_wait failed"); - exit (1); - } - - e = pthread_mutex_unlock (&m); - if (e == 0) - { - puts ("child: 2nd mutex_unlock succeeded"); - exit (1); - } - else if (e != EPERM) - { - puts ("child: 2nd mutex_unlock error != EPERM"); - exit (1); - } - - if (pthread_mutex_trylock (&m) != 0) - { - puts ("child: 2nd trylock failed"); - exit (1); - } - - if (pthread_mutex_unlock (&m) != 0) - { - puts ("child: 3rd mutex_unlock failed"); - exit (1); - } - - return NULL; -} - - -static int -do_test (void) -{ - pthread_mutexattr_t a; - int e; - - if (pthread_mutexattr_init (&a) != 0) - { - puts ("mutexattr_init failed"); - return 1; - } - - if (pthread_mutexattr_settype (&a, PTHREAD_MUTEX_ERRORCHECK) != 0) - { - puts ("mutexattr_settype failed"); - return 1; - } - -#ifdef ENABLE_PI - if (pthread_mutexattr_setprotocol (&a, PTHREAD_PRIO_INHERIT) != 0) - { - puts ("pthread_mutexattr_setprotocol failed"); - return 1; - } -#endif - - e = pthread_mutex_init (&m, &a); - if (e != 0) - { -#ifdef ENABLE_PI - if (e == ENOTSUP) - { - puts ("PI mutexes unsupported"); - return 0; - } -#endif - puts ("mutex_init failed"); - return 1; - } - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - e = pthread_mutex_unlock (&m); - if (e == 0) - { - puts ("1st mutex_unlock succeeded"); - return 1; - } - else if (e != EPERM) - { - puts ("1st mutex_unlock error != EPERM"); - return 1; - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("mutex_lock failed"); - return 1; - } - - e = pthread_mutex_lock (&m); - if (e == 0) - { - puts ("2nd mutex_lock succeeded"); - return 1; - } - else if (e != EDEADLK) - { - puts ("2nd mutex_lock error != EDEADLK"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("1st barrier_wait failed"); - return 1; - } - - if (pthread_mutex_unlock (&m) != 0) - { - puts ("2nd mutex_unlock failed"); - return 1; - } - - e = pthread_mutex_unlock (&m); - if (e == 0) - { - puts ("3rd mutex_unlock succeeded"); - return 1; - } - else if (e != EPERM) - { - puts ("3rd mutex_unlock error != EPERM"); - return 1; - } - - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("2nd barrier_wait failed"); - return 1; - } - - if (pthread_join (th, NULL) != 0) - { - puts ("join failed"); - return 1; - } - - if (pthread_mutex_destroy (&m) != 0) - { - puts ("mutex_destroy failed"); - return 1; - } - - if (pthread_barrier_destroy (&b) != 0) - { - puts ("barrier_destroy failed"); - return 1; - } - - if (pthread_mutexattr_destroy (&a) != 0) - { - puts ("mutexattr_destroy failed"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-mutex3.c b/nptl/tst-mutex3.c deleted file mode 100644 index e9c807c982..0000000000 --- a/nptl/tst-mutex3.c +++ /dev/null @@ -1,241 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - - -static pthread_mutex_t m; -static pthread_barrier_t b; - - -static void * -tf (void *arg) -{ - int e = pthread_mutex_unlock (&m); - if (e == 0) - { - puts ("1st mutex_unlock in child succeeded"); - exit (1); - } - if (e != EPERM) - { - puts ("1st mutex_unlock in child didn't return EPERM"); - exit (1); - } - - e = pthread_mutex_trylock (&m); - if (e == 0) - { - puts ("mutex_trylock in second thread succeeded"); - exit (1); - } - if (e != EBUSY) - { - puts ("mutex_trylock returned wrong value"); - exit (1); - } - - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - e = pthread_mutex_unlock (&m); - if (e == 0) - { - puts ("2nd mutex_unlock in child succeeded"); - exit (1); - } - if (e != EPERM) - { - puts ("2nd mutex_unlock in child didn't return EPERM"); - exit (1); - } - - if (pthread_mutex_trylock (&m) != 0) - { - puts ("2nd mutex_trylock in second thread failed"); - exit (1); - } - - if (pthread_mutex_unlock (&m) != 0) - { - puts ("3rd mutex_unlock in second thread failed"); - exit (1); - } - - return NULL; -} - - -static int -do_test (void) -{ - pthread_mutexattr_t a; - - if (pthread_mutexattr_init (&a) != 0) - { - puts ("mutexattr_init failed"); - return 1; - } - - if (pthread_mutexattr_settype (&a, PTHREAD_MUTEX_RECURSIVE) != 0) - { - puts ("mutexattr_settype failed"); - return 1; - } - -#ifdef ENABLE_PI - if (pthread_mutexattr_setprotocol (&a, PTHREAD_PRIO_INHERIT) != 0) - { - puts ("pthread_mutexattr_setprotocol failed"); - return 1; - } -#endif - - int e; - e = pthread_mutex_init (&m, &a); - if (e != 0) - { -#ifdef ENABLE_PI - if (e == ENOTSUP) - { - puts ("PI mutexes unsupported"); - return 0; - } -#endif - puts ("mutex_init failed"); - return 1; - } - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("mutex_lock failed"); - return 1; - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("2nd mutex_lock failed"); - return 1; - } - - if (pthread_mutex_trylock (&m) != 0) - { - puts ("1st trylock failed"); - return 1; - } - - if (pthread_mutex_unlock (&m) != 0) - { - puts ("mutex_unlock failed"); - return 1; - } - - if (pthread_mutex_unlock (&m) != 0) - { - puts ("2nd mutex_unlock failed"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - return 1; - } - - if (pthread_mutex_unlock (&m) != 0) - { - puts ("3rd mutex_unlock failed"); - return 1; - } - - e = pthread_mutex_unlock (&m); - if (e == 0) - { - puts ("4th mutex_unlock succeeded"); - return 1; - } - if (e != EPERM) - { - puts ("4th mutex_unlock didn't return EPERM"); - return 1; - } - - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - return 1; - } - - if (pthread_join (th, NULL) != 0) - { - puts ("join failed"); - return 1; - } - - if (pthread_barrier_destroy (&b) != 0) - { - puts ("barrier_destroy failed"); - return 1; - } - - if (pthread_mutex_destroy (&m) != 0) - { - puts ("mutex_destroy failed"); - return 1; - } - - if (pthread_mutexattr_destroy (&a) != 0) - { - puts ("mutexattr_destroy failed"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-mutex4.c b/nptl/tst-mutex4.c deleted file mode 100644 index a1f072d495..0000000000 --- a/nptl/tst-mutex4.c +++ /dev/null @@ -1,277 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/wait.h> - - -static int -do_test (void) -{ - size_t ps = sysconf (_SC_PAGESIZE); - char tmpfname[] = "/tmp/tst-mutex4.XXXXXX"; - char data[ps]; - void *mem; - int fd; - pthread_mutex_t *m; - pthread_mutexattr_t a; - pid_t pid; - char *p; - int err; - int s; - pthread_barrier_t *b; - pthread_barrierattr_t ba; - - fd = mkstemp (tmpfname); - if (fd == -1) - { - printf ("cannot open temporary file: %m\n"); - return 1; - } - - /* Make sure it is always removed. */ - unlink (tmpfname); - - /* Create one page of data. */ - memset (data, '\0', ps); - - /* Write the data to the file. */ - if (write (fd, data, ps) != (ssize_t) ps) - { - puts ("short write"); - return 1; - } - - mem = mmap (NULL, ps, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (mem == MAP_FAILED) - { - printf ("mmap failed: %m\n"); - return 1; - } - - m = (pthread_mutex_t *) (((uintptr_t) mem + __alignof (pthread_mutex_t) - 1) - & ~(__alignof (pthread_mutex_t) - 1)); - b = (pthread_barrier_t *) (((uintptr_t) (m + 1) - + __alignof (pthread_barrier_t) - 1) - & ~(__alignof (pthread_barrier_t) - 1)); - p = (char *) (b + 1); - - if (pthread_mutexattr_init (&a) != 0) - { - puts ("mutexattr_init failed"); - return 1; - } - - if (pthread_mutexattr_getpshared (&a, &s) != 0) - { - puts ("1st mutexattr_getpshared failed"); - return 1; - } - - if (s != PTHREAD_PROCESS_PRIVATE) - { - puts ("default pshared value wrong"); - return 1; - } - - if (pthread_mutexattr_setpshared (&a, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("mutexattr_setpshared failed"); - return 1; - } - - if (pthread_mutexattr_getpshared (&a, &s) != 0) - { - puts ("2nd mutexattr_getpshared failed"); - return 1; - } - - if (s != PTHREAD_PROCESS_SHARED) - { - puts ("pshared value after setpshared call wrong"); - return 1; - } - -#ifdef ENABLE_PI - if (pthread_mutexattr_setprotocol (&a, PTHREAD_PRIO_INHERIT) != 0) - { - puts ("pthread_mutexattr_setprotocol failed"); - return 1; - } -#endif - - if ((err = pthread_mutex_init (m, &a)) != 0) - { -#ifdef ENABLE_PI - if (err == ENOTSUP) - { - puts ("PI mutexes unsupported"); - return 0; - } -#endif - puts ("mutex_init failed"); - return 1; - } - - if (pthread_mutex_lock (m) != 0) - { - puts ("mutex_lock failed"); - return 1; - } - - if (pthread_mutexattr_destroy (&a) != 0) - { - puts ("mutexattr_destroy failed"); - return 1; - } - - if (pthread_barrierattr_init (&ba) != 0) - { - puts ("barrierattr_init failed"); - return 1; - } - - if (pthread_barrierattr_setpshared (&ba, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("barrierattr_setpshared failed"); - return 1; - } - - if (pthread_barrier_init (b, &ba, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - if (pthread_barrierattr_destroy (&ba) != 0) - { - puts ("barrierattr_destroy failed"); - return 1; - } - - err = pthread_mutex_trylock (m); - if (err == 0) - { - puts ("mutex_trylock succeeded"); - return 1; - } - else if (err != EBUSY) - { - puts ("mutex_trylock didn't return EBUSY"); - return 1; - } - - *p = 0; - - if (pthread_mutex_unlock (m) != 0) - { - puts ("parent: 1st mutex_unlock failed"); - return 1; - } - - puts ("going to fork now"); - pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - return 1; - } - else if (pid == 0) - { - if (pthread_mutex_lock (m) != 0) - { - puts ("child: mutex_lock failed"); - return 1; - } - - int e = pthread_barrier_wait (b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("child: barrier_wait failed"); - return 1; - } - - if ((*p)++ != 0) - { - puts ("child: *p != 0"); - return 1; - } - - if (pthread_mutex_unlock (m) != 0) - { - puts ("child: mutex_unlock failed"); - return 1; - } - - puts ("child done"); - } - else - { - int e = pthread_barrier_wait (b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("parent: barrier_wait failed"); - return 1; - } - - if (pthread_mutex_lock (m) != 0) - { - puts ("parent: 2nd mutex_lock failed"); - return 1; - } - - if (*p != 1) - { - puts ("*p != 1"); - return 1; - } - - if (pthread_mutex_unlock (m) != 0) - { - puts ("parent: 2nd mutex_unlock failed"); - return 1; - } - - if (pthread_mutex_destroy (m) != 0) - { - puts ("mutex_destroy failed"); - return 1; - } - - if (pthread_barrier_destroy (b) != 0) - { - puts ("barrier_destroy failed"); - return 1; - } - - puts ("parent done"); - } - - return 0; -} - -#define TIMEOUT 4 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-mutex5.c b/nptl/tst-mutex5.c deleted file mode 100644 index 3aedf274b9..0000000000 --- a/nptl/tst-mutex5.c +++ /dev/null @@ -1,203 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <time.h> -#include <unistd.h> -#include <sys/time.h> -#include <stdint.h> -#include <config.h> - - -#ifndef TYPE -# define TYPE PTHREAD_MUTEX_NORMAL -#endif - - -static int -do_test (void) -{ - pthread_mutex_t m; - struct timespec ts; - struct timeval tv; - struct timeval tv2; - int err; - pthread_mutexattr_t a; - - if (pthread_mutexattr_init (&a) != 0) - { - puts ("mutexattr_init failed"); - return 1; - } - - if (pthread_mutexattr_settype (&a, TYPE) != 0) - { - puts ("mutexattr_settype failed"); - return 1; - } - -#ifdef ENABLE_PI - if (pthread_mutexattr_setprotocol (&a, PTHREAD_PRIO_INHERIT) != 0) - { - puts ("pthread_mutexattr_setprotocol failed"); - return 1; - } -#endif - - err = pthread_mutex_init (&m, &a); - if (err != 0) - { -#ifdef ENABLE_PI - if (err == ENOTSUP) - { - puts ("PI mutexes unsupported"); - return 0; - } -#endif - puts ("mutex_init failed"); - return 1; - } - - if (pthread_mutexattr_destroy (&a) != 0) - { - puts ("mutexattr_destroy failed"); - return 1; - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("mutex_lock failed"); - return 1; - } - - if (pthread_mutex_trylock (&m) == 0) - { - puts ("mutex_trylock succeeded"); - return 1; - } - - gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); - - ts.tv_sec += 2; /* Wait 2 seconds. */ - - err = pthread_mutex_timedlock (&m, &ts); - if (err == 0) - { - puts ("timedlock succeeded"); - return 1; - } - else if (err != ETIMEDOUT) - { - printf ("timedlock error != ETIMEDOUT: %d\n", err); - return 1; - } - else - { - int clk_tck = sysconf (_SC_CLK_TCK); - - gettimeofday (&tv2, NULL); - - tv2.tv_sec -= tv.tv_sec; - tv2.tv_usec -= tv.tv_usec; - if (tv2.tv_usec < 0) - { - tv2.tv_usec += 1000000; - tv2.tv_sec -= 1; - } - - /* Be a bit tolerant, add one CLK_TCK. */ - tv2.tv_usec += 1000000 / clk_tck; - if (tv2.tv_usec >= 1000000) - { - tv2.tv_usec -= 1000000; - ++tv2.tv_sec; - } - - if (tv2.tv_sec < 2) - { - printf ("premature timeout: %jd.%06jd difference\n", - (intmax_t) tv2.tv_sec, (intmax_t) tv2.tv_usec); - return 1; - } - } - - (void) gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); - - ts.tv_sec += 2; /* Wait 2 seconds. */ - /* The following makes the ts value invalid. */ - ts.tv_nsec += 1000000000; - - err = pthread_mutex_timedlock (&m, &ts); - if (err == 0) - { - puts ("2nd timedlock succeeded"); - return 1; - } - else if (err != EINVAL) - { - printf ("2nd timedlock error != EINVAL: %d\n", err); - return 1; - } - - if (pthread_mutex_unlock (&m) != 0) - { - puts ("mutex_unlock failed"); - return 1; - } - - (void) gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); - - ts.tv_sec += 2; /* Wait 2 seconds. */ - if (pthread_mutex_timedlock (&m, &ts) != 0) - { - puts ("3rd timedlock failed"); - } - - (void) gettimeofday (&tv2, NULL); - - /* Check that timedlock didn't delay. We use a limit of 0.1 secs. */ - timersub (&tv2, &tv, &tv2); - if (tv2.tv_sec > 0 || tv2.tv_usec > 100000) - { - puts ("3rd timedlock didn't return right away"); - return 1; - } - - if (pthread_mutex_unlock (&m) != 0) - { - puts ("final mutex_unlock failed"); - return 1; - } - - if (pthread_mutex_destroy (&m) != 0) - { - puts ("mutex_destroy failed"); - return 1; - } - - return 0; -} - -#define TIMEOUT 4 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-mutex5a.c b/nptl/tst-mutex5a.c deleted file mode 100644 index f91eec0d7d..0000000000 --- a/nptl/tst-mutex5a.c +++ /dev/null @@ -1,2 +0,0 @@ -#define TYPE PTHREAD_MUTEX_ADAPTIVE_NP -#include "tst-mutex5.c" diff --git a/nptl/tst-mutex6.c b/nptl/tst-mutex6.c deleted file mode 100644 index 340a42a325..0000000000 --- a/nptl/tst-mutex6.c +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <unistd.h> -#include <errno.h> -#include <stdbool.h> - -#ifndef TEST_FUNCTION -static int do_test (void); -# define TEST_FUNCTION do_test () -#endif -#include "../test-skeleton.c" - -#ifndef ATTR -pthread_mutexattr_t *attr; -# define ATTR attr -#endif - -#ifndef ATTR_NULL -# define ATTR_NULL (ATTR == NULL) -#endif - -static int -do_test (void) -{ - pthread_mutex_t m; - - int e = pthread_mutex_init (&m, ATTR); - if (!ATTR_NULL && e == ENOTSUP) - { - puts ("cannot support selected type of mutexes"); - e = pthread_mutex_init (&m, NULL); - } - if (e != 0) - { - puts ("mutex_init failed"); - return 1; - } - - if (!ATTR_NULL && pthread_mutexattr_destroy (ATTR) != 0) - { - puts ("mutexattr_destroy failed"); - return 1; - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("1st mutex_lock failed"); - return 1; - } - - delayed_exit (1); - /* This call should never return. */ - xpthread_mutex_lock (&m); - - puts ("2nd mutex_lock returned"); - return 1; -} diff --git a/nptl/tst-mutex7.c b/nptl/tst-mutex7.c deleted file mode 100644 index a11afdba5e..0000000000 --- a/nptl/tst-mutex7.c +++ /dev/null @@ -1,164 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> - - -#ifndef TYPE -# define TYPE PTHREAD_MUTEX_DEFAULT -#endif - - -static pthread_mutex_t lock; - - -#define ROUNDS 1000 -#define N 100 - - -static void * -tf (void *arg) -{ - int nr = (long int) arg; - int cnt; - struct timespec ts = { .tv_sec = 0, .tv_nsec = 11000 }; - - for (cnt = 0; cnt < ROUNDS; ++cnt) - { - if (pthread_mutex_lock (&lock) != 0) - { - printf ("thread %d: failed to get the lock\n", nr); - return (void *) 1l; - } - - if (pthread_mutex_unlock (&lock) != 0) - { - printf ("thread %d: failed to release the lock\n", nr); - return (void *) 1l; - } - - nanosleep (&ts, NULL); - } - - return NULL; -} - - -static int -do_test (void) -{ - pthread_mutexattr_t a; - - if (pthread_mutexattr_init (&a) != 0) - { - puts ("mutexattr_init failed"); - exit (1); - } - - if (pthread_mutexattr_settype (&a, TYPE) != 0) - { - puts ("mutexattr_settype failed"); - exit (1); - } - -#ifdef ENABLE_PI - if (pthread_mutexattr_setprotocol (&a, PTHREAD_PRIO_INHERIT) != 0) - { - puts ("pthread_mutexattr_setprotocol failed"); - return 1; - } -#endif - - int e = pthread_mutex_init (&lock, &a); - if (e != 0) - { -#ifdef ENABLE_PI - if (e == ENOTSUP) - { - puts ("PI mutexes unsupported"); - return 0; - } -#endif - puts ("mutex_init failed"); - return 1; - } - - if (pthread_mutexattr_destroy (&a) != 0) - { - puts ("mutexattr_destroy failed"); - return 1; - } - - pthread_attr_t at; - pthread_t th[N]; - int cnt; - - if (pthread_attr_init (&at) != 0) - { - puts ("attr_init failed"); - return 1; - } - - if (pthread_attr_setstacksize (&at, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - if (pthread_mutex_lock (&lock) != 0) - { - puts ("locking in parent failed"); - return 1; - } - - for (cnt = 0; cnt < N; ++cnt) - if (pthread_create (&th[cnt], &at, tf, (void *) (long int) cnt) != 0) - { - printf ("creating thread %d failed\n", cnt); - return 1; - } - - if (pthread_attr_destroy (&at) != 0) - { - puts ("attr_destroy failed"); - return 1; - } - - if (pthread_mutex_unlock (&lock) != 0) - { - puts ("unlocking in parent failed"); - return 1; - } - - for (cnt = 0; cnt < N; ++cnt) - if (pthread_join (th[cnt], NULL) != 0) - { - printf ("joining thread %d failed\n", cnt); - return 1; - } - - return 0; -} - -#define TIMEOUT 60 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-mutex7a.c b/nptl/tst-mutex7a.c deleted file mode 100644 index 30d46b81af..0000000000 --- a/nptl/tst-mutex7a.c +++ /dev/null @@ -1,2 +0,0 @@ -#define TYPE PTHREAD_MUTEX_ADAPTIVE_NP -#include "tst-mutex7.c" diff --git a/nptl/tst-mutex8-static.c b/nptl/tst-mutex8-static.c deleted file mode 100644 index d69ed49ad0..0000000000 --- a/nptl/tst-mutex8-static.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-mutex8.c" diff --git a/nptl/tst-mutex8.c b/nptl/tst-mutex8.c deleted file mode 100644 index 1d288d243c..0000000000 --- a/nptl/tst-mutex8.c +++ /dev/null @@ -1,403 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* This test checks behavior not required by POSIX. */ -#include <errno.h> -#include <pthread.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> - - -static pthread_mutex_t *m; -static pthread_barrier_t b; -static pthread_cond_t c; -static bool done; - - -static void -cl (void *arg) -{ - if (pthread_mutex_unlock (m) != 0) - { - puts ("cl: mutex_unlocked failed"); - exit (1); - } -} - - -static void * -tf (void *arg) -{ - if (pthread_mutex_lock (m) != 0) - { - puts ("tf: mutex_lock failed"); - return (void *) 1l; - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - return (void *) 1l; - } - - if (arg == NULL) - do - if (pthread_cond_wait (&c, m) != 0) - { - puts ("tf: cond_wait failed"); - return (void *) 1l; - } - while (! done); - else - do - { - pthread_cleanup_push (cl, NULL); - - if (pthread_cond_wait (&c, m) != 0) - { - puts ("tf: cond_wait failed"); - return (void *) 1l; - } - - pthread_cleanup_pop (0); - } - while (! done); - - if (pthread_mutex_unlock (m) != 0) - { - puts ("tf: mutex_unlock failed"); - return (void *) 1l; - } - - return NULL; -} - - -static int -check_type (const char *mas, pthread_mutexattr_t *ma) -{ - int e; - - e = pthread_mutex_init (m, ma); - if (e != 0) - { -#ifdef ENABLE_PI - if (e == ENOTSUP) - { - puts ("PI mutexes unsupported"); - return 0; - } -#endif - printf ("1st mutex_init failed for %s\n", mas); - return 1; - } - - if (pthread_mutex_destroy (m) != 0) - { - printf ("immediate mutex_destroy failed for %s\n", mas); - return 1; - } - - if (pthread_mutex_init (m, ma) != 0) - { - printf ("2nd mutex_init failed for %s\n", mas); - return 1; - } - - if (pthread_mutex_lock (m) != 0) - { - printf ("1st mutex_lock failed for %s\n", mas); - return 1; - } - - /* Elided mutexes don't fail destroy. If elision is not explicitly disabled - we don't know, so can also not check this. */ -#ifndef ENABLE_LOCK_ELISION - e = pthread_mutex_destroy (m); - if (e == 0) - { - printf ("mutex_destroy of self-locked mutex succeeded for %s\n", mas); - return 1; - } - if (e != EBUSY) - { - printf ("mutex_destroy of self-locked mutex did not return EBUSY %s\n", - mas); - return 1; - } -#endif - - if (pthread_mutex_unlock (m) != 0) - { - printf ("1st mutex_unlock failed for %s\n", mas); - return 1; - } - - if (pthread_mutex_trylock (m) != 0) - { - printf ("mutex_trylock failed for %s\n", mas); - return 1; - } - - /* Elided mutexes don't fail destroy. */ -#ifndef ENABLE_LOCK_ELISION - e = pthread_mutex_destroy (m); - if (e == 0) - { - printf ("mutex_destroy of self-trylocked mutex succeeded for %s\n", mas); - return 1; - } - if (e != EBUSY) - { - printf ("\ -mutex_destroy of self-trylocked mutex did not return EBUSY %s\n", - mas); - return 1; - } -#endif - - if (pthread_mutex_unlock (m) != 0) - { - printf ("2nd mutex_unlock failed for %s\n", mas); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("1st create failed"); - return 1; - } - done = false; - - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("1st barrier_wait failed"); - return 1; - } - - if (pthread_mutex_lock (m) != 0) - { - printf ("2nd mutex_lock failed for %s\n", mas); - return 1; - } - - if (pthread_mutex_unlock (m) != 0) - { - printf ("3rd mutex_unlock failed for %s\n", mas); - return 1; - } - - /* Elided mutexes don't fail destroy. */ -#ifndef ENABLE_LOCK_ELISION - e = pthread_mutex_destroy (m); - if (e == 0) - { - printf ("mutex_destroy of condvar-used mutex succeeded for %s\n", mas); - return 1; - } - if (e != EBUSY) - { - printf ("\ -mutex_destroy of condvar-used mutex did not return EBUSY for %s\n", mas); - return 1; - } -#endif - - done = true; - if (pthread_cond_signal (&c) != 0) - { - puts ("cond_signal failed"); - return 1; - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("join failed"); - return 1; - } - if (r != NULL) - { - puts ("thread didn't return NULL"); - return 1; - } - - if (pthread_mutex_destroy (m) != 0) - { - printf ("mutex_destroy after condvar-use failed for %s\n", mas); - return 1; - } - - if (pthread_mutex_init (m, ma) != 0) - { - printf ("3rd mutex_init failed for %s\n", mas); - return 1; - } - - if (pthread_create (&th, NULL, tf, (void *) 1) != 0) - { - puts ("2nd create failed"); - return 1; - } - done = false; - - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("2nd barrier_wait failed"); - return 1; - } - - if (pthread_mutex_lock (m) != 0) - { - printf ("3rd mutex_lock failed for %s\n", mas); - return 1; - } - - if (pthread_mutex_unlock (m) != 0) - { - printf ("4th mutex_unlock failed for %s\n", mas); - return 1; - } - - /* Elided mutexes don't fail destroy. */ -#ifndef ENABLE_LOCK_ELISION - e = pthread_mutex_destroy (m); - if (e == 0) - { - printf ("2nd mutex_destroy of condvar-used mutex succeeded for %s\n", - mas); - return 1; - } - if (e != EBUSY) - { - printf ("\ -2nd mutex_destroy of condvar-used mutex did not return EBUSY for %s\n", - mas); - return 1; - } -#endif - - if (pthread_cancel (th) != 0) - { - puts ("cond_cancel failed"); - return 1; - } - - if (pthread_join (th, &r) != 0) - { - puts ("join failed"); - return 1; - } - if (r != PTHREAD_CANCELED) - { - puts ("thread not canceled"); - return 1; - } - - if (pthread_mutex_destroy (m) != 0) - { - printf ("mutex_destroy after condvar-canceled failed for %s\n", mas); - return 1; - } - - return 0; -} - - -static int -do_test (void) -{ - pthread_mutex_t mm; - m = &mm; - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - if (pthread_cond_init (&c, NULL) != 0) - { - puts ("cond_init failed"); - return 1; - } - - puts ("check normal mutex"); - int res = check_type ("normal", NULL); - - pthread_mutexattr_t ma; - if (pthread_mutexattr_init (&ma) != 0) - { - puts ("1st mutexattr_init failed"); - return 1; - } - if (pthread_mutexattr_settype (&ma, PTHREAD_MUTEX_RECURSIVE) != 0) - { - puts ("1st mutexattr_settype failed"); - return 1; - } -#ifdef ENABLE_PI - if (pthread_mutexattr_setprotocol (&ma, PTHREAD_PRIO_INHERIT)) - { - puts ("1st pthread_mutexattr_setprotocol failed"); - return 1; - } -#endif - puts ("check recursive mutex"); - res |= check_type ("recursive", &ma); - if (pthread_mutexattr_destroy (&ma) != 0) - { - puts ("1st mutexattr_destroy failed"); - return 1; - } - - if (pthread_mutexattr_init (&ma) != 0) - { - puts ("2nd mutexattr_init failed"); - return 1; - } - if (pthread_mutexattr_settype (&ma, PTHREAD_MUTEX_ERRORCHECK) != 0) - { - puts ("2nd mutexattr_settype failed"); - return 1; - } -#ifdef ENABLE_PI - if (pthread_mutexattr_setprotocol (&ma, PTHREAD_PRIO_INHERIT)) - { - puts ("2nd pthread_mutexattr_setprotocol failed"); - return 1; - } -#endif - puts ("check error-checking mutex"); - res |= check_type ("error-checking", &ma); - if (pthread_mutexattr_destroy (&ma) != 0) - { - puts ("2nd mutexattr_destroy failed"); - return 1; - } - - return res; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-mutex9.c b/nptl/tst-mutex9.c deleted file mode 100644 index 20ec63e924..0000000000 --- a/nptl/tst-mutex9.c +++ /dev/null @@ -1,202 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/time.h> -#include <sys/wait.h> - - -static int -do_test (void) -{ - size_t ps = sysconf (_SC_PAGESIZE); - char tmpfname[] = "/tmp/tst-mutex9.XXXXXX"; - char data[ps]; - void *mem; - int fd; - pthread_mutex_t *m; - pthread_mutexattr_t a; - pid_t pid; - - fd = mkstemp (tmpfname); - if (fd == -1) - { - printf ("cannot open temporary file: %m\n"); - return 1; - } - - /* Make sure it is always removed. */ - unlink (tmpfname); - - /* Create one page of data. */ - memset (data, '\0', ps); - - /* Write the data to the file. */ - if (write (fd, data, ps) != (ssize_t) ps) - { - puts ("short write"); - return 1; - } - - mem = mmap (NULL, ps, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (mem == MAP_FAILED) - { - printf ("mmap failed: %m\n"); - return 1; - } - - m = (pthread_mutex_t *) (((uintptr_t) mem + __alignof (pthread_mutex_t)) - & ~(__alignof (pthread_mutex_t) - 1)); - - if (pthread_mutexattr_init (&a) != 0) - { - puts ("mutexattr_init failed"); - return 1; - } - - if (pthread_mutexattr_setpshared (&a, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("mutexattr_setpshared failed"); - return 1; - } - - if (pthread_mutexattr_settype (&a, PTHREAD_MUTEX_RECURSIVE) != 0) - { - puts ("mutexattr_settype failed"); - return 1; - } - -#ifdef ENABLE_PI - if (pthread_mutexattr_setprotocol (&a, PTHREAD_PRIO_INHERIT) != 0) - { - puts ("pthread_mutexattr_setprotocol failed"); - return 1; - } -#endif - - int e; - if ((e = pthread_mutex_init (m, &a)) != 0) - { -#ifdef ENABLE_PI - if (e == ENOTSUP) - { - puts ("PI mutexes unsupported"); - return 0; - } -#endif - puts ("mutex_init failed"); - return 1; - } - - if (pthread_mutex_lock (m) != 0) - { - puts ("mutex_lock failed"); - return 1; - } - - if (pthread_mutexattr_destroy (&a) != 0) - { - puts ("mutexattr_destroy failed"); - return 1; - } - - puts ("going to fork now"); - pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - return 1; - } - else if (pid == 0) - { - if (pthread_mutex_trylock (m) == 0) - { - puts ("child: mutex_trylock succeeded"); - exit (1); - } - - if (pthread_mutex_unlock (m) == 0) - { - puts ("child: mutex_unlock succeeded"); - exit (1); - } - - struct timeval tv; - gettimeofday (&tv, NULL); - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_nsec += 500000000; - if (ts.tv_nsec >= 1000000000) - { - ++ts.tv_sec; - ts.tv_nsec -= 1000000000; - } - - e = pthread_mutex_timedlock (m, &ts); - if (e == 0) - { - puts ("child: mutex_timedlock succeeded"); - exit (1); - } - if (e != ETIMEDOUT) - { - puts ("child: mutex_timedlock didn't time out"); - exit (1); - } - - alarm (1); - - pthread_mutex_lock (m); - - puts ("child: mutex_lock returned"); - - exit (0); - } - - sleep (2); - - int status; - if (TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)) != pid) - { - puts ("waitpid failed"); - return 1; - } - if (! WIFSIGNALED (status)) - { - puts ("child not killed by signal"); - return 1; - } - if (WTERMSIG (status) != SIGALRM) - { - puts ("child not killed by SIGALRM"); - return 1; - } - - return 0; -} - -#define TIMEOUT 3 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-mutexpi1.c b/nptl/tst-mutexpi1.c deleted file mode 100644 index d768664d02..0000000000 --- a/nptl/tst-mutexpi1.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - - -static pthread_mutexattr_t a; - -static void -prepare (void) -{ - if (pthread_mutexattr_init (&a) != 0) - { - puts ("mutexattr_init failed"); - exit (1); - } - - if (pthread_mutexattr_setprotocol (&a, PTHREAD_PRIO_INHERIT) != 0) - { - puts ("mutexattr_setprotocol failed"); - exit (1); - } -} -#define PREPARE(argc, argv) prepare () - - -#define ATTR &a -#define ATTR_NULL false -#include "tst-mutex1.c" diff --git a/nptl/tst-mutexpi2.c b/nptl/tst-mutexpi2.c deleted file mode 100644 index fbe48716fd..0000000000 --- a/nptl/tst-mutexpi2.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-mutex2.c" diff --git a/nptl/tst-mutexpi3.c b/nptl/tst-mutexpi3.c deleted file mode 100644 index e338ebfff9..0000000000 --- a/nptl/tst-mutexpi3.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-mutex3.c" diff --git a/nptl/tst-mutexpi4.c b/nptl/tst-mutexpi4.c deleted file mode 100644 index 177b17b475..0000000000 --- a/nptl/tst-mutexpi4.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-mutex4.c" diff --git a/nptl/tst-mutexpi5.c b/nptl/tst-mutexpi5.c deleted file mode 100644 index 287465c23f..0000000000 --- a/nptl/tst-mutexpi5.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-mutex5.c" diff --git a/nptl/tst-mutexpi5a.c b/nptl/tst-mutexpi5a.c deleted file mode 100644 index 2f85c94ff3..0000000000 --- a/nptl/tst-mutexpi5a.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-mutex5a.c" diff --git a/nptl/tst-mutexpi6.c b/nptl/tst-mutexpi6.c deleted file mode 100644 index 8881a1d2c0..0000000000 --- a/nptl/tst-mutexpi6.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - - -pthread_mutexattr_t a; -pthread_mutexattr_t *attr; - -static void -prepare (void) -{ - attr = &a; - if (pthread_mutexattr_init (&a) != 0) - { - puts ("mutexattr_init failed"); - exit (1); - } - - if (pthread_mutexattr_setprotocol (&a, PTHREAD_PRIO_INHERIT) != 0) - { - puts ("mutexattr_setprotocol failed"); - exit (1); - } -} -#define PREPARE(argc, argv) prepare () - - -#define ATTR attr -#include "tst-mutex6.c" diff --git a/nptl/tst-mutexpi7.c b/nptl/tst-mutexpi7.c deleted file mode 100644 index 1e7e929380..0000000000 --- a/nptl/tst-mutexpi7.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-mutex7.c" diff --git a/nptl/tst-mutexpi7a.c b/nptl/tst-mutexpi7a.c deleted file mode 100644 index c59083cf6e..0000000000 --- a/nptl/tst-mutexpi7a.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-mutex7a.c" diff --git a/nptl/tst-mutexpi8-static.c b/nptl/tst-mutexpi8-static.c deleted file mode 100644 index 869e6df95c..0000000000 --- a/nptl/tst-mutexpi8-static.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-mutexpi8.c" diff --git a/nptl/tst-mutexpi8.c b/nptl/tst-mutexpi8.c deleted file mode 100644 index cea60309a8..0000000000 --- a/nptl/tst-mutexpi8.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-mutex8.c" diff --git a/nptl/tst-mutexpi9.c b/nptl/tst-mutexpi9.c deleted file mode 100644 index 3710d9e080..0000000000 --- a/nptl/tst-mutexpi9.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-mutex9.c" diff --git a/nptl/tst-mutexpp1.c b/nptl/tst-mutexpp1.c deleted file mode 100644 index 8ec4673f1a..0000000000 --- a/nptl/tst-mutexpp1.c +++ /dev/null @@ -1,46 +0,0 @@ -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - -#include "tst-tpp.h" - -static pthread_mutexattr_t a; - -static void -prepare (void) -{ - init_tpp_test (); - - if (pthread_mutexattr_init (&a) != 0) - { - puts ("mutexattr_init failed"); - exit (1); - } - - if (pthread_mutexattr_setprotocol (&a, PTHREAD_PRIO_PROTECT) != 0) - { - puts ("mutexattr_setprotocol failed"); - exit (1); - } - - if (pthread_mutexattr_setprioceiling (&a, 6) != 0) - { - puts ("mutexattr_setprioceiling failed"); - exit (1); - } -} -#define PREPARE(argc, argv) prepare () - -static int do_test (void); - -static int -do_test_wrapper (void) -{ - init_tpp_test (); - return do_test (); -} -#define TEST_FUNCTION do_test_wrapper () - -#define ATTR &a -#define ATTR_NULL false -#include "tst-mutex1.c" diff --git a/nptl/tst-mutexpp10.c b/nptl/tst-mutexpp10.c deleted file mode 100644 index b831ae6eb0..0000000000 --- a/nptl/tst-mutexpp10.c +++ /dev/null @@ -1,333 +0,0 @@ -/* Copyright (C) 2006-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2006. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <limits.h> -#include <pthread.h> -#include <sched.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include "tst-tpp.h" - -static int -do_test (void) -{ - int ret = 0; - - init_tpp_test (); - - pthread_mutexattr_t ma; - if (pthread_mutexattr_init (&ma)) - { - puts ("mutexattr_init failed"); - return 1; - } - if (pthread_mutexattr_setprotocol (&ma, PTHREAD_PRIO_PROTECT)) - { - puts ("mutexattr_setprotocol failed"); - return 1; - } - - int prioceiling; - if (pthread_mutexattr_getprioceiling (&ma, &prioceiling)) - { - puts ("mutexattr_getprioceiling failed"); - return 1; - } - - if (prioceiling < fifo_min || prioceiling > fifo_max) - { - printf ("prioceiling %d not in %d..%d range\n", - prioceiling, fifo_min, fifo_max); - return 1; - } - - if (fifo_max < INT_MAX - && pthread_mutexattr_setprioceiling (&ma, fifo_max + 1) != EINVAL) - { - printf ("mutexattr_setprioceiling %d did not fail with EINVAL\n", - fifo_max + 1); - return 1; - } - - if (fifo_min > 0 - && pthread_mutexattr_setprioceiling (&ma, fifo_min - 1) != EINVAL) - { - printf ("mutexattr_setprioceiling %d did not fail with EINVAL\n", - fifo_min - 1); - return 1; - } - - if (pthread_mutexattr_setprioceiling (&ma, fifo_min)) - { - puts ("mutexattr_setprioceiling failed"); - return 1; - } - - if (pthread_mutexattr_setprioceiling (&ma, fifo_max)) - { - puts ("mutexattr_setprioceiling failed"); - return 1; - } - - if (pthread_mutexattr_setprioceiling (&ma, 6)) - { - puts ("mutexattr_setprioceiling failed"); - return 1; - } - - if (pthread_mutexattr_getprioceiling (&ma, &prioceiling)) - { - puts ("mutexattr_getprioceiling failed"); - return 1; - } - - if (prioceiling != 6) - { - printf ("mutexattr_getprioceiling returned %d != 6\n", - prioceiling); - return 1; - } - - pthread_mutex_t m1, m2, m3; - int e = pthread_mutex_init (&m1, &ma); - if (e == ENOTSUP) - { - puts ("cannot support selected type of mutexes"); - return 0; - } - else if (e != 0) - { - puts ("mutex_init failed"); - return 1; - } - - if (pthread_mutexattr_setprioceiling (&ma, 8)) - { - puts ("mutexattr_setprioceiling failed"); - return 1; - } - - if (pthread_mutex_init (&m2, &ma)) - { - puts ("mutex_init failed"); - return 1; - } - - if (pthread_mutexattr_setprioceiling (&ma, 5)) - { - puts ("mutexattr_setprioceiling failed"); - return 1; - } - - if (pthread_mutex_init (&m3, &ma)) - { - puts ("mutex_init failed"); - return 1; - } - - CHECK_TPP_PRIORITY (4, 4); - - if (pthread_mutex_lock (&m1) != 0) - { - puts ("mutex_lock failed"); - return 1; - } - - CHECK_TPP_PRIORITY (4, 6); - - if (pthread_mutex_trylock (&m2) != 0) - { - puts ("mutex_lock failed"); - return 1; - } - - CHECK_TPP_PRIORITY (4, 8); - - if (pthread_mutex_lock (&m3) != 0) - { - puts ("mutex_lock failed"); - return 1; - } - - CHECK_TPP_PRIORITY (4, 8); - - if (pthread_mutex_unlock (&m2) != 0) - { - puts ("mutex_unlock failed"); - return 1; - } - - CHECK_TPP_PRIORITY (4, 6); - - if (pthread_mutex_unlock (&m1) != 0) - { - puts ("mutex_unlock failed"); - return 1; - } - - CHECK_TPP_PRIORITY (4, 5); - - if (pthread_mutex_lock (&m2) != 0) - { - puts ("mutex_lock failed"); - return 1; - } - - CHECK_TPP_PRIORITY (4, 8); - - if (pthread_mutex_unlock (&m2) != 0) - { - puts ("mutex_unlock failed"); - return 1; - } - - CHECK_TPP_PRIORITY (4, 5); - - if (pthread_mutex_getprioceiling (&m1, &prioceiling)) - { - puts ("mutex_getprioceiling m1 failed"); - return 1; - } - else if (prioceiling != 6) - { - printf ("unexpected m1 prioceiling %d != 6\n", prioceiling); - return 1; - } - - if (pthread_mutex_getprioceiling (&m2, &prioceiling)) - { - puts ("mutex_getprioceiling m2 failed"); - return 1; - } - else if (prioceiling != 8) - { - printf ("unexpected m2 prioceiling %d != 8\n", prioceiling); - return 1; - } - - if (pthread_mutex_getprioceiling (&m3, &prioceiling)) - { - puts ("mutex_getprioceiling m3 failed"); - return 1; - } - else if (prioceiling != 5) - { - printf ("unexpected m3 prioceiling %d != 5\n", prioceiling); - return 1; - } - - if (pthread_mutex_setprioceiling (&m1, 7, &prioceiling)) - { - printf ("mutex_setprioceiling failed"); - return 1; - } - else if (prioceiling != 6) - { - printf ("unexpected m1 old prioceiling %d != 6\n", prioceiling); - return 1; - } - - if (pthread_mutex_getprioceiling (&m1, &prioceiling)) - { - puts ("mutex_getprioceiling m1 failed"); - return 1; - } - else if (prioceiling != 7) - { - printf ("unexpected m1 prioceiling %d != 7\n", prioceiling); - return 1; - } - - CHECK_TPP_PRIORITY (4, 5); - - if (pthread_mutex_unlock (&m3) != 0) - { - puts ("mutex_unlock failed"); - return 1; - } - - CHECK_TPP_PRIORITY (4, 4); - - if (pthread_mutex_trylock (&m1) != 0) - { - puts ("mutex_lock failed"); - return 1; - } - - CHECK_TPP_PRIORITY (4, 7); - - struct sched_param sp; - memset (&sp, 0, sizeof (sp)); - sp.sched_priority = 8; - if (pthread_setschedparam (pthread_self (), SCHED_FIFO, &sp)) - { - puts ("cannot set scheduling params"); - return 1; - } - - CHECK_TPP_PRIORITY (8, 8); - - if (pthread_mutex_unlock (&m1) != 0) - { - puts ("mutex_unlock failed"); - return 1; - } - - CHECK_TPP_PRIORITY (8, 8); - - if (pthread_mutex_lock (&m3) != EINVAL) - { - puts ("pthread_mutex_lock didn't fail with EINVAL"); - return 1; - } - - CHECK_TPP_PRIORITY (8, 8); - - if (pthread_mutex_destroy (&m1) != 0) - { - puts ("mutex_destroy failed"); - return 1; - } - - if (pthread_mutex_destroy (&m2) != 0) - { - puts ("mutex_destroy failed"); - return 1; - } - - if (pthread_mutex_destroy (&m3) != 0) - { - puts ("mutex_destroy failed"); - return 1; - } - - if (pthread_mutexattr_destroy (&ma) != 0) - { - puts ("mutexattr_destroy failed"); - return 1; - } - - return ret; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-mutexpp6.c b/nptl/tst-mutexpp6.c deleted file mode 100644 index 87a6ebd74c..0000000000 --- a/nptl/tst-mutexpp6.c +++ /dev/null @@ -1,46 +0,0 @@ -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - -#include "tst-tpp.h" - -static pthread_mutexattr_t a; - -static void -prepare (void) -{ - init_tpp_test (); - - if (pthread_mutexattr_init (&a) != 0) - { - puts ("mutexattr_init failed"); - exit (1); - } - - if (pthread_mutexattr_setprotocol (&a, PTHREAD_PRIO_PROTECT) != 0) - { - puts ("mutexattr_setprotocol failed"); - exit (1); - } - - if (pthread_mutexattr_setprioceiling (&a, 6) != 0) - { - puts ("mutexattr_setprioceiling failed"); - exit (1); - } -} -#define PREPARE(argc, argv) prepare () - -static int do_test (void); - -static int -do_test_wrapper (void) -{ - init_tpp_test (); - return do_test (); -} -#define TEST_FUNCTION do_test_wrapper () - -#define ATTR &a -#define ATTR_NULL false -#include "tst-mutex6.c" diff --git a/nptl/tst-oddstacklimit.c b/nptl/tst-oddstacklimit.c deleted file mode 100644 index 8834e49d7d..0000000000 --- a/nptl/tst-oddstacklimit.c +++ /dev/null @@ -1,73 +0,0 @@ -/* Test NPTL with stack limit that is not a multiple of the page size. - Copyright (C) 2012-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdio.h> -#include <string.h> -#include <sys/resource.h> -#include <sys/wait.h> -#include <stdlib.h> - -/* This sets the stack resource limit to 1023kb, which is not a multiple - of the page size since every architecture's page size is > 1k. */ -#ifndef ODD_STACK_LIMIT -# define ODD_STACK_LIMIT (1023 * 1024) -#endif - -static const char *command; - -static int -do_test (void) -{ - int ret; - struct rlimit rlim; - - ret = getrlimit (RLIMIT_STACK, &rlim); - if (ret != 0) - { - printf ("getrlimit failed: %s\n", strerror (errno)); - return 1; - } - rlim.rlim_cur = ODD_STACK_LIMIT; - ret = setrlimit (RLIMIT_STACK, &rlim); - if (ret != 0) - { - printf ("setrlimit failed: %s\n", strerror (errno)); - return 1; - } - ret = system (command); - if (ret == -1) - { - printf ("system failed: %s\n", strerror (errno)); - return 1; - } - if (WIFEXITED (ret)) - return WEXITSTATUS (ret); - else - return 1; -} - -#define OPT_COMMAND 10000 -#define CMDLINE_OPTIONS \ - { "command", required_argument, NULL, OPT_COMMAND }, -#define CMDLINE_PROCESS \ - case OPT_COMMAND: \ - command = optarg; \ - break; -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-once1.c b/nptl/tst-once1.c deleted file mode 100644 index fdfb037f6f..0000000000 --- a/nptl/tst-once1.c +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> - - -static pthread_once_t once = PTHREAD_ONCE_INIT; - -static int global; - -static void -once_handler (void) -{ - ++global; -} - - -static int -do_test (void) -{ - pthread_once (&once, once_handler); - pthread_once (&once, once_handler); - - if (global != 1) - { - printf ("global = %d, expected 1\n", global); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-once2.c b/nptl/tst-once2.c deleted file mode 100644 index 6949358bc8..0000000000 --- a/nptl/tst-once2.c +++ /dev/null @@ -1,103 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> - - -#define N 100 - -static pthread_once_t once = PTHREAD_ONCE_INIT; - -static int global; - -static void -once_handler (void) -{ - struct timespec ts; - - ++global; - - ts.tv_sec = 2; - ts.tv_nsec = 0; - nanosleep (&ts, NULL); -} - - -static void * -tf (void *arg) -{ - pthread_once (&once, once_handler); - - if (global != 1) - { - printf ("thread %ld: global == %d\n", (long int) arg, global); - exit (1); - } - - return NULL; -} - - -static int -do_test (void) -{ - pthread_attr_t at; - pthread_t th[N]; - int cnt; - - if (pthread_attr_init (&at) != 0) - { - puts ("attr_init failed"); - return 1; - } - - if (pthread_attr_setstacksize (&at, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - for (cnt = 0; cnt < N; ++cnt) - if (pthread_create (&th[cnt], &at, tf, (void *) (long int) cnt) != 0) - { - printf ("creation of thread %d failed\n", cnt); - return 1; - } - - if (pthread_attr_destroy (&at) != 0) - { - puts ("attr_destroy failed"); - return 1; - } - - for (cnt = 0; cnt < N; ++cnt) - if (pthread_join (th[cnt], NULL) != 0) - { - printf ("join of thread %d failed\n", cnt); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#define TIMEOUT 4 -#include "../test-skeleton.c" diff --git a/nptl/tst-once3.c b/nptl/tst-once3.c deleted file mode 100644 index 757ad8f12c..0000000000 --- a/nptl/tst-once3.c +++ /dev/null @@ -1,166 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> - - -#define N 100 - -static pthread_once_t once = PTHREAD_ONCE_INIT; - -static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; - -static pthread_barrier_t bar; - -static int global; -static int cl_called; - -static void -once_handler1 (void) -{ - if (pthread_mutex_lock (&mut) != 0) - { - puts ("once_handler1: mutex_lock failed"); - exit (1); - } - puts ("once_handler1: locked"); - - int r = pthread_barrier_wait (&bar); - if (r != 0 && r!= PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("once_handler1: barrier_wait failed"); - exit (1); - } - - puts ("once_handler1: going to wait on cond"); - - pthread_cond_wait (&cond, &mut); - - /* We should never get here. */ - exit (42); -} - -static void -once_handler2 (void) -{ - global = 1; -} - - -static void -cl (void *arg) -{ - cl_called = 1; -} - - -static void * -tf (void *arg) -{ - pthread_cleanup_push (cl, NULL) - - pthread_once (&once, once_handler1); - - pthread_cleanup_pop (0); - - /* We should never get here. */ - puts ("pthread_once in tf returned"); - exit (1); -} - - -static int -do_test (void) -{ - pthread_t th; - - if (pthread_barrier_init (&bar, NULL, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("first create failed"); - return 1; - } - - int r = pthread_barrier_wait (&bar); - if (r != 0 && r!= PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - return 1; - } - - if (pthread_mutex_lock (&mut) != 0) - { - puts ("mutex_lock failed"); - return 1; - } - /* We unlock the mutex so that we catch the case where the pthread_cond_wait - call incorrectly resumes and tries to get the mutex. */ - if (pthread_mutex_unlock (&mut) != 0) - { - puts ("mutex_unlock failed"); - return 1; - } - - /* Cancel the thread. */ - puts ("going to cancel"); - if (pthread_cancel (th) != 0) - { - puts ("cancel failed"); - return 1; - } - - void *result; - pthread_join (th, &result); - if (result != PTHREAD_CANCELED) - { - puts ("join didn't return PTHREAD_CANCELED"); - return 1; - } - puts ("joined successfully"); - - printf ("once = %d\n", *(int *) &once); - - if (cl_called != 1) - { - puts ("cleanup handler not called"); - return 1; - } - - pthread_once (&once, once_handler2); - - if (global != 1) - { - puts ("global still 0"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#define TIMEOUT 4 -#include "../test-skeleton.c" diff --git a/nptl/tst-once4.c b/nptl/tst-once4.c deleted file mode 100644 index 1208e652f6..0000000000 --- a/nptl/tst-once4.c +++ /dev/null @@ -1,201 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <unistd.h> - - -static pthread_once_t once = PTHREAD_ONCE_INIT; - -static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; - -static pthread_barrier_t bar; - -static int global; -static int cl_called; - -static void -once_handler1 (void) -{ - if (pthread_mutex_lock (&mut) != 0) - { - puts ("once_handler1: mutex_lock failed"); - exit (1); - } - - int r = pthread_barrier_wait (&bar); - if (r != 0 && r!= PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("once_handler1: barrier_wait failed"); - exit (1); - } - - pthread_cond_wait (&cond, &mut); - - /* We should never get here. */ -} - - -static void -once_handler2 (void) -{ - global = 1; -} - - -static void -cl (void *arg) -{ - ++cl_called; -} - - -static void * -tf1 (void *arg) -{ - pthread_cleanup_push (cl, NULL); - - pthread_once (&once, once_handler1); - - pthread_cleanup_pop (0); - - /* We should never get here. */ - puts ("pthread_once in tf returned"); - exit (1); -} - - -static void * -tf2 (void *arg) -{ - pthread_cleanup_push (cl, NULL); - - int r = pthread_barrier_wait (&bar); - if (r != 0 && r!= PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("once_handler2: barrier_wait failed"); - exit (1); - } - - pthread_cleanup_pop (0); - - pthread_once (&once, once_handler2); - - return NULL; -} - - -static int -do_test (void) -{ - pthread_t th[2]; - - if (pthread_barrier_init (&bar, NULL, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - if (pthread_create (&th[0], NULL, tf1, NULL) != 0) - { - puts ("first create failed"); - return 1; - } - - int r = pthread_barrier_wait (&bar); - if (r != 0 && r!= PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("first barrier_wait failed"); - return 1; - } - - if (pthread_mutex_lock (&mut) != 0) - { - puts ("mutex_lock failed"); - return 1; - } - /* We unlock the mutex so that we catch the case where the pthread_cond_wait - call incorrectly resumes and tries to get the mutex. */ - if (pthread_mutex_unlock (&mut) != 0) - { - puts ("mutex_unlock failed"); - return 1; - } - - if (pthread_create (&th[1], NULL, tf2, NULL) != 0) - { - puts ("second create failed"); - return 1; - } - - r = pthread_barrier_wait (&bar); - if (r != 0 && r!= PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("second barrier_wait failed"); - return 1; - } - - /* Give the second thread a chance to reach the pthread_once call. */ - sleep (2); - - /* Cancel the thread. */ - if (pthread_cancel (th[0]) != 0) - { - puts ("cancel failed"); - return 1; - } - - void *result; - pthread_join (th[0], &result); - if (result != PTHREAD_CANCELED) - { - puts ("first join didn't return PTHREAD_CANCELED"); - return 1; - } - - puts ("joined first thread"); - - pthread_join (th[1], &result); - if (result != NULL) - { - puts ("second join didn't return PTHREAD_CANCELED"); - return 1; - } - - if (global != 1) - { - puts ("global still 0"); - return 1; - } - - if (cl_called != 1) - { - printf ("cl_called = %d\n", cl_called); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#define TIMEOUT 4 -#include "../test-skeleton.c" diff --git a/nptl/tst-once5.cc b/nptl/tst-once5.cc deleted file mode 100644 index 47d9436596..0000000000 --- a/nptl/tst-once5.cc +++ /dev/null @@ -1,81 +0,0 @@ -/* Copyright (C) 2015-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <string.h> - - -static pthread_once_t once = PTHREAD_ONCE_INIT; - -// Exception type thrown from the pthread_once init routine. -struct OnceException { }; - -// Test iteration counter. -static int niter; - -static void -init_routine (void) -{ - if (niter < 2) - throw OnceException (); -} - -// Verify that an exception thrown from the pthread_once init routine -// is propagated to the pthread_once caller and that the function can -// be subsequently invoked to attempt the initialization again. -static int -do_test (void) -{ - int result = 1; - - // Repeat three times, having the init routine throw the first two - // times and succeed on the final attempt. - for (niter = 0; niter != 3; ++niter) { - - try { - int rc = pthread_once (&once, init_routine); - if (rc) - fprintf (stderr, "pthread_once failed: %i (%s)\n", - rc, strerror (rc)); - - if (niter < 2) - fputs ("pthread_once unexpectedly returned without" - " throwing an exception", stderr); - } - catch (OnceException) { - if (1 < niter) - fputs ("pthread_once unexpectedly threw", stderr); - result = 0; - } - catch (...) { - fputs ("pthread_once threw an unknown exception", stderr); - } - - // Abort the test on the first failure. - if (result) - break; - } - - return result; -} - -// The test currently hangs and is XFAILed. Reduce the timeout. -#define TIMEOUT 1 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-oncex3.c b/nptl/tst-oncex3.c deleted file mode 100644 index 08225b88dc..0000000000 --- a/nptl/tst-oncex3.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-once3.c" diff --git a/nptl/tst-oncex4.c b/nptl/tst-oncex4.c deleted file mode 100644 index 9b4d98f3f1..0000000000 --- a/nptl/tst-oncex4.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-once4.c" diff --git a/nptl/tst-popen1.c b/nptl/tst-popen1.c deleted file mode 100644 index 4aa9273498..0000000000 --- a/nptl/tst-popen1.c +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <error.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -static void * -dummy (void *x) -{ - return NULL; -} - -static char buf[sizeof "something\n"]; - -static int -do_test (void) -{ - FILE *f; - pthread_t p; - int err; - - f = popen ("echo something", "r"); - if (f == NULL) - error (EXIT_FAILURE, errno, "popen failed"); - if (fgets (buf, sizeof (buf), f) == NULL) - error (EXIT_FAILURE, 0, "fgets failed"); - if (strcmp (buf, "something\n")) - error (EXIT_FAILURE, 0, "read wrong data"); - if (pclose (f)) - error (EXIT_FAILURE, errno, "pclose returned non-zero"); - if ((err = pthread_create (&p, NULL, dummy, NULL))) - error (EXIT_FAILURE, err, "pthread_create failed"); - if ((err = pthread_join (p, NULL))) - error (EXIT_FAILURE, err, "pthread_join failed"); - exit (0); -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-pthread-attr-affinity.c b/nptl/tst-pthread-attr-affinity.c deleted file mode 100644 index 634baaa8ce..0000000000 --- a/nptl/tst-pthread-attr-affinity.c +++ /dev/null @@ -1,63 +0,0 @@ -/* Make sure that pthread_attr_getaffinity_np does not crash when the input - cpuset size is smaller than that in the attribute structure. - - Copyright (C) 2013-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <sched.h> -#include <errno.h> -#include <sys/param.h> - - -#define RETURN_IF_FAIL(f, ...) \ - ({ \ - int ret = f (__VA_ARGS__); \ - if (ret != 0) \ - { \ - printf ("%s:%d: %s returned %d (errno = %d)\n", __FILE__, __LINE__, \ - #f, ret, errno); \ - return ret; \ - } \ - }) - -static int -do_test (void) -{ - for (int i = 0; i < 10; i++) - { - pthread_attr_t attr; - cpu_set_t *cpuset = CPU_ALLOC (512); - size_t cpusetsize = CPU_ALLOC_SIZE (512); - CPU_ZERO_S (cpusetsize, cpuset); - - RETURN_IF_FAIL (pthread_attr_init, &attr); - RETURN_IF_FAIL (pthread_attr_setaffinity_np, &attr, cpusetsize, cpuset); - CPU_FREE (cpuset); - - cpuset = CPU_ALLOC (1); - cpusetsize = CPU_ALLOC_SIZE (1); - RETURN_IF_FAIL (pthread_attr_getaffinity_np, &attr, cpusetsize, cpuset); - CPU_FREE (cpuset); - } - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-pthread-getattr.c b/nptl/tst-pthread-getattr.c deleted file mode 100644 index 86719f97ab..0000000000 --- a/nptl/tst-pthread-getattr.c +++ /dev/null @@ -1,161 +0,0 @@ -/* Make sure that the stackaddr returned by pthread_getattr_np is - reachable. - - Copyright (C) 2012-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <string.h> -#include <sys/resource.h> -#include <sys/param.h> -#include <pthread.h> -#include <alloca.h> -#include <assert.h> -#include <unistd.h> -#include <inttypes.h> - -/* There is an obscure bug in the kernel due to which RLIMIT_STACK is sometimes - returned as unlimited when it is not, which may cause this test to fail. - There is also the other case where RLIMIT_STACK is intentionally set as - unlimited or very high, which may result in a vma that is too large and again - results in a test case failure. To avoid these problems, we cap the stack - size to one less than 8M. See the following mailing list threads for more - information about this problem: - <http://sourceware.org/ml/libc-alpha/2012-06/msg00599.html> - <http://sourceware.org/ml/libc-alpha/2012-06/msg00713.html>. */ -#define MAX_STACK_SIZE (8192 * 1024 - 1) - -static size_t pagesize; - -/* Check if the page in which TARGET lies is accessible. This will segfault - if it fails. */ -static volatile char * -allocate_and_test (char *target) -{ - volatile char *mem = (char *) &mem; - /* FIXME: mem >= target for _STACK_GROWSUP. */ - mem = alloca ((size_t) (mem - target)); - - *mem = 42; - return mem; -} - -static int -get_self_pthread_attr (const char *id, void **stackaddr, size_t *stacksize) -{ - pthread_attr_t attr; - int ret; - pthread_t me = pthread_self (); - - if ((ret = pthread_getattr_np (me, &attr)) < 0) - { - printf ("%s: pthread_getattr_np failed: %s\n", id, strerror (ret)); - return 1; - } - - if ((ret = pthread_attr_getstack (&attr, stackaddr, stacksize)) < 0) - { - printf ("%s: pthread_attr_getstack returned error: %s\n", id, - strerror (ret)); - return 1; - } - - return 0; -} - -/* Verify that the stack size returned by pthread_getattr_np is usable when - the returned value is subject to rlimit. */ -static int -check_stack_top (void) -{ - struct rlimit stack_limit; - void *stackaddr; - volatile void *mem; - size_t stacksize = 0; - int ret; - uintptr_t pagemask = ~(pagesize - 1); - - puts ("Verifying that stack top is accessible"); - - ret = getrlimit (RLIMIT_STACK, &stack_limit); - if (ret) - { - perror ("getrlimit failed"); - return 1; - } - - printf ("current rlimit_stack is %zu\n", (size_t) stack_limit.rlim_cur); - - if (get_self_pthread_attr ("check_stack_top", &stackaddr, &stacksize)) - return 1; - - /* Reduce the rlimit to a page less that what is currently being returned - (subject to a maximum of MAX_STACK_SIZE) so that we ensure that - pthread_getattr_np uses rlimit. The figure is intentionally unaligned so - to verify that pthread_getattr_np returns an aligned stacksize that - correctly fits into the rlimit. We don't bother about the case where the - stack is limited by the vma below it and not by the rlimit because the - stacksize returned in that case is computed from the end of that vma and is - hence safe. */ - stack_limit.rlim_cur = MIN (stacksize - pagesize + 1, MAX_STACK_SIZE); - printf ("Adjusting RLIMIT_STACK to %zu\n", (size_t) stack_limit.rlim_cur); - if ((ret = setrlimit (RLIMIT_STACK, &stack_limit)) < 0) - { - perror ("setrlimit failed"); - return 1; - } - - if (get_self_pthread_attr ("check_stack_top2", &stackaddr, &stacksize)) - return 1; - - printf ("Adjusted rlimit: stacksize=%zu, stackaddr=%p\n", stacksize, - stackaddr); - - /* A lot of targets tend to write stuff on top of the user stack during - context switches, so we cannot possibly safely go up to the very top of - stack and test access there. It is however sufficient to simply check if - the top page is accessible, so we target our access halfway up the top - page. Thanks Chris Metcalf for this idea. */ - mem = allocate_and_test (stackaddr + pagesize / 2); - - /* Before we celebrate, make sure we actually did test the same page. */ - if (((uintptr_t) stackaddr & pagemask) != ((uintptr_t) mem & pagemask)) - { - printf ("We successfully wrote into the wrong page.\n" - "Expected %#" PRIxPTR ", but got %#" PRIxPTR "\n", - (uintptr_t) stackaddr & pagemask, (uintptr_t) mem & pagemask); - - return 1; - } - - puts ("Stack top tests done"); - - return 0; -} - -/* TODO: Similar check for thread stacks once the thread stack sizes are - fixed. */ -static int -do_test (void) -{ - pagesize = sysconf (_SC_PAGESIZE); - return check_stack_top (); -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-pthread-mutexattr.c b/nptl/tst-pthread-mutexattr.c deleted file mode 100644 index 4b42b01ef8..0000000000 --- a/nptl/tst-pthread-mutexattr.c +++ /dev/null @@ -1,60 +0,0 @@ -/* Make sure that pthread_mutexattr_gettype returns a valid kind. - - Copyright (C) 2015-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <string.h> -#include <pthread.h> - -static int -do_test (void) -{ - pthread_mutexattr_t attr; - int kind; - int error; - - error = pthread_mutexattr_init (&attr); - if (error) - { - printf ("pthread_mutexattr_init: %s\n", strerror (error)); - return 1; - } - error = pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_DEFAULT); - if (error) - { - printf ("pthread_mutexattr_settype (1): %s\n", strerror (error)); - return 1; - } - error = pthread_mutexattr_gettype (&attr, &kind); - if (error) - { - printf ("pthread_mutexattr_gettype: %s\n", strerror (error)); - return 1; - } - error = pthread_mutexattr_settype (&attr, kind); - if (error) - { - printf ("pthread_mutexattr_settype (2): %s\n", strerror (error)); - return 1; - } - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-raise1.c b/nptl/tst-raise1.c deleted file mode 100644 index 5d540b8cef..0000000000 --- a/nptl/tst-raise1.c +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <error.h> -#include <signal.h> -#include <stdlib.h> -#include <stdio.h> - -volatile int count; - -void -sh (int sig) -{ - ++count; -} - -int -main (void) -{ - struct sigaction sa; - sa.sa_handler = sh; - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - if (sigaction (SIGUSR1, &sa, NULL) < 0) - { - printf ("sigaction failed: %m\n"); - exit (1); - } - if (raise (SIGUSR1) < 0) - { - printf ("first raise failed: %m\n"); - exit (1); - } - if (raise (SIGUSR1) < 0) - { - printf ("second raise failed: %m\n"); - exit (1); - } - if (count != 2) - { - printf ("signal handler not called 2 times\n"); - exit (1); - } - exit (0); -} diff --git a/nptl/tst-robust-fork.c b/nptl/tst-robust-fork.c deleted file mode 100644 index 4a12ff000d..0000000000 --- a/nptl/tst-robust-fork.c +++ /dev/null @@ -1,184 +0,0 @@ -/* Test the interaction of fork and robust mutexes. - Copyright (C) 2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdbool.h> -#include <stdio.h> -#include <support/check.h> -#include <support/test-driver.h> -#include <support/xthread.h> -#include <support/xunistd.h> -#include <sys/mman.h> - -/* Data shared between processes. */ -struct shared -{ - pthread_mutex_t parent_mutex; - pthread_mutex_t child_mutex; -}; - -/* These flags control which mutex settings are enabled in the parent - and child (separately). */ -enum mutex_bits - { - mutex_pshared = 1, - mutex_robust = 2, - mutex_pi = 4, - mutex_check = 8, - - /* All bits combined. */ - mutex_all_bits = 15, - }; - -static void -mutex_init (pthread_mutex_t *mutex, int bits) -{ - pthread_mutexattr_t attr; - xpthread_mutexattr_init (&attr); - if (bits & mutex_pshared) - xpthread_mutexattr_setpshared (&attr, PTHREAD_PROCESS_SHARED); - if (bits & mutex_robust) - xpthread_mutexattr_setrobust (&attr, PTHREAD_MUTEX_ROBUST); - if (bits & mutex_pi) - xpthread_mutexattr_setprotocol (&attr, PTHREAD_PRIO_INHERIT); - if (bits & mutex_check) - xpthread_mutexattr_settype (&attr, PTHREAD_MUTEX_ERRORCHECK); - xpthread_mutex_init (mutex, &attr); - xpthread_mutexattr_destroy (&attr); -} - -static void -one_test (int parent_bits, int child_bits, int nonshared_bits, - bool lock_nonshared, bool lock_child) -{ - - struct shared *shared = xmmap (NULL, sizeof (*shared), - PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_SHARED, -1); - mutex_init (&shared->parent_mutex, parent_bits); - mutex_init (&shared->child_mutex, child_bits); - - /* Acquire the parent mutex in the parent. */ - xpthread_mutex_lock (&shared->parent_mutex); - - pthread_mutex_t nonshared_mutex; - mutex_init (&nonshared_mutex, nonshared_bits); - if (lock_nonshared) - xpthread_mutex_lock (&nonshared_mutex); - - pid_t pid = xfork (); - if (pid == 0) - { - /* Child process. */ - if (lock_child) - xpthread_mutex_lock (&shared->child_mutex); - else - xmunmap (shared, sizeof (*shared)); - if (lock_nonshared) - /* Reinitialize the non-shared mutex if it was locked in the - parent. */ - mutex_init (&nonshared_mutex, nonshared_bits); - xpthread_mutex_lock (&nonshared_mutex); - /* For robust mutexes, the _exit call will perform the unlock - instead. */ - if (lock_child && !(child_bits & mutex_robust)) - xpthread_mutex_unlock (&shared->child_mutex); - _exit (0); - } - /* Parent process. */ - { - int status; - xwaitpid (pid, &status, 0); - TEST_VERIFY (status == 0); - } - - if (parent_bits & mutex_check) - /* Test for expected self-deadlock. This is only possible to - detect if the mutex is error-checking. */ - TEST_VERIFY_EXIT (pthread_mutex_lock (&shared->parent_mutex) == EDEADLK); - - pid = xfork (); - if (pid == 0) - { - /* Child process. We can perform some checks only if we are - dealing with process-shared mutexes. */ - if (parent_bits & mutex_pshared) - /* It must not be possible to acquire the parent mutex. - - NB: This check touches a mutex which has been acquired in - the parent at fork time, so it might be deemed undefined - behavior, pending the resolution of Austin Groups issue - 1112. */ - TEST_VERIFY_EXIT (pthread_mutex_trylock (&shared->parent_mutex) - == EBUSY); - if (lock_child && (child_bits & mutex_robust)) - { - if (!(child_bits & mutex_pshared)) - /* No further tests possible. */ - _exit (0); - TEST_VERIFY_EXIT (pthread_mutex_lock (&shared->child_mutex) - == EOWNERDEAD); - xpthread_mutex_consistent (&shared->child_mutex); - } - else - /* We did not acquire the lock in the first child process, or - we unlocked the mutex again because the mutex is not a - robust mutex. */ - xpthread_mutex_lock (&shared->child_mutex); - xpthread_mutex_unlock (&shared->child_mutex); - _exit (0); - } - /* Parent process. */ - { - int status; - xwaitpid (pid, &status, 0); - TEST_VERIFY (status == 0); - } - - if (lock_nonshared) - xpthread_mutex_unlock (&nonshared_mutex); - xpthread_mutex_unlock (&shared->parent_mutex); - xpthread_mutex_destroy (&shared->parent_mutex); - xpthread_mutex_destroy (&shared->child_mutex); - xpthread_mutex_destroy (&nonshared_mutex); - xmunmap (shared, sizeof (*shared)); -} - -static int -do_test (void) -{ - for (int parent_bits = 0; parent_bits <= mutex_all_bits; ++parent_bits) - for (int child_bits = 0; child_bits <= mutex_all_bits; ++child_bits) - for (int nonshared_bits = 0; nonshared_bits <= mutex_all_bits; - ++nonshared_bits) - for (int lock_nonshared = 0; lock_nonshared < 2; ++lock_nonshared) - for (int lock_child = 0; lock_child < 2; ++lock_child) - { - if (test_verbose) - printf ("info: parent_bits=0x%x child_bits=0x%x" - " nonshared_bits=0x%x%s%s\n", - parent_bits, child_bits, nonshared_bits, - lock_nonshared ? " lock_nonshared" : "", - lock_child ? " lock_child" : ""); - one_test (parent_bits, child_bits, nonshared_bits, - lock_nonshared, lock_child); - } - return 0; -} - -#include <support/test-driver.c> diff --git a/nptl/tst-robust1.c b/nptl/tst-robust1.c deleted file mode 100644 index eb92e9cf69..0000000000 --- a/nptl/tst-robust1.c +++ /dev/null @@ -1,338 +0,0 @@ -/* Copyright (C) 2005-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2005. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - - -static pthread_mutex_t m1; -static pthread_mutex_t m2; -static pthread_barrier_t b; - - -#ifndef LOCK -# define LOCK(m) pthread_mutex_lock (m) -#endif - - -static void * -tf (void *arg) -{ - long int round = (long int) arg; - - if (pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL) != 0) - { - printf ("%ld: setcancelstate failed\n", round); - exit (1); - } - - int e = LOCK (&m1); - if (e != 0) - { - printf ("%ld: child: mutex_lock m1 failed with error %d\n", round, e); - exit (1); - } - - e = LOCK (&m2); - if (e != 0) - { - printf ("%ld: child: mutex_lock m2 failed with error %d\n", round, e); - exit (1); - } - - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("%ld: child: 1st barrier_wait failed\n", round); - exit (1); - } - - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("%ld: child: 2nd barrier_wait failed\n", round); - exit (1); - } - - pthread_testcancel (); - - printf ("%ld: testcancel returned\n", round); - exit (1); -} - - -static int -do_test (void) -{ -#ifdef PREPARE_TMO - PREPARE_TMO; -#endif - - pthread_mutexattr_t a; - if (pthread_mutexattr_init (&a) != 0) - { - puts ("mutexattr_init failed"); - return 1; - } - if (pthread_mutexattr_setrobust_np (&a, PTHREAD_MUTEX_ROBUST_NP) != 0) - { - puts ("mutexattr_setrobust failed"); - return 1; - } - -#ifdef ENABLE_PI - if (pthread_mutexattr_setprotocol (&a, PTHREAD_PRIO_INHERIT) != 0) - { - puts ("pthread_mutexattr_setprotocol failed"); - return 1; - } - else - { - int e = pthread_mutex_init (&m1, &a); - if (e == ENOTSUP) - { - puts ("PI robust mutexes not supported"); - return 0; - } - else if (e != 0) - { - puts ("mutex_init m1 failed"); - return 1; - } - pthread_mutex_destroy (&m1); - } -#endif - -#ifndef NOT_CONSISTENT - if (pthread_mutex_init (&m1, &a) != 0) - { - puts ("mutex_init m1 failed"); - return 1; - } - - if (pthread_mutex_init (&m2, &a) != 0) - { - puts ("mutex_init m2 failed"); - return 1; - } -#endif - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - for (long int round = 1; round < 5; ++round) - { -#ifdef NOT_CONSISTENT - if (pthread_mutex_init (&m1 , &a) != 0) - { - puts ("mutex_init m1 failed"); - return 1; - } - if (pthread_mutex_init (&m2 , &a) != 0) - { - puts ("mutex_init m2 failed"); - return 1; - } -#endif - - pthread_t th; - if (pthread_create (&th, NULL, tf, (void *) round) != 0) - { - printf ("%ld: create failed\n", round); - return 1; - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("%ld: parent: 1st barrier_wait failed\n", round); - return 1; - } - - if (pthread_cancel (th) != 0) - { - printf ("%ld: cancel failed\n", round); - return 1; - } - - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("%ld: parent: 2nd barrier_wait failed\n", round); - return 1; - } - -#ifndef AFTER_JOIN - if (round & 1) -#endif - { - void *res; - if (pthread_join (th, &res) != 0) - { - printf ("%ld: join failed\n", round); - return 1; - } - if (res != PTHREAD_CANCELED) - { - printf ("%ld: thread not canceled\n", round); - return 1; - } - } - - e = LOCK (&m1); - if (e == 0) - { - printf ("%ld: parent: mutex_lock m1 succeeded\n", round); - return 1; - } - if (e != EOWNERDEAD) - { - printf ("%ld: parent: mutex_lock m1 returned wrong code\n", round); - return 1; - } - - e = LOCK (&m2); - if (e == 0) - { - printf ("%ld: parent: mutex_lock m2 succeeded\n", round); - return 1; - } - if (e != EOWNERDEAD) - { - printf ("%ld: parent: mutex_lock m2 returned wrong code\n", round); - return 1; - } - -#ifndef AFTER_JOIN - if ((round & 1) == 0) - { - void *res; - if (pthread_join (th, &res) != 0) - { - printf ("%ld: join failed\n", round); - return 1; - } - if (res != PTHREAD_CANCELED) - { - printf ("%ld: thread not canceled\n", round); - return 1; - } - } -#endif - -#ifndef NOT_CONSISTENT - e = pthread_mutex_consistent_np (&m1); - if (e != 0) - { - printf ("%ld: mutex_consistent m1 failed with error %d\n", round, e); - return 1; - } - - e = pthread_mutex_consistent_np (&m2); - if (e != 0) - { - printf ("%ld: mutex_consistent m2 failed with error %d\n", round, e); - return 1; - } -#endif - - e = pthread_mutex_unlock (&m1); - if (e != 0) - { - printf ("%ld: mutex_unlock m1 failed with %d\n", round, e); - return 1; - } - - e = pthread_mutex_unlock (&m2); - if (e != 0) - { - printf ("%ld: mutex_unlock m2 failed with %d\n", round, e); - return 1; - } - -#ifdef NOT_CONSISTENT - e = LOCK (&m1); - if (e == 0) - { - printf ("%ld: locking inconsistent mutex m1 succeeded\n", round); - return 1; - } - if (e != ENOTRECOVERABLE) - { - printf ("%ld: locking inconsistent mutex m1 failed with error %d\n", - round, e); - return 1; - } - - if (pthread_mutex_destroy (&m1) != 0) - { - puts ("mutex_destroy m1 failed"); - return 1; - } - - e = LOCK (&m2); - if (e == 0) - { - printf ("%ld: locking inconsistent mutex m2 succeeded\n", round); - return 1; - } - if (e != ENOTRECOVERABLE) - { - printf ("%ld: locking inconsistent mutex m2 failed with error %d\n", - round, e); - return 1; - } - - if (pthread_mutex_destroy (&m2) != 0) - { - puts ("mutex_destroy m2 failed"); - return 1; - } -#endif - } - -#ifndef NOT_CONSISTENT - if (pthread_mutex_destroy (&m1) != 0) - { - puts ("mutex_destroy m1 failed"); - return 1; - } - - if (pthread_mutex_destroy (&m2) != 0) - { - puts ("mutex_destroy m2 failed"); - return 1; - } -#endif - - if (pthread_mutexattr_destroy (&a) != 0) - { - puts ("mutexattr_destroy failed"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-robust10.c b/nptl/tst-robust10.c deleted file mode 100644 index c56b420b01..0000000000 --- a/nptl/tst-robust10.c +++ /dev/null @@ -1,110 +0,0 @@ -/* Test that pthread_mutex_timedlock properly times out. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> - -pthread_mutex_t mutex; - -static void * -thr (void *arg) -{ - struct timespec abstime; - clock_gettime (CLOCK_REALTIME, &abstime); - abstime.tv_sec += 1; - int ret = pthread_mutex_timedlock (&mutex, &abstime); - if (ret == 0) - { - puts ("mutex_timedlock didn't fail"); - exit (1); - } - if (ret != ETIMEDOUT) - { - printf ("mutex_timedlock failed: %s\n", strerror (ret)); - exit (1); - } - - return 0; -} - -static int -do_test (void) -{ - pthread_t pt; - pthread_mutexattr_t ma; - - if (pthread_mutexattr_init (&ma) != 0) - { - puts ("mutexattr_init failed"); - return 0; - } - if (pthread_mutexattr_setrobust_np (&ma, PTHREAD_MUTEX_ROBUST_NP) != 0) - { - puts ("mutexattr_setrobust failed"); - return 1; - } - if (pthread_mutex_init (&mutex, &ma)) - { - puts ("mutex_init failed"); - return 1; - } - - if (pthread_mutexattr_destroy (&ma)) - { - puts ("mutexattr_destroy failed"); - return 1; - } - - if (pthread_mutex_lock (&mutex)) - { - puts ("mutex_lock failed"); - return 1; - } - - if (pthread_create (&pt, NULL, thr, NULL)) - { - puts ("pthread_create failed"); - return 1; - } - - if (pthread_join (pt, NULL)) - { - puts ("pthread_join failed"); - return 1; - } - - if (pthread_mutex_unlock (&mutex)) - { - puts ("mutex_unlock failed"); - return 1; - } - - if (pthread_mutex_destroy (&mutex)) - { - puts ("mutex_destroy failed"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-robust2.c b/nptl/tst-robust2.c deleted file mode 100644 index cf603feb4d..0000000000 --- a/nptl/tst-robust2.c +++ /dev/null @@ -1,3 +0,0 @@ -#define AFTER_JOIN 1 -#define LOCK(m) pthread_mutex_trylock (m) -#include "tst-robust1.c" diff --git a/nptl/tst-robust3.c b/nptl/tst-robust3.c deleted file mode 100644 index e56f2762c7..0000000000 --- a/nptl/tst-robust3.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <time.h> -#include <sys/time.h> - - -static struct timespec tmo; - - -#define PREPARE_TMO \ - do { \ - struct timeval tv; \ - gettimeofday (&tv, NULL); \ - \ - /* Define the timeout as one hour in the future. */ \ - tmo.tv_sec = tv.tv_sec + 3600; \ - tmo.tv_nsec = 0; \ - } while (0) - - -#define LOCK(m) pthread_mutex_timedlock (m, &tmo) -#include "tst-robust1.c" diff --git a/nptl/tst-robust4.c b/nptl/tst-robust4.c deleted file mode 100644 index b9c42b85b9..0000000000 --- a/nptl/tst-robust4.c +++ /dev/null @@ -1,2 +0,0 @@ -#define NOT_CONSISTENT 1 -#include "tst-robust1.c" diff --git a/nptl/tst-robust5.c b/nptl/tst-robust5.c deleted file mode 100644 index b83d3d66cb..0000000000 --- a/nptl/tst-robust5.c +++ /dev/null @@ -1,2 +0,0 @@ -#define NOT_CONSISTENT 1 -#include "tst-robust2.c" diff --git a/nptl/tst-robust6.c b/nptl/tst-robust6.c deleted file mode 100644 index 6713396de1..0000000000 --- a/nptl/tst-robust6.c +++ /dev/null @@ -1,2 +0,0 @@ -#define NOT_CONSISTENT 1 -#include "tst-robust3.c" diff --git a/nptl/tst-robust7.c b/nptl/tst-robust7.c deleted file mode 100644 index 6d414ad6f0..0000000000 --- a/nptl/tst-robust7.c +++ /dev/null @@ -1,212 +0,0 @@ -/* Copyright (C) 2005-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2005. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> - - -static pthread_barrier_t b; -static pthread_cond_t c = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t m; -static bool first = true; - - -static void * -tf (void *arg) -{ - long int n = (long int) arg; - - if (pthread_mutex_lock (&m) != 0) - { - printf ("thread %ld: mutex_lock failed\n", n + 1); - exit (1); - } - - int e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("thread %ld: barrier_wait failed\n", n + 1); - exit (1); - } - - e = pthread_cond_wait (&c, &m); - if (first) - { - if (e != 0) - { - printf ("thread %ld: cond_wait failed\n", n + 1); - exit (1); - } - first = false; - } - else - { - if (e != EOWNERDEAD) - { - printf ("thread %ld: cond_wait did not return EOWNERDEAD\n", n + 1); - exit (1); - } - } - - if (pthread_cancel (pthread_self ()) != 0) - { - printf ("thread %ld: cancel failed\n", n + 1); - exit (1); - } - - pthread_testcancel (); - - printf ("thread %ld: testcancel returned\n", n + 1); - exit (1); -} - - -static int -do_test (void) -{ - pthread_mutexattr_t a; - if (pthread_mutexattr_init (&a) != 0) - { - puts ("mutexattr_init failed"); - return 1; - } - - if (pthread_mutexattr_setrobust_np (&a, PTHREAD_MUTEX_ROBUST_NP) != 0) - { - puts ("mutexattr_setrobust failed"); - return 1; - } - -#ifdef ENABLE_PI - if (pthread_mutexattr_setprotocol (&a, PTHREAD_PRIO_INHERIT) != 0) - { - puts ("pthread_mutexattr_setprotocol failed"); - return 1; - } -#endif - - int e; - e = pthread_mutex_init (&m, &a); - if (e != 0) - { -#ifdef ENABLE_PI - if (e == ENOTSUP) - { - puts ("PI robust mutexes not supported"); - return 0; - } -#endif - puts ("mutex_init failed"); - return 1; - } - - if (pthread_mutexattr_destroy (&a) != 0) - { - puts ("mutexattr_destroy failed"); - return 1; - } - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - -#define N 5 - pthread_t th[N]; - for (long int n = 0; n < N; ++n) - { - if (pthread_create (&th[n], NULL, tf, (void *) n) != 0) - { - printf ("pthread_create loop %ld failed\n", n + 1); - return 1; - } - - e = pthread_barrier_wait (&b); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - printf ("parent: barrier_wait failed in round %ld\n", n + 1); - return 1; - } - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("parent: mutex_lock failed"); - return 1; - } - - if (pthread_mutex_unlock (&m) != 0) - { - puts ("parent: mutex_unlock failed"); - return 1; - } - - if (pthread_cond_broadcast (&c) != 0) - { - puts ("cond_broadcast failed"); - return 1; - } - - for (int n = 0; n < N; ++n) - { - void *res; - if (pthread_join (th[n], &res) != 0) - { - printf ("join round %d failed\n", n + 1); - return 1; - } - if (res != PTHREAD_CANCELED) - { - printf ("thread %d not canceled\n", n + 1); - return 1; - } - } - - e = pthread_mutex_lock (&m); - if (e == 0) - { - puts ("parent: 2nd mutex_lock succeeded"); - return 1; - } - if (e != EOWNERDEAD) - { - puts ("parent: mutex_lock did not return EOWNERDEAD"); - return 1; - } - - if (pthread_mutex_unlock (&m) != 0) - { - puts ("parent: 2nd mutex_unlock failed"); - return 1; - } - - if (pthread_mutex_destroy (&m) != 0) - { - puts ("mutex_destroy failed"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-robust8.c b/nptl/tst-robust8.c deleted file mode 100644 index 9c636250d4..0000000000 --- a/nptl/tst-robust8.c +++ /dev/null @@ -1,275 +0,0 @@ -#include <pthread.h> -#include <signal.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/wait.h> - - - - -static void prepare (void); -#define PREPARE(argc, argv) prepare () -static int do_test (void); -#define TEST_FUNCTION do_test () -#define TIMEOUT 5 -#include "../test-skeleton.c" - - -static int fd; -#define N 100 - -static void -prepare (void) -{ - fd = create_temp_file ("tst-robust8", NULL); - if (fd == -1) - exit (1); -} - - -#define THESIGNAL SIGKILL -#define ROUNDS 5 -#define THREADS 9 - - -static const struct timespec before = { 0, 0 }; - - -static pthread_mutex_t *map; - - -static void * -tf (void *arg) -{ - long int nr = (long int) arg; - int fct = nr % 3; - - uint8_t state[N]; - memset (state, '\0', sizeof (state)); - - while (1) - { - int r = random () % N; - if (state[r] == 0) - { - int e; - - switch (fct) - { - case 0: - e = pthread_mutex_lock (&map[r]); - if (e != 0) - { - printf ("mutex_lock of %d in thread %ld failed with %d\n", - r, nr, e); - exit (1); - } - state[r] = 1; - break; - case 1: - e = pthread_mutex_timedlock (&map[r], &before); - if (e != 0 && e != ETIMEDOUT) - { - printf ("\ -mutex_timedlock of %d in thread %ld failed with %d\n", - r, nr, e); - exit (1); - } - break; - default: - e = pthread_mutex_trylock (&map[r]); - if (e != 0 && e != EBUSY) - { - printf ("mutex_trylock of %d in thread %ld failed with %d\n", - r, nr, e); - exit (1); - } - break; - } - - if (e == EOWNERDEAD) - pthread_mutex_consistent_np (&map[r]); - - if (e == 0 || e == EOWNERDEAD) - state[r] = 1; - } - else - { - int e = pthread_mutex_unlock (&map[r]); - if (e != 0) - { - printf ("mutex_unlock of %d in thread %ld failed with %d\n", - r, nr, e); - exit (1); - } - - state[r] = 0; - } - } -} - - -static void -child (int round) -{ - for (int thread = 1; thread <= THREADS; ++thread) - { - pthread_t th; - if (pthread_create (&th, NULL, tf, (void *) (long int) thread) != 0) - { - printf ("cannot create thread %d in round %d\n", thread, round); - exit (1); - } - } - - struct timespec ts; - ts.tv_sec = 0; - ts.tv_nsec = 1000000000 / ROUNDS; - while (nanosleep (&ts, &ts) != 0) - /* nothing */; - - /* Time to die. */ - kill (getpid (), THESIGNAL); - - /* We better never get here. */ - abort (); -} - - -static int -do_test (void) -{ - if (ftruncate (fd, N * sizeof (pthread_mutex_t)) != 0) - { - puts ("cannot size new file"); - return 1; - } - - map = mmap (NULL, N * sizeof (pthread_mutex_t), PROT_READ | PROT_WRITE, - MAP_SHARED, fd, 0); - if (map == MAP_FAILED) - { - puts ("mapping failed"); - return 1; - } - - pthread_mutexattr_t ma; - if (pthread_mutexattr_init (&ma) != 0) - { - puts ("mutexattr_init failed"); - return 0; - } - if (pthread_mutexattr_setrobust_np (&ma, PTHREAD_MUTEX_ROBUST_NP) != 0) - { - puts ("mutexattr_setrobust failed"); - return 1; - } - if (pthread_mutexattr_setpshared (&ma, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("mutexattr_setpshared failed"); - return 1; - } -#ifdef ENABLE_PI - if (pthread_mutexattr_setprotocol (&ma, PTHREAD_PRIO_INHERIT) != 0) - { - puts ("pthread_mutexattr_setprotocol failed"); - return 1; - } -#endif - - for (int round = 1; round <= ROUNDS; ++round) - { - for (int n = 0; n < N; ++n) - { - int e = pthread_mutex_init (&map[n], &ma); - if (e == ENOTSUP) - { -#ifdef ENABLE_PI - puts ("cannot support pshared robust PI mutexes"); -#else - puts ("cannot support pshared robust mutexes"); -#endif - return 0; - } - if (e != 0) - { - printf ("mutex_init %d in round %d failed\n", n + 1, round); - return 1; - } - } - - pid_t p = fork (); - if (p == -1) - { - printf ("fork in round %d failed\n", round); - return 1; - } - if (p == 0) - child (round); - - int status; - if (TEMP_FAILURE_RETRY (waitpid (p, &status, 0)) != p) - { - printf ("waitpid in round %d failed\n", round); - return 1; - } - if (!WIFSIGNALED (status)) - { - printf ("child did not die of a signal in round %d\n", round); - return 1; - } - if (WTERMSIG (status) != THESIGNAL) - { - printf ("child did not die of signal %d in round %d\n", - THESIGNAL, round); - return 1; - } - - for (int n = 0; n < N; ++n) - { - int e = pthread_mutex_lock (&map[n]); - if (e != 0 && e != EOWNERDEAD) - { - printf ("mutex_lock %d failed in round %d\n", n + 1, round); - return 1; - } - } - - for (int n = 0; n < N; ++n) - if (pthread_mutex_unlock (&map[n]) != 0) - { - printf ("mutex_unlock %d failed in round %d\n", n + 1, round); - return 1; - } - - for (int n = 0; n < N; ++n) - { - int e = pthread_mutex_destroy (&map[n]); - if (e != 0) - { - printf ("mutex_destroy %d in round %d failed with %d\n", - n + 1, round, e); - printf("nusers = %d\n", (int) map[n].__data.__nusers); - return 1; - } - } - } - - if (pthread_mutexattr_destroy (&ma) != 0) - { - puts ("mutexattr_destroy failed"); - return 1; - } - - if (munmap (map, N * sizeof (pthread_mutex_t)) != 0) - { - puts ("munmap failed"); - return 1; - } - - return 0; -} diff --git a/nptl/tst-robust9.c b/nptl/tst-robust9.c deleted file mode 100644 index 1d6ba179be..0000000000 --- a/nptl/tst-robust9.c +++ /dev/null @@ -1,94 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <errno.h> -#include <pthread.h> -#include <unistd.h> -#include <sys/time.h> - - -static pthread_mutex_t m; - -static void * -tf (void *data) -{ - int err = pthread_mutex_lock (&m); - if (err == EOWNERDEAD) - { - err = pthread_mutex_consistent_np (&m); - if (err) - { - puts ("pthread_mutex_consistent_np"); - exit (1); - } - } - else if (err) - { - puts ("pthread_mutex_lock"); - exit (1); - } - printf ("thread%ld got the lock.\n", (long int) data); - sleep (1); - /* exit without unlock */ - return NULL; -} - -static int -do_test (void) -{ - int err, i; - pthread_t t[3]; - pthread_mutexattr_t ma; - - pthread_mutexattr_init (&ma); - err = pthread_mutexattr_setrobust_np (&ma, PTHREAD_MUTEX_ROBUST_NP); - if (err) - { - puts ("pthread_mutexattr_setrobust_np"); - return 1; - } -#ifdef ENABLE_PI - if (pthread_mutexattr_setprotocol (&ma, PTHREAD_PRIO_INHERIT) != 0) - { - puts ("pthread_mutexattr_setprotocol failed"); - return 1; - } -#endif - err = pthread_mutex_init (&m, &ma); -#ifdef ENABLE_PI - if (err == ENOTSUP) - { - puts ("PI robust mutexes not supported"); - return 0; - } -#endif - if (err) - { - puts ("pthread_mutex_init"); - return 1; - } - - for (i = 0; i < sizeof (t) / sizeof (t[0]); i++) - { - err = pthread_create (&t[i], NULL, tf, (void *) (long int) i); - if (err) - { - puts ("pthread_create"); - return 1; - } - } - - for (i = 0; i < sizeof (t) / sizeof (t[0]); i++) - { - err = pthread_join (t[i], NULL); - if (err) - { - puts ("pthread_join"); - return 1; - } - } - return 0; -} - -#define TIMEOUT 5 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-robustpi1.c b/nptl/tst-robustpi1.c deleted file mode 100644 index 031291b296..0000000000 --- a/nptl/tst-robustpi1.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-robust1.c" diff --git a/nptl/tst-robustpi2.c b/nptl/tst-robustpi2.c deleted file mode 100644 index ac411c7736..0000000000 --- a/nptl/tst-robustpi2.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-robust2.c" diff --git a/nptl/tst-robustpi3.c b/nptl/tst-robustpi3.c deleted file mode 100644 index 7dcf691e82..0000000000 --- a/nptl/tst-robustpi3.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-robust3.c" diff --git a/nptl/tst-robustpi4.c b/nptl/tst-robustpi4.c deleted file mode 100644 index 6c7b0aa7be..0000000000 --- a/nptl/tst-robustpi4.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-robust4.c" diff --git a/nptl/tst-robustpi5.c b/nptl/tst-robustpi5.c deleted file mode 100644 index a494c332f1..0000000000 --- a/nptl/tst-robustpi5.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-robust5.c" diff --git a/nptl/tst-robustpi6.c b/nptl/tst-robustpi6.c deleted file mode 100644 index 3b1482fc22..0000000000 --- a/nptl/tst-robustpi6.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-robust6.c" diff --git a/nptl/tst-robustpi7.c b/nptl/tst-robustpi7.c deleted file mode 100644 index f8892f3521..0000000000 --- a/nptl/tst-robustpi7.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-robust7.c" diff --git a/nptl/tst-robustpi8.c b/nptl/tst-robustpi8.c deleted file mode 100644 index cbea3d6d77..0000000000 --- a/nptl/tst-robustpi8.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-robust8.c" diff --git a/nptl/tst-robustpi9.c b/nptl/tst-robustpi9.c deleted file mode 100644 index d059aa7d88..0000000000 --- a/nptl/tst-robustpi9.c +++ /dev/null @@ -1,2 +0,0 @@ -#define ENABLE_PI 1 -#include "tst-robust9.c" diff --git a/nptl/tst-rwlock1.c b/nptl/tst-rwlock1.c deleted file mode 100644 index c041a3ee4f..0000000000 --- a/nptl/tst-rwlock1.c +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> - - -static int -do_test (void) -{ - pthread_rwlock_t r; - - if (pthread_rwlock_init (&r, NULL) != 0) - { - puts ("rwlock_init failed"); - return 1; - } - puts ("rwlock_init succeeded"); - - if (pthread_rwlock_rdlock (&r) != 0) - { - puts ("1st rwlock_rdlock failed"); - return 1; - } - puts ("1st rwlock_rdlock succeeded"); - - if (pthread_rwlock_rdlock (&r) != 0) - { - puts ("2nd rwlock_rdlock failed"); - return 1; - } - puts ("2nd rwlock_rdlock succeeded"); - - if (pthread_rwlock_unlock (&r) != 0) - { - puts ("1st rwlock_unlock failed"); - return 1; - } - puts ("1st rwlock_unlock succeeded"); - - if (pthread_rwlock_unlock (&r) != 0) - { - puts ("2nd rwlock_unlock failed"); - return 1; - } - puts ("2nd rwlock_unlock succeeded"); - - if (pthread_rwlock_wrlock (&r) != 0) - { - puts ("1st rwlock_wrlock failed"); - return 1; - } - puts ("1st rwlock_wrlock succeeded"); - - if (pthread_rwlock_unlock (&r) != 0) - { - puts ("3rd rwlock_unlock failed"); - return 1; - } - puts ("3rd rwlock_unlock succeeded"); - - if (pthread_rwlock_wrlock (&r) != 0) - { - puts ("2nd rwlock_wrlock failed"); - return 1; - } - puts ("2nd rwlock_wrlock succeeded"); - - if (pthread_rwlock_unlock (&r) != 0) - { - puts ("4th rwlock_unlock failed"); - return 1; - } - puts ("4th rwlock_unlock succeeded"); - - if (pthread_rwlock_rdlock (&r) != 0) - { - puts ("3rd rwlock_rdlock failed"); - return 1; - } - puts ("3rd rwlock_rdlock succeeded"); - - if (pthread_rwlock_unlock (&r) != 0) - { - puts ("5th rwlock_unlock failed"); - return 1; - } - puts ("5th rwlock_unlock succeeded"); - - if (pthread_rwlock_destroy (&r) != 0) - { - puts ("rwlock_destroy failed"); - return 1; - } - puts ("rwlock_destroy succeeded"); - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-rwlock10.c b/nptl/tst-rwlock10.c deleted file mode 100644 index 0726458a19..0000000000 --- a/nptl/tst-rwlock10.c +++ /dev/null @@ -1,20 +0,0 @@ -/* Test program for timedout read/write lock functions. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#define KIND PTHREAD_RWLOCK_PREFER_READER_NP -#include "tst-rwlock8.c" diff --git a/nptl/tst-rwlock11.c b/nptl/tst-rwlock11.c deleted file mode 100644 index bcd435803a..0000000000 --- a/nptl/tst-rwlock11.c +++ /dev/null @@ -1,20 +0,0 @@ -/* Test program for timedout read/write lock functions. - Copyright (C) 2003-2017 Free Software Foundation, Inc. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#define KIND PTHREAD_RWLOCK_PREFER_READER_NP -#include "tst-rwlock9.c" diff --git a/nptl/tst-rwlock12.c b/nptl/tst-rwlock12.c deleted file mode 100644 index cd9c176a23..0000000000 --- a/nptl/tst-rwlock12.c +++ /dev/null @@ -1,207 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/wait.h> - - -static int -do_test (void) -{ - size_t ps = sysconf (_SC_PAGESIZE); - char tmpfname[] = "/tmp/tst-rwlock12.XXXXXX"; - char data[ps]; - void *mem; - int fd; - pthread_mutex_t *m; - pthread_mutexattr_t ma; - pthread_rwlock_t *r; - pthread_rwlockattr_t ra; - pid_t pid; - int status = 0; - - fd = mkstemp (tmpfname); - if (fd == -1) - { - printf ("cannot open temporary file: %m\n"); - return 1; - } - - /* Make sure it is always removed. */ - unlink (tmpfname); - - /* Create one page of data. */ - memset (data, '\0', ps); - - /* Write the data to the file. */ - if (write (fd, data, ps) != (ssize_t) ps) - { - puts ("short write"); - return 1; - } - - mem = mmap (NULL, ps, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (mem == MAP_FAILED) - { - printf ("mmap failed: %m\n"); - return 1; - } - - r = (pthread_rwlock_t *) (((uintptr_t) mem + __alignof (pthread_rwlock_t)) - & ~(__alignof (pthread_rwlock_t) - 1)); - /* The following assumes alignment for a mutex is at least as high - as that for a rwlock. Which is true in our case. */ - m = (pthread_mutex_t *) (r + 1); - - if (pthread_rwlockattr_init (&ra) != 0) - { - puts ("rwlockattr_init failed"); - return 1; - } - - if (pthread_rwlockattr_setpshared (&ra, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("rwlockattr_setpshared failed"); - return 1; - } - - if (pthread_rwlock_init (r, &ra) != 0) - { - puts ("rwlock_init failed"); - return 1; - } - - if (pthread_mutexattr_init (&ma) != 0) - { - puts ("rwlockattr_init failed"); - return 1; - } - - if (pthread_mutexattr_setpshared (&ma, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("mutexattr_setpshared failed"); - return 1; - } - - if (pthread_mutex_init (m, &ma) != 0) - { - puts ("mutex_init failed"); - return 1; - } - - /* Lock the mutex. */ - if (pthread_mutex_lock (m) != 0) - { - puts ("mutex_lock failed"); - return 1; - } - - puts ("going to fork now"); - pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - return 1; - } - else if (pid == 0) - { - /* Lock the mutex. */ - if (pthread_mutex_lock (m) != 0) - { - puts ("child: mutex_lock failed"); - return 1; - } - - /* Try to get the rwlock. */ - if (pthread_rwlock_trywrlock (r) == 0) - { - puts ("rwlock_trywrlock succeeded"); - return 1; - } - - /* Try again. */ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 500000000 }; - int e = pthread_rwlock_timedwrlock (r, &ts); - if (e == 0) - { - puts ("rwlock_timedwrlock succeeded"); - return 1; - } - if (e != ETIMEDOUT) - { - puts ("rwlock_timedwrlock didn't return ETIMEDOUT"); - status = 1; - } - - if (pthread_rwlock_tryrdlock (r) == 0) - { - puts ("rwlock_tryrdlock succeeded"); - return 1; - } - - e = pthread_rwlock_timedrdlock (r, &ts); - if (e == 0) - { - puts ("rwlock_timedrdlock succeeded"); - return 1; - } - if (e != ETIMEDOUT) - { - puts ("rwlock_timedrdlock didn't return ETIMEDOUT"); - status = 1; - } - } - else - { - /* Lock the rwlock for writing. */ - if (pthread_rwlock_wrlock (r) != 0) - { - puts ("rwlock_wrlock failed"); - kill (pid, SIGTERM); - return 1; - } - - /* Allow the child to run. */ - if (pthread_mutex_unlock (m) != 0) - { - puts ("mutex_unlock failed"); - kill (pid, SIGTERM); - return 1; - } - - /* Just wait for the child. */ - if (TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)) != pid) - { - puts ("waitpid failed"); - kill (pid, SIGTERM); - return 1; - } - } - - return status; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-rwlock13.c b/nptl/tst-rwlock13.c deleted file mode 100644 index bd2d7138d1..0000000000 --- a/nptl/tst-rwlock13.c +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (C) 2004-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <string.h> - - -static int -do_test (void) -{ - pthread_rwlock_t r; - int ret; - - memset (&r, 0xaa, sizeof (r)); - if ((ret = pthread_rwlock_init (&r, NULL)) != 0) - { - printf ("rwlock_init failed: %d\n", ret); - return 1; - } - - if ((ret = pthread_rwlock_rdlock (&r)) != 0) - { - printf ("rwlock_rdlock failed: %d\n", ret); - return 1; - } - - if ((ret = pthread_rwlock_unlock (&r)) != 0) - { - printf ("rwlock_unlock failed: %d\n", ret); - return 1; - } - - if ((ret = pthread_rwlock_wrlock (&r)) != 0) - { - printf ("rwlock_wrlock failed: %d\n", ret); - return 1; - } - - if ((ret = pthread_rwlock_unlock (&r)) != 0) - { - printf ("second rwlock_unlock failed: %d\n", ret); - return 1; - } - - if ((ret = pthread_rwlock_destroy (&r)) != 0) - { - printf ("second rwlock_destroy failed: %d\n", ret); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-rwlock14.c b/nptl/tst-rwlock14.c deleted file mode 100644 index 763b529eea..0000000000 --- a/nptl/tst-rwlock14.c +++ /dev/null @@ -1,168 +0,0 @@ -/* Copyright (C) 2004-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> - - -static pthread_barrier_t b; -static pthread_rwlock_t r = PTHREAD_RWLOCK_INITIALIZER; - - -static void * -tf (void *arg) -{ - /* Lock the read-write lock. */ - if (pthread_rwlock_wrlock (&r) != 0) - { - puts ("tf: cannot lock rwlock"); - exit (EXIT_FAILURE); - } - - pthread_t mt = *(pthread_t *) arg; - - pthread_barrier_wait (&b); - - /* This call will never return. */ - pthread_join (mt, NULL); - - return NULL; -} - - -static int -do_test (void) -{ - int result = 0; - struct timespec ts; - - if (clock_gettime (CLOCK_REALTIME, &ts) != 0) - { - puts ("clock_gettime failed"); - return 1; - } - - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - pthread_t me = pthread_self (); - pthread_t th; - if (pthread_create (&th, NULL, tf, &me) != 0) - { - puts ("create failed"); - return 1; - } - - /* Wait until the rwlock is locked. */ - pthread_barrier_wait (&b); - - ts.tv_nsec = -1; - - int e = pthread_rwlock_timedrdlock (&r, &ts); - if (e == 0) - { - puts ("first rwlock_timedrdlock did not fail"); - result = 1; - } - else if (e != EINVAL) - { - puts ("first rwlock_timedrdlock did not return EINVAL"); - result = 1; - } - - e = pthread_rwlock_timedwrlock (&r, &ts); - if (e == 0) - { - puts ("first rwlock_timedwrlock did not fail"); - result = 1; - } - else if (e != EINVAL) - { - puts ("first rwlock_timedwrlock did not return EINVAL"); - result = 1; - } - - ts.tv_nsec = 1000000000; - - e = pthread_rwlock_timedrdlock (&r, &ts); - if (e == 0) - { - puts ("second rwlock_timedrdlock did not fail"); - result = 1; - } - else if (e != EINVAL) - { - puts ("second rwlock_timedrdlock did not return EINVAL"); - result = 1; - } - - e = pthread_rwlock_timedrdlock (&r, &ts); - if (e == 0) - { - puts ("second rwlock_timedrdlock did not fail"); - result = 1; - } - else if (e != EINVAL) - { - puts ("second rwlock_timedrdlock did not return EINVAL"); - result = 1; - } - - ts.tv_nsec = (__typeof (ts.tv_nsec)) 0x100001000LL; - if ((__typeof (ts.tv_nsec)) 0x100001000LL != 0x100001000LL) - ts.tv_nsec = 2000000000; - - e = pthread_rwlock_timedrdlock (&r, &ts); - if (e == 0) - { - puts ("third rwlock_timedrdlock did not fail"); - result = 1; - } - else if (e != EINVAL) - { - puts ("third rwlock_timedrdlock did not return EINVAL"); - result = 1; - } - - e = pthread_rwlock_timedrdlock (&r, &ts); - if (e == 0) - { - puts ("third rwlock_timedrdlock did not fail"); - result = 1; - } - else if (e != EINVAL) - { - puts ("third rwlock_timedrdlock did not return EINVAL"); - result = 1; - } - - if (result == 0) - puts ("no bugs"); - - return result; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-rwlock15.c b/nptl/tst-rwlock15.c deleted file mode 100644 index 78225fea27..0000000000 --- a/nptl/tst-rwlock15.c +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright (C) 2015-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* This tests that a writer that is preferred -- but times out due to a - reader being present -- does not miss to wake other readers blocked on the - writer's pending lock acquisition. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> - -/* The bug existed in the code that strictly prefers writers over readers. */ -static pthread_rwlock_t r = PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP; - -static void * -writer (void *arg) -{ - struct timespec ts; - if (clock_gettime (CLOCK_REALTIME, &ts) != 0) - { - puts ("clock_gettime failed"); - exit (EXIT_FAILURE); - } - ts.tv_sec += 1; - int e = pthread_rwlock_timedwrlock (&r, &ts); - if (e != ETIMEDOUT) - { - puts ("timedwrlock did not time out"); - exit (EXIT_FAILURE); - } - return NULL; -} - -static void * -reader (void *arg) -{ - /* This isn't a reliable way to get the interleaving we need (because a - failed trylock doesn't synchronize with the writer, and because we could - try to lock after the writer has already timed out). However, both will - just lead to false positives. */ - int e; - while ((e = pthread_rwlock_tryrdlock (&r)) != EBUSY) - { - if (e != 0) - exit (EXIT_FAILURE); - pthread_rwlock_unlock (&r); - } - e = pthread_rwlock_rdlock (&r); - if (e != 0) - { - puts ("reader rdlock failed"); - exit (EXIT_FAILURE); - } - pthread_rwlock_unlock (&r); - return NULL; -} - - -static int -do_test (void) -{ - /* Grab a rdlock, then create a writer and a reader, and wait until they - finished. */ - - if (pthread_rwlock_rdlock (&r) != 0) - { - puts ("initial rdlock failed"); - return 1; - } - - pthread_t thw; - if (pthread_create (&thw, NULL, writer, NULL) != 0) - { - puts ("create failed"); - return 1; - } - pthread_t thr; - if (pthread_create (&thr, NULL, reader, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - if (pthread_join (thw, NULL) != 0) - { - puts ("writer join failed"); - return 1; - } - if (pthread_join (thr, NULL) != 0) - { - puts ("reader join failed"); - return 1; - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-rwlock16.c b/nptl/tst-rwlock16.c deleted file mode 100644 index d19293198a..0000000000 --- a/nptl/tst-rwlock16.c +++ /dev/null @@ -1,183 +0,0 @@ -/* Copyright (C) 2015-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* This tests that with a reader-preferring rwlock, all readers are woken if - one reader "steals" lock ownership from a blocked writer. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <semaphore.h> -#include <unistd.h> - -/* If we strictly prefer writers over readers, a program must not expect - that, in the presence of concurrent writers, one reader will also acquire - the lock when another reader has already done so. Thus, use the - default rwlock type that does not strictly prefer writers. */ -static pthread_rwlock_t r = PTHREAD_RWLOCK_INITIALIZER; - -static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; -static pthread_cond_t cv = PTHREAD_COND_INITIALIZER; - -/* Avoid using glibc-internal atomic operations. */ -static sem_t stop; -static int consumer_stop = 0; - -static void * -writer (void *arg) -{ - int s; - - do - { - if (pthread_rwlock_wrlock (&r) != 0) - { - puts ("wrlock failed"); - exit (EXIT_FAILURE); - } - if (pthread_rwlock_unlock (&r) != 0) - { - puts ("unlock failed"); - exit (EXIT_FAILURE); - } - sem_getvalue (&stop, &s); - } - while (s == 0); - return NULL; -} - -static void * -reader_producer (void *arg) -{ - int s; - - do - { - if (pthread_rwlock_rdlock (&r) != 0) - { - puts ("rdlock reader failed"); - exit (EXIT_FAILURE); - } - - sem_getvalue (&stop, &s); - - pthread_mutex_lock (&m); - if (s != 0) - consumer_stop = 1; - pthread_cond_signal (&cv); - pthread_mutex_unlock (&m); - - if (pthread_rwlock_unlock (&r) != 0) - { - puts ("unlock reader failed"); - exit (EXIT_FAILURE); - } - } - while (s == 0); - puts ("producer finished"); - return NULL; -} - -static void * -reader_consumer (void *arg) -{ - int s; - - do - { - if (pthread_rwlock_rdlock (&r) != 0) - { - puts ("rdlock reader failed"); - exit (EXIT_FAILURE); - } - - pthread_mutex_lock (&m); - s = consumer_stop; - if (s == 0) - pthread_cond_wait (&cv, &m); - pthread_mutex_unlock (&m); - - if (pthread_rwlock_unlock (&r) != 0) - { - puts ("unlock reader failed"); - exit (EXIT_FAILURE); - } - } - while (s == 0); - puts ("consumer finished"); - return NULL; -} - - -static int -do_test (void) -{ - pthread_t w1, w2, rp, rc; - - if (pthread_create (&w1, NULL, writer, NULL) != 0) - { - puts ("create failed"); - return 1; - } - if (pthread_create (&w2, NULL, writer, NULL) != 0) - { - puts ("create failed"); - return 1; - } - if (pthread_create (&rc, NULL, reader_consumer, NULL) != 0) - { - puts ("create failed"); - return 1; - } - if (pthread_create (&rp, NULL, reader_producer, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - sleep (2); - sem_post (&stop); - - if (pthread_join (w1, NULL) != 0) - { - puts ("w1 join failed"); - return 1; - } - if (pthread_join (w2, NULL) != 0) - { - puts ("w2 join failed"); - return 1; - } - if (pthread_join (rp, NULL) != 0) - { - puts ("reader_producer join failed"); - return 1; - } - if (pthread_join (rc, NULL) != 0) - { - puts ("reader_consumer join failed"); - return 1; - } - - return 0; -} - - -#define TIMEOUT 3 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-rwlock17.c b/nptl/tst-rwlock17.c deleted file mode 100644 index 50c87e1f11..0000000000 --- a/nptl/tst-rwlock17.c +++ /dev/null @@ -1,19 +0,0 @@ -/* Test program for timedout read/write lock functions. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#define KIND PTHREAD_RWLOCK_PREFER_WRITER_NP -#include "tst-rwlock8.c" diff --git a/nptl/tst-rwlock18.c b/nptl/tst-rwlock18.c deleted file mode 100644 index c07935c56e..0000000000 --- a/nptl/tst-rwlock18.c +++ /dev/null @@ -1,19 +0,0 @@ -/* Test program for timedout read/write lock functions. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#define KIND PTHREAD_RWLOCK_PREFER_WRITER_NP -#include "tst-rwlock9.c" diff --git a/nptl/tst-rwlock19.c b/nptl/tst-rwlock19.c deleted file mode 100644 index 746d84d92f..0000000000 --- a/nptl/tst-rwlock19.c +++ /dev/null @@ -1,127 +0,0 @@ -/* Test rdlock overflow. - Copyright (C) 2000-2017 Free Software Foundation, Inc. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <error.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <unistd.h> -#include <pthreadP.h> - - -#define NREADERS 15 -#define READTRIES 5000 - -#define DELAY 1000000 - -static pthread_rwlock_t lock = PTHREAD_RWLOCK_INITIALIZER; -static int eagain_returned = 0; -static int success_returned = 0; - -static void * -reader_thread (void *nr) -{ - struct timespec delay; - int n; - - delay.tv_sec = 0; - delay.tv_nsec = DELAY; - - for (n = 0; n < READTRIES; ++n) - { - int err = pthread_rwlock_rdlock (&lock); - if (err == EAGAIN) - { - atomic_store_relaxed (&eagain_returned, 1); - continue; - } - else if (err == 0) - atomic_store_relaxed (&success_returned, 1); - else - { - puts ("rdlock failed"); - exit (1); - } - - nanosleep (&delay, NULL); - - if (pthread_rwlock_unlock (&lock) != 0) - { - puts ("unlock for reader failed"); - exit (1); - } - } - - return NULL; -} - - -static int -do_test (void) -{ - pthread_t thrd[NREADERS]; - int n; - void *res; - - /* Set the rwlock so that it's close to a reader overflow. - PTHREAD_RWLOCK_WRPHASE and PTHREAD_RWLOCK_WRLOCK are zero initially. */ - unsigned int readers = PTHREAD_RWLOCK_READER_OVERFLOW - - ((NREADERS / 3) << PTHREAD_RWLOCK_READER_SHIFT); - lock.__data.__readers = readers; - - for (n = 0; n < NREADERS; ++n) - if (pthread_create (&thrd[n], NULL, reader_thread, - (void *) (long int) n) != 0) - { - puts ("reader create failed"); - exit (1); - } - - /* Wait for all the threads. */ - for (n = 0; n < NREADERS; ++n) - if (pthread_join (thrd[n], &res) != 0) - { - puts ("reader join failed"); - exit (1); - } - - if (atomic_load_relaxed (&eagain_returned) == 0) - { - puts ("EAGAIN has never been returned"); - exit (1); - } - - if (atomic_load_relaxed (&success_returned) == 0) - { - puts ("rdlock was never successfully acquired"); - exit (1); - } - - if (lock.__data.__readers != readers) - { - puts ("__readers in rwlock differs from initial value"); - exit (1); - } - - return 0; -} - -#define TIMEOUT 30 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-rwlock2.c b/nptl/tst-rwlock2.c deleted file mode 100644 index 40462005ee..0000000000 --- a/nptl/tst-rwlock2.c +++ /dev/null @@ -1,168 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> - - -static int -do_test (void) -{ - pthread_rwlock_t r; - pthread_rwlockattr_t at; - int e; - - if (pthread_rwlockattr_init (&at) != 0) - { - puts ("rwlockattr_init failed"); - return 1; - } - puts ("rwlockattr_init succeeded"); - -#ifndef TYPE -# define TYPE PTHREAD_RWLOCK_PREFER_READER_NP -#endif - - if (pthread_rwlockattr_setkind_np (&at, TYPE) != 0) - { - puts ("rwlockattr_setkind failed"); - return 1; - } - puts ("rwlockattr_setkind succeeded"); - - if (pthread_rwlock_init (&r, &at) != 0) - { - puts ("rwlock_init failed"); - return 1; - } - puts ("rwlock_init succeeded"); - - if (pthread_rwlockattr_destroy (&at) != 0) - { - puts ("rwlockattr_destroy failed"); - return 1; - } - puts ("rwlockattr_destroy succeeded"); - - if (pthread_rwlock_wrlock (&r) != 0) - { - puts ("1st rwlock_wrlock failed"); - return 1; - } - puts ("1st rwlock_wrlock succeeded"); - - e = pthread_rwlock_tryrdlock (&r); - if (e == 0) - { - puts ("rwlock_tryrdlock on rwlock with writer succeeded"); - return 1; - } - if (e != EBUSY) - { - puts ("rwlock_tryrdlock on rwlock with writer return value != EBUSY"); - return 1; - } - puts ("rwlock_tryrdlock on rwlock with writer failed with EBUSY"); - - e = pthread_rwlock_trywrlock (&r); - if (e == 0) - { - puts ("rwlock_trywrlock on rwlock with writer succeeded"); - return 1; - } - if (e != EBUSY) - { - puts ("rwlock_trywrlock on rwlock with writer return value != EBUSY"); - return 1; - } - puts ("rwlock_trywrlock on rwlock with writer failed with EBUSY"); - - if (pthread_rwlock_unlock (&r) != 0) - { - puts ("1st rwlock_unlock failed"); - return 1; - } - puts ("1st rwlock_unlock succeeded"); - - if (pthread_rwlock_tryrdlock (&r) != 0) - { - puts ("rwlock_tryrdlock on unlocked rwlock failed"); - return 1; - } - puts ("rwlock_tryrdlock on unlocked rwlock succeeded"); - - e = pthread_rwlock_trywrlock (&r); - if (e == 0) - { - puts ("rwlock_trywrlock on rwlock with reader succeeded"); - return 1; - } - if (e != EBUSY) - { - puts ("rwlock_trywrlock on rwlock with reader return value != EBUSY"); - return 1; - } - puts ("rwlock_trywrlock on rwlock with reader failed with EBUSY"); - - if (pthread_rwlock_unlock (&r) != 0) - { - puts ("2nd rwlock_unlock failed"); - return 1; - } - puts ("2nd rwlock_unlock succeeded"); - - if (pthread_rwlock_trywrlock (&r) != 0) - { - puts ("rwlock_trywrlock on unlocked rwlock failed"); - return 1; - } - puts ("rwlock_trywrlock on unlocked rwlock succeeded"); - - e = pthread_rwlock_tryrdlock (&r); - if (e == 0) - { - puts ("rwlock_tryrdlock on rwlock with writer succeeded"); - return 1; - } - if (e != EBUSY) - { - puts ("rwlock_tryrdlock on rwlock with writer return value != EBUSY"); - return 1; - } - puts ("rwlock_tryrdlock on rwlock with writer failed with EBUSY"); - - if (pthread_rwlock_unlock (&r) != 0) - { - puts ("3rd rwlock_unlock failed"); - return 1; - } - puts ("3rd rwlock_unlock succeeded"); - - if (pthread_rwlock_destroy (&r) != 0) - { - puts ("rwlock_destroy failed"); - return 1; - } - puts ("rwlock_destroy succeeded"); - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-rwlock2a.c b/nptl/tst-rwlock2a.c deleted file mode 100644 index 615de5c015..0000000000 --- a/nptl/tst-rwlock2a.c +++ /dev/null @@ -1,2 +0,0 @@ -#define TYPE PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP -#include "tst-rwlock2.c" diff --git a/nptl/tst-rwlock2b.c b/nptl/tst-rwlock2b.c deleted file mode 100644 index 5ebaa3a546..0000000000 --- a/nptl/tst-rwlock2b.c +++ /dev/null @@ -1,2 +0,0 @@ -#define TYPE PTHREAD_RWLOCK_PREFER_WRITER_NP -#include "tst-rwlock2.c" diff --git a/nptl/tst-rwlock3.c b/nptl/tst-rwlock3.c deleted file mode 100644 index 45d83c3ef0..0000000000 --- a/nptl/tst-rwlock3.c +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* This test case checks more than standard compliance. An - implementation may provide this service but it is not required to - do so. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> - - -static int -do_test (void) -{ - pthread_rwlock_t r; - int e; - - if (pthread_rwlock_init (&r, NULL) != 0) - { - puts ("rwlock_init failed"); - return 1; - } - puts ("rwlock_init succeeded"); - - if (pthread_rwlock_trywrlock (&r) != 0) - { - puts ("rwlock_trywrlock on unlocked rwlock failed"); - return 1; - } - puts ("rwlock_trywrlock on unlocked rwlock succeeded"); - - e = pthread_rwlock_rdlock (&r); - if (e == 0) - { - puts ("rwlock_rdlock on rwlock with writer succeeded"); - return 1; - } - if (e != EDEADLK) - { - puts ("rwlock_rdlock on rwlock with writer failed != EDEADLK"); - return 1; - } - puts ("rwlock_rdlock on rwlock with writer failed with EDEADLK"); - - e = pthread_rwlock_wrlock (&r); - if (e == 0) - { - puts ("rwlock_wrlock on rwlock with writer succeeded"); - return 1; - } - if (e != EDEADLK) - { - puts ("rwlock_wrlock on rwlock with writer failed != EDEADLK"); - return 1; - } - puts ("rwlock_wrlock on rwlock with writer failed with EDEADLK"); - - if (pthread_rwlock_unlock (&r) != 0) - { - puts ("rwlock_unlock failed"); - return 1; - } - puts ("rwlock_unlock succeeded"); - - if (pthread_rwlock_destroy (&r) != 0) - { - puts ("rwlock_destroy failed"); - return 1; - } - puts ("rwlock_destroy succeeded"); - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-rwlock4.c b/nptl/tst-rwlock4.c deleted file mode 100644 index 73c301ba93..0000000000 --- a/nptl/tst-rwlock4.c +++ /dev/null @@ -1,189 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/wait.h> - - -static int -do_test (void) -{ - size_t ps = sysconf (_SC_PAGESIZE); - char tmpfname[] = "/tmp/tst-rwlock4.XXXXXX"; - char data[ps]; - void *mem; - int fd; - pthread_rwlock_t *r; - pthread_rwlockattr_t a; - pid_t pid; - char *p; - int err; - int s; - - fd = mkstemp (tmpfname); - if (fd == -1) - { - printf ("cannot open temporary file: %m\n"); - return 1; - } - - /* Make sure it is always removed. */ - unlink (tmpfname); - - /* Create one page of data. */ - memset (data, '\0', ps); - - /* Write the data to the file. */ - if (write (fd, data, ps) != (ssize_t) ps) - { - puts ("short write"); - return 1; - } - - mem = mmap (NULL, ps, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (mem == MAP_FAILED) - { - printf ("mmap failed: %m\n"); - return 1; - } - - r = (pthread_rwlock_t *) (((uintptr_t) mem + __alignof (pthread_rwlock_t)) - & ~(__alignof (pthread_rwlock_t) - 1)); - p = (char *) (r + 1); - - if (pthread_rwlockattr_init (&a) != 0) - { - puts ("rwlockattr_init failed"); - return 1; - } - - if (pthread_rwlockattr_getpshared (&a, &s) != 0) - { - puts ("1st rwlockattr_getpshared failed"); - return 1; - } - - if (s != PTHREAD_PROCESS_PRIVATE) - { - puts ("default pshared value wrong"); - return 1; - } - - if (pthread_rwlockattr_setpshared (&a, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("rwlockattr_setpshared failed"); - return 1; - } - - if (pthread_rwlockattr_getpshared (&a, &s) != 0) - { - puts ("2nd rwlockattr_getpshared failed"); - return 1; - } - - if (s != PTHREAD_PROCESS_SHARED) - { - puts ("pshared value after setpshared call wrong"); - return 1; - } - - if (pthread_rwlock_init (r, &a) != 0) - { - puts ("rwlock_init failed"); - return 1; - } - - if (pthread_rwlock_rdlock (r) != 0) - { - puts ("rwlock_rdlock failed"); - return 1; - } - - if (pthread_rwlockattr_destroy (&a) != 0) - { - puts ("rwlockattr_destroy failed"); - return 1; - } - - err = pthread_rwlock_trywrlock (r); - if (err == 0) - { - puts ("rwlock_trywrlock succeeded"); - return 1; - } - else if (err != EBUSY) - { - puts ("rwlock_trywrlock didn't return EBUSY"); - return 1; - } - - *p = 0; - - puts ("going to fork now"); - pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - return 1; - } - else if (pid == 0) - { - /* Play some lock ping-pong. It's our turn to unlock first. */ - if ((*p)++ != 0) - { - puts ("child: *p != 0"); - return 1; - } - - if (pthread_rwlock_unlock (r) != 0) - { - puts ("child: 1st rwlock_unlock failed"); - return 1; - } - - puts ("child done"); - } - else - { - if (pthread_rwlock_wrlock (r) != 0) - { - puts ("parent: rwlock_wrlock failed"); - return 1; - } - - if (*p != 1) - { - puts ("*p != 1"); - return 1; - } - - puts ("parent done"); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-rwlock5.c b/nptl/tst-rwlock5.c deleted file mode 100644 index ca95fc0714..0000000000 --- a/nptl/tst-rwlock5.c +++ /dev/null @@ -1,84 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; -static pthread_rwlock_t r; - - -static void * -tf (void *arg) -{ - if (pthread_rwlock_wrlock (&r) == 0) - { - puts ("child: rwlock_wrlock succeeded"); - exit (1); - } - - puts ("child: rwlock_wrlock returned"); - - exit (1); -} - - -static int -do_test (void) -{ - pthread_t th; - - if (pthread_rwlock_init (&r, NULL) != 0) - { - puts ("rwlock_init failed"); - return 1; - } - - if (pthread_rwlock_wrlock (&r) != 0) - { - puts ("rwlock_wrlock failed"); - return 1; - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("mutex_lock failed"); - return 1; - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - delayed_exit (1); - /* This call should never return. */ - xpthread_mutex_lock (&m); - - puts ("2nd mutex_lock returned"); - return 1; -} diff --git a/nptl/tst-rwlock6.c b/nptl/tst-rwlock6.c deleted file mode 100644 index 50906d893a..0000000000 --- a/nptl/tst-rwlock6.c +++ /dev/null @@ -1,225 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <sys/time.h> - - -static int kind[] = - { - PTHREAD_RWLOCK_PREFER_READER_NP, - PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, - PTHREAD_RWLOCK_PREFER_WRITER_NP, - }; - - -static void * -tf (void *arg) -{ - pthread_rwlock_t *r = arg; - - /* Timeout: 0.3 secs. */ - struct timeval tv; - (void) gettimeofday (&tv, NULL); - - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_nsec += 300000000; - if (ts.tv_nsec >= 1000000000) - { - ts.tv_nsec -= 1000000000; - ++ts.tv_sec; - } - - puts ("child calling timedrdlock"); - - int err = pthread_rwlock_timedrdlock (r, &ts); - if (err == 0) - { - puts ("rwlock_timedrdlock returned"); - pthread_exit ((void *) 1l); - } - - if (err != ETIMEDOUT) - { - printf ("err = %s (%d), expected %s (%d)\n", - strerror (err), err, strerror (ETIMEDOUT), ETIMEDOUT); - pthread_exit ((void *) 1l); - } - - puts ("1st child timedrdlock done"); - - struct timeval tv2; - (void) gettimeofday (&tv2, NULL); - - timersub (&tv2, &tv, &tv); - - if (tv.tv_usec < 200000) - { - puts ("timeout too short"); - pthread_exit ((void *) 1l); - } - - (void) gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_sec += 10; - /* Note that the following operation makes ts invalid. */ - ts.tv_nsec += 1000000000; - - err = pthread_rwlock_timedrdlock (r, &ts); - if (err == 0) - { - puts ("2nd timedrdlock succeeded"); - pthread_exit ((void *) 1l); - } - if (err != EINVAL) - { - puts ("2nd timedrdlock did not return EINVAL"); - pthread_exit ((void *) 1l); - } - - puts ("2nd child timedrdlock done"); - - return NULL; -} - - -static int -do_test (void) -{ - size_t cnt; - for (cnt = 0; cnt < sizeof (kind) / sizeof (kind[0]); ++cnt) - { - pthread_rwlock_t r; - pthread_rwlockattr_t a; - - if (pthread_rwlockattr_init (&a) != 0) - { - printf ("round %Zu: rwlockattr_t failed\n", cnt); - exit (1); - } - - if (pthread_rwlockattr_setkind_np (&a, kind[cnt]) != 0) - { - printf ("round %Zu: rwlockattr_setkind failed\n", cnt); - exit (1); - } - - if (pthread_rwlock_init (&r, &a) != 0) - { - printf ("round %Zu: rwlock_init failed\n", cnt); - exit (1); - } - - if (pthread_rwlockattr_destroy (&a) != 0) - { - printf ("round %Zu: rwlockattr_destroy failed\n", cnt); - exit (1); - } - - struct timeval tv; - (void) gettimeofday (&tv, NULL); - - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - - ++ts.tv_sec; - - /* Get a write lock. */ - int e = pthread_rwlock_timedwrlock (&r, &ts); - if (e != 0) - { - printf ("round %Zu: rwlock_timedwrlock failed (%d)\n", cnt, e); - exit (1); - } - - puts ("1st timedwrlock done"); - - (void) gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ++ts.tv_sec; - e = pthread_rwlock_timedrdlock (&r, &ts); - if (e == 0) - { - puts ("timedrdlock succeeded"); - exit (1); - } - if (e != EDEADLK) - { - puts ("timedrdlock did not return EDEADLK"); - exit (1); - } - - puts ("1st timedrdlock done"); - - (void) gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ++ts.tv_sec; - e = pthread_rwlock_timedwrlock (&r, &ts); - if (e == 0) - { - puts ("2nd timedwrlock succeeded"); - exit (1); - } - if (e != EDEADLK) - { - puts ("2nd timedwrlock did not return EDEADLK"); - exit (1); - } - - puts ("2nd timedwrlock done"); - - pthread_t th; - if (pthread_create (&th, NULL, tf, &r) != 0) - { - printf ("round %Zu: create failed\n", cnt); - exit (1); - } - - puts ("started thread"); - - void *status; - if (pthread_join (th, &status) != 0) - { - printf ("round %Zu: join failed\n", cnt); - exit (1); - } - if (status != NULL) - { - printf ("failure in round %Zu\n", cnt); - exit (1); - } - - puts ("joined thread"); - - if (pthread_rwlock_destroy (&r) != 0) - { - printf ("round %Zu: rwlock_destroy failed\n", cnt); - exit (1); - } - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-rwlock7.c b/nptl/tst-rwlock7.c deleted file mode 100644 index 504e51c68a..0000000000 --- a/nptl/tst-rwlock7.c +++ /dev/null @@ -1,181 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <sys/time.h> - - -static int kind[] = - { - PTHREAD_RWLOCK_PREFER_READER_NP, - PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, - PTHREAD_RWLOCK_PREFER_WRITER_NP, - }; - - -static void * -tf (void *arg) -{ - pthread_rwlock_t *r = arg; - - /* Timeout: 0.3 secs. */ - struct timeval tv; - (void) gettimeofday (&tv, NULL); - - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_nsec += 300000000; - if (ts.tv_nsec >= 1000000000) - { - ts.tv_nsec -= 1000000000; - ++ts.tv_sec; - } - - int err = pthread_rwlock_timedwrlock (r, &ts); - if (err == 0) - { - puts ("rwlock_timedwrlock returned"); - pthread_exit ((void *) 1l); - } - - if (err != ETIMEDOUT) - { - printf ("err = %s (%d), expected %s (%d)\n", - strerror (err), err, strerror (ETIMEDOUT), ETIMEDOUT); - pthread_exit ((void *) 1l); - } - puts ("child: timedwrlock failed with ETIMEDOUT"); - - struct timeval tv2; - (void) gettimeofday (&tv2, NULL); - - timersub (&tv2, &tv, &tv); - - if (tv.tv_usec < 200000) - { - puts ("timeout too short"); - pthread_exit ((void *) 1l); - } - - (void) gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_sec += 10; - /* Note that the following operation makes ts invalid. */ - ts.tv_nsec += 1000000000; - - err = pthread_rwlock_timedwrlock (r, &ts); - if (err == 0) - { - puts ("2nd timedwrlock succeeded"); - pthread_exit ((void *) 1l); - } - if (err != EINVAL) - { - puts ("2nd timedwrlock did not return EINVAL"); - pthread_exit ((void *) 1l); - } - puts ("child: timedwrlock failed with EINVAL"); - - return NULL; -} - - -static int -do_test (void) -{ - size_t cnt; - for (cnt = 0; cnt < sizeof (kind) / sizeof (kind[0]); ++cnt) - { - pthread_rwlock_t r; - pthread_rwlockattr_t a; - - if (pthread_rwlockattr_init (&a) != 0) - { - printf ("round %Zu: rwlockattr_t failed\n", cnt); - exit (1); - } - - if (pthread_rwlockattr_setkind_np (&a, kind[cnt]) != 0) - { - printf ("round %Zu: rwlockattr_setkind failed\n", cnt); - exit (1); - } - - if (pthread_rwlock_init (&r, &a) != 0) - { - printf ("round %Zu: rwlock_init failed\n", cnt); - exit (1); - } - - if (pthread_rwlockattr_destroy (&a) != 0) - { - printf ("round %Zu: rwlockattr_destroy failed\n", cnt); - exit (1); - } - - struct timeval tv; - (void) gettimeofday (&tv, NULL); - - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - - ++ts.tv_sec; - - /* Get a read lock. */ - if (pthread_rwlock_timedrdlock (&r, &ts) != 0) - { - printf ("round %Zu: rwlock_timedrdlock failed\n", cnt); - exit (1); - } - printf ("%zu: got timedrdlock\n", cnt); - - pthread_t th; - if (pthread_create (&th, NULL, tf, &r) != 0) - { - printf ("round %Zu: create failed\n", cnt); - exit (1); - } - - void *status; - if (pthread_join (th, &status) != 0) - { - printf ("round %Zu: join failed\n", cnt); - exit (1); - } - if (status != NULL) - { - printf ("failure in round %Zu\n", cnt); - exit (1); - } - - if (pthread_rwlock_destroy (&r) != 0) - { - printf ("round %Zu: rwlock_destroy failed\n", cnt); - exit (1); - } - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-rwlock8.c b/nptl/tst-rwlock8.c deleted file mode 100644 index 5f3174d46a..0000000000 --- a/nptl/tst-rwlock8.c +++ /dev/null @@ -1,182 +0,0 @@ -/* Test program for timedout read/write lock functions. - Copyright (C) 2000-2017 Free Software Foundation, Inc. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2000. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <error.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <unistd.h> - - -#define NWRITERS 15 -#define WRITETRIES 10 -#define NREADERS 15 -#define READTRIES 15 - -#define DELAY 1000000 - -#ifndef KIND -# define KIND PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP -#endif - -static pthread_rwlock_t lock; - - -static void * -writer_thread (void *nr) -{ - struct timespec delay; - int n; - - delay.tv_sec = 0; - delay.tv_nsec = DELAY; - - for (n = 0; n < WRITETRIES; ++n) - { - printf ("writer thread %ld tries again\n", (long int) nr); - - if (pthread_rwlock_wrlock (&lock) != 0) - { - puts ("wrlock failed"); - exit (1); - } - - printf ("writer thread %ld succeeded\n", (long int) nr); - - nanosleep (&delay, NULL); - - if (pthread_rwlock_unlock (&lock) != 0) - { - puts ("unlock for writer failed"); - exit (1); - } - - printf ("writer thread %ld released\n", (long int) nr); - } - - return NULL; -} - - -static void * -reader_thread (void *nr) -{ - struct timespec delay; - int n; - - delay.tv_sec = 0; - delay.tv_nsec = DELAY; - - for (n = 0; n < READTRIES; ++n) - { - printf ("reader thread %ld tries again\n", (long int) nr); - - if (pthread_rwlock_rdlock (&lock) != 0) - { - puts ("rdlock failed"); - exit (1); - } - - printf ("reader thread %ld succeeded\n", (long int) nr); - - nanosleep (&delay, NULL); - - if (pthread_rwlock_unlock (&lock) != 0) - { - puts ("unlock for reader failed"); - exit (1); - } - - printf ("reader thread %ld released\n", (long int) nr); - } - - return NULL; -} - - -static int -do_test (void) -{ - pthread_t thwr[NWRITERS]; - pthread_t thrd[NREADERS]; - int n; - void *res; - pthread_rwlockattr_t a; - - if (pthread_rwlockattr_init (&a) != 0) - { - puts ("rwlockattr_t failed"); - exit (1); - } - - if (pthread_rwlockattr_setkind_np (&a, KIND) != 0) - { - puts ("rwlockattr_setkind failed"); - exit (1); - } - - if (pthread_rwlock_init (&lock, &a) != 0) - { - puts ("rwlock_init failed"); - exit (1); - } - - /* Make standard error the same as standard output. */ - dup2 (1, 2); - - /* Make sure we see all message, even those on stdout. */ - setvbuf (stdout, NULL, _IONBF, 0); - - for (n = 0; n < NWRITERS; ++n) - if (pthread_create (&thwr[n], NULL, writer_thread, - (void *) (long int) n) != 0) - { - puts ("writer create failed"); - exit (1); - } - - for (n = 0; n < NREADERS; ++n) - if (pthread_create (&thrd[n], NULL, reader_thread, - (void *) (long int) n) != 0) - { - puts ("reader create failed"); - exit (1); - } - - /* Wait for all the threads. */ - for (n = 0; n < NWRITERS; ++n) - if (pthread_join (thwr[n], &res) != 0) - { - puts ("writer join failed"); - exit (1); - } - for (n = 0; n < NREADERS; ++n) - if (pthread_join (thrd[n], &res) != 0) - { - puts ("reader join failed"); - exit (1); - } - - return 0; -} - -#define TIMEOUT 30 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-rwlock9.c b/nptl/tst-rwlock9.c deleted file mode 100644 index a7ea34fae6..0000000000 --- a/nptl/tst-rwlock9.c +++ /dev/null @@ -1,221 +0,0 @@ -/* Test program for timedout read/write lock functions. - Copyright (C) 2000-2017 Free Software Foundation, Inc. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2000. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <error.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <unistd.h> -#include <sys/time.h> - - -#define NWRITERS 15 -#define WRITETRIES 10 -#define NREADERS 15 -#define READTRIES 15 - -#define TIMEOUT 1000000 -#define DELAY 1000000 - -#ifndef KIND -# define KIND PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP -#endif - -static pthread_rwlock_t lock; - - -static void * -writer_thread (void *nr) -{ - struct timespec ts; - struct timespec delay; - int n; - - delay.tv_sec = 0; - delay.tv_nsec = DELAY; - - for (n = 0; n < WRITETRIES; ++n) - { - int e; - do - { - struct timeval tv; - (void) gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); - - ts.tv_nsec += 2 * TIMEOUT; - if (ts.tv_nsec >= 1000000000) - { - ts.tv_nsec -= 1000000000; - ++ts.tv_sec; - } - - printf ("writer thread %ld tries again\n", (long int) nr); - - e = pthread_rwlock_timedwrlock (&lock, &ts); - if (e != 0 && e != ETIMEDOUT) - { - puts ("timedwrlock failed"); - exit (1); - } - } - while (e == ETIMEDOUT); - - printf ("writer thread %ld succeeded\n", (long int) nr); - - nanosleep (&delay, NULL); - - if (pthread_rwlock_unlock (&lock) != 0) - { - puts ("unlock for writer failed"); - exit (1); - } - - printf ("writer thread %ld released\n", (long int) nr); - } - - return NULL; -} - - -static void * -reader_thread (void *nr) -{ - struct timespec ts; - struct timespec delay; - int n; - - delay.tv_sec = 0; - delay.tv_nsec = DELAY; - - for (n = 0; n < READTRIES; ++n) - { - int e; - do - { - struct timeval tv; - (void) gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); - - ts.tv_nsec += TIMEOUT; - if (ts.tv_nsec >= 1000000000) - { - ts.tv_nsec -= 1000000000; - ++ts.tv_sec; - } - - printf ("reader thread %ld tries again\n", (long int) nr); - - e = pthread_rwlock_timedrdlock (&lock, &ts); - if (e != 0 && e != ETIMEDOUT) - { - puts ("timedrdlock failed"); - exit (1); - } - } - while (e == ETIMEDOUT); - - printf ("reader thread %ld succeeded\n", (long int) nr); - - nanosleep (&delay, NULL); - - if (pthread_rwlock_unlock (&lock) != 0) - { - puts ("unlock for reader failed"); - exit (1); - } - - printf ("reader thread %ld released\n", (long int) nr); - } - - return NULL; -} - - -static int -do_test (void) -{ - pthread_t thwr[NWRITERS]; - pthread_t thrd[NREADERS]; - int n; - void *res; - pthread_rwlockattr_t a; - - if (pthread_rwlockattr_init (&a) != 0) - { - puts ("rwlockattr_t failed"); - exit (1); - } - - if (pthread_rwlockattr_setkind_np (&a, KIND) != 0) - { - puts ("rwlockattr_setkind failed"); - exit (1); - } - - if (pthread_rwlock_init (&lock, &a) != 0) - { - puts ("rwlock_init failed"); - exit (1); - } - - /* Make standard error the same as standard output. */ - dup2 (1, 2); - - /* Make sure we see all message, even those on stdout. */ - setvbuf (stdout, NULL, _IONBF, 0); - - for (n = 0; n < NWRITERS; ++n) - if (pthread_create (&thwr[n], NULL, writer_thread, - (void *) (long int) n) != 0) - { - puts ("writer create failed"); - exit (1); - } - - for (n = 0; n < NREADERS; ++n) - if (pthread_create (&thrd[n], NULL, reader_thread, - (void *) (long int) n) != 0) - { - puts ("reader create failed"); - exit (1); - } - - /* Wait for all the threads. */ - for (n = 0; n < NWRITERS; ++n) - if (pthread_join (thwr[n], &res) != 0) - { - puts ("writer join failed"); - exit (1); - } - for (n = 0; n < NREADERS; ++n) - if (pthread_join (thrd[n], &res) != 0) - { - puts ("reader join failed"); - exit (1); - } - - return 0; -} - -#undef TIMEOUT -#define TIMEOUT 30 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-sched1.c b/nptl/tst-sched1.c deleted file mode 100644 index 992abdb007..0000000000 --- a/nptl/tst-sched1.c +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <unistd.h> -#include <sys/types.h> - - -static int global; - -static void * -tf (void *a) -{ - global = 1; - - return 0; -} - - -int -do_test (void) -{ - pthread_t th; - pthread_attr_t at; - - if (pthread_attr_init (&at) != 0) - { - puts ("attr_init failed"); - return 1; - } - - if (pthread_attr_setschedpolicy (&at, SCHED_OTHER) != 0) - { - puts ("attr_setschedpolicy failed"); - return 1; - } - - struct sched_param pa; - if (sched_getparam (getpid (), &pa) != 0) - { - puts ("sched_getschedparam failed"); - return 1; - } - - if (pthread_attr_setschedparam (&at, &pa) != 0) - { - puts ("attr_setschedparam failed"); - return 1; - } - - if (pthread_attr_setinheritsched (&at, PTHREAD_EXPLICIT_SCHED) != 0) - { - puts ("attr_setinheritsched failed"); - return 1; - } - - if (pthread_create (&th, &at, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - int e = pthread_join (th, NULL); - if (e != 0) - { - printf ("join failed: %d\n", e); - return 1; - } - - if (global == 0) - { - puts ("thread didn't run"); - return 1; - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-sem1.c b/nptl/tst-sem1.c deleted file mode 100644 index 29d1f5805e..0000000000 --- a/nptl/tst-sem1.c +++ /dev/null @@ -1,88 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <semaphore.h> -#include <stdio.h> -#include <unistd.h> - - -static int -do_test (void) -{ - sem_t s; - - if (sem_init (&s, 0, 1) == -1) - { - puts ("init failed"); - return 1; - } - - if (TEMP_FAILURE_RETRY (sem_wait (&s)) == -1) - { - puts ("1st wait failed"); - return 1; - } - - if (sem_post (&s) == -1) - { - puts ("1st post failed"); - return 1; - } - - if (TEMP_FAILURE_RETRY (sem_trywait (&s)) == -1) - { - puts ("1st trywait failed"); - return 1; - } - - errno = 0; - if (TEMP_FAILURE_RETRY (sem_trywait (&s)) != -1) - { - puts ("2nd trywait succeeded"); - return 1; - } - else if (errno != EAGAIN) - { - puts ("2nd trywait did not set errno to EAGAIN"); - return 1; - } - - if (sem_post (&s) == -1) - { - puts ("2nd post failed"); - return 1; - } - - if (TEMP_FAILURE_RETRY (sem_wait (&s)) == -1) - { - puts ("2nd wait failed"); - return 1; - } - - if (sem_destroy (&s) == -1) - { - puts ("destroy failed"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-sem10.c b/nptl/tst-sem10.c deleted file mode 100644 index 025363e22b..0000000000 --- a/nptl/tst-sem10.c +++ /dev/null @@ -1,87 +0,0 @@ -/* Copyright (C) 2007-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2007. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <semaphore.h> -#include <stdio.h> -#include <time.h> -#include <unistd.h> -#include <sys/time.h> - - -static int -do_test (void) -{ - sem_t s; - if (sem_init (&s, 0, 0) == -1) - { - puts ("sem_init failed"); - return 1; - } - - struct timeval tv; - if (gettimeofday (&tv, NULL) != 0) - { - puts ("gettimeofday failed"); - return 1; - } - - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - - /* Set ts to yesterday. */ - ts.tv_sec -= 86400; - - int type_before; - if (pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &type_before) != 0) - { - puts ("first pthread_setcanceltype failed"); - return 1; - } - - errno = 0; - if (TEMP_FAILURE_RETRY (sem_timedwait (&s, &ts)) != -1) - { - puts ("sem_timedwait succeeded"); - return 1; - } - if (errno != ETIMEDOUT) - { - printf ("sem_timedwait return errno = %d instead of ETIMEDOUT\n", - errno); - return 1; - } - - int type_after; - if (pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &type_after) != 0) - { - puts ("second pthread_setcanceltype failed"); - return 1; - } - if (type_after != PTHREAD_CANCEL_DEFERRED) - { - puts ("sem_timedwait changed cancellation type"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-sem11-static.c b/nptl/tst-sem11-static.c deleted file mode 100644 index 09b7698078..0000000000 --- a/nptl/tst-sem11-static.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-sem11.c" diff --git a/nptl/tst-sem11.c b/nptl/tst-sem11.c deleted file mode 100644 index 1a2dbafd89..0000000000 --- a/nptl/tst-sem11.c +++ /dev/null @@ -1,85 +0,0 @@ -#include <semaphore.h> -#include <stdio.h> -#include <unistd.h> -#include <pthread.h> -#include <internaltypes.h> - -#ifndef SEM_WAIT -# define SEM_WAIT(s) sem_wait (s) -#endif - -static void * -tf (void *arg) -{ -#ifdef PREPARE - PREPARE -#endif - SEM_WAIT (arg); - return NULL; -} - -int -main (void) -{ - int tries = 5; - pthread_t th; - union - { - sem_t s; - struct new_sem ns; - } u; - again: - if (sem_init (&u.s, 0, 0) != 0) - { - puts ("sem_init failed"); - return 1; - } -#if __HAVE_64B_ATOMICS - if ((u.ns.data >> SEM_NWAITERS_SHIFT) != 0) -#else - if (u.ns.nwaiters != 0) -#endif - { - puts ("nwaiters not initialized"); - return 1; - } - - if (pthread_create (&th, NULL, tf, &u.s) != 0) - { - puts ("pthread_create failed"); - return 1; - } - - sleep (1); - - if (pthread_cancel (th) != 0) - { - puts ("pthread_cancel failed"); - return 1; - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("pthread_join failed"); - return 1; - } - if (r != PTHREAD_CANCELED && --tries > 0) - { - /* Maybe we get the scheduling right the next time. */ - sem_destroy (&u.s); - goto again; - } - -#if __HAVE_64B_ATOMICS - if ((u.ns.data >> SEM_NWAITERS_SHIFT) != 0) -#else - if (u.ns.nwaiters != 0) -#endif - { - puts ("nwaiters not reset"); - return 1; - } - - return 0; -} diff --git a/nptl/tst-sem12-static.c b/nptl/tst-sem12-static.c deleted file mode 100644 index c06349f2b6..0000000000 --- a/nptl/tst-sem12-static.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-sem12.c" diff --git a/nptl/tst-sem12.c b/nptl/tst-sem12.c deleted file mode 100644 index 71d02b70e9..0000000000 --- a/nptl/tst-sem12.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <time.h> -#include <sys/time.h> - - -#define PREPARE \ - struct timespec ts; \ - struct timeval tv; \ - gettimeofday (&tv, NULL); \ - TIMEVAL_TO_TIMESPEC (&tv, &ts); \ - ts.tv_sec += 60; - -#define SEM_WAIT(s) sem_timedwait (s, &ts) - -#include "tst-sem11.c" diff --git a/nptl/tst-sem13.c b/nptl/tst-sem13.c deleted file mode 100644 index 1560e91443..0000000000 --- a/nptl/tst-sem13.c +++ /dev/null @@ -1,75 +0,0 @@ -#include <errno.h> -#include <semaphore.h> -#include <stdio.h> -#include <unistd.h> -#include <pthread.h> -#include <internaltypes.h> - - -static int -do_test (void) -{ - union - { - sem_t s; - struct new_sem ns; - } u; - - if (sem_init (&u.s, 0, 0) != 0) - { - puts ("sem_init failed"); - return 1; - } - - struct timespec ts = { 0, 1000000001 }; /* Invalid. */ - errno = 0; - if (sem_timedwait (&u.s, &ts) >= 0) - { - puts ("sem_timedwait did not fail"); - return 1; - } - if (errno != EINVAL) - { - perror ("sem_timedwait did not fail with EINVAL"); - return 1; - } -#if __HAVE_64B_ATOMICS - unsigned int nwaiters = (u.ns.data >> SEM_NWAITERS_SHIFT); -#else - unsigned int nwaiters = u.ns.nwaiters; -#endif - if (nwaiters != 0) - { - printf ("sem_timedwait modified nwaiters: %d\n", nwaiters); - return 1; - } - - ts.tv_sec = /* Invalid. */ -2; - ts.tv_nsec = 0; - errno = 0; - if (sem_timedwait (&u.s, &ts) >= 0) - { - puts ("2nd sem_timedwait did not fail"); - return 1; - } - if (errno != ETIMEDOUT) - { - perror ("2nd sem_timedwait did not fail with ETIMEDOUT"); - return 1; - } -#if __HAVE_64B_ATOMICS - nwaiters = (u.ns.data >> SEM_NWAITERS_SHIFT); -#else - nwaiters = u.ns.nwaiters; -#endif - if (nwaiters != 0) - { - printf ("2nd sem_timedwait modified nwaiters: %d\n", nwaiters); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-sem14.c b/nptl/tst-sem14.c deleted file mode 100644 index 195d229fc9..0000000000 --- a/nptl/tst-sem14.c +++ /dev/null @@ -1,92 +0,0 @@ -/* Test for sem_post race: bug 14532. - Copyright (C) 2012-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <semaphore.h> -#include <stdio.h> - -#define NTHREADS 10 -#define NITER 100000 - -sem_t sem; -int c; -volatile int thread_fail; - -static void * -tf (void *arg) -{ - for (int i = 0; i < NITER; i++) - { - if (sem_wait (&sem) != 0) - { - perror ("sem_wait"); - thread_fail = 1; - } - ++c; - if (sem_post (&sem) != 0) - { - perror ("sem_post"); - thread_fail = 1; - } - } - return NULL; -} - -static int -do_test (void) -{ - if (sem_init (&sem, 0, 0) != 0) - { - perror ("sem_init"); - return 1; - } - - pthread_t th[NTHREADS]; - for (int i = 0; i < NTHREADS; i++) - { - if (pthread_create (&th[i], NULL, tf, NULL) != 0) - { - puts ("pthread_create failed"); - return 1; - } - } - - if (sem_post (&sem) != 0) - { - perror ("sem_post"); - return 1; - } - - for (int i = 0; i < NTHREADS; i++) - if (pthread_join (th[i], NULL) != 0) - { - puts ("pthread_join failed"); - return 1; - } - - if (c != NTHREADS * NITER) - { - printf ("c = %d, should be %d\n", c, NTHREADS * NITER); - return 1; - } - return thread_fail; -} - -#define TIMEOUT 10 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-sem15.c b/nptl/tst-sem15.c deleted file mode 100644 index 60c4e0f879..0000000000 --- a/nptl/tst-sem15.c +++ /dev/null @@ -1,99 +0,0 @@ -/* Test for SEM_VALUE_MAX overflow detection: BZ #18434. - Copyright (C) 2015-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <limits.h> -#include <semaphore.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> - - -static int -do_test (void) -{ - sem_t s; - - if (sem_init (&s, 0, SEM_VALUE_MAX)) - { - printf ("sem_init: %m\n"); - return 1; - } - - int result = 0; - - int value = 0xdeadbeef; - if (sem_getvalue (&s, &value)) - { - printf ("sem_getvalue: %m\n"); - result = 1; - } - else - { - printf ("sem_getvalue after init: %d\n", value); - if (value != SEM_VALUE_MAX) - { - printf ("\tshould be %d\n", SEM_VALUE_MAX); - result = 1; - } - } - - errno = 0; - if (sem_post(&s) == 0) - { - puts ("sem_post at SEM_VALUE_MAX succeeded!"); - result = 1; - } - else - { - printf ("sem_post at SEM_VALUE_MAX: %m (%d)\n", errno); - if (errno != EOVERFLOW) - { - printf ("\tshould be %s (EOVERFLOW = %d)\n", - strerror (EOVERFLOW), EOVERFLOW); - result = 1; - } - } - - value = 0xbad1d00d; - if (sem_getvalue (&s, &value)) - { - printf ("sem_getvalue: %m\n"); - result = 1; - } - else - { - printf ("sem_getvalue after post: %d\n", value); - if (value != SEM_VALUE_MAX) - { - printf ("\tshould be %d\n", SEM_VALUE_MAX); - result = 1; - } - } - - if (sem_destroy (&s)) - { - printf ("sem_destroy: %m\n"); - result = 1; - } - - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-sem16.c b/nptl/tst-sem16.c deleted file mode 100644 index 1b03fa4b1e..0000000000 --- a/nptl/tst-sem16.c +++ /dev/null @@ -1,130 +0,0 @@ -/* Test for sem_open cancellation handling: BZ #15765. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <sys/mman.h> -#include <semaphore.h> -#include <stdio.h> -#include <fcntl.h> -#include <unistd.h> -#include <errno.h> -#include <stdlib.h> - -static sem_t sem; /* Use to sync with thread start. */ -static const char pipe_name[] = "/glibc-tst-sem16"; - -static void -remove_sem (int status, void *arg) -{ - sem_unlink (arg); -} - -static void * -tf (void *arg) -{ - pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, 0); - - if (sem_wait (&sem) != 0) - { - printf ("error: sem_wait failed: %m"); - exit (1); - } - - if (pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, 0) != 0) - { - printf ("error: pthread_setcancelstate failed: %m"); - exit (1); - } - - /* Neither sem_unlink or sem_open should act on thread cancellation. */ - sem_unlink (pipe_name); - on_exit (remove_sem, (void *) pipe_name); - - sem_t *s = sem_open (pipe_name, O_CREAT, 0600, 1); - if (s == SEM_FAILED) - { - int exit_code; - if (errno == ENOSYS || errno == EACCES) - exit_code = 77; - else - exit_code = 1; - exit (exit_code); - } - - if (pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, 0) != 0) - { - printf ("error: pthread_setcancelstate failed: %m"); - exit (1); - } - - if (sem_close (s) != 0) - { - printf ("error: sem_close failed: %m"); - exit (1); - } - - return NULL; -} - -static int -do_test (void) -{ - pthread_t td; - - if (sem_init (&sem, 0, 0)) - { - printf ("error: sem_init failed: %m\n"); - exit (1); - } - - if (pthread_create (&td, NULL, tf, NULL) != 0) - { - printf ("error: pthread_create failed: %m\n"); - exit (1); - } - - if (pthread_cancel (td) != 0) - { - printf ("error: pthread_cancel failed: %m\n"); - exit (1); - } - - if (sem_post (&sem) != 0) - { - printf ("error: sem_post failed: %m\n"); - exit (1); - } - - void *r; - if (pthread_join (td, &r) != 0) - { - printf ("error: pthread_join failed: %m\n"); - exit (1); - } - - if (r == PTHREAD_CANCELED) - { - puts ("error: pthread_join returned PTHREAD_CANCELED"); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include <test-skeleton.c> diff --git a/nptl/tst-sem2.c b/nptl/tst-sem2.c deleted file mode 100644 index e36ef65bc1..0000000000 --- a/nptl/tst-sem2.c +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <semaphore.h> -#include <signal.h> -#include <stdio.h> -#include <unistd.h> - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static int -do_test (void) -{ - sem_t s; - - if (sem_init (&s, 0, 0) == -1) - { - puts ("init failed"); - return 1; - } - - delayed_exit (1); - - if (TEMP_FAILURE_RETRY (sem_wait (&s)) == -1) - { - puts ("wait failed"); - return 1; - } - - /* We should never get here. */ - puts ("wait succeeded"); - return 1; -} diff --git a/nptl/tst-sem3.c b/nptl/tst-sem3.c deleted file mode 100644 index aa9ca8cb3b..0000000000 --- a/nptl/tst-sem3.c +++ /dev/null @@ -1,144 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <semaphore.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/wait.h> - - -int -do_test (void) -{ - size_t ps = sysconf (_SC_PAGESIZE); - char tmpfname[] = "/tmp/tst-sem3.XXXXXX"; - char data[ps]; - void *mem; - int fd; - sem_t *s; - pid_t pid; - char *p; - - fd = mkstemp (tmpfname); - if (fd == -1) - { - printf ("cannot open temporary file: %m\n"); - return 1; - } - - /* Make sure it is always removed. */ - unlink (tmpfname); - - /* Create one page of data. */ - memset (data, '\0', ps); - - /* Write the data to the file. */ - if (write (fd, data, ps) != (ssize_t) ps) - { - puts ("short write"); - return 1; - } - - mem = mmap (NULL, ps, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (mem == MAP_FAILED) - { - printf ("mmap failed: %m\n"); - return 1; - } - - s = (sem_t *) (((uintptr_t) mem + __alignof (sem_t)) - & ~(__alignof (sem_t) - 1)); - p = (char *) (s + 1); - - if (sem_init (s, 1, 1) == -1) - { - puts ("init failed"); - return 1; - } - - if (TEMP_FAILURE_RETRY (sem_wait (s)) == -1) - { - puts ("1st wait failed"); - return 1; - } - - errno = 0; - if (TEMP_FAILURE_RETRY (sem_trywait (s)) != -1) - { - puts ("trywait succeeded"); - return 1; - } - else if (errno != EAGAIN) - { - puts ("trywait didn't return EAGAIN"); - return 1; - } - - *p = 0; - - puts ("going to fork now"); - pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - return 1; - } - else if (pid == 0) - { - /* Play some lock ping-pong. It's our turn to unlock first. */ - if ((*p)++ != 0) - { - puts ("child: *p != 0"); - return 1; - } - - if (sem_post (s) == -1) - { - puts ("child: 1st post failed"); - return 1; - } - - puts ("child done"); - } - else - { - if (TEMP_FAILURE_RETRY (sem_wait (s)) == -1) - { - printf ("parent: 2nd wait failed: %m\n"); - return 1; - } - - if (*p != 1) - { - puts ("*p != 1"); - return 1; - } - - puts ("parent done"); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-sem4.c b/nptl/tst-sem4.c deleted file mode 100644 index b4d1f49995..0000000000 --- a/nptl/tst-sem4.c +++ /dev/null @@ -1,153 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <fcntl.h> -#include <semaphore.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static void -remove_sem (int status, void *arg) -{ - sem_unlink (arg); -} - - -int -do_test (void) -{ - sem_t *s; - sem_t *s2; - pid_t pid; - int val; - - /* Start with a clean slate and register a clean-up action. No need to - act if sem_unlink fails because we will catch the same problem during the - sem_open below. */ - sem_unlink ("/glibc-tst-sem4"); - on_exit (remove_sem, (void *) "/glibc-tst-sem4"); - - s = sem_open ("/glibc-tst-sem4", O_CREAT, 0600, 1); - if (s == SEM_FAILED) - { - if (errno == ENOSYS) - { - puts ("sem_open not supported. Oh well."); - return 0; - } - - /* Maybe the shm filesystem has strict permissions. */ - if (errno == EACCES) - { - puts ("sem_open not allowed. Oh well."); - return 0; - } - - printf ("sem_open: %m\n"); - return 1; - } - - /* We have the semaphore object. Now try again with O_EXCL, this - should fail. */ - s2 = sem_open ("/glibc-tst-sem4", O_CREAT | O_EXCL, 0600, 1); - if (s2 != SEM_FAILED) - { - puts ("2nd sem_open didn't fail"); - return 1; - } - if (errno != EEXIST) - { - puts ("2nd sem_open returned wrong error"); - return 1; - } - - /* Check the value. */ - if (sem_getvalue (s, &val) == -1) - { - puts ("getvalue failed"); - return 1; - } - if (val != 1) - { - printf ("initial value wrong: got %d, expected 1\n", val); - return 1; - } - - if (TEMP_FAILURE_RETRY (sem_wait (s)) == -1) - { - puts ("1st sem_wait failed"); - return 1; - } - - pid = fork (); - if (pid == -1) - { - printf ("fork failed: %m\n"); - return 1; - } - - if (pid == 0) - { - /* Child. */ - - /* Check the value. */ - if (sem_getvalue (s, &val) == -1) - { - puts ("child: getvalue failed"); - return 1; - } - if (val != 0) - { - printf ("child: value wrong: got %d, expect 0\n", val); - return 1; - } - - if (sem_post (s) == -1) - { - puts ("child: post failed"); - return 1; - } - } - else - { - if (TEMP_FAILURE_RETRY (sem_wait (s)) == -1) - { - puts ("2nd sem_wait failed"); - return 1; - } - - if (sem_getvalue (s, &val) == -1) - { - puts ("parent: 2nd getvalue failed"); - return 1; - } - if (val != 0) - { - printf ("parent: value wrong: got %d, expected 0\n", val); - return 1; - } - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-sem5.c b/nptl/tst-sem5.c deleted file mode 100644 index 0aafed2b07..0000000000 --- a/nptl/tst-sem5.c +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <semaphore.h> -#include <stdio.h> -#include <time.h> -#include <unistd.h> -#include <sys/time.h> - - -static int -do_test (void) -{ - sem_t s; - struct timespec ts; - struct timeval tv; - - if (sem_init (&s, 0, 1) == -1) - { - puts ("sem_init failed"); - return 1; - } - - if (TEMP_FAILURE_RETRY (sem_wait (&s)) == -1) - { - puts ("sem_wait failed"); - return 1; - } - - if (gettimeofday (&tv, NULL) != 0) - { - puts ("gettimeofday failed"); - return 1; - } - - TIMEVAL_TO_TIMESPEC (&tv, &ts); - - /* We wait for half a second. */ - ts.tv_nsec += 500000000; - if (ts.tv_nsec >= 1000000000) - { - ++ts.tv_sec; - ts.tv_nsec -= 1000000000; - } - - errno = 0; - if (TEMP_FAILURE_RETRY (sem_timedwait (&s, &ts)) != -1) - { - puts ("sem_timedwait succeeded"); - return 1; - } - if (errno != ETIMEDOUT) - { - printf ("sem_timedwait return errno = %d instead of ETIMEDOUT\n", - errno); - return 1; - } - - struct timespec ts2; - if (clock_gettime (CLOCK_REALTIME, &ts2) != 0) - { - puts ("clock_gettime failed"); - return 1; - } - - if (ts2.tv_sec < ts.tv_sec - || (ts2.tv_sec == ts.tv_sec && ts2.tv_nsec < ts.tv_nsec)) - { - puts ("timeout too short"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-sem6.c b/nptl/tst-sem6.c deleted file mode 100644 index 5edb488cfc..0000000000 --- a/nptl/tst-sem6.c +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <semaphore.h> -#include <signal.h> -#include <stdio.h> -#include <unistd.h> - - -static void -handler (int sig) -{ - struct sigaction sa; - - sa.sa_handler = SIG_DFL; - sa.sa_flags = 0; - sigemptyset (&sa.sa_mask); - - sigaction (SIGALRM, &sa, NULL); - - /* Rearm the timer. */ - alarm (1); -} - - -static int -do_test (void) -{ - sem_t s; - struct sigaction sa; - - sa.sa_handler = handler; - sa.sa_flags = 0; - sigemptyset (&sa.sa_mask); - - sigaction (SIGALRM, &sa, NULL); - - if (sem_init (&s, 0, 0) == -1) - { - puts ("init failed"); - return 1; - } - - /* Set an alarm for 1 second. The wrapper will expect this. */ - alarm (1); - - int res = sem_wait (&s); - if (res == 0) - { - puts ("wait succeeded"); - return 1; - } - if (res != -1 || errno != EINTR) - { - puts ("wait didn't fail with EINTR"); - return 1; - } - - return 0; -} - -#define TIMEOUT 3 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-sem7.c b/nptl/tst-sem7.c deleted file mode 100644 index d59ecd9f4b..0000000000 --- a/nptl/tst-sem7.c +++ /dev/null @@ -1,111 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <fcntl.h> -#include <semaphore.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static void -remove_sem (int status, void *arg) -{ - sem_unlink (arg); -} - - -static int -do_test (void) -{ - sem_t *s; - sem_t *s2; - sem_t *s3; - - s = sem_open ("/glibc-tst-sem7", O_CREAT, 0600, 1); - if (s == SEM_FAILED) - { - if (errno == ENOSYS) - { - puts ("sem_open not supported. Oh well."); - return 0; - } - - /* Maybe the shm filesystem has strict permissions. */ - if (errno == EACCES) - { - puts ("sem_open not allowed. Oh well."); - return 0; - } - - printf ("sem_open: %m\n"); - return 1; - } - - on_exit (remove_sem, (void *) "/glibc-tst-sem7"); - - /* We have the semaphore object. Now try again. We should get the - same address. */ - s2 = sem_open ("/glibc-tst-sem7", O_CREAT, 0600, 1); - if (s2 == SEM_FAILED) - { - puts ("2nd sem_open failed"); - return 1; - } - if (s != s2) - { - puts ("2nd sem_open didn't return the same address"); - return 1; - } - - /* And again, this time without O_CREAT. */ - s3 = sem_open ("/glibc-tst-sem7", 0); - if (s3 == SEM_FAILED) - { - puts ("3rd sem_open failed"); - return 1; - } - if (s != s3) - { - puts ("3rd sem_open didn't return the same address"); - return 1; - } - - /* Now close the handle. Three times. */ - if (sem_close (s2) != 0) - { - puts ("1st sem_close failed"); - return 1; - } - if (sem_close (s) != 0) - { - puts ("2nd sem_close failed"); - return 1; - } - if (sem_close (s3) != 0) - { - puts ("3rd sem_close failed"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-sem8.c b/nptl/tst-sem8.c deleted file mode 100644 index 97de9850ca..0000000000 --- a/nptl/tst-sem8.c +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <fcntl.h> -#include <semaphore.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static void -remove_sem (int status, void *arg) -{ - sem_unlink (arg); -} - - -static int -do_test (void) -{ - sem_t *s; - int i; - - on_exit (remove_sem, (void *) "/glibc-tst-sem8"); - - for (i = 0; i < 3; ++i) - { - s = sem_open ("/glibc-tst-sem8", O_CREAT, 0600, 1); - if (s == SEM_FAILED) - { - if (errno == ENOSYS) - { - puts ("sem_open not supported. Oh well."); - return 0; - } - - /* Maybe the shm filesystem has strict permissions. */ - if (errno == EACCES) - { - puts ("sem_open not allowed. Oh well."); - return 0; - } - - printf ("sem_open: %m\n"); - return 1; - } - - /* Now close the handle. */ - if (sem_close (s) != 0) - { - puts ("sem_close failed"); - return 1; - } - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-sem9.c b/nptl/tst-sem9.c deleted file mode 100644 index 7100b51155..0000000000 --- a/nptl/tst-sem9.c +++ /dev/null @@ -1,83 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <fcntl.h> -#include <semaphore.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static void -remove_sem (int status, void *arg) -{ - sem_unlink (arg); -} - - -static int -do_test (void) -{ - sem_t *s; - int i; - - on_exit (remove_sem, (void *) "/glibc-tst-sem9"); - - for (i = 0; i < 3; ++i) - { - s = sem_open ("/glibc-tst-sem9", O_CREAT, 0600, 1); - if (s == SEM_FAILED) - { - if (errno == ENOSYS) - { - puts ("sem_open not supported. Oh well."); - return 0; - } - - /* Maybe the shm filesystem has strict permissions. */ - if (errno == EACCES) - { - puts ("sem_open not allowed. Oh well."); - return 0; - } - - printf ("sem_open: %m\n"); - return 1; - } - - /* Now close the handle. */ - if (sem_close (s) != 0) - { - puts ("sem_close failed"); - return 1; - } - - /* And remove it. */ - if (sem_unlink ("/glibc-tst-sem9") != 0) - { - puts ("sem_unlink failed"); - return 1; - } - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-setuid1-static.c b/nptl/tst-setuid1-static.c deleted file mode 100644 index 46d26f0991..0000000000 --- a/nptl/tst-setuid1-static.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-setuid1.c" diff --git a/nptl/tst-setuid1.c b/nptl/tst-setuid1.c deleted file mode 100644 index 1aa388438b..0000000000 --- a/nptl/tst-setuid1.c +++ /dev/null @@ -1,1084 +0,0 @@ -/* Copyright (C) 2004-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jaku@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <pwd.h> -#include <grp.h> -#include <stdlib.h> -#include <stdio.h> -#include <sys/wait.h> -#include <unistd.h> - - -static pthread_barrier_t b3, b4; -static uid_t prev_ruid, prev_euid, prev_suid, nobody_uid; -static gid_t prev_rgid, prev_egid, prev_sgid, nobody_gid; -enum ACTION { PREPARE, SET, CHECK_BEFORE, CHECK_AFTER }; -#define TESTNO(arg) ((long int) (arg) & 0xff) -#define THREADNO(arg) ((long int) (arg) >> 8) - - -static void -check_prev_uid (int tno) -{ - uid_t ruid, euid, suid; - if (getresuid (&ruid, &euid, &suid) < 0) - { - printf ("getresuid failed: %d %m\n", tno); - exit (1); - } - - if (ruid != prev_ruid || euid != prev_euid || suid != prev_suid) - { - printf ("uids before in %d (%d %d %d) != (%d %d %d)\n", tno, - ruid, euid, suid, prev_ruid, prev_euid, prev_suid); - exit (1); - } -} - - -static void -check_prev_gid (int tno) -{ - gid_t rgid, egid, sgid; - if (getresgid (&rgid, &egid, &sgid) < 0) - { - printf ("getresgid failed: %d %m\n", tno); - exit (1); - } - - if (rgid != prev_rgid || egid != prev_egid || sgid != prev_sgid) - { - printf ("gids before in %d (%d %d %d) != (%d %d %d)\n", tno, - rgid, egid, sgid, prev_rgid, prev_egid, prev_sgid); - exit (1); - } -} - - -static void -test_setuid1 (enum ACTION action, int tno) -{ - if (action == PREPARE) - return; - - if (action != CHECK_AFTER) - check_prev_uid (tno); - - if (action == SET && setuid (nobody_uid) < 0) - { - printf ("setuid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - uid_t ruid, euid, suid; - if (getresuid (&ruid, &euid, &suid) < 0) - { - printf ("getresuid failed: %d %m\n", tno); - exit (1); - } - - if (ruid != nobody_uid || euid != nobody_uid || suid != nobody_uid) - { - printf ("after setuid %d (%d %d %d) != (%d %d %d)\n", tno, - ruid, euid, suid, nobody_uid, nobody_uid, nobody_uid); - exit (1); - } - } -} - - -static void -test_setuid2 (enum ACTION action, int tno) -{ - if (action == PREPARE) - { - if (setresuid (nobody_uid, nobody_uid, -1) < 0) - { - printf ("setresuid failed: %m\n"); - exit (1); - } - - prev_ruid = nobody_uid; - prev_euid = nobody_uid; - return; - } - - if (action != CHECK_AFTER) - check_prev_uid (tno); - - if (action == SET && setuid (prev_suid) < 0) - { - printf ("setuid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - uid_t ruid, euid, suid; - if (getresuid (&ruid, &euid, &suid) < 0) - { - printf ("getresuid failed: %d %m\n", tno); - exit (1); - } - - if (ruid != nobody_uid || euid != prev_suid || suid != prev_suid) - { - printf ("after setuid %d (%d %d %d) != (%d %d %d)\n", tno, - ruid, euid, suid, nobody_uid, prev_suid, prev_suid); - exit (1); - } - } -} - - -static void -test_seteuid1 (enum ACTION action, int tno) -{ - if (action == PREPARE) - return; - - if (action != CHECK_AFTER) - check_prev_uid (tno); - - if (action == SET && seteuid (nobody_uid) < 0) - { - printf ("seteuid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - uid_t ruid, euid, suid; - if (getresuid (&ruid, &euid, &suid) < 0) - { - printf ("getresuid failed: %d %m\n", tno); - exit (1); - } - - if (ruid != prev_ruid || euid != nobody_uid || suid != prev_suid) - { - printf ("after seteuid %d (%d %d %d) != (%d %d %d)\n", tno, - ruid, euid, suid, prev_ruid, nobody_uid, prev_suid); - exit (1); - } - } -} - - -static void -test_seteuid2 (enum ACTION action, int tno) -{ - if (action == PREPARE) - { - if (setresuid (nobody_uid, nobody_uid, -1) < 0) - { - printf ("setresuid failed: %m\n"); - exit (1); - } - - prev_ruid = nobody_uid; - prev_euid = nobody_uid; - nobody_uid = prev_suid; - return; - } - - test_seteuid1 (action, tno); -} - - -static void -test_setreuid1 (enum ACTION action, int tno) -{ - if (action == PREPARE) - return; - - if (action != CHECK_AFTER) - check_prev_uid (tno); - - if (action == SET && setreuid (-1, nobody_uid) < 0) - { - printf ("setreuid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - uid_t ruid, euid, suid, esuid; - if (getresuid (&ruid, &euid, &suid) < 0) - { - printf ("getresuid failed: %d %m\n", tno); - exit (1); - } - - if (prev_ruid != nobody_uid) - esuid = nobody_uid; - else - esuid = prev_suid; - - if (ruid != prev_ruid || euid != nobody_uid || suid != esuid) - { - printf ("after setreuid %d (%d %d %d) != (%d %d %d)\n", tno, - ruid, euid, suid, prev_ruid, nobody_uid, esuid); - exit (1); - } - } -} - - -static void -test_setreuid2 (enum ACTION action, int tno) -{ - if (action == PREPARE) - return; - - if (action != CHECK_AFTER) - check_prev_uid (tno); - - if (action == SET && setreuid (nobody_uid, -1) < 0) - { - printf ("setreuid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - uid_t ruid, euid, suid; - if (getresuid (&ruid, &euid, &suid) < 0) - { - printf ("getresuid failed: %d %m\n", tno); - exit (1); - } - - if (ruid != nobody_uid || euid != prev_euid || suid != prev_euid) - { - printf ("after setreuid %d (%d %d %d) != (%d %d %d)\n", tno, - ruid, euid, suid, nobody_uid, prev_euid, prev_euid); - exit (1); - } - } -} - - -static void -test_setreuid3 (enum ACTION action, int tno) -{ - if (action == PREPARE) - return; - - if (action != CHECK_AFTER) - check_prev_uid (tno); - - if (action == SET && setreuid (nobody_uid, nobody_uid) < 0) - { - printf ("setreuid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - uid_t ruid, euid, suid; - if (getresuid (&ruid, &euid, &suid) < 0) - { - printf ("getresuid failed: %d %m\n", tno); - exit (1); - } - - if (ruid != nobody_uid || euid != nobody_uid || suid != nobody_uid) - { - printf ("after setreuid %d (%d %d %d) != (%d %d %d)\n", tno, - ruid, euid, suid, nobody_uid, nobody_uid, nobody_uid); - exit (1); - } - } -} - - -static void -test_setreuid4 (enum ACTION action, int tno) -{ - if (action == PREPARE) - { - if (setresuid (nobody_uid, nobody_uid, -1) < 0) - { - printf ("setresuid failed: %m\n"); - exit (1); - } - - prev_ruid = nobody_uid; - prev_euid = nobody_uid; - nobody_uid = prev_suid; - return; - } - - test_setreuid1 (action, tno); -} - - -static void -test_setresuid1 (enum ACTION action, int tno) -{ - if (action == PREPARE) - return; - - if (action != CHECK_AFTER) - check_prev_uid (tno); - - if (action == SET && setresuid (-1, nobody_uid, -1) < 0) - { - printf ("setresuid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - uid_t ruid, euid, suid; - if (getresuid (&ruid, &euid, &suid) < 0) - { - printf ("getresuid failed: %d %m\n", tno); - exit (1); - } - - if (ruid != prev_ruid || euid != nobody_uid || suid != prev_suid) - { - printf ("after setresuid %d (%d %d %d) != (%d %d %d)\n", tno, - ruid, euid, suid, prev_ruid, nobody_uid, prev_suid); - exit (1); - } - } -} - - -static void -test_setresuid2 (enum ACTION action, int tno) -{ - if (action == PREPARE) - return; - - if (action != CHECK_AFTER) - check_prev_uid (tno); - - if (action == SET && setresuid (prev_euid, nobody_uid, nobody_uid) < 0) - { - printf ("setresuid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - uid_t ruid, euid, suid; - if (getresuid (&ruid, &euid, &suid) < 0) - { - printf ("getresuid failed: %d %m\n", tno); - exit (1); - } - - if (ruid != prev_euid || euid != nobody_uid || suid != nobody_uid) - { - printf ("after setresuid %d (%d %d %d) != (%d %d %d)\n", tno, - ruid, euid, suid, prev_euid, nobody_uid, nobody_uid); - exit (1); - } - } -} - - -static void -test_setresuid3 (enum ACTION action, int tno) -{ - if (action == PREPARE) - return; - - if (action != CHECK_AFTER) - check_prev_uid (tno); - - if (action == SET && setresuid (nobody_uid, nobody_uid, nobody_uid) < 0) - { - printf ("setresuid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - uid_t ruid, euid, suid; - if (getresuid (&ruid, &euid, &suid) < 0) - { - printf ("getresuid failed: %d %m\n", tno); - exit (1); - } - - if (ruid != nobody_uid || euid != nobody_uid || suid != nobody_uid) - { - printf ("after setresuid %d (%d %d %d) != (%d %d %d)\n", tno, - ruid, euid, suid, nobody_uid, nobody_uid, nobody_uid); - exit (1); - } - } -} - - -static void -test_setresuid4 (enum ACTION action, int tno) -{ - if (action == PREPARE) - { - if (setresuid (nobody_uid, nobody_uid, -1) < 0) - { - printf ("setresuid failed: %m\n"); - exit (1); - } - - prev_ruid = nobody_uid; - prev_euid = nobody_uid; - nobody_uid = prev_suid; - return; - } - - test_setresuid1 (action, tno); -} - - -static void -test_setgid1 (enum ACTION action, int tno) -{ - if (action == PREPARE) - return; - - if (action != CHECK_AFTER) - check_prev_gid (tno); - - if (action == SET && setgid (nobody_gid) < 0) - { - printf ("setgid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - gid_t rgid, egid, sgid; - if (getresgid (&rgid, &egid, &sgid) < 0) - { - printf ("getresgid failed: %d %m\n", tno); - exit (1); - } - - if (rgid != nobody_gid || egid != nobody_gid || sgid != nobody_gid) - { - printf ("after setgid %d (%d %d %d) != (%d %d %d)\n", tno, - rgid, egid, sgid, nobody_gid, nobody_gid, nobody_gid); - exit (1); - } - } -} - - -static void -test_setgid2 (enum ACTION action, int tno) -{ - if (action == PREPARE) - { - if (setresgid (nobody_gid, nobody_gid, -1) < 0) - { - printf ("setresgid failed: %m\n"); - exit (1); - } - - prev_rgid = nobody_gid; - prev_egid = nobody_gid; - - if (setresuid (nobody_uid, nobody_uid, -1) < 0) - { - printf ("setresuid failed: %m\n"); - exit (1); - } - - prev_ruid = nobody_uid; - prev_euid = nobody_uid; - return; - } - - if (action != CHECK_AFTER) - check_prev_gid (tno); - - if (action == SET && setgid (prev_sgid) < 0) - { - printf ("setgid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - gid_t rgid, egid, sgid; - if (getresgid (&rgid, &egid, &sgid) < 0) - { - printf ("getresgid failed: %d %m\n", tno); - exit (1); - } - - if (rgid != nobody_gid || egid != prev_sgid || sgid != prev_sgid) - { - printf ("after setgid %d (%d %d %d) != (%d %d %d)\n", tno, - rgid, egid, sgid, nobody_gid, prev_sgid, prev_sgid); - exit (1); - } - } -} - - -static void -test_setegid1 (enum ACTION action, int tno) -{ - if (action == PREPARE) - return; - - if (action != CHECK_AFTER) - check_prev_gid (tno); - - if (action == SET && setegid (nobody_gid) < 0) - { - printf ("setegid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - gid_t rgid, egid, sgid; - if (getresgid (&rgid, &egid, &sgid) < 0) - { - printf ("getresgid failed: %d %m\n", tno); - exit (1); - } - - if (rgid != prev_rgid || egid != nobody_gid || sgid != prev_sgid) - { - printf ("after setegid %d (%d %d %d) != (%d %d %d)\n", tno, - rgid, egid, sgid, prev_rgid, nobody_gid, prev_sgid); - exit (1); - } - } -} - - -static void -test_setegid2 (enum ACTION action, int tno) -{ - if (action == PREPARE) - { - if (setresgid (nobody_gid, nobody_gid, -1) < 0) - { - printf ("setresgid failed: %m\n"); - exit (1); - } - - prev_rgid = nobody_gid; - prev_egid = nobody_gid; - nobody_gid = prev_sgid; - return; - } - - test_setegid1 (action, tno); -} - - -static void -test_setregid1 (enum ACTION action, int tno) -{ - if (action == PREPARE) - return; - - if (action != CHECK_AFTER) - check_prev_gid (tno); - - if (action == SET && setregid (-1, nobody_gid) < 0) - { - printf ("setregid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - gid_t rgid, egid, sgid, esgid; - if (getresgid (&rgid, &egid, &sgid) < 0) - { - printf ("getresgid failed: %d %m\n", tno); - exit (1); - } - - if (prev_rgid != nobody_gid) - esgid = nobody_gid; - else - esgid = prev_sgid; - - if (rgid != prev_rgid || egid != nobody_gid || sgid != esgid) - { - printf ("after setregid %d (%d %d %d) != (%d %d %d)\n", tno, - rgid, egid, sgid, prev_rgid, nobody_gid, esgid); - exit (1); - } - } -} - - -static void -test_setregid2 (enum ACTION action, int tno) -{ - if (action == PREPARE) - return; - - if (action != CHECK_AFTER) - check_prev_gid (tno); - - if (action == SET && setregid (nobody_gid, -1) < 0) - { - printf ("setregid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - gid_t rgid, egid, sgid; - if (getresgid (&rgid, &egid, &sgid) < 0) - { - printf ("getresgid failed: %d %m\n", tno); - exit (1); - } - - if (rgid != nobody_gid || egid != prev_egid || sgid != prev_egid) - { - printf ("after setregid %d (%d %d %d) != (%d %d %d)\n", tno, - rgid, egid, sgid, nobody_gid, prev_egid, prev_egid); - exit (1); - } - } -} - - -static void -test_setregid3 (enum ACTION action, int tno) -{ - if (action == PREPARE) - return; - - if (action != CHECK_AFTER) - check_prev_gid (tno); - - if (action == SET && setregid (nobody_gid, nobody_gid) < 0) - { - printf ("setregid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - gid_t rgid, egid, sgid; - if (getresgid (&rgid, &egid, &sgid) < 0) - { - printf ("getresgid failed: %d %m\n", tno); - exit (1); - } - - if (rgid != nobody_gid || egid != nobody_gid || sgid != nobody_gid) - { - printf ("after setregid %d (%d %d %d) != (%d %d %d)\n", tno, - rgid, egid, sgid, nobody_gid, nobody_gid, nobody_gid); - exit (1); - } - } -} - - -static void -test_setregid4 (enum ACTION action, int tno) -{ - if (action == PREPARE) - { - if (setresgid (nobody_gid, nobody_gid, -1) < 0) - { - printf ("setresgid failed: %m\n"); - exit (1); - } - - prev_rgid = nobody_gid; - prev_egid = nobody_gid; - nobody_gid = prev_sgid; - return; - } - - test_setregid1 (action, tno); -} - - -static void -test_setresgid1 (enum ACTION action, int tno) -{ - if (action == PREPARE) - return; - - if (action != CHECK_AFTER) - check_prev_gid (tno); - - if (action == SET && setresgid (-1, nobody_gid, -1) < 0) - { - printf ("setresgid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - gid_t rgid, egid, sgid; - if (getresgid (&rgid, &egid, &sgid) < 0) - { - printf ("getresgid failed: %d %m\n", tno); - exit (1); - } - - if (rgid != prev_rgid || egid != nobody_gid || sgid != prev_sgid) - { - printf ("after setresgid %d (%d %d %d) != (%d %d %d)\n", tno, - rgid, egid, sgid, prev_rgid, nobody_gid, prev_sgid); - exit (1); - } - } -} - - -static void -test_setresgid2 (enum ACTION action, int tno) -{ - if (action == PREPARE) - return; - - if (action != CHECK_AFTER) - check_prev_gid (tno); - - if (action == SET && setresgid (prev_egid, nobody_gid, nobody_gid) < 0) - { - printf ("setresgid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - gid_t rgid, egid, sgid; - if (getresgid (&rgid, &egid, &sgid) < 0) - { - printf ("getresgid failed: %d %m\n", tno); - exit (1); - } - - if (rgid != prev_egid || egid != nobody_gid || sgid != nobody_gid) - { - printf ("after setresgid %d (%d %d %d) != (%d %d %d)\n", tno, - rgid, egid, sgid, prev_egid, nobody_gid, nobody_gid); - exit (1); - } - } -} - - -static void -test_setresgid3 (enum ACTION action, int tno) -{ - if (action == PREPARE) - return; - - if (action != CHECK_AFTER) - check_prev_gid (tno); - - if (action == SET && setresgid (nobody_gid, nobody_gid, nobody_gid) < 0) - { - printf ("setresgid failed: %m\n"); - exit (1); - } - - if (action != CHECK_BEFORE) - { - gid_t rgid, egid, sgid; - if (getresgid (&rgid, &egid, &sgid) < 0) - { - printf ("getresgid failed: %d %m\n", tno); - exit (1); - } - - if (rgid != nobody_gid || egid != nobody_gid || sgid != nobody_gid) - { - printf ("after setresgid %d (%d %d %d) != (%d %d %d)\n", tno, - rgid, egid, sgid, nobody_gid, nobody_gid, nobody_gid); - exit (1); - } - } -} - - -static void -test_setresgid4 (enum ACTION action, int tno) -{ - if (action == PREPARE) - { - if (setresgid (nobody_gid, nobody_gid, -1) < 0) - { - printf ("setresgid failed: %m\n"); - exit (1); - } - - prev_rgid = nobody_gid; - prev_egid = nobody_gid; - nobody_gid = prev_sgid; - return; - } - - test_setresgid1 (action, tno); -} - - -static struct setuid_test -{ - const char *name; - void (*test) (enum ACTION, int tno); -} setuid_tests[] = -{ - { "setuid1", test_setuid1 }, - { "setuid2", test_setuid2 }, - { "seteuid1", test_seteuid1 }, - { "seteuid2", test_seteuid2 }, - { "setreuid1", test_setreuid1 }, - { "setreuid2", test_setreuid2 }, - { "setreuid3", test_setreuid3 }, - { "setreuid4", test_setreuid4 }, - { "setresuid1", test_setresuid1 }, - { "setresuid2", test_setresuid2 }, - { "setresuid3", test_setresuid3 }, - { "setresuid4", test_setresuid4 }, - { "setgid1", test_setgid1 }, - { "setgid2", test_setgid2 }, - { "setegid1", test_setegid1 }, - { "setegid2", test_setegid2 }, - { "setregid1", test_setregid1 }, - { "setregid2", test_setregid2 }, - { "setregid3", test_setregid3 }, - { "setregid4", test_setregid4 }, - { "setresgid1", test_setresgid1 }, - { "setresgid2", test_setresgid2 }, - { "setresgid3", test_setresgid3 }, - { "setresgid4", test_setresgid4 } -}; - - -static void * -tf2 (void *arg) -{ - int e = pthread_barrier_wait (&b4); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - setuid_tests[TESTNO (arg)].test (CHECK_AFTER, THREADNO (arg)); - return NULL; -} - - -static void * -tf (void *arg) -{ - setuid_tests[TESTNO (arg)].test (CHECK_BEFORE, THREADNO (arg)); - - int e = pthread_barrier_wait (&b3); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - return tf2 (arg); -} - - -static int -do_one_test (long int testno) -{ - printf ("%s test\n", setuid_tests[testno].name); - - pid_t pid = fork (); - if (pid == 0) - { - setuid_tests[testno].test (PREPARE, 0); - setuid_tests[testno].test (SET, 0); - exit (0); - } - - if (pid < 0) - { - printf ("fork failed: %m\n"); - exit (1); - } - - int status; - if (waitpid (pid, &status, 0) < 0) - { - printf ("waitpid failed: %m\n"); - exit (1); - } - - if (!WIFEXITED (status)) - { - puts ("child did not exit"); - exit (1); - } - - if (WEXITSTATUS (status)) - { - printf ("skipping %s test\n", setuid_tests[testno].name); - return 0; - } - - pid = fork (); - if (pid == 0) - { - setuid_tests[testno].test (PREPARE, 0); - - pthread_t th; - int e = pthread_create (&th, NULL, tf, (void *) (testno | 0x100L)); - if (e != 0) - { - printf ("create failed: %m\n"); - exit (1); - } - - pthread_t th2; - e = pthread_create (&th2, NULL, tf, (void *) (testno | 0x200L)); - if (e != 0) - { - printf ("create failed: %m\n"); - exit (1); - } - - e = pthread_barrier_wait (&b3); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - setuid_tests[testno].test (SET, 0); - - pthread_t th3; - e = pthread_create (&th3, NULL, tf2, (void *) (testno | 0x300L)); - if (e != 0) - { - printf ("create failed: %m\n"); - exit (1); - } - - e = pthread_barrier_wait (&b4); - if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - exit (1); - } - - exit (0); - } - - if (pid < 0) - { - printf ("fork failed: %m\n"); - exit (1); - } - - if (waitpid (pid, &status, 0) < 0) - { - printf ("waitpid failed: %m\n"); - exit (1); - } - - if (!WIFEXITED (status)) - { - puts ("second child did not exit"); - exit (1); - } - - if (WEXITSTATUS (status)) - exit (WEXITSTATUS (status)); - - return 0; -} - - -static int -do_test (void) -{ - struct passwd *pwd = getpwnam ("nobody"); - if (pwd == NULL) - { - puts ("User nobody doesn't exist"); - return 0; - } - nobody_uid = pwd->pw_uid; - nobody_gid = pwd->pw_gid; - - if (getresuid (&prev_ruid, &prev_euid, &prev_suid) < 0) - { - printf ("getresuid failed: %m\n"); - exit (1); - } - - if (getresgid (&prev_rgid, &prev_egid, &prev_sgid) < 0) - { - printf ("getresgid failed: %m\n"); - exit (1); - } - - if (prev_ruid == nobody_uid || prev_euid == nobody_uid - || prev_suid == nobody_uid) - { - puts ("already running as user nobody, skipping tests"); - exit (0); - } - - if (prev_rgid == nobody_gid || prev_egid == nobody_gid - || prev_sgid == nobody_gid) - { - puts ("already running as group nobody, skipping tests"); - exit (0); - } - - if (pthread_barrier_init (&b3, NULL, 3) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - if (pthread_barrier_init (&b4, NULL, 4) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - for (unsigned long int testno = 0; - testno < sizeof (setuid_tests) / sizeof (setuid_tests[0]); - ++testno) - do_one_test (testno); - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-setuid2.c b/nptl/tst-setuid2.c deleted file mode 100644 index 79cfbf4d60..0000000000 --- a/nptl/tst-setuid2.c +++ /dev/null @@ -1,145 +0,0 @@ -/* Copyright (C) 2014-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdbool.h> -#include <stdio.h> -#include <sys/syscall.h> -#include <unistd.h> - -/* Check that a partial setuid failure aborts the process. */ - -static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; -static pthread_cond_t cond_send; -static void (*func_sent) (void); -static pthread_cond_t cond_recv; - -#define FAIL(fmt, ...) \ - do { printf ("FAIL: " fmt "\n", __VA_ARGS__); _exit (1); } while (0) - -static void * -thread_func (void *ctx __attribute__ ((unused))) -{ - int ret = pthread_mutex_lock (&mutex); - if (ret != 0) - FAIL ("pthread_mutex_lock (thread): %d", ret); - - while (true) - { - if (func_sent != NULL) - { - void (*func) (void) = func_sent; - ret = pthread_mutex_unlock (&mutex); - if (ret != 0) - FAIL ("pthread_mutex_unlock (thread): %d", ret); - func (); - ret = pthread_mutex_lock (&mutex); - if (ret != 0) - FAIL ("pthread_mutex_lock (thread): %d", ret); - func_sent = NULL; - ret = pthread_cond_signal (&cond_recv); - if (ret != 0) - FAIL ("pthread_cond_signal (recv): %d", ret); - } - ret = pthread_cond_wait (&cond_send, &mutex); - if (ret != 0) - FAIL ("pthread_cond_wait (send): %d", ret); - } - return NULL; -} - -static void -run_on_thread (void (*func) (void)) -{ - int ret = pthread_mutex_lock (&mutex); - if (ret != 0) - FAIL ("pthread_mutex_lock (%s): %d", __func__, ret); - func_sent = func; - ret = pthread_mutex_unlock (&mutex); - if (ret != 0) - FAIL ("pthread_mutex_unlock (%s): %d", __func__, ret); - - ret = pthread_cond_signal (&cond_send); - if (ret != 0) - FAIL ("pthread_mutex_lock (%s): %d", __func__, ret); - - ret = pthread_mutex_lock (&mutex); - if (ret != 0) - FAIL ("pthread_mutex_lock (%s): %d", __func__, ret); - - while (func_sent != NULL) - { - ret = pthread_cond_wait (&cond_recv, &mutex); - if (ret != 0) - FAIL ("pthread_mutex_wait (%s): %d", __func__, ret); - } - ret = pthread_mutex_unlock (&mutex); - if (ret != 0) - FAIL ("pthread_mutex_unlock (%s): %d", __func__, ret); -} - -static void -change_thread_ids (void) -{ - long ret = syscall (__NR_setresuid, 2001, 2002, 2003); - if (ret != 0) - FAIL ("setresuid (2001, 2002, 2003): %ld", ret); -} - -static uid_t ruid, euid, suid; - -static void -get_thread_ids (void) -{ - if (getresuid (&ruid, &euid, &suid) < 0) - FAIL ("getresuid: %m (%d)", errno); -} - -static void -abort_expected (int signal __attribute__ ((unused))) -{ - _exit (0); -} - -static int -do_test (void) -{ - pthread_t thread; - int ret = pthread_create (&thread, NULL, thread_func, NULL); - if (ret != 0) - FAIL ("pthread_create: %d", ret); - - run_on_thread (change_thread_ids); - - signal (SIGABRT, &abort_expected); - /* This should abort the process. */ - if (setresuid (1001, 1002, 1003) < 0) - FAIL ("setresuid: %m (%d)", errno); - signal (SIGABRT, SIG_DFL); - - /* If we get here, check that the kernel did the right thing. */ - run_on_thread (get_thread_ids); - if (ruid != 1001 || euid != 1002 || suid != 1003) - FAIL ("unexpected UIDs after setuid: %ld, %ld, %ld", - (long) ruid, (long) euid, (long) suid); - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-setuid3.c b/nptl/tst-setuid3.c deleted file mode 100644 index 079fdf3a51..0000000000 --- a/nptl/tst-setuid3.c +++ /dev/null @@ -1,118 +0,0 @@ -/* Copyright (C) 2014-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <errno.h> -#include <pthread.h> -#include <stdbool.h> -#include <unistd.h> - -/* The test must run under a non-privileged user ID. */ -static const uid_t test_uid = 1; - -static pthread_barrier_t barrier1; -static pthread_barrier_t barrier2; - -#define FAIL(fmt, ...) \ - do { printf ("FAIL: " fmt "\n", __VA_ARGS__); _exit (1); } while (0) - -#define FAIL_ERR(fmt, ...) \ - do { printf ("FAIL: " fmt ": %m\n", __VA_ARGS__); _exit (1); } while (0) - -/* True if x is not a successful return code from pthread_barrier_wait. */ -static inline bool -is_invalid_barrier_ret (int x) -{ - return x != 0 && x != PTHREAD_BARRIER_SERIAL_THREAD; -} - -static void * -thread_func (void *ctx __attribute__ ((unused))) -{ - int ret = pthread_barrier_wait (&barrier1); - if (is_invalid_barrier_ret (ret)) - FAIL ("pthread_barrier_wait (barrier1) (on thread): %d", ret); - ret = pthread_barrier_wait (&barrier2); - if (is_invalid_barrier_ret (ret)) - FAIL ("pthread_barrier_wait (barrier2) (on thread): %d", ret); - return NULL; -} - -static void -setuid_failure (int phase) -{ - int ret = setuid (0); - switch (ret) - { - case 0: - FAIL ("setuid succeeded unexpectedly in phase %d", phase); - case -1: - if (errno != EPERM) - FAIL_ERR ("setuid phase %d", phase); - break; - default: - FAIL ("invalid setuid return value in phase %d: %d", phase, ret); - } -} - -static int -do_test (void) -{ - if (getuid () == 0) - if (setuid (test_uid) != 0) - FAIL_ERR ("setuid (%u)", (unsigned) test_uid); - if (setuid (getuid ())) - FAIL_ERR ("setuid (%s)", "getuid ()"); - setuid_failure (1); - - int ret = pthread_barrier_init (&barrier1, NULL, 2); - if (ret != 0) - FAIL ("pthread_barrier_init (barrier1): %d", ret); - ret = pthread_barrier_init (&barrier2, NULL, 2); - if (ret != 0) - FAIL ("pthread_barrier_init (barrier2): %d", ret); - - pthread_t thread; - ret = pthread_create (&thread, NULL, thread_func, NULL); - if (ret != 0) - FAIL ("pthread_create: %d", ret); - - /* Ensure that the thread is running properly. */ - ret = pthread_barrier_wait (&barrier1); - if (is_invalid_barrier_ret (ret)) - FAIL ("pthread_barrier_wait (barrier1): %d", ret); - - setuid_failure (2); - - /* Check success case. */ - if (setuid (getuid ()) != 0) - FAIL_ERR ("setuid (%s)", "getuid ()"); - - /* Shutdown. */ - ret = pthread_barrier_wait (&barrier2); - if (is_invalid_barrier_ret (ret)) - FAIL ("pthread_barrier_wait (barrier2): %d", ret); - - ret = pthread_join (thread, NULL); - if (ret != 0) - FAIL ("pthread_join: %d", ret); - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-signal1.c b/nptl/tst-signal1.c deleted file mode 100644 index bfab0a9a66..0000000000 --- a/nptl/tst-signal1.c +++ /dev/null @@ -1,188 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/wait.h> - - -static sigset_t ss; -static pthread_barrier_t *b; - - -static void * -tf (void *arg) -{ - sigdelset (&ss, SIGINT); - - if (pthread_sigmask (SIG_SETMASK, &ss, NULL) != 0) - { - puts ("2nd pthread_sigmask failed"); - exit (1); - } - - pthread_barrier_wait (b); - - int sig; - int res = sigwait (&ss, &sig); - if (res == 0) - { - printf ("sigwait returned successfully with signal %d\n", sig); - exit (1); - } - - printf ("sigwait returned with %s (%d)\n", strerror (res), res); - - return NULL; -} - - -static void -receiver (void) -{ - pthread_t th; - - /* Make sure the process doesn't run forever. */ - alarm (10); - - sigfillset (&ss); - - if (pthread_sigmask (SIG_SETMASK, &ss, NULL) != 0) - { - puts ("1st pthread_sigmask failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("pthread_create failed"); - exit (1); - } - - if (pthread_join (th, NULL) == 0) - { - puts ("thread joined?!"); - exit (1); - } - - _exit (0); -} - - -static int -do_test (void) -{ - char tmp[] = "/tmp/tst-signal1-XXXXXX"; - - int fd = mkstemp (tmp); - if (fd == -1) - { - puts ("mkstemp failed"); - exit (1); - } - - unlink (tmp); - - int i; - for (i = 0; i < 20; ++i) - write (fd, "foobar xyzzy", 12); - - b = mmap (NULL, sizeof (pthread_barrier_t), PROT_READ | PROT_WRITE, - MAP_SHARED, fd, 0); - if (b == MAP_FAILED) - { - puts ("mmap failed"); - exit (1); - } - - pthread_barrierattr_t ba; - if (pthread_barrierattr_init (&ba) != 0) - { - puts ("barrierattr_init failed"); - exit (1); - } - - if (pthread_barrierattr_setpshared (&ba, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("barrierattr_setpshared failed"); - exit (1); - } - - if (pthread_barrier_init (b, &ba, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - if (pthread_barrierattr_destroy (&ba) != 0) - { - puts ("barrierattr_destroy failed"); - exit (1); - } - - pid_t pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - exit (1); - } - - if (pid == 0) - receiver (); - - pthread_barrier_wait (b); - - /* Wait a bit more. */ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 }; - nanosleep (&ts, NULL); - - /* Send the signal. */ - puts ("sending the signal now"); - kill (pid, SIGINT); - - /* Wait for the process to terminate. */ - int status; - if (TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)) != pid) - { - puts ("wrong child reported terminated"); - exit (1); - } - - if (!WIFSIGNALED (status)) - { - puts ("child wasn't signalled"); - exit (1); - } - - if (WTERMSIG (status) != SIGINT) - { - puts ("child not terminated with SIGINT"); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-signal2.c b/nptl/tst-signal2.c deleted file mode 100644 index b68ef52955..0000000000 --- a/nptl/tst-signal2.c +++ /dev/null @@ -1,197 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/wait.h> -#include <string.h> - - -static sigset_t ss; -static pthread_barrier_t *b; - - -static void * -tf (void *arg) -{ - pthread_barrier_wait (b); - - puts ("child: calling sigwait now"); - - int sig; - int err; - err = sigwait (&ss, &sig); - if (err != 0) - { - printf ("sigwait returned unsuccessfully: %s (%d)\n", - strerror (err), err); - _exit (1); - } - - puts ("sigwait returned"); - - if (sig != SIGINT) - { - printf ("caught signal %d, expected %d (SIGINT)\n", sig, SIGINT); - _exit (1); - } - - puts ("child thread terminating now"); - - return NULL; -} - - -static void -receiver (void) -{ - pthread_t th; - - /* Make sure the process doesn't run forever. */ - alarm (10); - - sigfillset (&ss); - - if (pthread_sigmask (SIG_SETMASK, &ss, NULL) != 0) - { - puts ("1st pthread_sigmask failed"); - _exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("pthread_create failed"); - _exit (1); - } - - if (pthread_join (th, NULL) != 0) - { - puts ("thread didn't join"); - _exit (1); - } - - puts ("join succeeded"); - - _exit (0); -} - - -static int -do_test (void) -{ - char tmp[] = "/tmp/tst-signal1-XXXXXX"; - - int fd = mkstemp (tmp); - if (fd == -1) - { - puts ("mkstemp failed"); - exit (1); - } - - unlink (tmp); - - int i; - for (i = 0; i < 20; ++i) - write (fd, "foobar xyzzy", 12); - - b = mmap (NULL, sizeof (pthread_barrier_t), PROT_READ | PROT_WRITE, - MAP_SHARED, fd, 0); - if (b == MAP_FAILED) - { - puts ("mmap failed"); - exit (1); - } - - pthread_barrierattr_t ba; - if (pthread_barrierattr_init (&ba) != 0) - { - puts ("barrierattr_init failed"); - exit (1); - } - - if (pthread_barrierattr_setpshared (&ba, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("barrierattr_setpshared failed"); - exit (1); - } - - if (pthread_barrier_init (b, &ba, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - if (pthread_barrierattr_destroy (&ba) != 0) - { - puts ("barrierattr_destroy failed"); - exit (1); - } - - pid_t pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - exit (1); - } - - if (pid == 0) - receiver (); - - pthread_barrier_wait (b); - - /* Wait a bit more. */ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 }; - nanosleep (&ts, NULL); - - /* Send the signal. */ - puts ("sending the signal now"); - kill (pid, SIGINT); - - /* Wait for the process to terminate. */ - int status; - if (TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)) != pid) - { - puts ("wrong child reported terminated"); - exit (1); - } - - if (!WIFEXITED (status)) - { - if (WIFSIGNALED (status)) - printf ("child exited with signal %d\n", WTERMSIG (status)); - else - puts ("child didn't exit normally"); - exit (1); - } - - if (WEXITSTATUS (status) != 0) - { - printf ("exit status %d != 0\n", WEXITSTATUS (status)); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-signal3.c b/nptl/tst-signal3.c deleted file mode 100644 index a6e089fbfc..0000000000 --- a/nptl/tst-signal3.c +++ /dev/null @@ -1,266 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <semaphore.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -#ifdef SIGRTMIN - -/* Number of different signals to use. Also is the number of threads. */ -# define N 10 -/* Maximum number of threads in flight at any one time. */ -# define INFLIGHT 5 -/* Number of signals sent in total. */ -# define ROUNDS 10000 - - -static int received[N][N]; -static int nsig[N]; -static pthread_t th[N]; -static sem_t sem; -static pthread_mutex_t lock[N]; -static pthread_t th_main; -static int sig0; - -static void -handler (int sig) -{ - int i; - for (i = 0; i < N; ++i) - if (pthread_equal (pthread_self (), th[i])) - break; - - if (i == N) - { - if (pthread_equal (pthread_self (), th_main)) - puts ("signal received by main thread"); - else - printf ("signal received by unknown thread (%lx)\n", - (unsigned long int) pthread_self ()); - exit (1); - } - - ++received[i][sig - sig0]; - - sem_post (&sem); -} - - -static void * -tf (void *arg) -{ - int idx = (long int) arg; - - sigset_t ss; - sigemptyset (&ss); - - int i; - for (i = 0; i <= idx; ++i) - sigaddset (&ss, sig0 + i); - - if (pthread_sigmask (SIG_UNBLOCK, &ss, NULL) != 0) - { - printf ("thread %d: pthread_sigmask failed\n", i); - exit (1); - } - - pthread_mutex_lock (&lock[idx]); - - return NULL; -} - - -static int -do_test (void) -{ - /* Block all signals. */ - sigset_t ss; - sigfillset (&ss); - - th_main = pthread_self (); - - sig0 = SIGRTMIN; - - if (pthread_sigmask (SIG_SETMASK, &ss, NULL) != 0) - { - puts ("1st pthread_sigmask failed"); - exit (1); - } - - /* Install the handler. */ - int i; - for (i = 0; i < N; ++i) - { - struct sigaction sa = - { - .sa_handler = handler, - .sa_flags = 0 - }; - sigfillset (&sa.sa_mask); - - if (sigaction (sig0 + i, &sa, NULL) != 0) - { - printf ("sigaction for signal %d failed\n", i); - exit (1); - } - } - - if (sem_init (&sem, 0, INFLIGHT) != 0) - { - puts ("sem_init failed"); - exit (1); - } - - pthread_attr_t a; - - if (pthread_attr_init (&a) != 0) - { - puts ("attr_init failed"); - exit (1); - } - - if (pthread_attr_setstacksize (&a, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - for (i = 0; i < N; ++i) - { - if (pthread_mutex_init (&lock[i], NULL) != 0) - { - printf ("mutex_init[%d] failed\n", i); - } - - if (pthread_mutex_lock (&lock[i]) != 0) - { - printf ("mutex_lock[%d] failed\n", i); - } - - if (pthread_create (&th[i], &a, tf, (void *) (long int) i) != 0) - { - printf ("create of thread %d failed\n", i); - exit (1); - } - } - - if (pthread_attr_destroy (&a) != 0) - { - puts ("attr_destroy failed"); - exit (1); - } - - int result = 0; - unsigned int r = 42; - pid_t pid = getpid (); - - for (i = 0; i < ROUNDS; ++i) - { - if (TEMP_FAILURE_RETRY (sem_wait (&sem)) != 0) - { - printf ("sem_wait round %d failed: %m\n", i); - exit (1); - } - - int s = rand_r (&r) % N; - - kill (pid, sig0 + s); - } - - void *status; - for (i = 0; i < N; ++i) - { - if (pthread_mutex_unlock (&lock[i]) != 0) - { - printf ("unlock %d failed\n", i); - exit (1); - } - - if (pthread_join (th[i], &status) != 0) - { - printf ("join %d failed\n", i); - result = 1; - } - else if (status != NULL) - { - printf ("%d: result != NULL\n", i); - result = 1; - } - } - - int total = 0; - for (i = 0; i < N; ++i) - { - int j; - - for (j = 0; j <= i; ++j) - total += received[i][j]; - - for (j = i + 1; j < N; ++j) - if (received[i][j] != 0) - { - printf ("thread %d received signal SIGRTMIN+%d\n", i, j); - result = 1; - } - } - - if (total != ROUNDS) - { - printf ("total number of handled signals is %d, expected %d\n", - total, ROUNDS); - result = 1; - } - - printf ("A total of %d signals sent and received\n", total); - for (i = 0; i < N; ++i) - { - printf ("thread %2d:", i); - - int j; - for (j = 0; j <= i; ++j) - { - printf (" %5d", received[i][j]); - nsig[j] += received[i][j]; - } - - putchar ('\n'); - - } - - printf ("\nTotal :"); - for (i = 0; i < N; ++i) - printf (" %5d", nsig[i]); - putchar ('\n'); - - return result; -} - -# define TIMEOUT 10 -# define TEST_FUNCTION do_test () - -#else -# define TEST_FUNCTION 0 -#endif - -#include "../test-skeleton.c" diff --git a/nptl/tst-signal4.c b/nptl/tst-signal4.c deleted file mode 100644 index 4dda025d58..0000000000 --- a/nptl/tst-signal4.c +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> - -static int -do_test (void) -{ - sigset_t ss; - - sigemptyset (&ss); - - int i; - for (i = 0; i < 10000; ++i) - { - long int r = random (); - - if (r != SIG_BLOCK && r != SIG_SETMASK && r != SIG_UNBLOCK) - { - int e = pthread_sigmask (r, &ss, NULL); - - if (e == 0) - { - printf ("pthread_sigmask succeeded for how = %ld\n", r); - exit (1); - } - - if (e != EINVAL) - { - puts ("pthread_sigmask didn't return EINVAL"); - exit (1); - } - } - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-signal5.c b/nptl/tst-signal5.c deleted file mode 100644 index b47b76b1a6..0000000000 --- a/nptl/tst-signal5.c +++ /dev/null @@ -1,110 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/wait.h> - - -static sigset_t ss; - - -static void * -tf (void *arg) -{ - sigset_t ss2; - if (pthread_sigmask (SIG_SETMASK, NULL, &ss2) != 0) - { - puts ("child: sigmask failed"); - exit (1); - } - - int i; - for (i = 1; i < 32; ++i) - if (sigismember (&ss, i) && ! sigismember (&ss2, i)) - { - printf ("signal %d set in parent mask, but not in child\n", i); - exit (1); - } - else if (! sigismember (&ss, i) && sigismember (&ss2, i)) - { - printf ("signal %d set in child mask, but not in parent\n", i); - exit (1); - } - - return NULL; -} - - -static int -do_test (void) -{ - sigemptyset (&ss); - sigaddset (&ss, SIGUSR1); - if (pthread_sigmask (SIG_SETMASK, &ss, NULL) != 0) - { - puts ("1st sigmask failed"); - exit (1); - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("1st create failed"); - exit (1); - } - - void *r; - if (pthread_join (th, &r) != 0) - { - puts ("1st join failed"); - exit (1); - } - - sigemptyset (&ss); - sigaddset (&ss, SIGUSR2); - sigaddset (&ss, SIGFPE); - if (pthread_sigmask (SIG_SETMASK, &ss, NULL) != 0) - { - puts ("2nd sigmask failed"); - exit (1); - } - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("2nd create failed"); - exit (1); - } - - if (pthread_join (th, &r) != 0) - { - puts ("2nd join failed"); - exit (1); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-signal6.c b/nptl/tst-signal6.c deleted file mode 100644 index 4172150eb8..0000000000 --- a/nptl/tst-signal6.c +++ /dev/null @@ -1,197 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -#ifdef SIGRTMIN - -# define N 2 -static pthread_barrier_t bar; -static struct -{ - void *p; - pthread_t s; -} ti[N]; -static int sig1; - - -static void -handler (int sig) -{ - pthread_t self = pthread_self (); - size_t i; - - for (i = 0; i < N; ++i) - if (ti[i].s == self) - { - if ((uintptr_t) ti[i].p <= (uintptr_t) &self - && (uintptr_t) ti[i].p + 2 * MINSIGSTKSZ > (uintptr_t) &self) - { - puts ("alt stack not used"); - exit (1); - } - - printf ("thread %zu used alt stack for signal %d\n", i, sig); - - return; - } - - puts ("handler: thread not found"); - exit (1); -} - - -static void * -tf (void *arg) -{ - size_t nr = (uintptr_t) arg; - if (nr >= N) - { - puts ("wrong nr parameter"); - exit (1); - } - - sigset_t ss; - sigemptyset (&ss); - size_t i; - for (i = 0; i < N; ++i) - if (i != nr) - if (sigaddset (&ss, sig1 + i) != 0) - { - puts ("tf: sigaddset failed"); - exit (1); - } - if (pthread_sigmask (SIG_BLOCK, &ss, NULL) != 0) - { - puts ("tf: sigmask failed"); - exit (1); - } - - void *p = malloc (2 * MINSIGSTKSZ); - if (p == NULL) - { - puts ("tf: malloc failed"); - exit (1); - } - - stack_t s; - s.ss_sp = p; - s.ss_size = 2 * MINSIGSTKSZ; - s.ss_flags = 0; - if (sigaltstack (&s, NULL) != 0) - { - puts ("tf: sigaltstack failed"); - exit (1); - } - - ti[nr].p = p; - ti[nr].s = pthread_self (); - - pthread_barrier_wait (&bar); - - pthread_barrier_wait (&bar); - - return NULL; -} - - -static int -do_test (void) -{ - sig1 = SIGRTMIN; - if (sig1 + N > SIGRTMAX) - { - puts ("too few RT signals"); - return 0; - } - - struct sigaction sa; - sa.sa_handler = handler; - sa.sa_flags = 0; - sigemptyset (&sa.sa_mask); - - if (sigaction (sig1, &sa, NULL) != 0 - || sigaction (sig1 + 1, &sa, NULL) != 0 - || sigaction (sig1 + 2, &sa, NULL) != 0) - { - puts ("sigaction failed"); - return 1; - } - - if (pthread_barrier_init (&bar, NULL, 1 + N) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - pthread_t th[N]; - size_t i; - for (i = 0; i < N; ++i) - if (pthread_create (&th[i], NULL, tf, (void *) (long int) i) != 0) - { - puts ("create failed"); - return 1; - } - - /* Block the three signals. */ - sigset_t ss; - sigemptyset (&ss); - for (i = 0; i <= N; ++i) - sigaddset (&ss, sig1 + i); - if (pthread_sigmask (SIG_BLOCK, &ss, NULL) != 0) - { - puts ("main: sigmask failed"); - return 1; - } - - pthread_barrier_wait (&bar); - - /* Send some signals. */ - pid_t me = getpid (); - kill (me, sig1 + N); - for (i = 0; i < N; ++i) - kill (me, sig1 + i); - kill (me, sig1 + N); - - /* Give the signals a chance to be worked on. */ - sleep (1); - - pthread_barrier_wait (&bar); - - for (i = 0; i < N; ++i) - if (pthread_join (th[i], NULL) != 0) - { - puts ("join failed"); - return 1; - } - - return 0; -} - -# define TEST_FUNCTION do_test () - -#else -# define TEST_FUNCTION 0 -#endif -#include "../test-skeleton.c" diff --git a/nptl/tst-signal7.c b/nptl/tst-signal7.c deleted file mode 100644 index e1e291e116..0000000000 --- a/nptl/tst-signal7.c +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (C) 2005-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2005. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthreadP.h> -#include <signal.h> -#include <stdio.h> - - -static int -do_test (void) -{ - int result = 0; - -#ifdef SIGCANCEL - errno = 0; - if (sigaction (SIGCANCEL, NULL, NULL) == 0) - { - puts ("sigaction(SIGCANCEL) did not fail"); - result = 1; - } - else if (errno != EINVAL) - { - puts ("sigaction(SIGCANCEL) did not set errno to EINVAL"); - result = 1; - } -#endif - -#ifdef SIGSETXID - errno = 0; - if (sigaction (SIGSETXID, NULL, NULL) == 0) - { - puts ("sigaction(SIGSETXID) did not fail"); - result = 1; - } - else if (errno != EINVAL) - { - puts ("sigaction(SIGSETXID) did not set errno to EINVAL"); - result = 1; - } -#endif - - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-spin1.c b/nptl/tst-spin1.c deleted file mode 100644 index a19f51dc2b..0000000000 --- a/nptl/tst-spin1.c +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> - - -static int -do_test (void) -{ - pthread_spinlock_t s; - - if (pthread_spin_init (&s, PTHREAD_PROCESS_PRIVATE) != 0) - { - puts ("spin_init failed"); - return 1; - } - - if (pthread_spin_lock (&s) != 0) - { - puts ("spin_lock failed"); - return 1; - } - - if (pthread_spin_unlock (&s) != 0) - { - puts ("spin_unlock failed"); - return 1; - } - - if (pthread_spin_destroy (&s) != 0) - { - puts ("spin_destroy failed"); - return 1; - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-spin2.c b/nptl/tst-spin2.c deleted file mode 100644 index 1a8260d256..0000000000 --- a/nptl/tst-spin2.c +++ /dev/null @@ -1,158 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/wait.h> - - -static int -do_test (void) -{ - size_t ps = sysconf (_SC_PAGESIZE); - char tmpfname[] = "/tmp/tst-spin2.XXXXXX"; - char data[ps]; - void *mem; - int fd; - pthread_spinlock_t *s; - pid_t pid; - char *p; - int err; - - fd = mkstemp (tmpfname); - if (fd == -1) - { - printf ("cannot open temporary file: %m\n"); - return 1; - } - - /* Make sure it is always removed. */ - unlink (tmpfname); - - /* Create one page of data. */ - memset (data, '\0', ps); - - /* Write the data to the file. */ - if (write (fd, data, ps) != (ssize_t) ps) - { - puts ("short write"); - return 1; - } - - mem = mmap (NULL, ps, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (mem == MAP_FAILED) - { - printf ("mmap failed: %m\n"); - return 1; - } - - s = (pthread_spinlock_t *) (((uintptr_t) mem - + __alignof (pthread_spinlock_t)) - & ~(__alignof (pthread_spinlock_t) - 1)); - p = (char *) (s + 1); - - if (pthread_spin_init (s, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("spin_init failed"); - return 1; - } - - if (pthread_spin_lock (s) != 0) - { - puts ("spin_lock failed"); - return 1; - } - - err = pthread_spin_trylock (s); - if (err == 0) - { - puts ("1st spin_trylock succeeded"); - return 1; - } - else if (err != EBUSY) - { - puts ("1st spin_trylock didn't return EBUSY"); - return 1; - } - - err = pthread_spin_unlock (s); - if (err != 0) - { - puts ("parent: spin_unlock failed"); - return 1; - } - - err = pthread_spin_trylock (s); - if (err != 0) - { - puts ("2nd spin_trylock failed"); - return 1; - } - - *p = 0; - - puts ("going to fork now"); - pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - return 1; - } - else if (pid == 0) - { - /* Play some lock ping-pong. It's our turn to unlock first. */ - if ((*p)++ != 0) - { - puts ("child: *p != 0"); - return 1; - } - - if (pthread_spin_unlock (s) != 0) - { - puts ("child: 1st spin_unlock failed"); - return 1; - } - - puts ("child done"); - } - else - { - if (pthread_spin_lock (s) != 0) - { - puts ("parent: 2nd spin_lock failed"); - return 1; - } - - puts ("waiting for child"); - - waitpid (pid, NULL, 0); - - puts ("parent done"); - } - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-spin3.c b/nptl/tst-spin3.c deleted file mode 100644 index d04b59de47..0000000000 --- a/nptl/tst-spin3.c +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <unistd.h> - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static int -do_test (void) -{ - pthread_spinlock_t s; - - if (pthread_spin_init (&s, PTHREAD_PROCESS_PRIVATE) != 0) - { - puts ("spin_init failed"); - return 1; - } - - if (pthread_spin_lock (&s) != 0) - { - puts ("1st spin_lock failed"); - return 1; - } - - delayed_exit (1); - - /* This call should never return. */ - xpthread_spin_lock (&s); - - puts ("2nd spin_lock returned"); - return 1; -} diff --git a/nptl/tst-spin4.c b/nptl/tst-spin4.c deleted file mode 100644 index 5b23a172ca..0000000000 --- a/nptl/tst-spin4.c +++ /dev/null @@ -1,109 +0,0 @@ -#include <pthread.h> -#include <stdio.h> -#include <unistd.h> - -static int count = 0; - -static void * -thread_add_one (void *arg) -{ - int tmp; - pthread_spinlock_t *lock = (pthread_spinlock_t *) arg; - - /* When do_test holds the lock for 1 sec, the two thread will be - in contention for the lock. */ - if (pthread_spin_lock (lock) != 0) - { - puts ("thread_add_one(): spin_lock failed"); - pthread_exit ((void *) 1l); - } - - /* sleep 1s before modifying count */ - tmp = count; - sleep (1); - count = tmp + 1; - - if (pthread_spin_unlock (lock) != 0) - { - puts ("thread_add_one(): spin_unlock failed"); - pthread_exit ((void *) 1l); - } - - return NULL; -} - -static int -do_test (void) -{ - pthread_t thr1, thr2; - pthread_spinlock_t lock; - int tmp; - - if (pthread_spin_init (&lock, PTHREAD_PROCESS_PRIVATE) != 0) - { - puts ("spin_init failed"); - return 1; - } - - if (pthread_spin_lock (&lock) != 0) - { - puts ("1st spin_lock failed"); - return 1; - } - - if (pthread_create (&thr1, NULL, thread_add_one, (void *) &lock) != 0) - { - puts ("1st pthread_create failed"); - return 1; - } - - if (pthread_create (&thr2, NULL, thread_add_one, (void *) &lock) != 0) - { - puts ("2nd pthread_create failed"); - return 1; - } - - /* sleep 1s before modifying count */ - tmp = count; - sleep (1); - count = tmp + 1; - - if (pthread_spin_unlock (&lock) != 0) - { - puts ("1st spin_unlock failed"); - return 1; - } - - void *status; - if (pthread_join (thr1, &status) != 0) - { - puts ("1st pthread_join failed"); - return 1; - } - if (status != NULL) - { - puts ("failure in the 1st thread"); - return 1; - } - if (pthread_join (thr2, &status) != 0) - { - puts ("2nd pthread_join failed"); - return 1; - } - if (status != NULL) - { - puts ("failure in the 2nd thread"); - return 1; - } - - if (count != 3) - { - printf ("count is %d, should be 3\n", count); - return 1; - } - return 0; -} - -#define TIMEOUT 5 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-stack1.c b/nptl/tst-stack1.c deleted file mode 100644 index dc1a03e294..0000000000 --- a/nptl/tst-stack1.c +++ /dev/null @@ -1,145 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <limits.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <sys/param.h> -#include <unistd.h> - - -static void *stack; -static size_t size; - - -static void * -tf (void *a) -{ - int result = 0; - - puts ("child start"); - - pthread_attr_t attr; - if (pthread_getattr_np (pthread_self (), &attr) != 0) - { - puts ("getattr_np failed"); - exit (1); - } - - size_t test_size; - void *test_stack; - if (pthread_attr_getstack (&attr, &test_stack, &test_size) != 0) - { - puts ("attr_getstack failed"); - exit (1); - } - - if (test_size != size) - { - printf ("child: reported size differs: is %zu, expected %zu\n", - test_size, size); - result = 1; - } - - if (test_stack != stack) - { - printf ("child: reported stack address differs: is %p, expected %p\n", - test_stack, stack); - result = 1; - } - - puts ("child OK"); - - return result ? (void *) 1l : NULL; -} - - -int -do_test (void) -{ - int result = 0; - - size = MAX (4 * getpagesize (), PTHREAD_STACK_MIN); - if (posix_memalign (&stack, getpagesize (), size) != 0) - { - puts ("out of memory while allocating the stack memory"); - exit (1); - } - - pthread_attr_t attr; - if (pthread_attr_init (&attr) != 0) - { - puts ("attr_init failed"); - exit (1); - } - - puts ("attr_setstack"); - if (pthread_attr_setstack (&attr, stack, size) != 0) - { - puts ("attr_setstack failed"); - exit (1); - } - - size_t test_size; - void *test_stack; - puts ("attr_getstack"); - if (pthread_attr_getstack (&attr, &test_stack, &test_size) != 0) - { - puts ("attr_getstack failed"); - exit (1); - } - - if (test_size != size) - { - printf ("reported size differs: is %zu, expected %zu\n", - test_size, size); - result = 1; - } - - if (test_stack != stack) - { - printf ("reported stack address differs: is %p, expected %p\n", - test_stack, stack); - result = 1; - } - - puts ("create"); - - pthread_t th; - if (pthread_create (&th, &attr, tf, NULL) != 0) - { - puts ("failed to create thread"); - exit (1); - } - - void *status; - if (pthread_join (th, &status) != 0) - { - puts ("join failed"); - exit (1); - } - - result |= status != NULL; - - return result; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-stack2.c b/nptl/tst-stack2.c deleted file mode 100644 index fe319572e8..0000000000 --- a/nptl/tst-stack2.c +++ /dev/null @@ -1,79 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* Test whether it is possible to create a thread with PTHREAD_STACK_MIN - stack size. */ - -#include <pthread.h> -#include <stdlib.h> -#include <stdio.h> -#include <limits.h> - -static int seen; - -static void * -tf (void *p) -{ - ++seen; - return NULL; -} - -static int -do_test (void) -{ - pthread_attr_t attr; - pthread_attr_init (&attr); - - int result = 0; - int res = pthread_attr_setstacksize (&attr, PTHREAD_STACK_MIN); - if (res) - { - printf ("pthread_attr_setstacksize failed %d\n", res); - result = 1; - } - - /* Create the thread. */ - pthread_t th; - res = pthread_create (&th, &attr, tf, NULL); - if (res) - { - printf ("pthread_create failed %d\n", res); - result = 1; - } - else - { - res = pthread_join (th, NULL); - if (res) - { - printf ("pthread_join failed %d\n", res); - result = 1; - } - } - - if (seen != 1) - { - printf ("seen %d != 1\n", seen); - result = 1; - } - - return result; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-stack3.c b/nptl/tst-stack3.c deleted file mode 100644 index fd5349671b..0000000000 --- a/nptl/tst-stack3.c +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* Test whether pthread_create/pthread_join with user defined stacks - doesn't leak memory. - NOTE: this tests functionality beyond POSIX. In POSIX user defined - stacks cannot be ever freed once used by pthread_create nor they can - be reused for other thread. */ - -#include <limits.h> -#include <mcheck.h> -#include <pthread.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -static int seen; - -static void * -tf (void *p) -{ - ++seen; - return NULL; -} - -static int -do_test (void) -{ - mtrace (); - - void *stack; - int res = posix_memalign (&stack, getpagesize (), 4 * PTHREAD_STACK_MIN); - if (res) - { - printf ("malloc failed %s\n", strerror (res)); - return 1; - } - - pthread_attr_t attr; - pthread_attr_init (&attr); - - int result = 0; - res = pthread_attr_setstack (&attr, stack, 4 * PTHREAD_STACK_MIN); - if (res) - { - printf ("pthread_attr_setstack failed %d\n", res); - result = 1; - } - - for (int i = 0; i < 16; ++i) - { - /* Create the thread. */ - pthread_t th; - res = pthread_create (&th, &attr, tf, NULL); - if (res) - { - printf ("pthread_create failed %d\n", res); - result = 1; - } - else - { - res = pthread_join (th, NULL); - if (res) - { - printf ("pthread_join failed %d\n", res); - result = 1; - } - } - } - - pthread_attr_destroy (&attr); - - if (seen != 16) - { - printf ("seen %d != 16\n", seen); - result = 1; - } - - free (stack); - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-stack4.c b/nptl/tst-stack4.c deleted file mode 100644 index eed7c58a9d..0000000000 --- a/nptl/tst-stack4.c +++ /dev/null @@ -1,159 +0,0 @@ -/* Test DTV size oveflow when pthread_create reuses old DTV and TLS is - used by dlopened shared object. - Copyright (C) 2014-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <stdint.h> -#include <dlfcn.h> -#include <assert.h> -#include <pthread.h> - -/* The choices of thread count, and file counts are arbitary. - The point is simply to run enough threads that an exiting - thread has it's stack reused by another thread at the same - time as new libraries have been loaded. */ -#define DSO_SHARED_FILES 20 -#define DSO_OPEN_THREADS 20 -#define DSO_EXEC_THREADS 2 - -/* Used to make sure that only one thread is calling dlopen and dlclose - at a time. */ -pthread_mutex_t g_lock; - -typedef void (*function) (void); - -void * -dso_invoke(void *dso_fun) -{ - function *fun_vec = (function *) dso_fun; - int dso; - - for (dso = 0; dso < DSO_SHARED_FILES; dso++) - (*fun_vec[dso]) (); - - pthread_exit (NULL); -} - -void * -dso_process (void * p) -{ - void *handle[DSO_SHARED_FILES]; - function fun_vec[DSO_SHARED_FILES]; - char dso_path[DSO_SHARED_FILES][100]; - int dso; - int t = (int) (uintptr_t) p; - - /* Open DSOs and get a function. */ - for (dso = 0; dso < DSO_SHARED_FILES; dso++) - { - sprintf (dso_path[dso], "tst-stack4mod-%i-%i.so", t, dso); - - pthread_mutex_lock (&g_lock); - - handle[dso] = dlopen (dso_path[dso], RTLD_NOW); - assert (handle[dso]); - - fun_vec[dso] = (function) dlsym (handle[dso], "function"); - assert (fun_vec[dso]); - - pthread_mutex_unlock (&g_lock); - } - - /* Spawn workers. */ - pthread_t thread[DSO_EXEC_THREADS]; - int i, ret; - uintptr_t result = 0; - for (i = 0; i < DSO_EXEC_THREADS; i++) - { - pthread_mutex_lock (&g_lock); - ret = pthread_create (&thread[i], NULL, dso_invoke, (void *) fun_vec); - if (ret != 0) - { - printf ("pthread_create failed: %d\n", ret); - result = 1; - } - pthread_mutex_unlock (&g_lock); - } - - if (!result) - for (i = 0; i < DSO_EXEC_THREADS; i++) - { - ret = pthread_join (thread[i], NULL); - if (ret != 0) - { - printf ("pthread_join failed: %d\n", ret); - result = 1; - } - } - - /* Close all DSOs. */ - for (dso = 0; dso < DSO_SHARED_FILES; dso++) - { - pthread_mutex_lock (&g_lock); - dlclose (handle[dso]); - pthread_mutex_unlock (&g_lock); - } - - /* Exit. */ - pthread_exit ((void *) result); -} - -static int -do_test (void) -{ - pthread_t thread[DSO_OPEN_THREADS]; - int i,j; - int ret; - int result = 0; - - pthread_mutex_init (&g_lock, NULL); - - /* 100 is arbitrary here and is known to trigger PR 13862. */ - for (j = 0; j < 100; j++) - { - for (i = 0; i < DSO_OPEN_THREADS; i++) - { - ret = pthread_create (&thread[i], NULL, dso_process, - (void *) (uintptr_t) i); - if (ret != 0) - { - printf ("pthread_create failed: %d\n", ret); - result = 1; - } - } - - if (result) - break; - - for (i = 0; i < DSO_OPEN_THREADS; i++) - { - ret = pthread_join (thread[i], NULL); - if (ret != 0) - { - printf ("pthread_join failed: %d\n", ret); - result = 1; - } - } - } - - return result; -} - -#define TEST_FUNCTION do_test () -#define TIMEOUT 100 -#include "../test-skeleton.c" diff --git a/nptl/tst-stack4mod.c b/nptl/tst-stack4mod.c deleted file mode 100644 index 319a8b51c3..0000000000 --- a/nptl/tst-stack4mod.c +++ /dev/null @@ -1,28 +0,0 @@ -/* This tests DTV usage with TLS in dlopened shared object. - Copyright (C) 2014-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* 256 is arbitrary here and is known to trigger PR 13862. */ -__thread int var[256] attribute_hidden = {0}; - -void -function (void) -{ - int i; - for (i = 0; i < sizeof (var) / sizeof (int); i++) - var[i] = i; -} diff --git a/nptl/tst-stackguard1-static.c b/nptl/tst-stackguard1-static.c deleted file mode 100644 index db1e21554d..0000000000 --- a/nptl/tst-stackguard1-static.c +++ /dev/null @@ -1 +0,0 @@ -#include "tst-stackguard1.c" diff --git a/nptl/tst-stackguard1.c b/nptl/tst-stackguard1.c deleted file mode 100644 index 0f21d0ddc3..0000000000 --- a/nptl/tst-stackguard1.c +++ /dev/null @@ -1,227 +0,0 @@ -/* Copyright (C) 2005-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2005. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdbool.h> -#include <stddef.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/wait.h> -#include <stackguard-macros.h> -#include <tls.h> -#include <unistd.h> - -static const char *command; -static bool child; -static uintptr_t stack_chk_guard_copy; -static bool stack_chk_guard_copy_set; -static int fds[2]; - -static void __attribute__ ((constructor)) -con (void) -{ - stack_chk_guard_copy = STACK_CHK_GUARD; - stack_chk_guard_copy_set = true; -} - -static int -uintptr_t_cmp (const void *a, const void *b) -{ - if (*(uintptr_t *) a < *(uintptr_t *) b) - return 1; - if (*(uintptr_t *) a > *(uintptr_t *) b) - return -1; - return 0; -} - -static void * -tf (void *arg) -{ - if (stack_chk_guard_copy != STACK_CHK_GUARD) - { - puts ("STACK_CHK_GUARD changed in thread"); - return (void *) 1L; - } - return NULL; -} - -static int -do_test (void) -{ - if (!stack_chk_guard_copy_set) - { - puts ("constructor has not been run"); - return 1; - } - - if (stack_chk_guard_copy != STACK_CHK_GUARD) - { - puts ("STACK_CHK_GUARD changed between constructor and do_test"); - return 1; - } - - if (child) - { - int i; - pthread_t th[4]; - void *ret; - for (i = 0; i < 4; ++i) - if (pthread_create (&th[i], NULL, tf, NULL)) - { - puts ("thread creation failed"); - return 1; - } - for (i = 0; i < 4; ++i) - if (pthread_join (th[i], &ret)) - { - puts ("thread join failed"); - return 1; - } - else if (ret != NULL) - return 1; - - write (2, &stack_chk_guard_copy, sizeof (stack_chk_guard_copy)); - return 0; - } - - if (command == NULL) - { - puts ("missing --command or --child argument"); - return 1; - } - -#define N 16 - uintptr_t child_stack_chk_guards[N + 1]; - child_stack_chk_guards[N] = stack_chk_guard_copy; - int i; - for (i = 0; i < N; ++i) - { - if (pipe (fds) < 0) - { - printf ("couldn't create pipe: %m\n"); - return 1; - } - - pid_t pid = fork (); - if (pid < 0) - { - printf ("fork failed: %m\n"); - return 1; - } - - if (!pid) - { - if (stack_chk_guard_copy != STACK_CHK_GUARD) - { - puts ("STACK_CHK_GUARD changed after fork"); - exit (1); - } - - close (fds[0]); - close (2); - dup2 (fds[1], 2); - close (fds[1]); - - system (command); - exit (0); - } - - close (fds[1]); - - if (TEMP_FAILURE_RETRY (read (fds[0], &child_stack_chk_guards[i], - sizeof (uintptr_t))) != sizeof (uintptr_t)) - { - puts ("could not read stack_chk_guard value from child"); - return 1; - } - - close (fds[0]); - - pid_t termpid; - int status; - termpid = TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)); - if (termpid == -1) - { - printf ("waitpid failed: %m\n"); - return 1; - } - else if (termpid != pid) - { - printf ("waitpid returned %ld != %ld\n", - (long int) termpid, (long int) pid); - return 1; - } - else if (!WIFEXITED (status) || WEXITSTATUS (status)) - { - puts ("child hasn't exited with exit status 0"); - return 1; - } - } - - qsort (child_stack_chk_guards, N + 1, sizeof (uintptr_t), uintptr_t_cmp); - - uintptr_t default_guard = 0; - unsigned char *p = (unsigned char *) &default_guard; - p[sizeof (uintptr_t) - 1] = 255; - p[sizeof (uintptr_t) - 2] = '\n'; - p[0] = 0; - - /* Test if the stack guard canaries are either randomized, - or equal to the default stack guard canary value. - Even with randomized stack guards it might happen - that the random number generator generates the same - values, but if that happens in more than half from - the 16 runs, something is very wrong. */ - int ndifferences = 0; - int ndefaults = 0; - for (i = 0; i < N; ++i) - { - if (child_stack_chk_guards[i] != child_stack_chk_guards[i+1]) - ndifferences++; - else if (child_stack_chk_guards[i] == default_guard) - ndefaults++; - } - - printf ("differences %d defaults %d\n", ndifferences, ndefaults); - - if (ndifferences < N / 2 && ndefaults < N / 2) - { - puts ("stack guard canaries are not randomized enough"); - puts ("nor equal to the default canary value"); - return 1; - } - - return 0; -} - -#define OPT_COMMAND 10000 -#define OPT_CHILD 10001 -#define CMDLINE_OPTIONS \ - { "command", required_argument, NULL, OPT_COMMAND }, \ - { "child", no_argument, NULL, OPT_CHILD }, -#define CMDLINE_PROCESS \ - case OPT_COMMAND: \ - command = optarg; \ - break; \ - case OPT_CHILD: \ - child = true; \ - break; -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-stdio1.c b/nptl/tst-stdio1.c deleted file mode 100644 index 355e716cd3..0000000000 --- a/nptl/tst-stdio1.c +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <unistd.h> - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static void *tf (void *a) -{ - flockfile (stdout); - /* This call should never return. */ - return a; -} - - -int -do_test (void) -{ - pthread_t th; - - flockfile (stdout); - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - write_message ("create failed\n"); - _exit (1); - } - - delayed_exit (1); - xpthread_join (th); - - puts ("join returned"); - - return 1; -} diff --git a/nptl/tst-stdio2.c b/nptl/tst-stdio2.c deleted file mode 100644 index d7c0e13b6d..0000000000 --- a/nptl/tst-stdio2.c +++ /dev/null @@ -1,82 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -static void *tf (void *a) -{ - puts ("start tf"); - - /* Multiple locking, implicitly or explicitly, must be possible. */ - flockfile (stdout); - - puts ("after first flockfile"); - - flockfile (stdout); - - puts ("foo"); - - funlockfile (stdout); - - puts ("after first funlockfile"); - - funlockfile (stdout); - - puts ("all done"); - - return a; -} - - -int -do_test (void) -{ - pthread_t th; - - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - write_message ("create failed\n"); - _exit (1); - } - - void *result; - if (pthread_join (th, &result) != 0) - { - puts ("join failed"); - exit (1); - } - else if (result != NULL) - { - printf ("wrong return value: %p, expected %p\n", result, NULL); - exit (1); - } - - puts ("join returned succsefully"); - - return 0; -} diff --git a/nptl/tst-sysconf.c b/nptl/tst-sysconf.c deleted file mode 100644 index 291b1465a0..0000000000 --- a/nptl/tst-sysconf.c +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <unistd.h> - - -static int -do_test (void) -{ - puts ("We expect no limits"); - /* We have no fixed limit on the number of threads. Make sure the - headers tell the right story. */ -#ifdef PTHREAD_THREADS_MAX - printf ("Header report maximum number of threads = %lu\n", - (unsigned long int) PTHREAD_THREADS_MAX); - return 1; -#else - long int r = sysconf (_SC_THREAD_THREADS_MAX); - if (r != -1) - { - printf ("sysconf(_SC_THREAD_THREADS_MAX) return %ld\n", r); - return 1; - } -#endif - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-thread_local1.cc b/nptl/tst-thread_local1.cc deleted file mode 100644 index e8249d4401..0000000000 --- a/nptl/tst-thread_local1.cc +++ /dev/null @@ -1,199 +0,0 @@ -/* Test basic thread_local support. - Copyright (C) 2015-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <string.h> - -#include <functional> -#include <string> -#include <thread> - -struct counter -{ - int constructed {}; - int destructed {}; - - void reset (); -}; - -void -counter::reset () -{ - constructed = 0; - destructed = 0; -} - -static std::string -to_string (const counter &c) -{ - char buf[128]; - snprintf (buf, sizeof (buf), "%d/%d", - c.constructed, c.destructed); - return buf; -} - -template <counter *Counter> -struct counting -{ - counting () __attribute__ ((noinline, noclone)); - ~counting () __attribute__ ((noinline, noclone)); - void operation () __attribute__ ((noinline, noclone)); -}; - -template<counter *Counter> -__attribute__ ((noinline, noclone)) -counting<Counter>::counting () -{ - ++Counter->constructed; -} - -template<counter *Counter> -__attribute__ ((noinline, noclone)) -counting<Counter>::~counting () -{ - ++Counter->destructed; -} - -template<counter *Counter> -void __attribute__ ((noinline, noclone)) -counting<Counter>::operation () -{ - // Optimization barrier. - asm (""); -} - -static counter counter_static; -static counter counter_anonymous_namespace; -static counter counter_extern; -static counter counter_function_local; -static bool errors (false); - -static std::string -all_counters () -{ - return to_string (counter_static) - + ' ' + to_string (counter_anonymous_namespace) - + ' ' + to_string (counter_extern) - + ' ' + to_string (counter_function_local); -} - -static void -check_counters (const char *name, const char *expected) -{ - std::string actual{all_counters ()}; - if (actual != expected) - { - printf ("error: %s: (%s) != (%s)\n", - name, actual.c_str (), expected); - errors = true; - } -} - -static void -reset_all () -{ - counter_static.reset (); - counter_anonymous_namespace.reset (); - counter_extern.reset (); - counter_function_local.reset (); -} - -static thread_local counting<&counter_static> counting_static; -namespace { - thread_local counting<&counter_anonymous_namespace> - counting_anonymous_namespace; -} -extern thread_local counting<&counter_extern> counting_extern; -thread_local counting<&counter_extern> counting_extern; - -static void * -thread_without_access (void *) -{ - return nullptr; -} - -static void * -thread_with_access (void *) -{ - thread_local counting<&counter_function_local> counting_function_local; - counting_function_local.operation (); - check_counters ("early in thread_with_access", "0/0 0/0 0/0 1/0"); - counting_static.operation (); - counting_anonymous_namespace.operation (); - counting_extern.operation (); - check_counters ("in thread_with_access", "1/0 1/0 1/0 1/0"); - return nullptr; -} - -static int -do_test (void) -{ - std::function<void (void *(void *))> do_pthread = - [](void *(func) (void *)) - { - pthread_t thr; - int ret = pthread_create (&thr, nullptr, func, nullptr); - if (ret != 0) - { - errno = ret; - printf ("error: pthread_create: %m\n"); - errors = true; - return; - } - ret = pthread_join (thr, nullptr); - if (ret != 0) - { - errno = ret; - printf ("error: pthread_join: %m\n"); - errors = true; - return; - } - }; - std::function<void (void *(void *))> do_std_thread = - [](void *(func) (void *)) - { - std::thread thr{[func] {func (nullptr);}}; - thr.join (); - }; - - std::array<std::pair<const char *, std::function<void (void *(void *))>>, 2> - do_thread_X - {{ - {"pthread_create", do_pthread}, - {"std::thread", do_std_thread}, - }}; - - for (auto do_thread : do_thread_X) - { - printf ("info: testing %s\n", do_thread.first); - check_counters ("initial", "0/0 0/0 0/0 0/0"); - do_thread.second (thread_without_access); - check_counters ("after thread_without_access", "0/0 0/0 0/0 0/0"); - reset_all (); - do_thread.second (thread_with_access); - check_counters ("after thread_with_access", "1/1 1/1 1/1 1/1"); - reset_all (); - } - - return errors; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-tls1.c b/nptl/tst-tls1.c deleted file mode 100644 index 12799798a2..0000000000 --- a/nptl/tst-tls1.c +++ /dev/null @@ -1,111 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - - -struct test_s -{ - int a; - int b; -}; - -#define INIT_A 1 -#define INIT_B 42 -/* Deliberately not static. */ -__thread struct test_s s __attribute__ ((tls_model ("initial-exec"))) = -{ - .a = INIT_A, - .b = INIT_B -}; - - -static void * -tf (void *arg) -{ - if (s.a != INIT_A || s.b != INIT_B) - { - puts ("initial value of s in child thread wrong"); - exit (1); - } - - ++s.a; - - return NULL; -} - - -int -do_test (void) -{ - if (s.a != INIT_A || s.b != INIT_B) - { - puts ("initial value of s in main thread wrong"); - exit (1); - } - - pthread_attr_t a; - - if (pthread_attr_init (&a) != 0) - { - puts ("attr_init failed"); - exit (1); - } - - if (pthread_attr_setstacksize (&a, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - -#define N 10 - int i; - for (i = 0; i < N; ++i) - { -#define M 10 - pthread_t th[M]; - int j; - for (j = 0; j < M; ++j, ++s.a) - if (pthread_create (&th[j], &a, tf, NULL) != 0) - { - puts ("pthread_create failed"); - exit (1); - } - - for (j = 0; j < M; ++j) - if (pthread_join (th[j], NULL) != 0) - { - puts ("pthread_join failed"); - exit (1); - } - } - - if (pthread_attr_destroy (&a) != 0) - { - puts ("attr_destroy failed"); - exit (1); - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-tls2.c b/nptl/tst-tls2.c deleted file mode 100644 index fc434a1b50..0000000000 --- a/nptl/tst-tls2.c +++ /dev/null @@ -1,206 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <semaphore.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -#define N 10 -static pthread_t th[N]; - - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -#define CB(n) \ -static void \ -cb##n (void) \ -{ \ - if (th[n] != pthread_self ()) \ - { \ - write_message ("wrong callback\n"); \ - _exit (1); \ - } \ -} -CB (0) -CB (1) -CB (2) -CB (3) -CB (4) -CB (5) -CB (6) -CB (7) -CB (8) -CB (9) -static void (*cbs[]) (void) = -{ - cb0, cb1, cb2, cb3, cb4, cb5, cb6, cb7, cb8, cb9 -}; - - -static __thread void (*fp) (void) __attribute__ ((tls_model ("local-exec"))); - - -static sem_t s; - - -#define THE_SIG SIGUSR1 -static void -handler (int sig) -{ - if (sig != THE_SIG) - { - write_message ("wrong signal\n"); - _exit (1); - } - - fp (); - - if (sem_post (&s) != 0) - { - write_message ("sem_post failed\n"); - _exit (1); - } -} - - -static pthread_barrier_t b; - -#define TOTAL_SIGS 1000 -static int nsigs; - - -static void * -tf (void *arg) -{ - fp = arg; - - pthread_barrier_wait (&b); - - pthread_barrier_wait (&b); - - if (nsigs != TOTAL_SIGS) - { - puts ("barrier_wait prematurely returns"); - exit (1); - } - - return NULL; -} - - -int -do_test (void) -{ - if (pthread_barrier_init (&b, NULL, N + 1) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - if (sem_init (&s, 0, 0) != 0) - { - puts ("sem_init failed"); - exit (1); - } - - struct sigaction sa; - sa.sa_handler = handler; - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - if (sigaction (THE_SIG, &sa, NULL) != 0) - { - puts ("sigaction failed"); - exit (1); - } - - pthread_attr_t a; - - if (pthread_attr_init (&a) != 0) - { - puts ("attr_init failed"); - exit (1); - } - - if (pthread_attr_setstacksize (&a, 1 * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - int i; - for (i = 0; i < N; ++i) - if (pthread_create (&th[i], &a, tf, cbs[i]) != 0) - { - puts ("pthread_create failed"); - exit (1); - } - - if (pthread_attr_destroy (&a) != 0) - { - puts ("attr_destroy failed"); - exit (1); - } - - pthread_barrier_wait (&b); - - sigset_t ss; - sigemptyset (&ss); - sigaddset (&ss, THE_SIG); - if (pthread_sigmask (SIG_BLOCK, &ss, NULL) != 0) - { - puts ("pthread_sigmask failed"); - exit (1); - } - - /* Start sending signals. */ - for (i = 0; i < TOTAL_SIGS; ++i) - { - if (kill (getpid (), THE_SIG) != 0) - { - puts ("kill failed"); - exit (1); - } - - if (TEMP_FAILURE_RETRY (sem_wait (&s)) != 0) - { - puts ("sem_wait failed"); - exit (1); - } - - ++nsigs; - } - - pthread_barrier_wait (&b); - - for (i = 0; i < N; ++i) - if (pthread_join (th[i], NULL) != 0) - { - puts ("join failed"); - exit (1); - } - - return 0; -} diff --git a/nptl/tst-tls3-malloc.c b/nptl/tst-tls3-malloc.c deleted file mode 100644 index 527bb1793a..0000000000 --- a/nptl/tst-tls3-malloc.c +++ /dev/null @@ -1,31 +0,0 @@ -/* Test TLS allocation with an interposed malloc. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* Reuse the test. */ -#define STACK_SIZE_MB 5 -#include "tst-tls3.c" - -/* Increase the thread stack size to 10 MiB, so that some thread - stacks are actually freed. (The stack cache size is currently - hard-wired to 40 MiB in allocatestack.c.) */ -static long stack_size_in_mb = 10; - -#include <sys/mman.h> - -#define INTERPOSE_THREADS 1 -#include "../malloc/tst-interpose-aux.c" diff --git a/nptl/tst-tls3.c b/nptl/tst-tls3.c deleted file mode 100644 index f768e88d54..0000000000 --- a/nptl/tst-tls3.c +++ /dev/null @@ -1,215 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <dlfcn.h> -#include <errno.h> -#include <pthread.h> -#include <signal.h> -#include <semaphore.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <pthreaddef.h> - -#define THE_SIG SIGUSR1 - -/* The stack size can be overriden. With a sufficiently large stack - size, thread stacks for terminated threads are freed, but this does - not happen with the default size of 1 MiB. */ -enum { default_stack_size_in_mb = 1 }; -static long stack_size_in_mb; - -#define N 10 -static pthread_t th[N]; - - -static int do_test (void); - -#define TIMEOUT 5 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" - -#define CB(n) \ -static void \ -cb##n (void) \ -{ \ - if (th[n] != pthread_self ()) \ - { \ - write_message ("wrong callback\n"); \ - _exit (1); \ - } \ -} -CB (0) -CB (1) -CB (2) -CB (3) -CB (4) -CB (5) -CB (6) -CB (7) -CB (8) -CB (9) -static void (*cbs[]) (void) = -{ - cb0, cb1, cb2, cb3, cb4, cb5, cb6, cb7, cb8, cb9 -}; - - -sem_t s; - - -pthread_barrier_t b; - -#define TOTAL_SIGS 1000 -int nsigs; - - -int -do_test (void) -{ - if (stack_size_in_mb == 0) - stack_size_in_mb = default_stack_size_in_mb; - - if ((uintptr_t) pthread_self () & (TCB_ALIGNMENT - 1)) - { - puts ("initial thread's struct pthread not aligned enough"); - exit (1); - } - - if (pthread_barrier_init (&b, NULL, N + 1) != 0) - { - puts ("barrier_init failed"); - exit (1); - } - - if (sem_init (&s, 0, 0) != 0) - { - puts ("sem_init failed"); - exit (1); - } - - void *h = dlopen ("tst-tls3mod.so", RTLD_LAZY); - if (h == NULL) - { - puts ("dlopen failed"); - exit (1); - } - - void *(*tf) (void *) = dlsym (h, "tf"); - if (tf == NULL) - { - puts ("dlsym for tf failed"); - exit (1); - } - - struct sigaction sa; - sa.sa_handler = dlsym (h, "handler"); - if (sa.sa_handler == NULL) - { - puts ("dlsym for handler failed"); - exit (1); - } - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - if (sigaction (THE_SIG, &sa, NULL) != 0) - { - puts ("sigaction failed"); - exit (1); - } - - pthread_attr_t a; - - if (pthread_attr_init (&a) != 0) - { - puts ("attr_init failed"); - exit (1); - } - - if (pthread_attr_setstacksize (&a, stack_size_in_mb * 1024 * 1024) != 0) - { - puts ("attr_setstacksize failed"); - return 1; - } - - int r; - for (r = 0; r < 10; ++r) - { - int i; - for (i = 0; i < N; ++i) - if (pthread_create (&th[i], &a, tf, cbs[i]) != 0) - { - puts ("pthread_create failed"); - exit (1); - } - - nsigs = 0; - - pthread_barrier_wait (&b); - - sigset_t ss; - sigemptyset (&ss); - sigaddset (&ss, THE_SIG); - if (pthread_sigmask (SIG_BLOCK, &ss, NULL) != 0) - { - puts ("pthread_sigmask failed"); - exit (1); - } - - /* Start sending signals. */ - for (i = 0; i < TOTAL_SIGS; ++i) - { - if (kill (getpid (), THE_SIG) != 0) - { - puts ("kill failed"); - exit (1); - } - - if (TEMP_FAILURE_RETRY (sem_wait (&s)) != 0) - { - puts ("sem_wait failed"); - exit (1); - } - - ++nsigs; - } - - pthread_barrier_wait (&b); - - if (pthread_sigmask (SIG_UNBLOCK, &ss, NULL) != 0) - { - puts ("pthread_sigmask failed"); - exit (1); - } - - for (i = 0; i < N; ++i) - if (pthread_join (th[i], NULL) != 0) - { - puts ("join failed"); - exit (1); - } - } - - if (pthread_attr_destroy (&a) != 0) - { - puts ("attr_destroy failed"); - exit (1); - } - - return 0; -} diff --git a/nptl/tst-tls3mod.c b/nptl/tst-tls3mod.c deleted file mode 100644 index 51e544bdeb..0000000000 --- a/nptl/tst-tls3mod.c +++ /dev/null @@ -1,88 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <semaphore.h> -#include <signal.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <pthreaddef.h> - - -extern pthread_barrier_t b; - -#define TOTAL_SIGS 1000 -extern int nsigs; - -extern sem_t s; - - -static __thread void (*fp) (void); - - -#define THE_SIG SIGUSR1 -void -handler (int sig) -{ - if (sig != THE_SIG) - { - write (STDOUT_FILENO, "wrong signal\n", 13); - _exit (1); - } - - fp (); - - if (sem_post (&s) != 0) - { - write (STDOUT_FILENO, "sem_post failed\n", 16); - _exit (1); - } -} - - -void * -tf (void *arg) -{ - if ((uintptr_t) pthread_self () & (TCB_ALIGNMENT - 1)) - { - puts ("thread's struct pthread not aligned enough"); - exit (1); - } - - if (fp != NULL) - { - puts ("fp not initially NULL"); - exit (1); - } - - fp = arg; - - pthread_barrier_wait (&b); - - pthread_barrier_wait (&b); - - if (nsigs != TOTAL_SIGS) - { - puts ("barrier_wait prematurely returns"); - exit (1); - } - - return NULL; -} diff --git a/nptl/tst-tls4.c b/nptl/tst-tls4.c deleted file mode 100644 index 15da980ea2..0000000000 --- a/nptl/tst-tls4.c +++ /dev/null @@ -1,181 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <dlfcn.h> -#include <errno.h> -#include <pthread.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -#define N 3 - -void (*test1) (void), (*test2) (void); - -pthread_barrier_t b2, b3; - -static void * -tf (void *arg) -{ - int i; - - for (i = 0; i <= (uintptr_t) arg; ++i) - { - int r = pthread_barrier_wait (&b3); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("tf: barrier_wait failed"); - exit (1); - } - } - - test1 (); - - for (i = 0; i < 3; ++i) - { - int r = pthread_barrier_wait (&b3); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("tf: barrier_wait failed"); - exit (1); - } - } - - test2 (); - - for (i = 0; i < 3 - (uintptr_t) arg; ++i) - { - int r = pthread_barrier_wait (&b3); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("tf: barrier_wait failed"); - exit (1); - } - } - - return NULL; -} - -static void * -tf2 (void *arg) -{ - int r = pthread_barrier_wait (&b2); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("tf2: barrier_wait failed"); - exit (1); - } - - int i; - for (i = 0; i < N; ++i) - tf (arg); - return NULL; -} - -int -do_test (void) -{ - pthread_t th[2]; - const char *modules[N] - = { "tst-tls4moda.so", "tst-tls4moda.so", "tst-tls4modb.so" }; - - if (pthread_barrier_init (&b2, NULL, 2) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - if (pthread_barrier_init (&b3, NULL, 3) != 0) - { - puts ("barrier_init failed"); - return 1; - } - - if (pthread_create (&th[0], NULL, tf2, (void *) (uintptr_t) 1)) - { - puts ("pthread_create failed"); - return 1; - } - - int r = pthread_barrier_wait (&b2); - if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD) - { - puts ("barrier_wait failed"); - return 1; - } - - int i; - for (i = 0; i < N; ++i) - { - void *h = dlopen (modules[i], RTLD_LAZY); - if (h == NULL) - { - printf ("dlopen failed %s\n", dlerror ()); - return 1; - } - - test1 = dlsym (h, "test1"); - if (test1 == NULL) - { - printf ("dlsym for test1 failed %s\n", dlerror ()); - return 1; - } - - test2 = dlsym (h, "test2"); - if (test2 == NULL) - { - printf ("dlsym for test2 failed %s\n", dlerror ()); - return 1; - } - - if (pthread_create (&th[1], NULL, tf, (void *) (uintptr_t) 2)) - { - puts ("pthread_create failed"); - return 1; - } - - tf ((void *) (uintptr_t) 0); - - if (pthread_join (th[1], NULL) != 0) - { - puts ("join failed"); - return 1; - } - - if (dlclose (h)) - { - puts ("dlclose failed"); - return 1; - } - - printf ("test %d with %s succeeded\n", i, modules[i]); - } - - if (pthread_join (th[0], NULL) != 0) - { - puts ("join failed"); - return 1; - } - - return 0; -} - -#define TIMEOUT 5 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-tls4moda.c b/nptl/tst-tls4moda.c deleted file mode 100644 index cd44f4ec98..0000000000 --- a/nptl/tst-tls4moda.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stddef.h> -#include <stdlib.h> - -static __thread unsigned char foo [32] - __attribute__ ((tls_model ("initial-exec"), aligned (sizeof (void *)))); - -void -test1 (void) -{ - size_t s; - - for (s = 0; s < sizeof (foo); ++s) - { - if (foo [s]) - abort (); - foo [s] = s; - } -} - -void -test2 (void) -{ - size_t s; - - for (s = 0; s < sizeof (foo); ++s) - { - if (foo [s] != s) - abort (); - foo [s] = sizeof (foo) - s; - } -} diff --git a/nptl/tst-tls4modb.c b/nptl/tst-tls4modb.c deleted file mode 100644 index a0b1f623cb..0000000000 --- a/nptl/tst-tls4modb.c +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stddef.h> -#include <stdlib.h> - -static int i; -int bar; - -static __thread void *foo [32 / sizeof (void *)] - __attribute__ ((tls_model ("initial-exec"), aligned (sizeof (void *)))) - = { &i, &bar }; - -void -test1 (void) -{ - size_t s; - - if (foo [0] != &i || foo [1] != &bar) - abort (); - - foo [0] = NULL; - foo [1] = NULL; - for (s = 0; s < sizeof (foo) / sizeof (void *); ++s) - { - if (foo [s]) - abort (); - foo [s] = &foo[s]; - } -} - -void -test2 (void) -{ - size_t s; - - for (s = 0; s < sizeof (foo) / sizeof (void *); ++s) - { - if (foo [s] != &foo [s]) - abort (); - foo [s] = &foo [s ^ 1]; - } -} diff --git a/nptl/tst-tls5.c b/nptl/tst-tls5.c deleted file mode 100644 index 0d94ec4d93..0000000000 --- a/nptl/tst-tls5.c +++ /dev/null @@ -1,119 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* Check alignment, overlapping and layout of TLS variables. */ -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <pthread.h> -#include <pthreadP.h> -#include <sys/param.h> - -#include "tst-tls5.h" - -#ifdef TLS_REGISTER - -struct tls_obj tls_registry[64]; - -static int -tls_addr_cmp (const void *a, const void *b) -{ - if (((struct tls_obj *)a)->addr < ((struct tls_obj *)b)->addr) - return -1; - if (((struct tls_obj *)a)->addr > ((struct tls_obj *)b)->addr) - return 1; - return 0; -} - -static int -do_test (void) -{ - size_t cnt, i; - int res = 0; - uintptr_t min_addr = ~(uintptr_t) 0, max_addr = 0; - - for (cnt = 0; tls_registry[cnt].name; ++cnt); - tls_registry[cnt].name = NULL; - tls_registry[cnt].addr = (uintptr_t) pthread_self (); - tls_registry[cnt].size = sizeof (struct pthread); - tls_registry[cnt++].align = __alignof__ (struct pthread); - - qsort (tls_registry, cnt, sizeof (struct tls_obj), tls_addr_cmp); - - for (i = 0; i < cnt; ++i) - { - printf ("%s%s = %p, size %zd, align %zd", - tls_registry[i].name ? "&" : "", - tls_registry[i].name ?: "pthread_self ()", - (void *) tls_registry[i].addr, - tls_registry[i].size, tls_registry[i].align); - if (tls_registry[i].addr & (tls_registry[i].align - 1)) - { - fputs (", WRONG ALIGNMENT", stdout); - res = 1; - } - if (i > 0 - && (tls_registry[i - 1].addr + tls_registry[i - 1].size - > tls_registry[i].addr)) - { - fputs (", ADDRESS OVERLAP", stdout); - res = 1; - } - puts (""); - if (tls_registry[i].name) - { - min_addr = MIN (tls_registry[i].addr, min_addr); - max_addr = MAX (tls_registry[i].addr + tls_registry[i].size, - max_addr); - } - } - - if (cnt > 1) - { -#if TLS_TCB_AT_TP - if (tls_registry[cnt - 1].name) - { - puts ("pthread_self () not larger than all TLS addresses"); - res = 1; - } - else - max_addr = MAX (tls_registry[cnt - 1].addr, max_addr); -#elif TLS_DTV_AT_TP - if (tls_registry[0].name) - { - puts ("pthread_self () not smaller than all TLS addresses"); - res = 1; - } -#else - abort (); -#endif - printf ("Initial TLS used block size %zd\n", - (size_t) (max_addr - min_addr)); - } - return res; -} - -#define TEST_FUNCTION do_test () - -#else - -#define TEST_FUNCTION 0 - -#endif - -#include "../test-skeleton.c" diff --git a/nptl/tst-tls5.h b/nptl/tst-tls5.h deleted file mode 100644 index 6c2e1b0d09..0000000000 --- a/nptl/tst-tls5.h +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdint.h> -#include <stddef.h> - -struct tls_obj -{ - const char *name; - uintptr_t addr; - size_t size; - size_t align; -}; -extern struct tls_obj tls_registry[]; - -#define TLS_REGISTER(x) \ -static void __attribute__((constructor)) \ -tls_register_##x (void) \ -{ \ - size_t i; \ - for (i = 0; tls_registry[i].name; ++i); \ - tls_registry[i].name = #x; \ - tls_registry[i].addr = (uintptr_t) &x; \ - tls_registry[i].size = sizeof (x); \ - tls_registry[i].align = __alignof__ (x); \ -} diff --git a/nptl/tst-tls5mod.c b/nptl/tst-tls5mod.c deleted file mode 100644 index b308bd60e1..0000000000 --- a/nptl/tst-tls5mod.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <tst-tls5.h> - -#ifdef TLS_REGISTER -/* Ensure tls_registry is exported from the binary. */ -void *tst_tls5mod attribute_hidden = tls_registry; -#endif diff --git a/nptl/tst-tls5moda.c b/nptl/tst-tls5moda.c deleted file mode 100644 index a035c96cdb..0000000000 --- a/nptl/tst-tls5moda.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <tst-tls5.h> - -#ifdef TLS_REGISTER -static __thread char a [32] __attribute__ ((aligned (64))); -TLS_REGISTER (a) -#endif diff --git a/nptl/tst-tls5modb.c b/nptl/tst-tls5modb.c deleted file mode 100644 index 848a803630..0000000000 --- a/nptl/tst-tls5modb.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <tst-tls5.h> - -#ifdef TLS_REGISTER -static __thread int b; -TLS_REGISTER (b) -#endif diff --git a/nptl/tst-tls5modc.c b/nptl/tst-tls5modc.c deleted file mode 100644 index d63ceff8d0..0000000000 --- a/nptl/tst-tls5modc.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <tst-tls5.h> - -#ifdef TLS_REGISTER -static __thread int c; -TLS_REGISTER (c) -#endif diff --git a/nptl/tst-tls5modd.c b/nptl/tst-tls5modd.c deleted file mode 100644 index 202a66a15a..0000000000 --- a/nptl/tst-tls5modd.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <tst-tls5.h> - -#ifdef TLS_REGISTER -static __thread int d; -TLS_REGISTER (d) -#endif diff --git a/nptl/tst-tls5mode.c b/nptl/tst-tls5mode.c deleted file mode 100644 index 3e53ee1a6e..0000000000 --- a/nptl/tst-tls5mode.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <tst-tls5.h> - -#ifdef TLS_REGISTER -static __thread int e1 = 24; -static __thread char e2 [32] __attribute__ ((aligned (64))); -TLS_REGISTER (e1) -TLS_REGISTER (e2) -#endif diff --git a/nptl/tst-tls5modf.c b/nptl/tst-tls5modf.c deleted file mode 100644 index 8e50962de7..0000000000 --- a/nptl/tst-tls5modf.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <tst-tls5.h> - -#ifdef TLS_REGISTER -char tst_tls5modf[60] attribute_hidden = { 26 }; -static __thread int f1 = 24; -static __thread char f2 [32] __attribute__ ((aligned (64))); -TLS_REGISTER (f1) -TLS_REGISTER (f2) -#endif diff --git a/nptl/tst-tls6.sh b/nptl/tst-tls6.sh deleted file mode 100755 index fde169f7b3..0000000000 --- a/nptl/tst-tls6.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/bash -# A tls test. -# Copyright (C) 2003-2017 Free Software Foundation, Inc. -# This file is part of the GNU C Library. - -# The GNU C Library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. - -# The GNU C Library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. - -# You should have received a copy of the GNU Lesser General Public -# License along with the GNU C Library; if not, see -# <http://www.gnu.org/licenses/>. - -set -e - -common_objpfx=$1; shift -test_via_rtld_prefix=$1; shift -test_wrapper_env=$1; shift -run_program_env=$1; shift -logfile=$common_objpfx/nptl/tst-tls6.out - -# We have to find libc and nptl -library_path=${common_objpfx}:${common_objpfx}nptl -tst_tls5="${test_via_rtld_prefix} ${common_objpfx}/nptl/tst-tls5" - -> $logfile -fail=0 - -for aligned in a e f; do - echo "preload tst-tls5mod{$aligned,b,c,d}.so" >> $logfile - echo "===============" >> $logfile - ${test_wrapper_env} \ - ${run_program_env} \ - LD_PRELOAD="`echo ${common_objpfx}nptl/tst-tls5mod{$aligned,b,c,d}.so \ - | sed 's/:$//;s/: /:/g'`" ${tst_tls5} >> $logfile || fail=1 - echo >> $logfile - - echo "preload tst-tls5mod{b,$aligned,c,d}.so" >> $logfile - echo "===============" >> $logfile - ${test_wrapper_env} \ - ${run_program_env} \ - LD_PRELOAD="`echo ${common_objpfx}nptl/tst-tls5mod{b,$aligned,c,d}.so \ - | sed 's/:$//;s/: /:/g'`" ${tst_tls5} >> $logfile || fail=1 - echo >> $logfile - - echo "preload tst-tls5mod{b,c,d,$aligned}.so" >> $logfile - echo "===============" >> $logfile - ${test_wrapper_env} \ - ${run_program_env} \ - LD_PRELOAD="`echo ${common_objpfx}nptl/tst-tls5mod{b,c,d,$aligned}.so \ - | sed 's/:$//;s/: /:/g'`" ${tst_tls5} >> $logfile || fail=1 - echo >> $logfile -done - -echo "preload tst-tls5mod{d,a,b,c,e}" >> $logfile -echo "===============" >> $logfile -${test_wrapper_env} \ -${run_program_env} \ -LD_PRELOAD="`echo ${common_objpfx}nptl/tst-tls5mod{d,a,b,c,e}.so \ - | sed 's/:$//;s/: /:/g'`" ${tst_tls5} >> $logfile || fail=1 -echo >> $logfile - -echo "preload tst-tls5mod{d,a,b,e,f}" >> $logfile -echo "===============" >> $logfile -${test_wrapper_env} \ -${run_program_env} \ -LD_PRELOAD="`echo ${common_objpfx}nptl/tst-tls5mod{d,a,b,e,f}.so \ - | sed 's/:$//;s/: /:/g'`" ${tst_tls5} >> $logfile || fail=1 -echo >> $logfile - -exit $fail diff --git a/nptl/tst-tpp.h b/nptl/tst-tpp.h deleted file mode 100644 index 708bcb7e0d..0000000000 --- a/nptl/tst-tpp.h +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright (C) 2006-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2006. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include <sched.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/syscall.h> - -/* This test is Linux specific. */ -#define CHECK_TPP_PRIORITY(normal, boosted) \ - do \ - { \ - pid_t tid = syscall (__NR_gettid); \ - \ - struct sched_param cep_sp; \ - int cep_policy; \ - if (pthread_getschedparam (pthread_self (), &cep_policy, \ - &cep_sp) != 0) \ - { \ - puts ("getschedparam failed"); \ - ret = 1; \ - } \ - else if (cep_sp.sched_priority != (normal)) \ - { \ - printf ("unexpected priority %d != %d\n", \ - cep_sp.sched_priority, (normal)); \ - } \ - if (syscall (__NR_sched_getparam, tid, &cep_sp) == 0 \ - && cep_sp.sched_priority != (boosted)) \ - { \ - printf ("unexpected boosted priority %d != %d\n", \ - cep_sp.sched_priority, (boosted)); \ - ret = 1; \ - } \ - } \ - while (0) - -int fifo_min, fifo_max; - -void -init_tpp_test (void) -{ - fifo_min = sched_get_priority_min (SCHED_FIFO); - if (fifo_min < 0) - { - printf ("couldn't get min priority for SCHED_FIFO: %m\n"); - exit (1); - } - - fifo_max = sched_get_priority_max (SCHED_FIFO); - if (fifo_max < 0) - { - printf ("couldn't get max priority for SCHED_FIFO: %m\n"); - exit (1); - } - - if (fifo_min > 4 || fifo_max < 10) - { - printf ("%d..%d SCHED_FIFO priority interval not suitable for this test\n", - fifo_min, fifo_max); - exit (0); - } - - struct sched_param sp; - memset (&sp, 0, sizeof (sp)); - sp.sched_priority = 4; - int e = pthread_setschedparam (pthread_self (), SCHED_FIFO, &sp); - if (e != 0) - { - errno = e; - printf ("cannot set scheduling params: %m\n"); - exit (0); - } -} diff --git a/nptl/tst-tsd1.c b/nptl/tst-tsd1.c deleted file mode 100644 index 0c870473bc..0000000000 --- a/nptl/tst-tsd1.c +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <string.h> - - -static int -do_test (void) -{ - pthread_key_t key1; - pthread_key_t key2; - void *value; - int result = 0; - int err; - - err = pthread_key_create (&key1, NULL); - if (err != 0) - { - printf ("1st key_create failed: %s\n", strerror (err)); - return 1; - } - - /* Initial value must be NULL. */ - value = pthread_getspecific (key1); - if (value != NULL) - { - puts ("1st getspecific != NULL"); - result = 1; - } - - err = pthread_setspecific (key1, (void *) -2l); - if (err != 0) - { - printf ("1st setspecific failed: %s\n", strerror (err)); - return 1; - } - - value = pthread_getspecific (key1); - if (value == NULL) - { - puts ("2nd getspecific == NULL\n"); - result = 1; - } - else if (value != (void *) -2l) - { - puts ("2nd getspecific != -2l\n"); - result = 1; - } - - err = pthread_setspecific (key1, (void *) -3l); - if (err != 0) - { - printf ("2nd setspecific failed: %s\n", strerror (err)); - return 1; - } - - value = pthread_getspecific (key1); - if (value == NULL) - { - puts ("3rd getspecific == NULL\n"); - result = 1; - } - else if (value != (void *) -3l) - { - puts ("3rd getspecific != -2l\n"); - result = 1; - } - - err = pthread_key_delete (key1); - if (err != 0) - { - printf ("key_delete failed: %s\n", strerror (err)); - result = 1; - } - - - err = pthread_key_create (&key2, NULL); - if (err != 0) - { - printf ("2nd key_create failed: %s\n", strerror (err)); - return 1; - } - - if (key1 != key2) - puts ("key1 != key2; no more tests performed"); - else - { - value = pthread_getspecific (key2); - if (value != NULL) - { - puts ("4th getspecific != NULL"); - result = 1; - } - } - - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-tsd2.c b/nptl/tst-tsd2.c deleted file mode 100644 index 14e8e1c7ce..0000000000 --- a/nptl/tst-tsd2.c +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <string.h> - - -static int result; - - -static void -destr (void *arg) -{ - if (arg != (void *) -2l) - result = 2; - else - result = 0; -} - - -static void * -tf (void *arg) -{ - pthread_key_t key = (pthread_key_t) (long int) arg; - int err; - - err = pthread_setspecific (key, (void *) -2l); - if (err != 0) - result = 3; - - return NULL; -} - - -static int -do_test (void) -{ - pthread_key_t key; - pthread_t th; - int err; - - err = pthread_key_create (&key, destr); - if (err != 0) - { - printf ("key_create failed: %s\n", strerror (err)); - return 1; - } - - result = 1; - - err = pthread_create (&th, NULL, tf, (void *) (long int) key); - if (err != 0) - { - printf ("create failed: %s\n", strerror (err)); - return 1; - } - - /* Wait for the thread to terminate. */ - err = pthread_join (th, NULL); - if (err != 0) - { - printf ("join failed: %s\n", strerror (err)); - return 1; - } - - if (result == 1) - puts ("destructor not called"); - else if (result == 2) - puts ("destructor got passed a wrong value"); - else if (result == 3) - puts ("setspecific in child failed"); - else if (result != 0) - puts ("result != 0"); - - return result; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-tsd3.c b/nptl/tst-tsd3.c deleted file mode 100644 index 1b15432c8c..0000000000 --- a/nptl/tst-tsd3.c +++ /dev/null @@ -1,128 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <limits.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static pthread_key_t key1; -static pthread_key_t key2; - - -static int left; - - -static void -destr1 (void *arg) -{ - if (--left > 0) - { - puts ("set key2"); - - if (pthread_setspecific (key2, (void *) 1l) != 0) - { - puts ("destr1: setspecific failed"); - exit (1); - } - } -} - - -static void -destr2 (void *arg) -{ - if (--left > 0) - { - puts ("set key1"); - - if (pthread_setspecific (key1, (void *) 1l) != 0) - { - puts ("destr2: setspecific failed"); - exit (1); - } - } -} - - -static void * -tf (void *arg) -{ - /* Let the destructors work. */ - left = 7; - - if (pthread_setspecific (key1, (void *) 1l) != 0 - || pthread_setspecific (key2, (void *) 1l) != 0) - { - puts ("tf: setspecific failed"); - exit (1); - } - - return NULL; -} - - -static int -do_test (void) -{ - /* Allocate two keys, both with destructors. */ - if (pthread_key_create (&key1, destr1) != 0 - || pthread_key_create (&key2, destr2) != 0) - { - puts ("key_create failed"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - if (pthread_join (th, NULL) != 0) - { - puts ("join failed"); - return 1; - } - - if (left != 0) - { - printf ("left == %d\n", left); - return 1; - } - - if (pthread_getspecific (key1) != NULL) - { - puts ("key1 data != NULL"); - return 1; - } - if (pthread_getspecific (key2) != NULL) - { - puts ("key2 data != NULL"); - return 1; - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-tsd4.c b/nptl/tst-tsd4.c deleted file mode 100644 index 2423ab3dbc..0000000000 --- a/nptl/tst-tsd4.c +++ /dev/null @@ -1,102 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <limits.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - - -static pthread_key_t key; - - -static int rounds; - - -static void -destr (void *arg) -{ - ++rounds; - - if (pthread_setspecific (key, (void *) 1l) != 0) - { - puts ("destr: setspecific failed"); - exit (1); - } -} - - -static void * -tf (void *arg) -{ - if (pthread_setspecific (key, (void *) 1l) != 0) - { - puts ("tf: setspecific failed"); - exit (1); - } - - return NULL; -} - - -/* This test check non-standard behavior. The standard does not - require that the implementation has to stop calling TSD destructors - when they are set over and over again. But NPTL does. */ -static int -do_test (void) -{ - /* Allocate two keys, both with destructors. */ - if (pthread_key_create (&key, destr) != 0) - { - puts ("key_create failed"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - if (pthread_join (th, NULL) != 0) - { - puts ("join failed"); - return 1; - } - - if (rounds < PTHREAD_DESTRUCTOR_ITERATIONS) - { - printf ("rounds == %d, PTHREAD_DESTRUCTOR_ITERATIONS = %d\n", - rounds, PTHREAD_DESTRUCTOR_ITERATIONS); - return 1; - } - - if (pthread_getspecific (key) != NULL) - { - puts ("key data != NULL"); - return 1; - } - - return 0; -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-tsd5.c b/nptl/tst-tsd5.c deleted file mode 100644 index 7eae4c38a3..0000000000 --- a/nptl/tst-tsd5.c +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright (C) 2004-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> - - -static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; - - -static void -cl (void *p) -{ - pthread_mutex_unlock (&m); -} - - -static void * -tf (void *arg) -{ - if (pthread_mutex_lock (&m) != 0) - { - puts ("2nd mutex_lock failed"); - exit (1); - } - - exit (0); -} - - -static int -do_test (void) -{ - pthread_key_t k; - if (pthread_key_create (&k, cl) != 0) - { - puts ("key_create failed"); - return 1; - } - if (pthread_setspecific (k, (void *) 1) != 0) - { - puts ("setspecific failed"); - return 1; - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("1st mutex_lock failed"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("create failed"); - return 1; - } - - pthread_exit (NULL); -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-tsd6.c b/nptl/tst-tsd6.c deleted file mode 100644 index debb1dd367..0000000000 --- a/nptl/tst-tsd6.c +++ /dev/null @@ -1,89 +0,0 @@ -#include <errno.h> -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/wait.h> - -#define NKEYS 100 -static pthread_key_t keys[NKEYS]; -static pthread_barrier_t b; - - -static void * -tf (void *arg) -{ - void *res = NULL; - for (int i = 0; i < NKEYS; ++i) - { - void *p = pthread_getspecific (keys[i]); - pthread_setspecific (keys[i], (void *) 7); - if (p != NULL) - res = p; - } - if (arg != NULL) - { - pthread_barrier_wait (arg); - pthread_barrier_wait (arg); - } - return res; -} - - -static int -do_test (void) -{ - pthread_barrier_init (&b, NULL, 2); - - for (int i = 0; i < NKEYS; ++i) - if (pthread_key_create (&keys[i], NULL) != 0) - { - puts ("cannot create keys"); - return 1; - } - - pthread_t th; - if (pthread_create (&th, NULL, tf, &b) != 0) - { - puts ("cannot create thread in parent"); - return 1; - } - - pthread_barrier_wait (&b); - - pid_t pid = fork (); - if (pid == 0) - { - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("cannot create thread in child"); - exit (1); - } - - void *res; - pthread_join (th, &res); - - exit (res != NULL); - } - else if (pid == -1) - { - puts ("cannot create child process"); - return 1; - } - - int s; - if (TEMP_FAILURE_RETRY (waitpid (pid, &s, 0)) != pid) - { - puts ("failing to wait for child process"); - return 1; - } - - pthread_barrier_wait (&b); - pthread_join (th, NULL); - - return !WIFEXITED (s) ? 2 : WEXITSTATUS (s); -} - - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-typesizes.c b/nptl/tst-typesizes.c deleted file mode 100644 index 78ed7738b6..0000000000 --- a/nptl/tst-typesizes.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Copyright (C) 2005-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2005. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <pthreadP.h> -#include <semaphore.h> - -static const struct -{ - const char *name; - size_t expected; - size_t is; -} types[] = - { -#define T(t, c) \ - { #t, c, sizeof (t) } - T (pthread_attr_t, __SIZEOF_PTHREAD_ATTR_T), - T (pthread_mutex_t, __SIZEOF_PTHREAD_MUTEX_T), - T (pthread_mutexattr_t, __SIZEOF_PTHREAD_MUTEXATTR_T), - T (pthread_cond_t, __SIZEOF_PTHREAD_COND_T), - T (pthread_condattr_t, __SIZEOF_PTHREAD_CONDATTR_T), - T (pthread_rwlock_t, __SIZEOF_PTHREAD_RWLOCK_T), - T (pthread_rwlockattr_t, __SIZEOF_PTHREAD_RWLOCKATTR_T), - T (pthread_barrier_t, __SIZEOF_PTHREAD_BARRIER_T), - T (pthread_barrierattr_t, __SIZEOF_PTHREAD_BARRIERATTR_T) - }; - -static int -do_test (void) -{ - int result = 0; - -#define TEST_TYPE(name) \ - printf ("%s: ", #name); \ - if (sizeof (name) != sizeof (((name *) 0)->__size)) \ - { \ - printf ("expected %zu, is %zu\n", \ - sizeof (((name *) 0)->__size), sizeof (name)); \ - result = 1; \ - } \ - else \ - puts ("OK") - - TEST_TYPE (pthread_mutex_t); - TEST_TYPE (pthread_cond_t); - TEST_TYPE (pthread_rwlock_t); - -#define TEST_TYPE2(name, internal) \ - printf ("%s: ", #name); \ - if (sizeof (((name *) 0)->__size) < sizeof (internal)) \ - { \ - printf ("expected %zu, is %zu\n", \ - sizeof (((name *) 0)->__size), sizeof (internal)); \ - result = 1; \ - } \ - else \ - puts ("OK") - - TEST_TYPE2 (pthread_attr_t, struct pthread_attr); - TEST_TYPE2 (pthread_mutexattr_t, struct pthread_mutexattr); - TEST_TYPE2 (pthread_condattr_t, struct pthread_condattr); - TEST_TYPE2 (pthread_rwlockattr_t, struct pthread_rwlockattr); - TEST_TYPE2 (pthread_barrier_t, struct pthread_barrier); - TEST_TYPE2 (pthread_barrierattr_t, struct pthread_barrierattr); - TEST_TYPE2 (sem_t, struct new_sem); - TEST_TYPE2 (sem_t, struct old_sem); - - for (size_t i = 0; i < sizeof (types) / sizeof (types[0]); ++i) - if (types[i].expected != types[i].is) - { - printf ("%s: expected %zu, is %zu\n", - types[i].name, types[i].expected, types[i].is); - result = 1; - } - - return result; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-umask1.c b/nptl/tst-umask1.c deleted file mode 100644 index 074717f060..0000000000 --- a/nptl/tst-umask1.c +++ /dev/null @@ -1,136 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <fcntl.h> -#include <pthread.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/stat.h> - - -static struct -{ - int (*fp) (const char *, mode_t); - const char *name; - bool is_fd; -} fcts[] = -{ - { creat, "creat", true }, - { mkdir, "mkdir", false }, - { mkfifo, "mkfifo", false }, -}; -#define nfcts (sizeof (fcts) / sizeof (fcts[0])) - - -static int -work (const char *fname, int mask) -{ - int result = 0; - size_t i; - for (i = 0; i < nfcts; ++i) - { - remove (fname); - int fd = fcts[i].fp (fname, 0777); - if (fd == -1) - { - printf ("cannot %s %s: %m\n", fcts[i].name, fname); - exit (1); - } - if (fcts[i].is_fd) - close (fd); - struct stat64 st; - if (stat64 (fname, &st) == -1) - { - printf ("cannot stat %s after %s: %m\n", fname, fcts[i].name); - exit (1); - } - - if ((st.st_mode & mask) != 0) - { - printf ("mask not successful after %s: %x still set\n", - fcts[i].name, (unsigned int) (st.st_mode & mask)); - result = 1; - } - } - - return result; -} - - -static pthread_barrier_t bar; - - -static void * -tf (void *arg) -{ - pthread_barrier_wait (&bar); - - int result = work (arg, 022); - - pthread_barrier_wait (&bar); - - pthread_barrier_wait (&bar); - - return (work (arg, 0) | result) ? (void *) -1l : NULL; -} - - -static int -do_test (const char *fname) -{ - int result = 0; - - umask (0); - result |= work (fname, 0); - - pthread_barrier_init (&bar, NULL, 2); - - pthread_t th; - if (pthread_create (&th, NULL, tf, (void *) fname) != 0) - { - puts ("cannot create thread"); - exit (1); - } - - umask (022); - result |= work (fname, 022); - - pthread_barrier_wait (&bar); - - pthread_barrier_wait (&bar); - - umask (0); - - pthread_barrier_wait (&bar); - - void *res; - if (pthread_join (th, &res) != 0) - { - puts ("join failed"); - exit (1); - } - - remove (fname); - - return result || res != NULL; -} - -#define TEST_FUNCTION do_test (argc < 2 ? "/tmp/tst-umask.tmp" : argv[1]) -#include "../test-skeleton.c" diff --git a/nptl/tst-unload.c b/nptl/tst-unload.c deleted file mode 100644 index bf13026e39..0000000000 --- a/nptl/tst-unload.c +++ /dev/null @@ -1,47 +0,0 @@ -/* Tests for non-unloading of libpthread. - Copyright (C) 2000-2017 Free Software Foundation, Inc. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2000. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#include <dlfcn.h> -#include <stdio.h> -#include <stdlib.h> -#include <gnu/lib-names.h> - -static int -do_test (void) -{ - void *p = dlopen (LIBPTHREAD_SO, RTLD_LAZY); - - if (p == NULL) - { - puts ("failed to load " LIBPTHREAD_SO); - return 1; - } - - if (dlclose (p) != 0) - { - puts ("dlclose (" LIBPTHREAD_SO ") failed"); - return 1; - } - - puts ("seems to work"); - - return 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/nptl/tst-vfork1.c b/nptl/tst-vfork1.c deleted file mode 100644 index f409ec49b3..0000000000 --- a/nptl/tst-vfork1.c +++ /dev/null @@ -1 +0,0 @@ -#include <posix/tst-vfork1.c> diff --git a/nptl/tst-vfork1x.c b/nptl/tst-vfork1x.c deleted file mode 100644 index f409ec49b3..0000000000 --- a/nptl/tst-vfork1x.c +++ /dev/null @@ -1 +0,0 @@ -#include <posix/tst-vfork1.c> diff --git a/nptl/tst-vfork2.c b/nptl/tst-vfork2.c deleted file mode 100644 index 5356e83115..0000000000 --- a/nptl/tst-vfork2.c +++ /dev/null @@ -1 +0,0 @@ -#include <posix/tst-vfork2.c> diff --git a/nptl/tst-vfork2x.c b/nptl/tst-vfork2x.c deleted file mode 100644 index 5356e83115..0000000000 --- a/nptl/tst-vfork2x.c +++ /dev/null @@ -1 +0,0 @@ -#include <posix/tst-vfork2.c> diff --git a/nptl/unregister-atfork.c b/nptl/unregister-atfork.c deleted file mode 100644 index 1eb11d60c6..0000000000 --- a/nptl/unregister-atfork.c +++ /dev/null @@ -1,121 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdlib.h> -#include <fork.h> -#include <atomic.h> -#include <futex-internal.h> - - -void -__unregister_atfork (void *dso_handle) -{ - /* Check whether there is any entry in the list which we have to - remove. It is likely that this is not the case so don't bother - getting the lock. - - We do not worry about other threads adding entries for this DSO - right this moment. If this happens this is a race and we can do - whatever we please. The program will crash anyway seen. */ - struct fork_handler *runp = __fork_handlers; - struct fork_handler *lastp = NULL; - - while (runp != NULL) - if (runp->dso_handle == dso_handle) - break; - else - { - lastp = runp; - runp = runp->next; - } - - if (runp == NULL) - /* Nothing to do. */ - return; - - /* Get the lock to not conflict with additions or deletions. Note - that there couldn't have been another thread deleting something. - The __unregister_atfork function is only called from the - dlclose() code which itself serializes the operations. */ - lll_lock (__fork_lock, LLL_PRIVATE); - - /* We have to create a new list with all the entries we don't remove. */ - struct deleted_handler - { - struct fork_handler *handler; - struct deleted_handler *next; - } *deleted = NULL; - - /* Remove the entries for the DSO which is unloaded from the list. - It's a single linked list so readers are. */ - do - { - again: - if (runp->dso_handle == dso_handle) - { - if (lastp == NULL) - { - /* We have to use an atomic operation here because - __linkin_atfork also uses one. */ - if (catomic_compare_and_exchange_bool_acq (&__fork_handlers, - runp->next, runp) - != 0) - { - runp = __fork_handlers; - goto again; - } - } - else - lastp->next = runp->next; - - /* We cannot overwrite the ->next element now. Put the deleted - entries in a separate list. */ - struct deleted_handler *newp = alloca (sizeof (*newp)); - newp->handler = runp; - newp->next = deleted; - deleted = newp; - } - else - lastp = runp; - - runp = runp->next; - } - while (runp != NULL); - - /* Release the lock. */ - lll_unlock (__fork_lock, LLL_PRIVATE); - - /* Walk the list of all entries which have to be deleted. */ - while (deleted != NULL) - { - /* We need to be informed by possible current users. */ - deleted->handler->need_signal = 1; - /* Make sure this gets written out first. */ - atomic_write_barrier (); - - /* Decrement the reference counter. If it does not reach zero - wait for the last user. */ - atomic_decrement (&deleted->handler->refcntr); - unsigned int val; - while ((val = deleted->handler->refcntr) != 0) - futex_wait_simple (&deleted->handler->refcntr, val, FUTEX_PRIVATE); - - deleted = deleted->next; - } -} diff --git a/nptl/unwind.c b/nptl/unwind.c deleted file mode 100644 index db3108ff64..0000000000 --- a/nptl/unwind.c +++ /dev/null @@ -1,138 +0,0 @@ -/* Copyright (C) 2003-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com> - and Richard Henderson <rth@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <setjmp.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include "pthreadP.h" -#include <jmpbuf-unwind.h> - -#ifdef _STACK_GROWS_DOWN -# define FRAME_LEFT(frame, other, adj) \ - ((uintptr_t) frame - adj >= (uintptr_t) other - adj) -#elif _STACK_GROWS_UP -# define FRAME_LEFT(frame, other, adj) \ - ((uintptr_t) frame - adj <= (uintptr_t) other - adj) -#else -# error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP" -#endif - -static _Unwind_Reason_Code -unwind_stop (int version, _Unwind_Action actions, - _Unwind_Exception_Class exc_class, - struct _Unwind_Exception *exc_obj, - struct _Unwind_Context *context, void *stop_parameter) -{ - struct pthread_unwind_buf *buf = stop_parameter; - struct pthread *self = THREAD_SELF; - struct _pthread_cleanup_buffer *curp = THREAD_GETMEM (self, cleanup); - int do_longjump = 0; - - /* Adjust all pointers used in comparisons, so that top of thread's - stack is at the top of address space. Without that, things break - if stack is allocated above the main stack. */ - uintptr_t adj = (uintptr_t) self->stackblock + self->stackblock_size; - - /* Do longjmp if we're at "end of stack", aka "end of unwind data". - We assume there are only C frame without unwind data in between - here and the jmp_buf target. Otherwise simply note that the CFA - of a function is NOT within it's stack frame; it's the SP of the - previous frame. */ - if ((actions & _UA_END_OF_STACK) - || ! _JMPBUF_CFA_UNWINDS_ADJ (buf->cancel_jmp_buf[0].jmp_buf, context, - adj)) - do_longjump = 1; - - if (__glibc_unlikely (curp != NULL)) - { - /* Handle the compatibility stuff. Execute all handlers - registered with the old method which would be unwound by this - step. */ - struct _pthread_cleanup_buffer *oldp = buf->priv.data.cleanup; - void *cfa = (void *) (_Unwind_Ptr) _Unwind_GetCFA (context); - - if (curp != oldp && (do_longjump || FRAME_LEFT (cfa, curp, adj))) - { - do - { - /* Pointer to the next element. */ - struct _pthread_cleanup_buffer *nextp = curp->__prev; - - /* Call the handler. */ - curp->__routine (curp->__arg); - - /* To the next. */ - curp = nextp; - } - while (curp != oldp - && (do_longjump || FRAME_LEFT (cfa, curp, adj))); - - /* Mark the current element as handled. */ - THREAD_SETMEM (self, cleanup, curp); - } - } - - if (do_longjump) - __libc_unwind_longjmp ((struct __jmp_buf_tag *) buf->cancel_jmp_buf, 1); - - return _URC_NO_REASON; -} - - -static void -unwind_cleanup (_Unwind_Reason_Code reason, struct _Unwind_Exception *exc) -{ - /* When we get here a C++ catch block didn't rethrow the object. We - cannot handle this case and therefore abort. */ - __libc_fatal ("FATAL: exception not rethrown\n"); -} - - -void -__cleanup_fct_attribute __attribute ((noreturn)) -__pthread_unwind (__pthread_unwind_buf_t *buf) -{ - struct pthread_unwind_buf *ibuf = (struct pthread_unwind_buf *) buf; - struct pthread *self = THREAD_SELF; - - /* This is not a catchable exception, so don't provide any details about - the exception type. We do need to initialize the field though. */ - THREAD_SETMEM (self, exc.exception_class, 0); - THREAD_SETMEM (self, exc.exception_cleanup, &unwind_cleanup); - - _Unwind_ForcedUnwind (&self->exc, unwind_stop, ibuf); - /* NOTREACHED */ - - /* We better do not get here. */ - abort (); -} -hidden_def (__pthread_unwind) - - -void -__cleanup_fct_attribute __attribute ((noreturn)) -__pthread_unwind_next (__pthread_unwind_buf_t *buf) -{ - struct pthread_unwind_buf *ibuf = (struct pthread_unwind_buf *) buf; - - __pthread_unwind ((__pthread_unwind_buf_t *) ibuf->priv.data.prev); -} -hidden_def (__pthread_unwind_next) diff --git a/nptl/unwindbuf.sym b/nptl/unwindbuf.sym deleted file mode 100644 index 8044b4078c..0000000000 --- a/nptl/unwindbuf.sym +++ /dev/null @@ -1,7 +0,0 @@ -#include <pthread.h> -#include <stddef.h> - --- - -UNWINDBUFSIZE sizeof (__pthread_unwind_buf_t) -UWJMPBUF offsetof (__pthread_unwind_buf_t, __cancel_jmp_buf) diff --git a/nptl/vars.c b/nptl/vars.c deleted file mode 100644 index 198f463404..0000000000 --- a/nptl/vars.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (C) 2004-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <pthreadP.h> -#include <stdlib.h> -#include <tls.h> -#include <unistd.h> - -/* Default thread attributes for the case when the user does not - provide any. */ -struct pthread_attr __default_pthread_attr attribute_hidden; - -/* Mutex protecting __default_pthread_attr. */ -int __default_pthread_attr_lock = LLL_LOCK_INITIALIZER; - -/* Flag whether the machine is SMP or not. */ -int __is_smp attribute_hidden; - -#ifndef TLS_MULTIPLE_THREADS_IN_TCB -/* Variable set to a nonzero value either if more than one thread runs or ran, - or if a single-threaded process is trying to cancel itself. See - nptl/descr.h for more context on the single-threaded process case. */ -int __pthread_multiple_threads attribute_hidden; -#endif - -/* Table of the key information. */ -struct pthread_key_struct __pthread_keys[PTHREAD_KEYS_MAX] - __attribute__ ((nocommon)); -hidden_data_def (__pthread_keys) diff --git a/nptl/version.c b/nptl/version.c deleted file mode 100644 index d9513fb84f..0000000000 --- a/nptl/version.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Entry point for libpthread DSO. - Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <unistd.h> -#include <sysdep.h> - - -static const char banner[] = -#include "banner.h" -"Copyright (C) 2017 Free Software Foundation, Inc.\n\ -This is free software; see the source for copying conditions.\n\ -There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n\ -PARTICULAR PURPOSE.\n" -"Forced unwind support included.\n" -; - - -/* This is made the e_entry of libpthread.so by LDFLAGS-pthread.so. */ -__attribute__ ((noreturn)) -void -__nptl_main (void) -{ - __libc_write (STDOUT_FILENO, banner, sizeof banner - 1); - _exit (0); -} |