aboutsummaryrefslogtreecommitdiff
path: root/nptl
diff options
context:
space:
mode:
Diffstat (limited to 'nptl')
-rw-r--r--nptl/Banner1
-rw-r--r--nptl/ChangeLog.old13230
-rw-r--r--nptl/DESIGN-systemtap-probes.txt73
-rw-r--r--nptl/Makefile722
-rw-r--r--nptl/TODO31
-rw-r--r--nptl/TODO-kernel20
-rw-r--r--nptl/TODO-testing20
-rw-r--r--nptl/Versions275
-rw-r--r--nptl/alloca_cutoff.c36
-rw-r--r--nptl/allocatestack.c1238
-rw-r--r--nptl/cancellation.c101
-rw-r--r--nptl/cleanup.c48
-rw-r--r--nptl/cleanup_compat.c50
-rw-r--r--nptl/cleanup_defer.c91
-rw-r--r--nptl/cleanup_defer_compat.c94
-rw-r--r--nptl/cleanup_routine.c27
-rw-r--r--nptl/cond-perf.c103
-rw-r--r--nptl/createthread.c45
-rw-r--r--nptl/default-sched.h35
-rw-r--r--nptl/descr.h406
-rw-r--r--nptl/eintr.c88
-rw-r--r--nptl/elision-conf.h1
-rw-r--r--nptl/errno-loc.c1
-rw-r--r--nptl/events.c33
-rw-r--r--nptl/forward.c210
-rw-r--r--nptl/herrno.c34
-rw-r--r--nptl/libc-cancellation.c24
-rw-r--r--nptl/libc-cleanup.c27
-rw-r--r--nptl/libc-lowlevellock.c20
-rw-r--r--nptl/libc_multiple_threads.c28
-rw-r--r--nptl/libc_pthread_init.c88
-rw-r--r--nptl/lll_timedlock_wait.c59
-rw-r--r--nptl/lll_timedwait_tid.c70
-rw-r--r--nptl/lowlevellock.c48
-rw-r--r--nptl/nptl-init.c480
-rw-r--r--nptl/nptl-printers.py594
-rw-r--r--nptl/nptl_lock_constants.pysym67
-rw-r--r--nptl/old_pthread_atfork.c26
-rw-r--r--nptl/old_pthread_cond_broadcast.c56
-rw-r--r--nptl/old_pthread_cond_destroy.c35
-rw-r--r--nptl/old_pthread_cond_init.c45
-rw-r--r--nptl/old_pthread_cond_signal.c56
-rw-r--r--nptl/old_pthread_cond_timedwait.c57
-rw-r--r--nptl/old_pthread_cond_wait.c56
-rw-r--r--nptl/perf.c759
-rw-r--r--nptl/pt-allocrtsig.c50
-rw-r--r--nptl/pt-cleanup.c62
-rw-r--r--nptl/pt-crti.S43
-rw-r--r--nptl/pt-fork.c49
-rw-r--r--nptl/pt-interp.c1
-rw-r--r--nptl/pt-longjmp.c60
-rw-r--r--nptl/pt-raise.c29
-rw-r--r--nptl/pt-system.c53
-rw-r--r--nptl/pt-vfork.c65
-rw-r--r--nptl/pthread-errnos.sym13
-rw-r--r--nptl/pthread-pi-defines.sym9
-rw-r--r--nptl/pthread-pids.h29
-rw-r--r--nptl/pthreadP.h641
-rw-r--r--nptl/pthread_atfork.c61
-rw-r--r--nptl/pthread_attr_destroy.c44
-rw-r--r--nptl/pthread_attr_getaffinity.c74
-rw-r--r--nptl/pthread_attr_getdetachstate.c36
-rw-r--r--nptl/pthread_attr_getguardsize.c34
-rw-r--r--nptl/pthread_attr_getinheritsched.c37
-rw-r--r--nptl/pthread_attr_getschedparam.c38
-rw-r--r--nptl/pthread_attr_getschedpolicy.c36
-rw-r--r--nptl/pthread_attr_getscope.c37
-rw-r--r--nptl/pthread_attr_getstack.c42
-rw-r--r--nptl/pthread_attr_getstackaddr.c42
-rw-r--r--nptl/pthread_attr_getstacksize.c45
-rw-r--r--nptl/pthread_attr_init.c85
-rw-r--r--nptl/pthread_attr_setaffinity.c73
-rw-r--r--nptl/pthread_attr_setdetachstate.c45
-rw-r--r--nptl/pthread_attr_setguardsize.c37
-rw-r--r--nptl/pthread_attr_setinheritsched.c44
-rw-r--r--nptl/pthread_attr_setschedparam.c45
-rw-r--r--nptl/pthread_attr_setschedpolicy.c45
-rw-r--r--nptl/pthread_attr_setscope.c48
-rw-r--r--nptl/pthread_attr_setstack.c100
-rw-r--r--nptl/pthread_attr_setstackaddr.c44
-rw-r--r--nptl/pthread_attr_setstacksize.c81
-rw-r--r--nptl/pthread_barrier_destroy.c61
-rw-r--r--nptl/pthread_barrier_init.c60
-rw-r--r--nptl/pthread_barrier_wait.c223
-rw-r--r--nptl/pthread_barrierattr_destroy.c28
-rw-r--r--nptl/pthread_barrierattr_getpshared.c29
-rw-r--r--nptl/pthread_barrierattr_init.c28
-rw-r--r--nptl/pthread_barrierattr_setpshared.c34
-rw-r--r--nptl/pthread_cancel.c103
-rw-r--r--nptl/pthread_clock_gettime.c67
-rw-r--r--nptl/pthread_clock_settime.c54
-rw-r--r--nptl/pthread_cond_broadcast.c92
-rw-r--r--nptl/pthread_cond_common.c465
-rw-r--r--nptl/pthread_cond_destroy.c62
-rw-r--r--nptl/pthread_cond_init.c51
-rw-r--r--nptl/pthread_cond_signal.c100
-rw-r--r--nptl/pthread_cond_wait.c673
-rw-r--r--nptl/pthread_condattr_destroy.c28
-rw-r--r--nptl/pthread_condattr_getclock.c28
-rw-r--r--nptl/pthread_condattr_getpshared.c29
-rw-r--r--nptl/pthread_condattr_init.c32
-rw-r--r--nptl/pthread_condattr_setclock.c50
-rw-r--r--nptl/pthread_condattr_setpshared.c35
-rw-r--r--nptl/pthread_create.c933
-rw-r--r--nptl/pthread_detach.c55
-rw-r--r--nptl/pthread_equal.c27
-rw-r--r--nptl/pthread_exit.c34
-rw-r--r--nptl/pthread_getaffinity.c32
-rw-r--r--nptl/pthread_getattr_default_np.c37
-rw-r--r--nptl/pthread_getattr_np.c207
-rw-r--r--nptl/pthread_getconcurrency.c26
-rw-r--r--nptl/pthread_getcpuclockid.c54
-rw-r--r--nptl/pthread_getname.c32
-rw-r--r--nptl/pthread_getschedparam.c73
-rw-r--r--nptl/pthread_getspecific.c67
-rw-r--r--nptl/pthread_join.c117
-rw-r--r--nptl/pthread_key_create.c51
-rw-r--r--nptl/pthread_key_delete.c41
-rw-r--r--nptl/pthread_kill.c38
-rw-r--r--nptl/pthread_kill_other_threads.c36
-rw-r--r--nptl/pthread_mutex_cond_lock.c21
-rw-r--r--nptl/pthread_mutex_consistent.c35
-rw-r--r--nptl/pthread_mutex_destroy.c40
-rw-r--r--nptl/pthread_mutex_getprioceiling.c35
-rw-r--r--nptl/pthread_mutex_init.c148
-rw-r--r--nptl/pthread_mutex_lock.c621
-rw-r--r--nptl/pthread_mutex_setprioceiling.c121
-rw-r--r--nptl/pthread_mutex_timedlock.c636
-rw-r--r--nptl/pthread_mutex_trylock.c408
-rw-r--r--nptl/pthread_mutex_unlock.c350
-rw-r--r--nptl/pthread_mutexattr_destroy.c27
-rw-r--r--nptl/pthread_mutexattr_getprioceiling.c48
-rw-r--r--nptl/pthread_mutexattr_getprotocol.c34
-rw-r--r--nptl/pthread_mutexattr_getpshared.c33
-rw-r--r--nptl/pthread_mutexattr_getrobust.c34
-rw-r--r--nptl/pthread_mutexattr_gettype.c34
-rw-r--r--nptl/pthread_mutexattr_init.c36
-rw-r--r--nptl/pthread_mutexattr_setprioceiling.c49
-rw-r--r--nptl/pthread_mutexattr_setprotocol.c38
-rw-r--r--nptl/pthread_mutexattr_setpshared.c41
-rw-r--r--nptl/pthread_mutexattr_setrobust.c41
-rw-r--r--nptl/pthread_mutexattr_settype.c43
-rw-r--r--nptl/pthread_once.c146
-rw-r--r--nptl/pthread_rwlock_common.c924
-rw-r--r--nptl/pthread_rwlock_destroy.c31
-rw-r--r--nptl/pthread_rwlock_init.c48
-rw-r--r--nptl/pthread_rwlock_rdlock.c33
-rw-r--r--nptl/pthread_rwlock_timedrdlock.c37
-rw-r--r--nptl/pthread_rwlock_timedwrlock.c37
-rw-r--r--nptl/pthread_rwlock_tryrdlock.c112
-rw-r--r--nptl/pthread_rwlock_trywrlock.c61
-rw-r--r--nptl/pthread_rwlock_unlock.c48
-rw-r--r--nptl/pthread_rwlock_wrlock.c33
-rw-r--r--nptl/pthread_rwlockattr_destroy.c28
-rw-r--r--nptl/pthread_rwlockattr_getkind_np.c28
-rw-r--r--nptl/pthread_rwlockattr_getpshared.c28
-rw-r--r--nptl/pthread_rwlockattr_init.c33
-rw-r--r--nptl/pthread_rwlockattr_setkind_np.c38
-rw-r--r--nptl/pthread_rwlockattr_setpshared.c38
-rw-r--r--nptl/pthread_self.c28
-rw-r--r--nptl/pthread_setaffinity.c32
-rw-r--r--nptl/pthread_setattr_default_np.c108
-rw-r--r--nptl/pthread_setcancelstate.c71
-rw-r--r--nptl/pthread_setcanceltype.c76
-rw-r--r--nptl/pthread_setconcurrency.c39
-rw-r--r--nptl/pthread_setegid.c3
-rw-r--r--nptl/pthread_seteuid.c3
-rw-r--r--nptl/pthread_setgid.c3
-rw-r--r--nptl/pthread_setname.c32
-rw-r--r--nptl/pthread_setregid.c3
-rw-r--r--nptl/pthread_setresgid.c3
-rw-r--r--nptl/pthread_setresuid.c3
-rw-r--r--nptl/pthread_setreuid.c3
-rw-r--r--nptl/pthread_setschedparam.c72
-rw-r--r--nptl/pthread_setschedprio.c64
-rw-r--r--nptl/pthread_setspecific.c93
-rw-r--r--nptl/pthread_setuid.c3
-rw-r--r--nptl/pthread_sigmask.c36
-rw-r--r--nptl/pthread_sigqueue.c37
-rw-r--r--nptl/pthread_spin_destroy.c27
-rw-r--r--nptl/pthread_spin_init.c28
-rw-r--r--nptl/pthread_spin_lock.c80
-rw-r--r--nptl/pthread_spin_trylock.c79
-rw-r--r--nptl/pthread_spin_unlock.c31
-rw-r--r--nptl/pthread_testcancel.c29
-rw-r--r--nptl/pthread_timedjoin.c104
-rw-r--r--nptl/pthread_tryjoin.c72
-rw-r--r--nptl/pthread_yield.c29
-rw-r--r--nptl/register-atfork.c144
-rw-r--r--nptl/res.c26
-rw-r--r--nptl/sem_close.c79
-rw-r--r--nptl/sem_destroy.c36
-rw-r--r--nptl/sem_getvalue.c55
-rw-r--r--nptl/sem_init.c90
-rw-r--r--nptl/sem_open.c329
-rw-r--r--nptl/sem_post.c103
-rw-r--r--nptl/sem_timedwait.c40
-rw-r--r--nptl/sem_unlink.c38
-rw-r--r--nptl/sem_wait.c106
-rw-r--r--nptl/sem_waitcommon.c356
-rw-r--r--nptl/semaphoreP.h54
-rw-r--r--nptl/shlib-versions1
-rw-r--r--nptl/sigaction.c43
-rw-r--r--nptl/smp.h27
-rw-r--r--nptl/sockperf.c593
-rw-r--r--nptl/stack-aliasing.h23
-rw-r--r--nptl/test-cond-printers.c57
-rw-r--r--nptl/test-cond-printers.py50
-rw-r--r--nptl/test-condattr-printers.c95
-rw-r--r--nptl/test-condattr-printers.py71
-rw-r--r--nptl/test-mutex-printers.c151
-rw-r--r--nptl/test-mutex-printers.py100
-rw-r--r--nptl/test-mutexattr-printers.c144
-rw-r--r--nptl/test-mutexattr-printers.py101
-rw-r--r--nptl/test-rwlock-printers.c78
-rw-r--r--nptl/test-rwlock-printers.py64
-rw-r--r--nptl/test-rwlockattr-printers.c100
-rw-r--r--nptl/test-rwlockattr-printers.py76
-rw-r--r--nptl/tpp.c195
-rw-r--r--nptl/tst-_res1.c68
-rw-r--r--nptl/tst-_res1mod1.c22
-rw-r--r--nptl/tst-_res1mod2.c1
-rw-r--r--nptl/tst-abstime.c97
-rw-r--r--nptl/tst-align.c70
-rw-r--r--nptl/tst-align3.c56
-rw-r--r--nptl/tst-atfork1.c120
-rw-r--r--nptl/tst-atfork2.c158
-rw-r--r--nptl/tst-atfork2mod.c57
-rw-r--r--nptl/tst-attr1.c305
-rw-r--r--nptl/tst-attr2.c316
-rw-r--r--nptl/tst-attr3.c421
-rw-r--r--nptl/tst-backtrace1.c85
-rw-r--r--nptl/tst-bad-schedattr.c97
-rw-r--r--nptl/tst-barrier1.c71
-rw-r--r--nptl/tst-barrier2.c185
-rw-r--r--nptl/tst-barrier3.c152
-rw-r--r--nptl/tst-barrier4.c121
-rw-r--r--nptl/tst-barrier5.c145
-rw-r--r--nptl/tst-basic1.c82
-rw-r--r--nptl/tst-basic2.c120
-rw-r--r--nptl/tst-basic3.c86
-rw-r--r--nptl/tst-basic4.c100
-rw-r--r--nptl/tst-basic5.c73
-rw-r--r--nptl/tst-basic6.c131
-rw-r--r--nptl/tst-basic7.c75
-rw-r--r--nptl/tst-cancel-self-cancelstate.c65
-rw-r--r--nptl/tst-cancel-self-canceltype.c53
-rw-r--r--nptl/tst-cancel-self-cleanup.c23
-rw-r--r--nptl/tst-cancel-self-testcancel.c48
-rw-r--r--nptl/tst-cancel-self.c48
-rw-r--r--nptl/tst-cancel-wrappers.sh92
-rw-r--r--nptl/tst-cancel1.c162
-rw-r--r--nptl/tst-cancel10.c125
-rw-r--r--nptl/tst-cancel11.c122
-rw-r--r--nptl/tst-cancel12.c123
-rw-r--r--nptl/tst-cancel13.c127
-rw-r--r--nptl/tst-cancel14.c133
-rw-r--r--nptl/tst-cancel15.c138
-rw-r--r--nptl/tst-cancel16.c230
-rw-r--r--nptl/tst-cancel17.c356
-rw-r--r--nptl/tst-cancel18.c173
-rw-r--r--nptl/tst-cancel19.c286
-rw-r--r--nptl/tst-cancel2.c95
-rw-r--r--nptl/tst-cancel20.c268
-rw-r--r--nptl/tst-cancel21-static.c1
-rw-r--r--nptl/tst-cancel21.c298
-rw-r--r--nptl/tst-cancel22.c120
-rw-r--r--nptl/tst-cancel23.c1
-rw-r--r--nptl/tst-cancel24-static.cc1
-rw-r--r--nptl/tst-cancel24.cc113
-rw-r--r--nptl/tst-cancel25.c173
-rw-r--r--nptl/tst-cancel26.c68
-rw-r--r--nptl/tst-cancel27.c23
-rw-r--r--nptl/tst-cancel3.c97
-rw-r--r--nptl/tst-cancel4-common.c262
-rw-r--r--nptl/tst-cancel4-common.h97
-rw-r--r--nptl/tst-cancel4.c1565
-rw-r--r--nptl/tst-cancel4_1.c109
-rw-r--r--nptl/tst-cancel4_2.c107
-rw-r--r--nptl/tst-cancel5.c1
-rw-r--r--nptl/tst-cancel6.c78
-rw-r--r--nptl/tst-cancel7.c209
-rw-r--r--nptl/tst-cancel8.c142
-rw-r--r--nptl/tst-cancel9.c125
-rw-r--r--nptl/tst-cancelx1.c1
-rw-r--r--nptl/tst-cancelx10.c1
-rw-r--r--nptl/tst-cancelx11.c1
-rw-r--r--nptl/tst-cancelx12.c1
-rw-r--r--nptl/tst-cancelx13.c1
-rw-r--r--nptl/tst-cancelx14.c1
-rw-r--r--nptl/tst-cancelx15.c1
-rw-r--r--nptl/tst-cancelx16.c1
-rw-r--r--nptl/tst-cancelx17.c1
-rw-r--r--nptl/tst-cancelx18.c1
-rw-r--r--nptl/tst-cancelx2.c1
-rw-r--r--nptl/tst-cancelx20.c1
-rw-r--r--nptl/tst-cancelx21.c1
-rw-r--r--nptl/tst-cancelx3.c1
-rw-r--r--nptl/tst-cancelx4.c1
-rw-r--r--nptl/tst-cancelx5.c1
-rw-r--r--nptl/tst-cancelx6.c1
-rw-r--r--nptl/tst-cancelx7.c1
-rw-r--r--nptl/tst-cancelx8.c1
-rw-r--r--nptl/tst-cancelx9.c1
-rw-r--r--nptl/tst-cleanup0.c74
-rw-r--r--nptl/tst-cleanup0.expect3
-rw-r--r--nptl/tst-cleanup1.c100
-rw-r--r--nptl/tst-cleanup2.c63
-rw-r--r--nptl/tst-cleanup3.c98
-rw-r--r--nptl/tst-cleanup4.c197
-rw-r--r--nptl/tst-cleanup4aux.c120
-rw-r--r--nptl/tst-cleanupx0.c1
-rw-r--r--nptl/tst-cleanupx0.expect3
-rw-r--r--nptl/tst-cleanupx1.c1
-rw-r--r--nptl/tst-cleanupx2.c1
-rw-r--r--nptl/tst-cleanupx3.c1
-rw-r--r--nptl/tst-cleanupx4.c1
-rw-r--r--nptl/tst-cleanupx4aux.c1
-rw-r--r--nptl/tst-clock1.c50
-rw-r--r--nptl/tst-clock2.c201
-rw-r--r--nptl/tst-cond-except.c110
-rw-r--r--nptl/tst-cond1.c96
-rw-r--r--nptl/tst-cond10.c172
-rw-r--r--nptl/tst-cond11.c204
-rw-r--r--nptl/tst-cond12.c195
-rw-r--r--nptl/tst-cond13.c2
-rw-r--r--nptl/tst-cond14.c117
-rw-r--r--nptl/tst-cond15.c159
-rw-r--r--nptl/tst-cond16.c111
-rw-r--r--nptl/tst-cond17.c2
-rw-r--r--nptl/tst-cond18.c123
-rw-r--r--nptl/tst-cond19.c75
-rw-r--r--nptl/tst-cond2.c162
-rw-r--r--nptl/tst-cond20.c172
-rw-r--r--nptl/tst-cond21.c3
-rw-r--r--nptl/tst-cond22.c162
-rw-r--r--nptl/tst-cond23.c183
-rw-r--r--nptl/tst-cond24.c249
-rw-r--r--nptl/tst-cond25.c289
-rw-r--r--nptl/tst-cond3.c111
-rw-r--r--nptl/tst-cond4.c263
-rw-r--r--nptl/tst-cond5.c105
-rw-r--r--nptl/tst-cond6.c233
-rw-r--r--nptl/tst-cond7.c167
-rw-r--r--nptl/tst-cond8-static.c1
-rw-r--r--nptl/tst-cond8.c276
-rw-r--r--nptl/tst-cond9.c149
-rw-r--r--nptl/tst-context1.c205
-rw-r--r--nptl/tst-create-detached.c137
-rw-r--r--nptl/tst-default-attr.c385
-rw-r--r--nptl/tst-detach1.c55
-rw-r--r--nptl/tst-dlsym1.c66
-rw-r--r--nptl/tst-eintr1.c104
-rw-r--r--nptl/tst-eintr2.c118
-rw-r--r--nptl/tst-eintr3.c69
-rw-r--r--nptl/tst-eintr4.c53
-rw-r--r--nptl/tst-eintr5.c79
-rw-r--r--nptl/tst-exec1.c159
-rw-r--r--nptl/tst-exec2.c154
-rw-r--r--nptl/tst-exec3.c152
-rw-r--r--nptl/tst-exec4.c115
-rw-r--r--nptl/tst-exec5.c176
-rw-r--r--nptl/tst-execstack-mod.c1
-rw-r--r--nptl/tst-execstack.c2
-rw-r--r--nptl/tst-exit1.c78
-rw-r--r--nptl/tst-exit2.c42
-rw-r--r--nptl/tst-exit3.c83
-rw-r--r--nptl/tst-fini1.c34
-rw-r--r--nptl/tst-fini1mod.c71
-rw-r--r--nptl/tst-flock1.c92
-rw-r--r--nptl/tst-flock2.c259
-rw-r--r--nptl/tst-fork1.c121
-rw-r--r--nptl/tst-fork2.c89
-rw-r--r--nptl/tst-fork3.c108
-rw-r--r--nptl/tst-fork4.c64
-rw-r--r--nptl/tst-getpid3.c114
-rw-r--r--nptl/tst-initializers1-c11.c1
-rw-r--r--nptl/tst-initializers1-c89.c1
-rw-r--r--nptl/tst-initializers1-c99.c1
-rw-r--r--nptl/tst-initializers1-gnu11.c1
-rw-r--r--nptl/tst-initializers1-gnu89.c1
-rw-r--r--nptl/tst-initializers1-gnu99.c1
-rw-r--r--nptl/tst-initializers1.c60
-rw-r--r--nptl/tst-join1.c82
-rw-r--r--nptl/tst-join2.c103
-rw-r--r--nptl/tst-join3.c122
-rw-r--r--nptl/tst-join4.c124
-rw-r--r--nptl/tst-join5.c207
-rw-r--r--nptl/tst-join6.c2
-rw-r--r--nptl/tst-join7.c46
-rw-r--r--nptl/tst-join7mod.c63
-rw-r--r--nptl/tst-key1.c89
-rw-r--r--nptl/tst-key2.c115
-rw-r--r--nptl/tst-key3.c156
-rw-r--r--nptl/tst-key4.c136
-rw-r--r--nptl/tst-kill1.c99
-rw-r--r--nptl/tst-kill2.c138
-rw-r--r--nptl/tst-kill3.c159
-rw-r--r--nptl/tst-kill4.c90
-rw-r--r--nptl/tst-kill5.c49
-rw-r--r--nptl/tst-kill6.c162
-rw-r--r--nptl/tst-locale1.c22
-rw-r--r--nptl/tst-locale2.c15
-rw-r--r--nptl/tst-mutex-errorcheck.c61
-rw-r--r--nptl/tst-mutex1.c83
-rw-r--r--nptl/tst-mutex2.c241
-rw-r--r--nptl/tst-mutex3.c241
-rw-r--r--nptl/tst-mutex4.c277
-rw-r--r--nptl/tst-mutex5.c203
-rw-r--r--nptl/tst-mutex5a.c2
-rw-r--r--nptl/tst-mutex6.c76
-rw-r--r--nptl/tst-mutex7.c164
-rw-r--r--nptl/tst-mutex7a.c2
-rw-r--r--nptl/tst-mutex8-static.c1
-rw-r--r--nptl/tst-mutex8.c403
-rw-r--r--nptl/tst-mutex9.c202
-rw-r--r--nptl/tst-mutexpi1.c28
-rw-r--r--nptl/tst-mutexpi2.c2
-rw-r--r--nptl/tst-mutexpi3.c2
-rw-r--r--nptl/tst-mutexpi4.c2
-rw-r--r--nptl/tst-mutexpi5.c2
-rw-r--r--nptl/tst-mutexpi5a.c2
-rw-r--r--nptl/tst-mutexpi6.c29
-rw-r--r--nptl/tst-mutexpi7.c2
-rw-r--r--nptl/tst-mutexpi7a.c2
-rw-r--r--nptl/tst-mutexpi8-static.c1
-rw-r--r--nptl/tst-mutexpi8.c2
-rw-r--r--nptl/tst-mutexpi9.c2
-rw-r--r--nptl/tst-mutexpp1.c46
-rw-r--r--nptl/tst-mutexpp10.c333
-rw-r--r--nptl/tst-mutexpp6.c46
-rw-r--r--nptl/tst-oddstacklimit.c73
-rw-r--r--nptl/tst-once1.c50
-rw-r--r--nptl/tst-once2.c103
-rw-r--r--nptl/tst-once3.c166
-rw-r--r--nptl/tst-once4.c201
-rw-r--r--nptl/tst-once5.cc81
-rw-r--r--nptl/tst-oncex3.c1
-rw-r--r--nptl/tst-oncex4.c1
-rw-r--r--nptl/tst-popen1.c59
-rw-r--r--nptl/tst-pthread-attr-affinity.c63
-rw-r--r--nptl/tst-pthread-getattr.c161
-rw-r--r--nptl/tst-pthread-mutexattr.c60
-rw-r--r--nptl/tst-raise1.c61
-rw-r--r--nptl/tst-robust-fork.c184
-rw-r--r--nptl/tst-robust1.c338
-rw-r--r--nptl/tst-robust10.c110
-rw-r--r--nptl/tst-robust2.c3
-rw-r--r--nptl/tst-robust3.c20
-rw-r--r--nptl/tst-robust4.c2
-rw-r--r--nptl/tst-robust5.c2
-rw-r--r--nptl/tst-robust6.c2
-rw-r--r--nptl/tst-robust7.c212
-rw-r--r--nptl/tst-robust8.c275
-rw-r--r--nptl/tst-robust9.c94
-rw-r--r--nptl/tst-robustpi1.c2
-rw-r--r--nptl/tst-robustpi2.c2
-rw-r--r--nptl/tst-robustpi3.c2
-rw-r--r--nptl/tst-robustpi4.c2
-rw-r--r--nptl/tst-robustpi5.c2
-rw-r--r--nptl/tst-robustpi6.c2
-rw-r--r--nptl/tst-robustpi7.c2
-rw-r--r--nptl/tst-robustpi8.c2
-rw-r--r--nptl/tst-robustpi9.c2
-rw-r--r--nptl/tst-rwlock1.c116
-rw-r--r--nptl/tst-rwlock10.c20
-rw-r--r--nptl/tst-rwlock11.c20
-rw-r--r--nptl/tst-rwlock12.c207
-rw-r--r--nptl/tst-rwlock13.c70
-rw-r--r--nptl/tst-rwlock14.c168
-rw-r--r--nptl/tst-rwlock15.c116
-rw-r--r--nptl/tst-rwlock16.c183
-rw-r--r--nptl/tst-rwlock17.c19
-rw-r--r--nptl/tst-rwlock18.c19
-rw-r--r--nptl/tst-rwlock19.c127
-rw-r--r--nptl/tst-rwlock2.c168
-rw-r--r--nptl/tst-rwlock2a.c2
-rw-r--r--nptl/tst-rwlock2b.c2
-rw-r--r--nptl/tst-rwlock3.c92
-rw-r--r--nptl/tst-rwlock4.c189
-rw-r--r--nptl/tst-rwlock5.c84
-rw-r--r--nptl/tst-rwlock6.c225
-rw-r--r--nptl/tst-rwlock7.c181
-rw-r--r--nptl/tst-rwlock8.c182
-rw-r--r--nptl/tst-rwlock9.c221
-rw-r--r--nptl/tst-sched1.c97
-rw-r--r--nptl/tst-sem1.c88
-rw-r--r--nptl/tst-sem10.c87
-rw-r--r--nptl/tst-sem11-static.c1
-rw-r--r--nptl/tst-sem11.c85
-rw-r--r--nptl/tst-sem12-static.c1
-rw-r--r--nptl/tst-sem12.c14
-rw-r--r--nptl/tst-sem13.c75
-rw-r--r--nptl/tst-sem14.c92
-rw-r--r--nptl/tst-sem15.c99
-rw-r--r--nptl/tst-sem16.c130
-rw-r--r--nptl/tst-sem2.c53
-rw-r--r--nptl/tst-sem3.c144
-rw-r--r--nptl/tst-sem4.c153
-rw-r--r--nptl/tst-sem5.c93
-rw-r--r--nptl/tst-sem6.c80
-rw-r--r--nptl/tst-sem7.c111
-rw-r--r--nptl/tst-sem8.c76
-rw-r--r--nptl/tst-sem9.c83
-rw-r--r--nptl/tst-setuid1-static.c1
-rw-r--r--nptl/tst-setuid1.c1084
-rw-r--r--nptl/tst-setuid2.c145
-rw-r--r--nptl/tst-setuid3.c118
-rw-r--r--nptl/tst-signal1.c188
-rw-r--r--nptl/tst-signal2.c197
-rw-r--r--nptl/tst-signal3.c266
-rw-r--r--nptl/tst-signal4.c59
-rw-r--r--nptl/tst-signal5.c110
-rw-r--r--nptl/tst-signal6.c197
-rw-r--r--nptl/tst-signal7.c62
-rw-r--r--nptl/tst-spin1.c56
-rw-r--r--nptl/tst-spin2.c158
-rw-r--r--nptl/tst-spin3.c53
-rw-r--r--nptl/tst-spin4.c109
-rw-r--r--nptl/tst-stack1.c145
-rw-r--r--nptl/tst-stack2.c79
-rw-r--r--nptl/tst-stack3.c100
-rw-r--r--nptl/tst-stack4.c159
-rw-r--r--nptl/tst-stack4mod.c28
-rw-r--r--nptl/tst-stackguard1-static.c1
-rw-r--r--nptl/tst-stackguard1.c227
-rw-r--r--nptl/tst-stdio1.c56
-rw-r--r--nptl/tst-stdio2.c82
-rw-r--r--nptl/tst-sysconf.c47
-rw-r--r--nptl/tst-thread_local1.cc199
-rw-r--r--nptl/tst-tls1.c111
-rw-r--r--nptl/tst-tls2.c206
-rw-r--r--nptl/tst-tls3-malloc.c31
-rw-r--r--nptl/tst-tls3.c215
-rw-r--r--nptl/tst-tls3mod.c88
-rw-r--r--nptl/tst-tls4.c181
-rw-r--r--nptl/tst-tls4moda.c49
-rw-r--r--nptl/tst-tls4modb.c58
-rw-r--r--nptl/tst-tls5.c119
-rw-r--r--nptl/tst-tls5.h23
-rw-r--r--nptl/tst-tls5mod.c6
-rw-r--r--nptl/tst-tls5moda.c6
-rw-r--r--nptl/tst-tls5modb.c6
-rw-r--r--nptl/tst-tls5modc.c6
-rw-r--r--nptl/tst-tls5modd.c6
-rw-r--r--nptl/tst-tls5mode.c8
-rw-r--r--nptl/tst-tls5modf.c9
-rwxr-xr-xnptl/tst-tls6.sh77
-rw-r--r--nptl/tst-tpp.h93
-rw-r--r--nptl/tst-tsd1.c117
-rw-r--r--nptl/tst-tsd2.c96
-rw-r--r--nptl/tst-tsd3.c128
-rw-r--r--nptl/tst-tsd4.c102
-rw-r--r--nptl/tst-tsd5.c80
-rw-r--r--nptl/tst-tsd6.c89
-rw-r--r--nptl/tst-typesizes.c95
-rw-r--r--nptl/tst-umask1.c136
-rw-r--r--nptl/tst-unload.c47
-rw-r--r--nptl/tst-vfork1.c1
-rw-r--r--nptl/tst-vfork1x.c1
-rw-r--r--nptl/tst-vfork2.c1
-rw-r--r--nptl/tst-vfork2x.c1
-rw-r--r--nptl/unregister-atfork.c121
-rw-r--r--nptl/unwind.c138
-rw-r--r--nptl/unwindbuf.sym7
-rw-r--r--nptl/vars.c43
-rw-r--r--nptl/version.c41
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, &param) == -1))
- result = errno;
- else
- {
- /* We succeeded changing the kernel information. Reflect this
- change in the thread descriptor. */
- param.sched_priority = prio;
- memcpy (&pd->schedparam, &param, 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, &param));
-
- 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, &param);
- 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, &param);
-
- 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);
-}