summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2005-07-08 09:10:42 +0000
committerJakub Jelinek <jakub@redhat.com>2005-07-08 09:10:42 +0000
commit48f006fc656c70757103dc9efa92d5775717576b (patch)
tree49d57e1205b93471c3245fceab5dd5ac31ba743d
parent03d65262fdcc287ef8b691c7dff2f1a63cdd13c2 (diff)
Updated to fedora-glibc-20050708T0811
-rw-r--r--ChangeLog124
-rw-r--r--Makeconfig2
-rw-r--r--NEWS5
-rw-r--r--csu/elf-init.c22
-rw-r--r--elf/Makefile21
-rw-r--r--elf/dl-error.c5
-rw-r--r--elf/dl-reloc.c5
-rw-r--r--elf/stackguard-macros.h7
-rw-r--r--elf/tst-array5-static.c1
-rw-r--r--elf/tst-array5-static.exp2
-rw-r--r--elf/tst-array5.c50
-rw-r--r--elf/tst-array5.exp3
-rw-r--r--elf/tst-array5dep.c23
-rw-r--r--fedora/branch.mk4
-rw-r--r--fedora/glibc.spec.in6
-rw-r--r--gmon/Makefile12
-rw-r--r--gmon/tst-profile-static.c10
-rw-r--r--linuxthreads/Banner1
-rw-r--r--linuxthreads/ChangeLog6631
-rw-r--r--linuxthreads/Changes85
-rw-r--r--linuxthreads/Examples/Makefile15
-rw-r--r--linuxthreads/Examples/ex1.c42
-rw-r--r--linuxthreads/Examples/ex10.c108
-rw-r--r--linuxthreads/Examples/ex11.c154
-rw-r--r--linuxthreads/Examples/ex12.c47
-rw-r--r--linuxthreads/Examples/ex13.c112
-rw-r--r--linuxthreads/Examples/ex14.c133
-rw-r--r--linuxthreads/Examples/ex15.c58
-rw-r--r--linuxthreads/Examples/ex16.c26
-rw-r--r--linuxthreads/Examples/ex17.c112
-rw-r--r--linuxthreads/Examples/ex18.c113
-rw-r--r--linuxthreads/Examples/ex2.c124
-rw-r--r--linuxthreads/Examples/ex3.c152
-rw-r--r--linuxthreads/Examples/ex4.c115
-rw-r--r--linuxthreads/Examples/ex5.c114
-rw-r--r--linuxthreads/Examples/ex6.c46
-rw-r--r--linuxthreads/Examples/ex7.c45
-rw-r--r--linuxthreads/Examples/ex8.c101
-rw-r--r--linuxthreads/Examples/ex9.c98
-rw-r--r--linuxthreads/Examples/tststatic.c1
-rw-r--r--linuxthreads/FAQ.html1039
-rw-r--r--linuxthreads/LICENSE501
-rw-r--r--linuxthreads/Makeconfig11
-rw-r--r--linuxthreads/Makefile348
-rw-r--r--linuxthreads/README166
-rw-r--r--linuxthreads/README.Xfree3.2352
-rw-r--r--linuxthreads/Versions188
-rw-r--r--linuxthreads/alloca_cutoff.c36
-rw-r--r--linuxthreads/attr.c485
-rw-r--r--linuxthreads/barrier.c128
-rw-r--r--linuxthreads/bug-sleep.c34
-rw-r--r--linuxthreads/cancel.c235
-rw-r--r--linuxthreads/condvar.c341
-rwxr-xr-xlinuxthreads/configure17
-rw-r--r--linuxthreads/configure.in14
-rw-r--r--linuxthreads/descr.h267
-rw-r--r--linuxthreads/ecmutex.c157
-rw-r--r--linuxthreads/errno.c47
-rw-r--r--linuxthreads/events.c37
-rw-r--r--linuxthreads/forward.c179
-rw-r--r--linuxthreads/internals.h550
-rw-r--r--linuxthreads/join.c220
-rw-r--r--linuxthreads/joinrace.c48
-rw-r--r--linuxthreads/libc-cancellation.c64
-rw-r--r--linuxthreads/libc-tls-loc.c49
-rw-r--r--linuxthreads/libc-tsd.c41
-rw-r--r--linuxthreads/libc_pthread_init.c46
-rw-r--r--linuxthreads/linuxthreads.texi1627
-rw-r--r--linuxthreads/lockfile.c86
-rw-r--r--linuxthreads/man/Makefile25
-rw-r--r--linuxthreads/man/pthread_atfork.man53
-rw-r--r--linuxthreads/man/pthread_attr_init.man221
-rw-r--r--linuxthreads/man/pthread_cancel.man155
-rw-r--r--linuxthreads/man/pthread_cleanup_push.man194
-rw-r--r--linuxthreads/man/pthread_cond_init.man234
-rw-r--r--linuxthreads/man/pthread_condattr_init.man39
-rw-r--r--linuxthreads/man/pthread_create.man46
-rw-r--r--linuxthreads/man/pthread_detach.man44
-rw-r--r--linuxthreads/man/pthread_equal.man23
-rw-r--r--linuxthreads/man/pthread_exit.man32
-rw-r--r--linuxthreads/man/pthread_join.man70
-rw-r--r--linuxthreads/man/pthread_key_create.man151
-rw-r--r--linuxthreads/man/pthread_kill_other_threads_np.man40
-rw-r--r--linuxthreads/man/pthread_mutex_init.man213
-rw-r--r--linuxthreads/man/pthread_mutexattr_init.man84
-rw-r--r--linuxthreads/man/pthread_mutexattr_setkind_np.man39
-rw-r--r--linuxthreads/man/pthread_once.man34
-rw-r--r--linuxthreads/man/pthread_self.man23
-rw-r--r--linuxthreads/man/pthread_setschedparam.man79
-rw-r--r--linuxthreads/man/pthread_sigmask.man123
-rw-r--r--linuxthreads/man/sem_init.man132
-rwxr-xr-xlinuxthreads/man/troffprepro68
-rw-r--r--linuxthreads/manager.c1112
-rw-r--r--linuxthreads/mutex.c362
-rw-r--r--linuxthreads/old_pthread_atfork.c27
-rw-r--r--linuxthreads/oldsemaphore.c241
-rw-r--r--linuxthreads/pt-allocrtsig.c50
-rw-r--r--linuxthreads/pt-machine.c25
-rw-r--r--linuxthreads/pt-system.c32
-rw-r--r--linuxthreads/ptcleanup.c52
-rw-r--r--linuxthreads/ptclock_gettime.c69
-rw-r--r--linuxthreads/ptclock_settime.c55
-rw-r--r--linuxthreads/ptfork.c93
-rw-r--r--linuxthreads/pthandles.c6
-rw-r--r--linuxthreads/pthread.c1408
-rw-r--r--linuxthreads/pthread_atfork.c63
-rw-r--r--linuxthreads/pthread_setegid.c27
-rw-r--r--linuxthreads/pthread_seteuid.c27
-rw-r--r--linuxthreads/pthread_setgid.c27
-rw-r--r--linuxthreads/pthread_setregid.c27
-rw-r--r--linuxthreads/pthread_setresgid.c27
-rw-r--r--linuxthreads/pthread_setresuid.c27
-rw-r--r--linuxthreads/pthread_setreuid.c27
-rw-r--r--linuxthreads/pthread_setuid.c27
-rw-r--r--linuxthreads/queue.h61
-rw-r--r--linuxthreads/restart.h49
-rw-r--r--linuxthreads/rwlock.c658
-rw-r--r--linuxthreads/semaphore.c307
-rw-r--r--linuxthreads/semaphore.h88
-rw-r--r--linuxthreads/shlib-versions11
-rw-r--r--linuxthreads/sighandler.c71
-rw-r--r--linuxthreads/signals.c213
-rw-r--r--linuxthreads/specific.c241
-rw-r--r--linuxthreads/spinlock.c720
-rw-r--r--linuxthreads/spinlock.h218
-rw-r--r--linuxthreads/sysdeps/alpha/elf/pt-initfini.c90
-rw-r--r--linuxthreads/sysdeps/alpha/pspinlock.c110
-rw-r--r--linuxthreads/sysdeps/alpha/pt-machine.h128
-rw-r--r--linuxthreads/sysdeps/alpha/tls.h156
-rw-r--r--linuxthreads/sysdeps/cris/pspinlock.c72
-rw-r--r--linuxthreads/sysdeps/cris/pt-machine.h58
-rw-r--r--linuxthreads/sysdeps/hppa/pspinlock.c81
-rw-r--r--linuxthreads/sysdeps/hppa/pt-machine.h62
-rw-r--r--linuxthreads/sysdeps/i386/Makefile23
-rw-r--r--linuxthreads/sysdeps/i386/i586/Versions5
-rw-r--r--linuxthreads/sysdeps/i386/i686/Versions5
-rw-r--r--linuxthreads/sysdeps/i386/i686/pt-machine.h79
-rw-r--r--linuxthreads/sysdeps/i386/pspinlock.c103
-rw-r--r--linuxthreads/sysdeps/i386/pt-machine.h108
-rw-r--r--linuxthreads/sysdeps/i386/tcb-offsets.sym7
-rw-r--r--linuxthreads/sysdeps/i386/tls.h237
-rw-r--r--linuxthreads/sysdeps/i386/useldt.h314
-rw-r--r--linuxthreads/sysdeps/ia64/Makefile3
-rw-r--r--linuxthreads/sysdeps/ia64/Versions5
-rw-r--r--linuxthreads/sysdeps/ia64/pspinlock.c79
-rw-r--r--linuxthreads/sysdeps/ia64/pt-machine.h133
-rw-r--r--linuxthreads/sysdeps/ia64/tcb-offsets.sym9
-rw-r--r--linuxthreads/sysdeps/ia64/tls.h153
-rw-r--r--linuxthreads/sysdeps/m68k/pspinlock.c82
-rw-r--r--linuxthreads/sysdeps/m68k/pt-machine.h69
-rw-r--r--linuxthreads/sysdeps/mips/pspinlock.c98
-rw-r--r--linuxthreads/sysdeps/mips/pt-machine.h92
-rw-r--r--linuxthreads/sysdeps/mips/tls.h170
-rw-r--r--linuxthreads/sysdeps/powerpc/Makefile7
-rw-r--r--linuxthreads/sysdeps/powerpc/powerpc32/pspinlock.c70
-rw-r--r--linuxthreads/sysdeps/powerpc/powerpc32/pt-machine.h120
-rw-r--r--linuxthreads/sysdeps/powerpc/powerpc64/pspinlock.c70
-rw-r--r--linuxthreads/sysdeps/powerpc/powerpc64/pt-machine.h185
-rw-r--r--linuxthreads/sysdeps/powerpc/tcb-offsets.sym19
-rw-r--r--linuxthreads/sysdeps/powerpc/tls.h173
-rw-r--r--linuxthreads/sysdeps/pthread/Makefile26
-rw-r--r--linuxthreads/sysdeps/pthread/Subdirs1
-rw-r--r--linuxthreads/sysdeps/pthread/bits/initspin.h28
-rw-r--r--linuxthreads/sysdeps/pthread/bits/libc-lock.h413
-rw-r--r--linuxthreads/sysdeps/pthread/bits/libc-tsd.h59
-rw-r--r--linuxthreads/sysdeps/pthread/bits/pthreadtypes.h152
-rw-r--r--linuxthreads/sysdeps/pthread/bits/typesizes.h66
-rw-r--r--linuxthreads/sysdeps/pthread/errno-loc.c46
-rw-r--r--linuxthreads/sysdeps/pthread/flockfile.c33
-rw-r--r--linuxthreads/sysdeps/pthread/ftrylockfile.c33
-rw-r--r--linuxthreads/sysdeps/pthread/funlockfile.c33
-rw-r--r--linuxthreads/sysdeps/pthread/getcpuclockid.c117
-rw-r--r--linuxthreads/sysdeps/pthread/herrno-loc.c43
-rw-r--r--linuxthreads/sysdeps/pthread/list.h114
-rw-r--r--linuxthreads/sysdeps/pthread/malloc-machine.h67
-rw-r--r--linuxthreads/sysdeps/pthread/posix-timer.h204
-rw-r--r--linuxthreads/sysdeps/pthread/pt-initfini.c124
-rw-r--r--linuxthreads/sysdeps/pthread/pthread-functions.h96
-rw-r--r--linuxthreads/sysdeps/pthread/pthread.h686
-rw-r--r--linuxthreads/sysdeps/pthread/ptlongjmp.c39
-rw-r--r--linuxthreads/sysdeps/pthread/res-state.c47
-rw-r--r--linuxthreads/sysdeps/pthread/semaphore.h1
-rw-r--r--linuxthreads/sysdeps/pthread/sigaction.c55
-rw-r--r--linuxthreads/sysdeps/pthread/tcb-offsets.h1
-rw-r--r--linuxthreads/sysdeps/pthread/timer_create.c170
-rw-r--r--linuxthreads/sysdeps/pthread/timer_delete.c70
-rw-r--r--linuxthreads/sysdeps/pthread/timer_getoverr.c45
-rw-r--r--linuxthreads/sysdeps/pthread/timer_gettime.c77
-rw-r--r--linuxthreads/sysdeps/pthread/timer_routines.c573
-rw-r--r--linuxthreads/sysdeps/pthread/timer_settime.c137
-rw-r--r--linuxthreads/sysdeps/pthread/tst-timer.c114
-rw-r--r--linuxthreads/sysdeps/s390/Makefile6
-rw-r--r--linuxthreads/sysdeps/s390/pspinlock.c91
-rw-r--r--linuxthreads/sysdeps/s390/s390-32/pt-machine.h120
-rw-r--r--linuxthreads/sysdeps/s390/s390-64/pt-machine.h125
-rw-r--r--linuxthreads/sysdeps/s390/tcb-offsets.sym4
-rw-r--r--linuxthreads/sysdeps/s390/tls.h152
-rw-r--r--linuxthreads/sysdeps/sh/Makefile3
-rw-r--r--linuxthreads/sysdeps/sh/pspinlock.c80
-rw-r--r--linuxthreads/sysdeps/sh/pt-machine.h81
-rw-r--r--linuxthreads/sysdeps/sh/tcb-offsets.sym10
-rw-r--r--linuxthreads/sysdeps/sh/tls.h160
-rw-r--r--linuxthreads/sysdeps/sparc/Makefile3
-rw-r--r--linuxthreads/sysdeps/sparc/sparc32/pspinlock.c88
-rw-r--r--linuxthreads/sysdeps/sparc/sparc32/pt-machine.h83
-rw-r--r--linuxthreads/sysdeps/sparc/sparc32/sparcv9/Versions5
-rw-r--r--linuxthreads/sysdeps/sparc/sparc32/sparcv9/pspinlock.c94
-rw-r--r--linuxthreads/sysdeps/sparc/sparc64/Versions5
-rw-r--r--linuxthreads/sysdeps/sparc/sparc64/pspinlock.c93
-rw-r--r--linuxthreads/sysdeps/sparc/sparc64/pt-machine.h105
-rw-r--r--linuxthreads/sysdeps/sparc/tcb-offsets.sym4
-rw-r--r--linuxthreads/sysdeps/sparc/tls.h122
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/Implies1
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/Makefile3
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/Versions5
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/allocalim.h26
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/allocrtsig.c87
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/alpha/Makefile3
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/alpha/Versions6
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/alpha/aio_cancel.c33
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h92
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h66
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/alpha/pt-sigsuspend.S28
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h146
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S70
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h92
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/bits/posix_opt.h181
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h38
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/execve.c73
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/fork.c43
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/fork.h60
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/hppa/aio_cancel.c33
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/hppa/bits/initspin.h27
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/hppa/malloc-machine.h73
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/hppa/pt-initfini.c109
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h189
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/i386/dl-sysdep.h64
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h188
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/i386/vfork.S95
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/ia64/Makefile3
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/ia64/Versions6
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h92
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/ia64/dl-sysdep.h49
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/ia64/fork.h25
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-initfini.c142
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-sigsuspend.c33
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h144
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/ia64/vfork.S54
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/jmp-unwind.c34
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h129
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/m68k/vfork.S84
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/mips/Makefile3
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h144
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h143
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/mips/vfork.S104
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/mq_notify.c287
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/powerpc/Makefile2
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/powerpc/Versions5
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h159
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S86
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h127
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S91
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/powerpc/ptlongjmp.c70
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/pt-sigsuspend.c56
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/raise.c36
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/register-atfork.c88
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/s390/bits/typesizes.h72
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/pt-initfini.c154
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h137
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/vfork.S69
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-initfini.c137
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-sigsuspend.c1
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h116
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/vfork.S54
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/sh/pt-initfini.c143
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/sh/smp.h24
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h227
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/sh/vfork.S77
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/sigwait.c88
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/smp.h48
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/sparc/Versions6
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/sparc/aio_cancel.c33
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h92
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h66
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/sparc/fork.h34
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h102
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S65
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile5
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/pt-sigsuspend.c1
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h101
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S64
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/unregister-atfork.c49
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/x86_64/Makefile4
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/x86_64/pt-sigsuspend.c1
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h132
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/x86_64/vfork.S62
-rw-r--r--linuxthreads/sysdeps/x86_64/Makefile3
-rw-r--r--linuxthreads/sysdeps/x86_64/Versions5
-rw-r--r--linuxthreads/sysdeps/x86_64/pspinlock.c97
-rw-r--r--linuxthreads/sysdeps/x86_64/pt-machine.h225
-rw-r--r--linuxthreads/sysdeps/x86_64/tcb-offsets.sym4
-rw-r--r--linuxthreads/sysdeps/x86_64/tls.h141
-rw-r--r--linuxthreads/tst-_res1.c69
-rw-r--r--linuxthreads/tst-_res1mod1.c23
-rw-r--r--linuxthreads/tst-_res1mod2.c1
-rw-r--r--linuxthreads/tst-align.c71
-rw-r--r--linuxthreads/tst-attr1.c358
-rw-r--r--linuxthreads/tst-cancel-static.c1
-rw-r--r--linuxthreads/tst-cancel-wrappers.sh92
-rw-r--r--linuxthreads/tst-cancel.c214
-rw-r--r--linuxthreads/tst-cancel1.c150
-rw-r--r--linuxthreads/tst-cancel2.c100
-rw-r--r--linuxthreads/tst-cancel3.c98
-rw-r--r--linuxthreads/tst-cancel4.c469
-rw-r--r--linuxthreads/tst-cancel5.c1
-rw-r--r--linuxthreads/tst-cancel6.c79
-rw-r--r--linuxthreads/tst-cancel7.c111
-rw-r--r--linuxthreads/tst-cancel8.c287
-rw-r--r--linuxthreads/tst-clock1.c202
-rw-r--r--linuxthreads/tst-context.c116
-rw-r--r--linuxthreads/tst-popen.c37
-rw-r--r--linuxthreads/tst-popen2.c41
-rw-r--r--linuxthreads/tst-signal.c64
-rw-r--r--linuxthreads/tst-signal.sh28
-rw-r--r--linuxthreads/tst-stack1.c97
-rw-r--r--linuxthreads/tst-static-locale.c13
-rw-r--r--linuxthreads/tst-tls1.c91
-rw-r--r--linuxthreads/tst-tls1.h28
-rw-r--r--linuxthreads/tst-tls1mod.c6
-rw-r--r--linuxthreads/tst-tls1moda.c6
-rw-r--r--linuxthreads/tst-tls1modb.c6
-rw-r--r--linuxthreads/tst-tls1modc.c6
-rw-r--r--linuxthreads/tst-tls1modd.c6
-rw-r--r--linuxthreads/tst-tls1mode.c8
-rw-r--r--linuxthreads/tst-tls1modf.c9
-rw-r--r--linuxthreads/tst-tls2.sh53
-rw-r--r--linuxthreads/tst-tsd1.c118
-rw-r--r--linuxthreads/tststack.c74
-rw-r--r--linuxthreads/unload.c45
-rw-r--r--linuxthreads_db/Banner1
-rw-r--r--linuxthreads_db/ChangeLog451
-rw-r--r--linuxthreads_db/Makefile57
-rw-r--r--linuxthreads_db/Versions24
-rw-r--r--linuxthreads_db/proc_service.h70
-rw-r--r--linuxthreads_db/shlib-versions2
-rw-r--r--linuxthreads_db/td_init.c32
-rw-r--r--linuxthreads_db/td_log.c32
-rw-r--r--linuxthreads_db/td_symbol_list.c62
-rw-r--r--linuxthreads_db/td_ta_clear_event.c53
-rw-r--r--linuxthreads_db/td_ta_delete.c58
-rw-r--r--linuxthreads_db/td_ta_enable_stats.c35
-rw-r--r--linuxthreads_db/td_ta_event_addr.c73
-rw-r--r--linuxthreads_db/td_ta_event_getmsg.c129
-rw-r--r--linuxthreads_db/td_ta_get_nthreads.c42
-rw-r--r--linuxthreads_db/td_ta_get_ph.c36
-rw-r--r--linuxthreads_db/td_ta_get_stats.c35
-rw-r--r--linuxthreads_db/td_ta_map_id2thr.c79
-rw-r--r--linuxthreads_db/td_ta_map_lwp2thr.c91
-rw-r--r--linuxthreads_db/td_ta_new.c150
-rw-r--r--linuxthreads_db/td_ta_reset_stats.c35
-rw-r--r--linuxthreads_db/td_ta_set_event.c53
-rw-r--r--linuxthreads_db/td_ta_setconcurrency.c35
-rw-r--r--linuxthreads_db/td_ta_thr_iter.c176
-rw-r--r--linuxthreads_db/td_ta_tsd_iter.c56
-rw-r--r--linuxthreads_db/td_thr_clear_event.c62
-rw-r--r--linuxthreads_db/td_thr_dbresume.c30
-rw-r--r--linuxthreads_db/td_thr_dbsuspend.c30
-rw-r--r--linuxthreads_db/td_thr_event_enable.c57
-rw-r--r--linuxthreads_db/td_thr_event_getmsg.c65
-rw-r--r--linuxthreads_db/td_thr_get_info.c83
-rw-r--r--linuxthreads_db/td_thr_getfpregs.c58
-rw-r--r--linuxthreads_db/td_thr_getgregs.c58
-rw-r--r--linuxthreads_db/td_thr_getxregs.c30
-rw-r--r--linuxthreads_db/td_thr_getxregsize.c30
-rw-r--r--linuxthreads_db/td_thr_set_event.c62
-rw-r--r--linuxthreads_db/td_thr_setfpregs.c47
-rw-r--r--linuxthreads_db/td_thr_setgregs.c47
-rw-r--r--linuxthreads_db/td_thr_setprio.c30
-rw-r--r--linuxthreads_db/td_thr_setsigpending.c31
-rw-r--r--linuxthreads_db/td_thr_setxregs.c30
-rw-r--r--linuxthreads_db/td_thr_sigsetmask.c30
-rw-r--r--linuxthreads_db/td_thr_tls_get_addr.c45
-rw-r--r--linuxthreads_db/td_thr_tlsbase.c71
-rw-r--r--linuxthreads_db/td_thr_tsd.c82
-rw-r--r--linuxthreads_db/td_thr_validate.c70
-rw-r--r--linuxthreads_db/thread_db.h459
-rw-r--r--linuxthreads_db/thread_dbP.h108
-rw-r--r--localedata/ChangeLog4
-rw-r--r--manual/install.texi12
-rw-r--r--nis/nss_compat/compat-grp.c17
-rw-r--r--nis/nss_compat/compat-pwd.c18
-rw-r--r--nis/nss_compat/compat-spwd.c18
-rw-r--r--nptl/ChangeLog17
-rw-r--r--nptl/Makeconfig4
-rw-r--r--nptl/descr.h7
-rw-r--r--nptl/sysdeps/ia64/tcb-offsets.sym6
-rw-r--r--nptl/sysdeps/ia64/tls.h26
-rw-r--r--nptl/sysdeps/unix/sysv/linux/ia64/createthread.c4
-rw-r--r--posix/regex_internal.c8
-rw-r--r--resolv/Depend1
-rw-r--r--resolv/res_send.c8
-rw-r--r--rt/Depend1
-rw-r--r--sysdeps/generic/libc-start.c14
-rw-r--r--sysdeps/generic/s_ctan.c16
-rw-r--r--sysdeps/generic/s_ctanf.c17
-rw-r--r--sysdeps/generic/s_ctanh.c16
-rw-r--r--sysdeps/generic/s_ctanhf.c16
-rw-r--r--sysdeps/generic/s_ctanhl.c16
-rw-r--r--sysdeps/generic/s_ctanl.c17
-rw-r--r--sysdeps/hppa/add_n.s12
-rw-r--r--sysdeps/hppa/hppa1.1/udiv_qrnnd.s20
-rw-r--r--sysdeps/hppa/lshift.s20
-rw-r--r--sysdeps/hppa/rshift.s20
-rw-r--r--sysdeps/hppa/setjmp.S22
-rw-r--r--sysdeps/hppa/sub_n.s12
-rw-r--r--sysdeps/hppa/udiv_qrnnd.s10
-rw-r--r--sysdeps/i386/dl-trampoline.S2
-rw-r--r--sysdeps/ia64/dl-trampoline.S4
-rw-r--r--sysdeps/powerpc/elf/libc-start.c1
-rw-r--r--sysdeps/powerpc/powerpc32/dl-trampoline.S2
-rw-r--r--sysdeps/powerpc/powerpc64/dl-trampoline.S45
-rw-r--r--sysdeps/s390/s390-32/dl-trampoline.S5
-rw-r--r--sysdeps/s390/s390-64/dl-trampoline.S2
-rw-r--r--sysdeps/unix/sysv/linux/bits/sched.h4
-rw-r--r--sysdeps/unix/sysv/linux/configure21
-rw-r--r--sysdeps/unix/sysv/linux/configure.in21
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/Makefile2
-rw-r--r--sysdeps/x86_64/dl-trampoline.S3
428 files changed, 568 insertions, 46146 deletions
diff --git a/ChangeLog b/ChangeLog
index c0ecf6ad6a..66ad07ce84 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,127 @@
+2005-07-07 Ulrich Drepper <drepper@redhat.com>
+
+ * resolv/res_send.c (send_dg): Recognize referral results and
+ treat them as server errors.
+ Based on a patch by Jason Vas Dias <jvdias@redhat.com>.
+
+2005-07-08 Carlos O'Donell <carlos@systemhalted.org>
+
+ * sysdeps/hppa/setjmp.S (__sigsetjmp): Use %r1 not %r19.
+
+ * sysdeps/hppa/add_n.s (__mpn_add_n): Use sr0 or r0, not 0.
+ * sysdeps/hppa/lshift.s (__mpn_lshift): Likewise.
+ * sysdeps/hppa/rshift.s (__mpn_rshift): Likewise.
+ * sysdeps/hppa/sub_n.s (__mpn_sub_n): Likewise.
+ * sysdeps/hppa/udiv_qrnnd.s (__udiv_qrnnd): Likewise.
+ * sysdeps/hppa/hppa1.1/udiv_qrnnd.s (__udiv_qrnnd): Likewise.
+
+2005-07-07 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/generic/s_ctanh.c (__ctanh): Handle case of zero den better.
+ * sysdeps/generic/s_ctanhf.c (__ctanhf): Likewise.
+ * sysdeps/generic/s_ctanhl.c (__ctanhl): Likewise.
+ * sysdeps/generic/s_ctan.c (__ctan): Likewise.
+ * sysdeps/generic/s_ctanf.c (__ctanf): Likewise.
+ * sysdeps/generic/s_ctanl.c (__ctanl): Likewise.
+
+2005-04-13 H.J. Lu <hongjiu.lu@intel.com>
+
+ [BZ #974]
+ * csu/elf-init.c (__preinit_array_start): Take int, char **, char **.
+ (__preinit_array_end): Likewise.
+ (__init_array_start): Likewise.
+ (__init_array_end): Likewise.
+ (__libc_csu_init): Take int argc, char **argv, char **envp.
+ Call preinit_array and init_array with argc, argv, envp.
+ * sysdeps/generic/libc-start.c (LIBC_START_MAIN): Remove
+ INIT_MAIN_ARGS.
+ * sysdeps/powerpc/elf/libc-start.c (INIT_MAIN_ARGS): Removed.
+ * elf/Makefile (distribute): Add tst-array5.c, tst-array5-static.c,
+ tst-array5dep.c, and tst-array5.exp.
+ (tests): Add tst-array5.
+ (tests-static): Add tst-array5-static.
+ ($(objpfx)tst-array5): New target.
+ ($(objpfx)tst-array5.out): Likewise.
+ ($(objpfx)tst-array5-static.out): Likewise.
+ * elf/tst-array5-static.c: New file.
+ * elf/tst-array5-static.exp: Likewise.
+ * elf/tst-array5.c: Likewise.
+ * elf/tst-array5.exp: Likewise.
+ * elf/tst-array5dep.c: Likewise.
+
+2005-07-07 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/unix/sysv/linux/bits/sched.h: Adjust clone prototype.
+
+2005-07-05 Jakub Jelinek <jakub@redhat.com>
+
+ * elf/stackguard-macros.h (STACK_CHK_GUARD): Fix s390/s390x definition.
+ Reported by Ulrich Weigand <uweigand@de.ibm.com>.
+
+ * elf/stackguard-macros.h (STACK_CHK_GUARD): Add ia64 definition.
+
+2005-07-06 Ulrich Drepper <drepper@redhat.com>
+
+ * elf/dl-error.c (_dl_signal_error): When testing for executable
+ being relocated, take into account that nothing might even be loaded.
+
+ * elf/dl-reloc.c [PROF] (_dl_relocate_object): Define
+ consider_profiling always to zero. Don't count of compiler to
+ remove unreached if block.
+ * sysdeps/x86_64/dl-trampoline.S [PROF] (_dl_runtime_profile):
+ Don't compile.
+ * sysdeps/i386/dl-trampoline.S [PROF] (_dl_runtime_profile): Likewise.
+ * sysdeps/ia64/dl-trampoline.S [PROF] (_dl_runtime_profile): Likewise.
+ * sysdeps/s390/s390-64/dl-trampoline.S [PROF] (_dl_runtime_profile):
+ Likewise.
+ * sysdeps/s390/s390-32/dl-trampoline.S [PROF] (_dl_runtime_profile):
+ Likewise.
+ * sysdeps/powerpc/powerpc64/dl-trampoline.S [PROF]
+ (_dl_profile_resolve): Likewise.
+ * sysdeps/powerpc/powerpc32/dl-trampoline.S [PROF]
+ (_dl_profile_resolve): Likewise.
+ * gmon/Makefile: Add rules to build and run tst-profile-static.
+ * gmon/tst-profile-static.c: New file.
+ * Makeconfig (+link-static): Allow passing program-specific flags.
+
+2005-07-05 Thorsten Kukuk <kukuk@suse.de>
+
+ * nis/nss_compat/compat-grp.c (internal_getgrgid_r): Check if NSS
+ module provides getgrgid_r.
+ (getgrnam_plusgroup): Preserve original return value.
+ * nis/nss_compat/compat-pwd.c (getpwnam_plususer): Preserve
+ original return value.
+ * nis/nss_compat/compat-spwd.c (getspnam_plususer): Likewise.
+
+2005-07-05 Ulrich Drepper <drepper@redhat.com>
+
+ * posix/regex_internal.c (build_wcs_buffer): Use MB_LEN_MAX not
+ MB_CUR_MAX.
+ (build_wcs_upper_buffer): Likewise.
+
+ * csu/elf-init.c (__libc_csu_fini): Pretty printing.
+
+2005-07-02 Roland McGrath <roland@redhat.com>
+
+ * NEWS: Note LinuxThreads removal.
+ * manual/install.texi (Installation): Don't mention linuxthreads.
+ (Configuring and compiling): Don't use linuxthreads as example.
+
+ * sysdeps/unix/sysv/linux/configure.in: Check for nptl add-on only,
+ not linuxthreads.
+ * sysdeps/unix/sysv/linux/configure: Regenerated.
+ * resolv/Depend: Add nptl.
+ * rt/Depend: Likewise.
+
+ * linuxthreads, linuxthreads_db: Directories removed (preserved in
+ ports repository).
+
+2005-06-27 Jakub Jelinek <jj@ultra.linux.cz>
+
+ [BZ #1037]
+ * sysdeps/unix/sysv/linux/sparc/sparc32/Makefile: -mv8 is deprecated,
+ use -mcpu=v8.
+
2005-06-16 Jakub Jelinek <jakub@redhat.com>
[BZ #1016]
diff --git a/Makeconfig b/Makeconfig
index 4c3a4e344c..b280aa5adb 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -415,7 +415,7 @@ endif
# Command for statically linking programs with the C library.
ifndef +link-static
+link-static = $(CC) -nostdlib -nostartfiles -static -o $@ \
- $(sysdep-LDFLAGS) $(LDFLAGS) \
+ $(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \
$(addprefix $(csu-objpfx),$(static-start-installed-name)) \
$(+preinit) $(+prector) \
$(filter-out $(addprefix $(csu-objpfx),start.o \
diff --git a/NEWS b/NEWS
index 3ece35565b..10c68ca9e5 100644
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,11 @@ Version 2.4
* It is now possible to install audit libraries for the dynamic linker using
LD_AUDIT. Implemented by Ulrich Drepper.
+
+* The LinuxThreads add-on, providing pthreads on Linux 2.4 kernels, is no
+ longer supported. The new NPTL implementation requires Linux 2.6 kernels.
+ For a libc and libpthread that works well on Linux 2.4 kernels, we
+ recommend using the stable 2.3 branch.
Version 2.3.5
diff --git a/csu/elf-init.c b/csu/elf-init.c
index fcf6a04315..12ae15747c 100644
--- a/csu/elf-init.c
+++ b/csu/elf-init.c
@@ -38,10 +38,14 @@
#ifdef HAVE_INITFINI_ARRAY
/* These magic symbols are provided by the linker. */
-extern void (*__preinit_array_start []) (void) attribute_hidden;
-extern void (*__preinit_array_end []) (void) attribute_hidden;
-extern void (*__init_array_start []) (void) attribute_hidden;
-extern void (*__init_array_end []) (void) attribute_hidden;
+extern void (*__preinit_array_start []) (int, char **, char **)
+ attribute_hidden;
+extern void (*__preinit_array_end []) (int, char **, char **)
+ attribute_hidden;
+extern void (*__init_array_start []) (int, char **, char **)
+ attribute_hidden;
+extern void (*__init_array_end []) (int, char **, char **)
+ attribute_hidden;
extern void (*__fini_array_start []) (void) attribute_hidden;
extern void (*__fini_array_end []) (void) attribute_hidden;
@@ -75,7 +79,7 @@ extern void _fini (void);
the libc.a module in that it doesn't call the preinit array. */
void
-__libc_csu_init (void)
+__libc_csu_init (int argc, char **argv, char **envp)
{
#ifdef HAVE_INITFINI_ARRAY
/* For dynamically linked executables the preinit array is executed by
@@ -87,7 +91,7 @@ __libc_csu_init (void)
const size_t size = __preinit_array_end - __preinit_array_start;
size_t i;
for (i = 0; i < size; i++)
- (*__preinit_array_start [i]) ();
+ (*__preinit_array_start [i]) (argc, argv, envp);
}
# endif
#endif
@@ -99,7 +103,7 @@ __libc_csu_init (void)
const size_t size = __init_array_end - __init_array_start;
size_t i;
for (i = 0; i < size; i++)
- (*__init_array_start [i]) ();
+ (*__init_array_start [i]) (argc, argv, envp);
}
#endif
}
@@ -111,11 +115,11 @@ void
__libc_csu_fini (void)
{
#ifndef LIBC_NONSHARED
-#ifdef HAVE_INITFINI_ARRAY
+# ifdef HAVE_INITFINI_ARRAY
size_t i = __fini_array_end - __fini_array_start;
while (i-- > 0)
(*__fini_array_start [i]) ();
-#endif
+# endif
_fini ();
#endif
diff --git a/elf/Makefile b/elf/Makefile
index c43eb02f5b..a563f0190f 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -88,7 +88,9 @@ distribute := rtld-Rules \
unload4mod1.c unload4mod2.c unload4mod3.c unload4mod4.c \
unload6mod1.c unload6mod2.c unload6mod3.c tst-auditmod1.c \
order2mod1.c order2mod2.c order2mod3.c order2mod4.c \
- tst-stackguard1.c tst-stackguard1-static.c
+ tst-stackguard1.c tst-stackguard1-static.c \
+ tst-array5.c tst-array5-static.c tst-array5dep.c \
+ tst-array5.exp
CFLAGS-dl-runtime.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-dl-lookup.c = -fexceptions -fasynchronous-unwind-tables
@@ -138,7 +140,7 @@ endif
tests = tst-tls1 tst-tls2 tst-tls9
ifeq (yes,$(have-initfini-array))
-tests += tst-array1 tst-array2 tst-array3 tst-array4
+tests += tst-array1 tst-array2 tst-array3 tst-array4 tst-array5
endif
ifeq (yes,$(build-static))
tests-static = tst-tls1-static tst-tls2-static tst-stackguard1-static
@@ -148,7 +150,7 @@ tst-tls9-static-ENV = \
LD_LIBRARY_PATH=$(objpfx):$(common-objpfx):$(common-objpfx)dlfcn
endif
ifeq (yes,$(have-initfini-array))
-tests-static += tst-array1-static
+tests-static += tst-array1-static tst-array5-static
endif
tests += $(tests-static)
endif
@@ -206,7 +208,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
unload6mod1 unload6mod2 unload6mod3 \
order2mod1 order2mod2 order2mod3 order2mod4
ifeq (yes,$(have-initfini-array))
-modules-names += tst-array2dep
+modules-names += tst-array2dep tst-array5dep
endif
ifeq (yesyes,$(have-fpie)$(build-shared))
modules-names += tst-piemod1
@@ -767,6 +769,17 @@ $(objpfx)tst-array4.out: $(objpfx)tst-array4 $(objpfx)tst-array2dep.so
$< > $@
cmp $@ tst-array4.exp > /dev/null
+$(objpfx)tst-array5: $(objpfx)tst-array5dep.so
+$(objpfx)tst-array5.out: $(objpfx)tst-array5
+ $(elf-objpfx)$(rtld-installed-name) \
+ --library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \
+ $(objpfx)tst-array5 > $@
+ cmp $@ tst-array5.exp > /dev/null
+
+$(objpfx)tst-array5-static.out: $(objpfx)tst-array5-static
+ $(objpfx)tst-array5-static > $@
+ cmp $@ tst-array5-static.exp > /dev/null
+
ifeq (yesyes,$(have-fpie)$(build-shared))
CFLAGS-tst-pie1.c += -fpie
diff --git a/elf/dl-error.c b/elf/dl-error.c
index a63d801411..3a0d9bb8a7 100644
--- a/elf/dl-error.c
+++ b/elf/dl-error.c
@@ -98,8 +98,9 @@ _dl_signal_error (int errcode, const char *objname, const char *occation,
/* If the main executable is relocated it means the libc's malloc
is used. */
#ifdef SHARED
- lcatch->malloced = (GL(dl_ns)[LM_ID_BASE]._ns_loaded->l_relocated
- != 0);
+ lcatch->malloced = (GL(dl_ns)[LM_ID_BASE]._ns_loaded != NULL
+ && (GL(dl_ns)[LM_ID_BASE]._ns_loaded->l_relocated
+ != 0));
#else
lcatch->malloced = true;
#endif
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index 2d309fb210..117410e924 100644
--- a/elf/dl-reloc.c
+++ b/elf/dl-reloc.c
@@ -153,6 +153,9 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
#ifdef SHARED
/* If we are auditing, install the same handlers we need for profiling. */
consider_profiling |= GLRO(dl_audit) != NULL;
+#elif defined PROF
+ /* Never use dynamic linker profiling for gprof profiling code. */
+# define consider_profiling 0
#endif
if (l->l_relocated)
@@ -264,6 +267,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
ELF_DYNAMIC_RELOCATE (l, lazy, consider_profiling);
+#ifndef PROF
if (__builtin_expect (consider_profiling, 0))
{
/* Allocate the array which will contain the already found
@@ -288,6 +292,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
goto fatal;
}
}
+#endif
}
/* Mark the object so we know this work has been done. */
diff --git a/elf/stackguard-macros.h b/elf/stackguard-macros.h
index 0fbf4d2c0b..97db8bc22a 100644
--- a/elf/stackguard-macros.h
+++ b/elf/stackguard-macros.h
@@ -20,10 +20,13 @@
({ uintptr_t x; asm ("ld [%%g7+0x14], %0" : "=r" (x)); x; })
#elif defined __s390x__
# define STACK_CHK_GUARD \
- ({ uintptr_t x; asm ("ear %0,%a0; sllg %0,%0,32; ear %0,%a1; lg %0,0x28(%0)" : "=r" (x)); x; })
+ ({ uintptr_t x; asm ("ear %0,%%a0; sllg %0,%0,32; ear %0,%%a1; lg %0,0x28(%0)" : "=a" (x)); x; })
#elif defined __s390__
# define STACK_CHK_GUARD \
- ({ uintptr_t x; asm ("ear %0,%%a0; l %0,0x14(%0)" : "=r" (x)); x; })
+ ({ uintptr_t x; asm ("ear %0,%%a0; l %0,0x14(%0)" : "=a" (x)); x; })
+#elif defined __ia64__
+# define STACK_CHK_GUARD \
+ ({ uintptr_t x; asm ("adds %0 = -8, r13;; ld8 %0 = [%0]" : "=r" (x)); x; })
#else
extern uintptr_t __stack_chk_guard;
# define STACK_CHK_GUARD __stack_chk_guard
diff --git a/elf/tst-array5-static.c b/elf/tst-array5-static.c
new file mode 100644
index 0000000000..4ef2aba3f3
--- /dev/null
+++ b/elf/tst-array5-static.c
@@ -0,0 +1 @@
+#include "tst-array5.c"
diff --git a/elf/tst-array5-static.exp b/elf/tst-array5-static.exp
new file mode 100644
index 0000000000..b1dc9e467b
--- /dev/null
+++ b/elf/tst-array5-static.exp
@@ -0,0 +1,2 @@
+preinit array in executable: tst-array5-static
+init array in executable: tst-array5-static
diff --git a/elf/tst-array5.c b/elf/tst-array5.c
new file mode 100644
index 0000000000..03a5668326
--- /dev/null
+++ b/elf/tst-array5.c
@@ -0,0 +1,50 @@
+#include <string.h>
+#include <unistd.h>
+
+static void
+preinit_0 (int argc __attribute__ ((unused)), char **argv)
+{
+ char *p = strrchr (argv [0], '/');
+
+ if (p == NULL)
+ return;
+
+ p++;
+ size_t len = strlen (p);
+ write (STDOUT_FILENO, "preinit array in executable: ", 29);
+ write (STDOUT_FILENO, p, len);
+ write (STDOUT_FILENO, "\n", 1);
+}
+
+void (*const preinit_array []) (int, char **)
+ __attribute__ ((section (".preinit_array"), aligned (sizeof (void *)))) =
+{
+ &preinit_0,
+};
+
+static void
+init_0 (int argc __attribute__ ((unused)), char **argv)
+{
+ char *p = strrchr (argv [0], '/');
+
+ if (p == NULL)
+ return;
+
+ p++;
+ size_t len = strlen (p);
+ write (STDOUT_FILENO, "init array in executable: ", 26);
+ write (STDOUT_FILENO, p, len);
+ write (STDOUT_FILENO, "\n", 1);
+}
+
+void (*const init_array []) (int, char **)
+ __attribute__ ((section (".init_array"), aligned (sizeof (void *)))) =
+{
+ &init_0,
+};
+
+int
+main (void)
+{
+ return 0;
+}
diff --git a/elf/tst-array5.exp b/elf/tst-array5.exp
new file mode 100644
index 0000000000..28b4909833
--- /dev/null
+++ b/elf/tst-array5.exp
@@ -0,0 +1,3 @@
+preinit array in executable: tst-array5
+init array in DSO: tst-array5
+init array in executable: tst-array5
diff --git a/elf/tst-array5dep.c b/elf/tst-array5dep.c
new file mode 100644
index 0000000000..570d282af4
--- /dev/null
+++ b/elf/tst-array5dep.c
@@ -0,0 +1,23 @@
+#include <string.h>
+#include <unistd.h>
+
+static void
+init_0 (int argc __attribute__ ((unused)), char **argv)
+{
+ char *p = strrchr (argv [0], '/');
+
+ if (p == NULL)
+ return;
+
+ p++;
+ size_t len = strlen (p);
+ write (STDOUT_FILENO, "init array in DSO: ", 19);
+ write (STDOUT_FILENO, p, len);
+ write (STDOUT_FILENO, "\n", 1);
+}
+
+void (*const init_array []) (int, char **)
+ __attribute__ ((section (".init_array"), aligned (sizeof (void *)))) =
+{
+ &init_0,
+};
diff --git a/fedora/branch.mk b/fedora/branch.mk
index daf78e7120..7aea6ca945 100644
--- a/fedora/branch.mk
+++ b/fedora/branch.mk
@@ -1,5 +1,5 @@
# This file is updated automatically by Makefile.
glibc-branch := fedora
glibc-base := HEAD
-fedora-sync-date := 2005-06-27 08:50 UTC
-fedora-sync-tag := fedora-glibc-20050627T0850
+fedora-sync-date := 2005-07-08 08:11 UTC
+fedora-sync-tag := fedora-glibc-20050708T0811
diff --git a/fedora/glibc.spec.in b/fedora/glibc.spec.in
index 278cab70f4..14ab9ff772 100644
--- a/fedora/glibc.spec.in
+++ b/fedora/glibc.spec.in
@@ -1,4 +1,4 @@
-%define glibcrelease 1
+%define glibcrelease 2
%define auxarches i586 i686 athlon sparcv9 alphaev6
%define prelinkarches noarch
%define xenarches i686 athlon
@@ -1072,6 +1072,10 @@ rm -f *.filelist*
%endif
%changelog
+* Fri Jul 8 2005 Jakub Jelinek <jakub@redhat.com> 2.3.90-2
+- update from CVS
+ - ia64 stack protector support
+
* Mon Jun 27 2005 Jakub Jelinek <jakub@redhat.com> 2.3.90-1
- update from CVS
- stack protector support
diff --git a/gmon/Makefile b/gmon/Makefile
index 80a79456f7..969edd5575 100644
--- a/gmon/Makefile
+++ b/gmon/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1995, 1996, 1997, 2001, 2002 Free Software Foundation, Inc.
+# Copyright (C) 1995,1996,1997,2001,2002,2005 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
@@ -27,7 +27,15 @@ routines := gmon mcount profil sprofil bb_init_func bb_exit_func prof-freq
elide-routines.os = bb_init_func bb_exit_func
-tests := tst-sprofil
+include ../Makeconfig
+
+tests = tst-sprofil
+ifeq ($(build-profile),yes)
+tests += tst-profile-static
+tests-static += tst-profile-static
+
+LDFLAGS-tst-profile-static = -profile
+endif
# The mcount code won't work without a frame pointer.
CFLAGS-mcount.c := -fno-omit-frame-pointer
diff --git a/gmon/tst-profile-static.c b/gmon/tst-profile-static.c
new file mode 100644
index 0000000000..b2f371e782
--- /dev/null
+++ b/gmon/tst-profile-static.c
@@ -0,0 +1,10 @@
+#include <stdio.h>
+static int
+do_test (void)
+{
+ puts ("Hello world");
+ return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/linuxthreads/Banner b/linuxthreads/Banner
deleted file mode 100644
index f0be105a5d..0000000000
--- a/linuxthreads/Banner
+++ /dev/null
@@ -1 +0,0 @@
-linuxthreads-0.10 by Xavier Leroy
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog
deleted file mode 100644
index d952f9c164..0000000000
--- a/linuxthreads/ChangeLog
+++ /dev/null
@@ -1,6631 +0,0 @@
-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.
- (SINGLE_THREAD_P): Add variant for new PLT/GOT layout.
- * sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S (__vfork): Avoid
- bl into the GOT when HAVE_ASM_PPC_REL16.
-
-2005-05-30 Jakub Jelinek <jakub@redhat.com>
-
- * man/Makefile (SOURCES): Remove all man pages but
- pthread_cleanup_push.man, pthread_kill_other_threads_np.man
- and pthread_mutexattr_setkind_np.man.
- * man/pthread_cleanup_push.man: Replace (3) with (3p) where man page
- was not kept.
- * man/pthread_kill_other_threads_np.man: Likewise.
- * man/pthread_mutexattr_setkind_np.man: Likewise.
-
-2005-05-23 Roland McGrath <roland@redhat.com>
-
- * sysdeps/arm, sysdeps/unix/sysv/linux/arm: Subdirectories moved to
- ports repository.
-
-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.
- * sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S: Likewise.
-
-2005-05-19 Richard Henderson <rth@redhat.com>
-
- * sysdeps/ia64/pspinlock.c (__pthread_spin_lock): Use
- __sync_val_compare_and_swap, not explicit _si variant.
- (__pthread_spin_trylock): Likewise.
-
-2005-05-05 Daniel Jacobowitz <dan@codesourcery.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/pthread/getcpuclockid.c: Include spinlock.h.
- Fix a typo in kernel-posix-cpy-timers.h include name, use <> instead
- of "" includes.
- (pthread_getcpuclockid): Fix 2 typos.
-
-2005-04-27 Roland McGrath <roland@redhat.com>
-
- * sysdeps/pthread/getcpuclockid.c (pthread_getcpuclockid)
- [__NR_clock_getres]: Use kernel-supplied CPU clocks if available.
-
-2005-03-31 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h: Use
- functionally equivalent, but shorter instructions.
-
-2005-03-28 Daniel Jacobowitz <dan@codesourcery.com>
-
- * sysdeps/mips/tls.h: New file.
- * sysdeps/unix/sysv/linux/mips/vfork.S: New file.
-
-2005-03-21 GOTO Masanori <gotom@debian.or.jp>
-
- * linuxthreads/sysdeps/m68k/Makefile: Remove to delete
- unneeded o-iterator thing.
-
-2005-02-21 H.J. Lu <hongjiu.lu@intel.com>
-
- * sysdeps/unix/sysv/linux/ia64/pt-initfini.c: Add local _init
- and _fini labels.
-
-2005-03-05 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/Makefile (CFLAGS-pt-initfini.s): Unconditionally
- use -mtune.
-
-2005-03-05 Roland McGrath <roland@redhat.com>
-
- * sysdeps/i386/Makefile (CFLAGS-pt-initfini.s): Use $(cc-mtune).
-
-2005-03-05 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/powerpc/tcb-offsets.sym (thread_offsetof): Rework for GCC 4.
-
-2005-02-09 Daniel Jacobowitz <dan@codesourcery.com>
-
- [BZ #740]
- * descr.h (__pthread_find_self, thread_self): Mark as pure
- instead of const.
-
-2005-02-07 Jakub Jelinek <jakub@redhat.com>
-
- [BZ #739]
- * specific.c (pthread_key_delete): If pthread_create has not been
- called yet, clear p_specific for the current thread.
- * Makefile (tests): Add tst-tsd1.
- * tst-tsd1.c: New test.
-
-2005-01-08 Andreas Jaeger <aj@suse.de>
-
- * pthread.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, include <stdbool.h>.
- * 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-21 Jakub Jelinek <jakub@redhat.com>
-
- * Makefile (tests): Add tst-align.
- * tst-align.c: New test.
- * sysdeps/i386/Makefile (CFLAGS-tst-align.c): Add
- -mpreferred-stack-boundary=4.
-
-2004-12-12 Ulrich Drepper <drepper@redhat.com>
-
- * internals.h: Include <stdbool.h> to match includes used in nptl.
-
-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.
- * tst-clock1.c (do_test): Check for availability of CPU clock.
-
-2004-11-18 Daniel Jacobowitz <dan@codesourcery.com>
-
- * sysdeps/unix/sysv/linux/arm/sysdep-cancel.h: Update RETINSTR use.
- * sysdeps/unix/sysv/linux/arm/vfork.S: Likewise.
-
-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): 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-05 Maciej W. Rozycki <macro@mips.com>
-
- * sysdeps/mips/pspinlock.c: Include <sgidefs.h>. Use _ABIO32,
- _ABIN32 and _ABI64 for ABI selection throughout.
- * sysdeps/mips/pt-machine.h: Use _ABIO32, _ABIN32 and _ABI64 for
- ABI selection throughout.
-
-2004-10-18 Roland McGrath <roland@redhat.com>
-
- [BZ #406]
- * Makefile (linuxthreads-CPPFLAGS): New variable;
- adds -DIS_IN_linuxthreads=1.
- * sysdeps/i386/tls.h: Protect "useldt.h" with
- [!IS_IN_linuxthreads && !DO_MODIFY_LDT].
- * sysdeps/i386/i686/pt-machine.h: Revert last change.
-
-2004-10-14 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/pthread/errno-loc.c: Don't undef #errno
- if RTLD_PRIVATE_ERRNO.
-
-2004-10-05 Dwayne Grant McConnell <dgm69@us.ibm.com>
-
- * pthread.c: Mask restart signal during cancel signal handler.
-
-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: Set _POSIX_CPUTIME
- and _POSIX_THREAD_CPUTIME to zero.
- * sysdeps/unix/sysv/linux/ia64/bits/posix_opt.h: Likewise.
-
- * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define
- _POSIX_THREAD_PROCESS_SHARED and _POSIX_CLOCK_SELECTION as -1.
- * 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-09-25 Roland McGrath <roland@redhat.com>
-
- [BZ #406]
- * sysdeps/i386/i686/pt-machine.h: Don't #include "../useldt.h" if
- [_TLS_H], since sysdeps/i386/tls.h includes it after including us.
-
-2004-09-24 Roland McGrath <roland@redhat.com>
-
- [BZ #406]
- * sysdeps/i386/tls.h: Move #include "useldt.h" outside
- of [__ASSUME_LDT_WORKS > 0] test.
- Reported by Carlos Velasco <carlos.velasco@newipnet.com>.
-
-2004-09-21 Roland McGrath <roland@redhat.com>
-
- * Versions: Add comment about linuxthreads' frozen ABI.
-
-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/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-12 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/pthread.h: Make rwlock prototypes available also
- for __USE_XOPEN2K.
- * sysdeps/pthread/bits/pthreadtypes.h: Define rwlock types also
- for __USE_XOPEN2K. [BZ #320]
-
-2004-09-04 Jakub Jelinek <jakub@redhat.com>
-
- * tst-cancel4.c (tf_waitid): Use WEXITED flag bit if available.
-
-2004-09-07 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/pthread.h (pthread_once): Remove __THROW since
- the initialization function might throw.
-
-2004-08-30 Roland McGrath <roland@frob.com>
-
- * Makefile (libpthread-abi-frozen): New variable.
-
-2004-08-26 Roland McGrath <roland@redhat.com>
-
- * configure.in: New file. If nptl add-on is also selected, barf if
- explicit and elide ourselves if implicit.
- * configure: Now generated.
-
-2004-08-25 Richard Sandiford <rsandifo@redhat.com>
-
- * sysdeps/unix/sysv/linux/mips/sysdep-cancel.h (CENABLE, CDISABLE,
- __local_multiple_threads): Fix definitions for IS_IN_librt.
- * sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h: Likewise.
-
-2004-08-22 Andreas Schwab <schwab@suse.de>
-
- * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h (PSEUDO) [IS_IN_librt]:
- Save gp around CENABLE/CDISABLE calls.
-
-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>
-
- * libc-tsd.c: Move resolv.h include before the #if.
- (__res_maybe_init): New function. Add libc_hidden_def.
-
-2004-08-02 Ulrich Drepper <drepper@redhat.com>
-
- * linuxthreads.texi (Cleanup Handlers): Fix typo.
- Reported by Bjoern Engelmann <bjengelmann@gmx.de>.
-
-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-02 Roland McGrath <roland@redhat.com>
-
- * configure: Don't exit.
-
-2004-07-20 Alexandre Oliva <aoliva@redhat.com>
-
- * sysdeps/mips/pt-machine.h: Use standard names for ABI macros,
- include sgidefs.h.
- * sysdeps/mips/atomicity.h: Likewise.
-
-2004-07-19 Alexandre Oliva <aoliva@redhat.com>
-
- * sysdeps/unix/sysv/linux/mips/Makefile (CFLAGS-pt-initfini.s):
- Remove redundant override that missed -g0.
-
-2004-07-14 Kaz Kojima <kkojima@rr.iij4u.or.jp>
-
- * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h
- (__local_multiple_threads): Define for librt.
- (SINGLE_THREAD_P): Likewise.
-
-2004-07-07 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/pthread/getcpuclockid.c (pthread_getcpuclockid): Allow
- using other thread's clock.
- * ptclock_gettime.c (__pthread_clock_gettime): Likewise.
- * ptclock_settime.c (__pthread_clock_settime): Likewise.
- * internals.h (__pthread_clock_gettime, __pthread_clock_settime):
- Remove prototypes.
- Reported by Bernd Schmidt <bernds@redhat.com>.
- * Makefile (librt-tests): Add tst-clock1.
- * tst-clock1.c: New test.
-
- * sysdeps/x86_64/Versions: New file.
- * sysdeps/unix/sysv/linux/ia64/bits/posix_opt.h: New file.
- * sysdeps/unix/sysv/linux/x86_64/bits/posix_opt.h: New file.
-
-2004-04-16 Andreas Schwab <schwab@suse.de>
-
- * sysdeps/ia64/tls.h (INIT_SYSINFO): Cast dl_sysinfo to void*.
-
-2004-07-05 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/s390/pspinlock.c (__pthread_spin_lock,
- __pthread_spin_trylock): Use constraint "m" instead of "0" for
- futex.
- * sysdeps/ia64/pt-machine.h (__compare_and_swap,
- __compare_and_swap_with_release_semantic, testandset): Use
- constraint "m" instead of "0" for futex.
-
-2004-06-29 Kaz Kojima <kkojima@rr.iij4u.or.jp>
-
- * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (CENABLE): Fix
- branch offset for a PLT entry.
- (CDISABLE): Likewise.
-
-2004-05-31 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/unix/sysv/linux/mips/Makefile (CFLAGS-pt-initfini.s):
- Set to -fno-unit-at-a-time.
- Patch by Dan Kegel <dank@kegel.com>.
-
-2004-05-04 Jakub Jelinek <jakub@redhat.com>
-
- * tst-stack1.c: Don't include mcheck.h.
- (do_test): Make sure user defined stacks aren't reused,
- don't free them at the end. [BZ #110]
-
-2004-05-02 Jakub Jelinek <jakub@redhat.com>
-
- * manager.c: Include not-cancel.h.
- (__pthread_manager): Use read_not_cancel instead of __libc_read.
- (pthread_start_thread, __pthread_manager_sighandler): Use
- write_not_cancel instead of __libc_write.
- (pthread_reap_children): Use waitpid_not_cancel instead of
- __libc_waitpid.
- * pthread.c: Include not-cancel.h.
- (__pthread_initialize_minimal, __pthread_create_2_1,
- pthread_onexit_process, __pthread_message): Use
- write_not_cancel instead of __libc_write.
- (__pthread_initialize_manager): Likewise. Use close_not_cancel
- instead of __libc_close.
- (__pthread_reset_main_thread): Use close_not_cancel instead of
- __libc_close.
- * join.c: Include not-cancel.h.
- (__pthread_do_exit, pthread_join, pthread_detach): Use
- write_not_cancel instead of __libc_write.
- * semaphore.c: Include not-cancel.h.
- (__new_sem_post): Use write_not_cancel instead of __libc_write.
- * specific.c: Include not-cancel.h.
- (pthread_key_delete): Use write_not_cancel instead of __libc_write.
-
-2004-05-01 Jakub Jelinek <jakub@redhat.com>
-
- * Versions (libc): Add __on_exit and __libc_sigaction.
-
-2004-04-28 Jakub Jelinek <jakub@redhat.com>
-
- * semaphore.c (sem_timedwait): Return -1 and set errno instead of
- returning error number [BZ #133]. Patch by <rmhaddad@yahoo.com>.
-
-2004-04-22 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
-
- * sysdeps/unix/sysv/linux/sh/vfork.S: Fix wrong function pointer
- reference in PIC case.
-
-2004-04-20 Jakub Jelinek <jakub@redhat.com>
-
- * oldsemaphore.c (SEM_VALUE_MAX): Remove.
-
-2004-04-19 Kaz Kojima <kkojima@rr.iij4u.or.jp>
-
- * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (CENABLE): Define
- for librt. Save the return value to a safe register.
- (CDISABLE): Define for librt. Set the function argument correctly.
-
-2004-04-18 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h
- (PSEUDO_CANCEL): Define.
- (PSEUDO): Use it.
- * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h (CENABLE,
- CDISABLE): For librt, append @PLT.
-
-2004-04-17 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/x86_64/tls.h [!__ASSEMBLER__]: Include tcb-offsets.h.
-
- * 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.
-
- * sysdeps/unix/sysv/linux/mq_notify.c: Include stdlib.h.
-
-2004-04-17 Ulrich Drepper <drepper@redhat.com>
-
- * semaphore.h (SEM_VALUE_MAX): Just use a plain number.
-
-2004-04-16 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Fix last patch.
-
-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.
-
- * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (CENABLE): Define
- for librt.
- (CDISABLE): Likewise.
-
-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.
-
-2004-04-10 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/x86_64/pt-machine.h: Add used attribute to stack_pointer
- to avoid warnings with GCC 3.5.
-
-2004-04-09 Steven Munroe <sjmunroe@us.ibm.com>
-
- * sysdeps/powerpc/tls.h (TLS_INIT_TP): Eliminate lvalue cast from
- __thread_self assignment.
- (THREAD_DTV): Replace __thread_register with __thread_self.
- (INIT_THREAD_SELF): Eliminate lvalue cast from __thread_self
- assignment.
-
-2004-04-08 Alexandre Oliva <aoliva@redhat.com>
-
- * signals.c (pthread_sigmask): Don't ever block or mask
- __pthread_sig_debug.
-
-2004-03-11 Steven Munroe <sjmunroe@us.ibm.com>
-
- * sysdeps/powerpc/tls.h: Remove __powerpc64__ conditional.
-
-2004-03-23 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/ia64/pt-machine.h (BUSY_WAIT_NOP): Define.
- * sysdeps/x86_64/pt-machine.h (BUSY_WAIT_NOP): Likewise.
-
-2004-03-12 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/bits/local_lim.h: Add 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-08 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/i386/tls.h (TLS_DO_MODIFY_LDT_KERNEL_CHECK):
- dl_osversion is readonly.
-
-2004-03-07 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/tls.h (INIT_SYSINFO): _dl_sysinfo is now in
- _rtlf_global_ro.
- * sysdeps/ia64/tls.h (INIT_SYSINFO): Likewise.
-
-2004-02-20 Steven Munroe <sjmunroe@us.ibm.com>
-
- * sysdeps/unix/sysv/linux/powerpc/ptlongjmp.c [SHARED]: Code only
- valid for SHARED case. Correct spelling of __vmx_longjmp.
-
- * sysdeps/powerpc/pspinlock.c: Move from here.
- * sysdeps/powerpc/powerpc32/pspinlock.c: To here.
- * sysdeps/powerpc/powerpc64/pspinlock.c: New file.
- * sysdeps/powerpc/powerpc64/pt-machine.h: Define __compare_and_swap32
- and __compare_and_swap32_with_release_semantics.
-
-2004-02-20 Jakub Jelinek <jakub@redhat.com>
-
- * Makefile (generated): Remove tst-stack1.mtrace and tst-stack1-mem.
- (tests): Remove $(objpfx)tst-stack1-mem.
- (tst-stack1-ENV): Remove.
- ($(objpfx)tst-stack1-mem): Remove.
-
- * 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/unix/sysv/linux/ia64/dl-sysdep.h (DL_ARGV_NOT_RELRO): Define.
-
-2004-02-10 Steven Munroe <sjmunroe@us.ibm.com>
-
- * Makefile (libpthread-routines): Add ptcleanup.
- * ptlongjmp.c: Removed.
- * ptcleanup.c: Copied __pthread_cleanup_upto to here. New file.
- * sysdeps/pthread/ptlongjmp.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/ptlongjmp.c: New File.
-
-2004-01-22 Andreas Jaeger <aj@suse.de>
-
- * spinlock.c (__pthread_lock): Fix contraint to avoid warning.
- (__pthread_release): Likewise.
-
-2004-01-16 Richard Henderson <rth@redhat.com>
-
- * attr.c: Include ldsodefs.h.
- (pthread_getattr_np): Don't declare __libc_stack_end.
-
-2004-01-09 Steven Munroe <sjmunroe@us.ibm.com>
-
- * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h
- [!HAVE_TLS_SUPPORT]: Define SINGLE_THREAD_P using static
- __lib*_multiple_threads.
- * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
- [!HAVE_TLS_SUPPORT]: Likewise.
-
-2004-01-13 Roland McGrath <roland@redhat.com>
-
- * sysdeps/powerpc/tcb-offsets.sym: Put -- separator line before any
- conditionals.
-
-2004-01-10 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/unix/sysv/linux/x86_64/vfork.S: Add cfi directives.
-
-2004-01-01 Andreas Jaeger <aj@suse.de>
-
- * Makefile (generated): Add missing files.
-
-2003-12-31 Ulrich Drepper <drepper@redhat.com>
-
- * attr.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>
-
- * sysdeps/ia64/tls.h: Include dl-sysdep.h.
- (INIT_SYSINFO): Define.
- (TLS_INIT_TP): Use it.
-
-2003-12-28 Carlos O'Donell <carlos@baldric.uwo.ca>
-
- * attr.c (pthread_getattr_np): Add _STACK_GROWS_UP case.
-
-2003-12-26 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/pthread/pthread.h (pthread_setcancelstate,
- pthread_setcanceltype, pthread_cancel, pthread_testcancel): Remove
- __THROW.
- * semaphore.h (sem_wait, sem_timedwait): Likewise.
-
-2003-12-17 Jakub Jelinek <jakub@redhat.com>
-
- * manager.c (pthread_free): Call _dl_deallocate_tls even for
- p_userstack threads.
- * pthread.c (__pthread_initialize_manager): Call _dl_deallocate_tls
- on error.
- (pthread_onexit_process): Update comment.
- * Makefile (tests): Add tst-stack1. Depend on $(objpfx)tst-stack1-mem.
- (generated): Add tst-stack1.mtrace and tst-stack1-mem.
- (tst-stack1-ENV): Set.
- ($(objpfx)tst-stack1-mem): New.
- * tst-stack1.c: New test.
-
-2003-12-16 Steven Munroe <sjmunroe@us.ibm.com>
-
- * sysdeps/powerpc/tcb-offsets.sym [!__powerpc64__]: Remove
- conditional so MULTIPLE_THREADS_OFFSET is generated for both.
- * sysdeps/powerpc/tls.h [!__powerpc64__]: Remove conditional
- so TLS_MULTIPLE_THREADS_IN_TCB is generated for both.
- * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h:
- Include tls.h.
-
-2003-12-04 Steven Munroe <sjmunroe@us.ibm.com>
-
- * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
- (SINGLE_THREAD_P): Test using thread local p_multiple_threads field.
-
-2003-12-10 David Mosberger <davidm@hpl.hp.com>
-
- * sysdeps/unix/sysv/linux/ia64/pt-initfini.c: Update copyright
- message. Add include of <stddef.h>.
- (INIT_NEW_WAY): New macro.
- (INIT_OLD_WAY): Likewise.
- (_init): Add unwind directives. Invoke
- __pthread_initialize_minimal() via INIT_NEW_WAY or INIT_OLD_WAY,
- respectively.
- (_init_EPILOG_BEGINS): Add unwind-directives. Drop unused .regstk
- directive.
- (_fini): Add unwind directives. Drop unnecessary .align 16
- directive (bundles are always 16-byte aligned).
- (_fini_EPILOG_BEGINS): Add unwind-directives.
-
-2003-11-19 David Mosberger <davidm@hpl.hp.com>
-
- * sysdeps/unix/sysv/linux/ia64/dl-sysdep.h: New file.
-
-2003-12-10 Andreas Jaeger <aj@suse.de>
- Ruediger Oertel <ro@suse.de>
-
- * sysdeps/alpha/elf/pt-initfini.c (__asm__): Remove extra .prologue.
-
-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-04 Jakub Jelinek <jakub@redhat.com>
-
- * signals.c (__pthread_sigaction): Set __sighandler[sig].old before
- __libc_sigaction if it has been one of the special values before.
-
-2003-10-06 Carlos O'Donell <carlos@baldric.uwo.ca>
-
- * pthread.c (__pthread_self_stack): _STACK_GROWS_UP case added.
- (__pthread_find_self): Likewise.
- * manager.c (thread_segment): _STACK_GROWS_UP case added.
-
-2003-10-10 Carlos O'Donell <carlos@baldric.uwo.ca>
-
- * linuxthreads/sysdeps/unix/sysv/linux/hppa/malloc-machine.h: New file.
-
-2003-10-10 Carlos O'Donell <carlos@baldric.uwo.ca>
-
- * sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h: New file.
-
-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-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-cancel8.
- * tst-cancel8.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-10 Chris Demetriou <cgd@broadcom.com>
-
- * sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h: New file.
-
-2003-09-30 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/pthread/malloc-machine.h [!__libc_maybe_call2] (mutex_init,
- mutex_lock, mutex_trylock, mutex_unlock): Remove.
-
-2003-09-27 Wolfram Gloger <wg@malloc.de>
-
- * sysdeps/pthread/malloc-machine.h: New file.
-
-2003-09-18 H.J. Lu <hongjiu.lu@intel.com>
-
- * attr.c (__pthread_attr_init_2_1): Double __guardsize size
- if NEED_SEPARATE_REGISTER_STACK is defined.
-
-2003-09-22 Philip Blundell <philb@gnu.org>
-
- * forward.c: Add _pthread_cleanup_push, _pthread_cleanup_pop.
- * sysdeps/pthread/pthread-functions.h (struct pthread_functions):
- Likewise.
- * pthread.c (__pthread_elements): Initialise these new elements.
- * sysdeps/pthread/bits/libc-lock.h (__libc_cleanup_push): Use
- __libc_maybe_call.
- (__libc_cleanup_pop): Likewise.
-
-2003-09-22 Jakub Jelinek <jakub@redhat.com>
-
- * attr.c: Include stdlib.h.
-
-2003-09-18 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/pthread/pthread.h (pthread_getattr_np): Clarify usage.
-
- * tst-attr1.c: New test.
- * Makefile (tests): Add tst-attr1.
-
-2003-09-17 Philip Blundell <philb@gnu.org>
-
- * sysdeps/unix/sysv/linux/arm/vfork.S: Branch to fork if
- libpthread is loaded. Elide backwards compatibility code when not
- required.
-
-2003-09-17 Jakub Jelinek <jakub@redhat.com>
-
- * descr.h (manager_thread): Rename to...
- (__pthread_manager_threadp): ... this.
- * pthread.c (manager_thread): Define to __pthread_manager_threadp.
- (__pthread_manager_threadp): New variable.
- * internals.h (__manager_thread): Define to
- __pthread_manager_threadp if USE_TLS.
-
-2003-09-15 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/i386/Makefile (CFLAGS-cancel.c, CFLAGS-manager.c,
- CFLAGS-pthread.c, CFLAGS-sighandler.c): Add
- -mpreferred-stack-boundary=4.
-
-2003-09-16 Ulrich Drepper <drepper@redhat.com>
-
- * attr.c (pthread_getattr_np): Correctly fill in the stack-related
- values for the initial thread.
-
-2003-09-17 Jakub Jelinek <jakub@redhat.com>
-
- * pthread.c (manager_thread): Remove static, add attribute_hidden.
- (thread_self_stack): Rename to...
- (__pthread_self_stack): ... this. Remove static.
- (pthread_handle_sigcancel): Use check_thread_self ().
- (pthread_handle_sigrestart): Likewise.
- * sighandler.c (__pthread_sighandler, __pthread_sighandler_rt):
- Likewise.
- * descr.h (manager_thread): Declare.
- * internals.h (__pthread_self_stack): New prototype.
- (__manager_thread): Define.
- (check_thread_self): New function.
-
-2003-09-15 Jakub Jelinek <jakub@redhat.com>
-
- * Makefile (CFLAGS-mutex.c): Add $(uses-callbacks).
- (CFLAGS-sighandler.c): Change $(exceptions) into $(uses-callbacks).
-
-2003-09-12 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/s390/bits/typesizes.h: New.
- (__SSIZE_T_TYPE): Define to __SWORD_TYPE for gcc 2.95.x and
- __SLONGWORD_TYPE otherwise.
-
-2003-09-11 Steven Munroe <sjmunroe@us.ibm.com>
-
- * sysdeps/powerpc/powerpc64/pt-machine.h [MEMORY_BARRIER]: Use lwsync.
- [READ_MEMORY_BARRIER]: Define.
- [WRITE_MEMORY_BARRIER]: Define.
-
-2003-09-10 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/pthread/pthread-functions.h (struct pthread_functions): Move
- ptr___pthread_cond_timedwait to the end of the structure to avoid
- breaking Wine unnecessarily.
-
-2003-09-08 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/s390/bits/typesizes.h: Remove.
-
-2003-09-02 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/alpha/bits/local_lim.h: New file.
- * sysdeps/unix/sysv/linux/alpha/Versions: New file.
- * sysdeps/unix/sysv/linux/ia64/bits/local_lim.h: New file.
- * sysdeps/unix/sysv/linux/ia64/Versions: New file.
- * sysdeps/unix/sysv/linux/sparc/bits/local_lim.h: New file.
- * sysdeps/unix/sysv/linux/sparc/Versions: New file.
- * attr.c (__old_pthread_attr_setstacksize,
- __old_pthread_attr_setstack): New functions.
- (pthread_attr_setstacksize): If PTHREAD_STACK_MIN != 16384, export
- as @@GLIBC_2.3.2 and also export compatibility @GLIBC_2.1.
- (pthread_attr_setstack): If PTHREAD_STACK_MIN != 16384, export
- as @@GLIBC_2.3.2 and also export compatibility @GLIBC_2.2.
- * tststack.c: Include limits.h and sys/param.h.
- (main): Set size to MAX (70 * 1024, PTHREAD_STACK_MIN).
-
- * barrier.c (__pthread_barrierattr_getpshared): Always
- return PTHREAD_PROCESS_PRIVATE.
- (pthread_barrierattr_setpshared): Return EINVAL if pshared
- is neither PTHREAD_PROCESS_PRIVATE nor PTHREAD_PROCESS_SHARED.
-
-2003-09-02 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/sparc/tls.h (TLS_TCB_SIZE): If in ld.so and NPTL struct
- pthread is bigger than struct _pthread_descr_struct, use NPTL struct
- pthread size.
-
-2003-09-02 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/i386/dl-sysdep.h
- (DL_SYSINFO_IMPLEMENTATION): Add CFI and make sure the code ends
- up in .text.
-
- * barrier.c (pthread_barrierattr_setpshared): We don't handle
- inter-process barriers.
-
-2003-09-01 Jakub Jelinek <jakub@redhat.com>
-
- * Makefile (tests): Add tst-tls1.
- (module-names): Add tst-tls1mod{,a,b,c,d,e,f}.
- ($(objpfx)tst-tls1mod{,a,b,c,d,e,f}.so-no-z-defs): Set to yes.
- ($(objpfx)tst-tls1): New.
- ($(objpfx)tst-tls2.out): Likewise.
- (tests): Depend on $(objpfx)tst-tls2.out.
- * tst-tls1.c: New test.
- * tst-tls1.h: New.
- * tst-tls1mod.c: New.
- * tst-tls1moda.c: New.
- * tst-tls1modb.c: New.
- * tst-tls1modc.c: New.
- * tst-tls1modd.c: New.
- * tst-tls1mode.c: New.
- * tst-tls1modf.c: New.
- * tst-tls2.sh: New test.
-
- * internals.h (__pthread_cond_timedwait): New prototype.
- * sysdeps/pthread/pthread-functions.h (struct pthread_functions): Add
- ptr___pthread_cond_timedwait.
- * pthread.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-08-27 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/pthread.h: Don't mark pthread_exit,
- pthread_join, pthread_cond_wait, and pthread_cond_timedwait with
- __THROW to match NPTL.
-
-2003-08-13 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/Makefile [subdir=rt] (CPPFLAGS): Add
- -DBROKEN_THREAD_SIGNALS.
-
-2003-08-11 Steven Munroe <sjmunroe@us.ibm.com>
-
- * manager.c (pthread_start_thread) [!(USE_TLS && HAVE___THREAD)]:
- Correct spelling of per thread resolver state.
-
-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).
- * pthread.c (pthread_initialize): 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.
-
-2003-07-31 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/pthread/bits/typesizes.h (__SSIZE_T_TYPE): Define.
- * sysdeps/unix/sysv/linux/alpha/bits/typesizes.h (__SSIZE_T_TYPE):
- Likewise.
- * sysdeps/unix/sysv/linux/sparc/bits/typesizes.h (__SSIZE_T_TYPE):
- Likewise.
- * sysdeps/unix/sysv/linux/s390/bits/typesizes.h: New file.
-
- * sysdeps/pthread/pthread.h (pthread_attr_setstackaddr,
- pthread_attr_setstacksize): Change PTHREAD_STACK_SIZE to
- PTHREAD_STACK_MIN in comments.
-
- * sysdeps/alpha/pt-machine.h (PT_EI): Add
- __attribute__((always_inline)).
- * sysdeps/arm/pt-machine.h (PT_EI): Likewise.
- * sysdeps/cris/pt-machine.h (PT_EI): Likewise.
- * sysdeps/hppa/pt-machine.h (PT_EI): Likewise.
- * sysdeps/i386/i686/pt-machine.h (PT_EI): Likewise.
- * sysdeps/i386/pt-machine.h (PT_EI): Likewise.
- * sysdeps/ia64/pt-machine.h (PT_EI): Likewise.
- * sysdeps/m68k/pt-machine.h (PT_EI): Likewise.
- * sysdeps/mips/pt-machine.h (PT_EI): Likewise.
- * sysdeps/powerpc/powerpc32/pt-machine.h (PT_EI): Likewise.
- * sysdeps/powerpc/powerpc64/pt-machine.h (PT_EI): Likewise.
- * sysdeps/s390/s390-32/pt-machine.h (PT_EI): Likewise.
- * sysdeps/s390/s390-64/pt-machine.h (PT_EI): Likewise.
- * sysdeps/sh/pt-machine.h (PT_EI): Likewise.
- * sysdeps/sparc/sparc32/pt-machine.h (PT_EI): Likewise.
- * sysdeps/sparc/sparc64/pt-machine.h (PT_EI): Likewise.
- * sysdeps/x86_64/pt-machine.h (PT_EI): Likewise.
- * spinlock.h (__pthread_set_own_extricate_if): Likewise.
- * sysdeps/ia64/tls.h (TLS_INIT_TP): Cast tcbp to __typeof
- (__thread_self).
- * Examples/ex13.c (main): Change res type to void * to avoid
- warnings.
- * tst-cancel.c (cleanup, inner, tf1, tf2, tf3): Comment out.
-
-2003-07-30 Jakub Jelinek <jakub@redhat.com>
-
- * pthread.c (init_one_static_tls, __pthread_init_static_tls): New
- functions.
- (pthread_initialize): Initialize GL(dl_init_static_tls).
-
-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 Roland McGrath <roland@redhat.com>
-
- * manager.c (pthread_start_thread): Fix typo in last change.
-
-2003-07-14 Guido Guenther <agx@sigxcpu.org>
-
- * sysdeps/unix/sysv/linux/mips/sysdep-cancel.h: Add IS_IN_librt,
- use L() for local labels.
-
-2003-07-22 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/alpha/tls.h (TLS_INIT_TCB_SIZE, TLS_TCB_SIZE): Change to 0.
- (TLS_INIT_TCB_ALIGN, TLS_TCB_ALIGN): Alignment of struct
- _pthread_descr_struct.
- (TLS_PRE_TCB_SIZE): Add sizeof (tcbhead_t) and pad to align.
- If in ld.so and NPTL struct pthread is bigger than struct
- _pthread_descr_struct, use NPTL struct pthread size.
- (TLS_TCB_OFFSET): Define.
- (INSTALL_DTV, INSTALL_NEW_DTV, GET_DTV, TLS_INIT_TP, THREAD_DTV,
- THREAD_SELF, INIT_THREAD_SELF): Changed to match NPTL tls.h
- definitions.
- * sysdeps/i386/tls.h (TLS_TCB_SIZE): If in ld.so and NPTL struct
- pthread is bigger than struct _pthread_descr_struct, use NPTL struct
- pthread size.
- * sysdeps/ia64/tls.h (TLS_PRE_TCB_SIZE): Likewise.
- * sysdeps/powerpc/tls.h (TLS_PRE_TCB_SIZE): Likewise.
- * sysdeps/s390/tls.h (TLS_TCB_SIZE): Likewise.
- * sysdeps/sh/tls.h (TLS_PRE_TCB_SIZE): Likewise.
- * sysdeps/x86_64/tls.h (TLS_TCB_SIZE): Likewise.
- * sysdeps/pthread/Makefile (gen-as-const-headers): Add
- nptl-struct-pthread.sym if nptl tree is present.
- (before-compile): Add $(common-objpfx)nptl-struct-pthread.h
- if nptl tree is not present.
- (common-generated): Add nptl-struct-pthread.h.
- ($(common-objpfx)nptl-struct-pthread.h): New rule.
- * sysdeps/pthread/nptl-struct-pthread.sym: New file.
-
-2003-07-22 Jakub Jelinek <jakub@redhat.com>
-
- * descr.h (struct _pthread_descr_struct): Provide p_res member
- even if USE_TLS && HAVE___THREAD.
- * sysdeps/pthread/res-state.c (__res_state): Return __resp
- if USE___THREAD.
- * manager.c: Include resolv.h.
- (pthread_start_thread): Initialize __resp.
- * libc-tls-loc.c (__res_state): Return __resp.
- * Makefile (tests): Add tst-_res1.
- (modules-names, extra-objs, test-extras, test-modules): Add support
- for test modules.
- ($(objpfx)tst-_res1mod2.so): Depend on $(objpfx)tst-_res1mod1.so.
- ($(objpfx)tst-_res1): Depend on $(objpfx)tst-_res1mod2.so and
- -lpthread.
- * tst-_res1.c: New test.
- * tst-_res1mod1.c: New test.
- * tst-_res1mod2.c: New test.
-
-2003-07-20 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/bits/libc-lock.h: Define __libc_cleanup_push and
- __libc_cleanup_pop.
-
- * tst-cancel-wrappers.sh: lseek and llseek are no cancellation points.
-
-2003-07-14 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Fix typo
- in test for compilation in libc.
-
-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.
-
-2003-06-20 Kaz Kojima <kkojima@rr.iij4u.or.jp>
-
- * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Support cancellation
- in librt.
-
-2003-06-21 Andreas Schwab <schwab@suse.de>
-
- * sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h: Support cancellation
- in librt.
-
-2003-06-20 Richard Henderson <rth@redhat.com>
-
- * sysdeps/unix/sysv/linux/alpha/Makefile (libpthread-routines):
- Remove ptw-osf_sigprocmask.
-
-2003-06-18 Jakub Jelinek <jakub@redhat.com>
-
- * internals.h (__librt_multiple_threads, __librt_enable_asynccancel,
- __librt_disable_asynccancel): Declare.
- (LIBC_CANCEL_ASYNC, LIBC_CANCEL_RESET, LIBC_CANCEL_HANDLED): Define
- for IS_IN_librt.
- * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Support cancellation
- in librt.
- * 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/sparc/sparc32/sysdep-cancel.h: Likewise.
- * sysdeps/unix/sysv/linux/sparc/sparc64/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/x86_64/tcb-offsets.sym: New file.
- * sysdeps/x86_64/Makefile: New file.
- * sysdeps/x86_64/tls.h (tcbhead_t): Add multiple_threads.
- * Versions (libc): Export __librt_enable_asynccancel,
- __librt_disable_asynccancel and __librt_multiple_threads as
- GLIBC_PRIVATE.
- * libc-cancellation.c (__librt_multiple_threads,
- __librt_enable_asynccancel, __librt_disable_asynccancel): New aliases.
-
-2003-06-12 Steven Munroe <sjmunroe@us.ibm.com>
-
- * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
- (SINGLE_THREAD_P): Replace @ got notation with @toc.
-
-2003-06-11 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/powerpc/pspinlock.c (__pthread_spin_init): Fix
- initializer [PR libc/5052].
-
-2003-06-09 Andreas Schwab <schwab@suse.de>
-
- * Makefile: Move inclusion of ../Rules down after extra-objs is
- fully known.
-
-2003-06-06 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/arm/sysdep-cancel.h: New sequences for
- 5+ arg syscalls only needed for PIC.
- Patch by Ralph Siemsen <ralphs@netwinder.org>.
-
-2003-06-05 Richard Henderson <rth@redhat.com>
-
- * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h (PSEUDO): Use
- and require CFI assembler directives.
- * sysdeps/unix/sysv/linux/alpha/vfork.S: Likewise.
-
-2003-05-30 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
- (SAVESTK_0): Add CFI directives.
- (SAVESTK_3): Likewise.
- (SAVESTK_5): Likewise.
- (RESTSTK_0): Likewise.
- (RESTSTK_3): Likewise.
- (RESTSTK_5): Likewise.
-
-2003-05-05 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/tls.h (TLS_DO_SET_THREAD_AREA): Add \n to error
- messages.
-
-2003-05-04 Roland McGrath <roland@redhat.com>
-
- * Makefile ($(objpfx)../libc.so): New target.
-
-2003-04-26 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c (__pthread_initialize_manager): Remove one last
- p_multiple_threads call.
-
-2003-04-22 Jakub Jelinek <jakub@redhat.com>
-
- * pthread.c (__pthread_initialize_manager): Subtract
- TLS_PRE_TCB_SIZE bytes from tcbp to get to descr.
- * manager.c (pthread_handle_create): Subtract or add TLS_PRE_TCB_SIZE
- instead of sizeof (pthread_descr).
- (pthread_free): Add TLS_PRE_TCB_SIZE instead of sizeof (pthread_descr).
- * 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
- pthread_descr.
- (TLS_PRE_TCB_SIZE): Increase to cover tcbhead_t preceeded by pad
- to TLS_TCB_ALIGN.
- (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.
-
-2003-04-22 Roland McGrath <roland@redhat.com>
-
- * Makeconfig (shared-thread-library): Reverse link order to work
- around linker bug.
-
-2003-04-20 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/useldt.h (DO_SET_THREAD_AREA): Make sure the
- compiler knows we use the ldt_entry variable and that the syscall
- modifies the memory.
-
- * internals.h: Split pthread_functions definition into...
- * sysdeps/pthread/pthread-functions.h: ...new file.
-
- * sysdeps/i386/useldt.h: Include <sysdep.h>.
-
-2003-04-13 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Rename macros to
- match changes in NPTL sysdep-cancel.h.
-
-2003-04-11 Roland McGrath <roland@redhat.com>
-
- * Makefile (multidir): Don't set the variable here with $(shell ...).
- ($(objpfx)multidir.mk): New target, generated makefile; include that.
- (generated): Append it.
-
-2003-04-10 Jakub Jelinek <jakub@redhat.com>
-
- * Makefile (multidir, crti-objs, crtn-objs): New variables.
- (generated-dirs): Add pathname component of multidir.
- (omit-deps, extra-objs): Include $(multidir)/crt? as well.
- ($(objpfx)libpthread.so): Depend on $(multidir)/crt?.o as well.
- ($(objpfx)$(multidir), $(objpfx)$(multidir)/crti.o,
- $(objpfx)$(multidir)/crtn.o): New.
- * sysdeps/unix/sysv/linux/sparc/Makefile: Removed.
- * sysdeps/unix/sysv/linux/x86_64/Makefile (LDFLAGS-pthread.so,
- before-compile, generated): Don't generate and use specs.
- ($(objpfx)specs): Remove.
-
-2003-04-11 Martin Schwidefsky <schwidefsky@de.ibm.com>
-
- * sysdeps/s390/pspinlock.c (__pthread_spin_unlock): Fix asm contraints.
-
-2003-04-03 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/arm/sysdep-cancel.h (PSEUDO): Add
- missing ; after ENTRY use [PR libc/4997].
-
-2003-04-03 Jakub Jelinek <jakub@redhat.com>
-
- * pthread.c (pthread_initialize): Unblock __pthread_sig_cancel
- in case the parent blocked it.
-
-2003-04-02 Jakub Jelinek <jakub@redhat.com>
-
- * Makefile (libpthread-routines): Add pthread_atfork.
- (libpthread-static-only-routines): Add pthread_atfork.
-
-2003-04-01 Jakub Jelinek <jakub@redhat.com>
-
- * pthread.c (__pthread_wait_for_restart_signal): Use
- __pthread_sigsuspend instead of sigsuspend.
- * internals.h (__pthread_sigsuspend): New prototype.
- * Makefile (libpthread-routines): Add pt-sigsuspend.
- (tests): Add tst-cancel7.
- * sysdeps/unix/sysv/linux/pt-sigsuspend.c: New file.
- * sysdeps/unix/sysv/linux/alpha/pt-sigsuspend.S: New file.
- * sysdeps/unix/sysv/linux/ia64/pt-sigsuspend.c: New file.
- * sysdeps/unix/sysv/linux/s390/s390-64/pt-sigsuspend.c: New file.
- * sysdeps/unix/sysv/linux/sparc/sparc64/pt-sigsuspend.c: New file.
- * sysdeps/unix/sysv/linux/x86_64/pt-sigsuspend.c: New file.
- * tst-cancel7.c: New test.
-
-2003-03-31 Alexandre Oliva <aoliva@redhat.com>
-
- * alloca_cutoff.c: Include internals.h.
- * sysdeps/pthread/errno-loc.c: Include linuxthreads/internals.h.
- * sysdeps/pthread/herrno-loc.c: Likewise.
- * sysdeps/pthread/res-state.c: Likewise.
-
-2003-03-25 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/bits/typesizes.h: New file.
- * sysdeps/unix/sysv/linux/alpha/bits/typesizes.h: New file.
- * sysdeps/unix/sysv/linux/sparc/bits/typesizes.h: New file.
-
-2003-03-24 Daniel Jacobowitz <drow@mvista.com>
-
- * sysdeps/unix/sysv/linux/arm/sysdep-cancel.h
- (DOARGS_5, DOARGS_6, DOARGS_7): Rewritten.
-
-2003-03-22 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/fork.c (__fork): Add libc_hidden_def.
-
-2003-03-21 Daniel Jacobowitz <drow@mvista.com>
-
- * sysdeps/unix/sysv/linux/arm/sysdep-cancel.h
- (SINGLE_THREAD_P_PIC): Use "reg" instead of "lr".
-
-2003-03-21 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/i386/tls.h [__ASSUME_SET_THREAD_AREA_SYSCALL]
- (TLS_SETUP_GS_SEGMENT): Fix a typo.
-
-2003-03-19 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/Makefile: Fix cut&paste error.
-
-2003-03-18 Roland McGrath <roland@redhat.com>
-
- * Versions (libpthread: GLIBC_2.2): Remove
- pthread_barrierattr_getpshared, never really existed.
- (libpthread: GLIBC_2.0): Move __pthread_initialize to ...
- (libpthread: GLIBC_PRIVATE): ... here.
-
-2003-03-14 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/sparc/sparc64/Makefile: New file.
- * sysdeps/unix/sysv/linux/sparc/Makefile ($(objpfx)specs): Use full
- path for crt[in].o.
-
-2003-03-14 Alexandre Oliva <aoliva@redhat.com>
-
- * sysdeps/mips/pspinlock.c (__pthread_spin_lock): Don't .set
- mips2 on new abi.
- * sysdeps/mips/pt-machine.h (__compare_and_swap): Likewise.
- Handle 64-bit longs on n64.
-
-2003-03-07 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/ia64/pspinlock.c (__pthread_spin_lock,
- __pthread_spin_trylock): Rewritten.
-
-2003-03-06 Ulrich Drepper <drepper@redhat.com>
-
- * tst-cancel4.c (tf_sleep): Lower sleep time a bit to not upset
- recent kernels.
-
-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.
-
-2003-03-01 Roland McGrath <roland@redhat.com>
-
- * sysdeps/powerpc/powerpc64/pt-machine.h
- (THREAD_GETMEM, THREAD_GETMEM_NC, THREAD_SETMEM, THREAD_SETMEM_NC):
- New macros.
- * sysdeps/powerpc/tls.h: Don't define those here.
-
- * sysdeps/powerpc/tls.h [! USE_TLS && !__powerpc64__]: Define
- tcbhead_t with multiple_threads member.
- [USE_TLS] (tcbhead_t): Define minimal one-word version.
- [USE_TLS && !__powerpc64__] (TLS_MULTIPLE_THREADS_IN_TCB): Define.
- * sysdeps/powerpc/tcb-offsets.sym [USE_TLS]: Use tls.h macros to
- derive thread register offset of p_multiple_threads member.
-
- * descr.h (struct _pthread_descr_struct) [!USE_TLS || !TLS_DTV_AT_TP]:
- Conditionalize p_header member on this.
- [TLS_MULTIPLE_THREADS_IN_TCB]: Add p_multiple_threads alternatively.
- * sysdeps/ia64/tls.h [USE_TLS] (TLS_MULTIPLE_THREADS_IN_TCB): Define.
- * sysdeps/sh/tls.h: Likewise.
- * sysdeps/ia64/tcb-offsets.sym [USE_TLS]: Use p_multiple_threads.
- * sysdeps/sh/tcb-offsets.sym: Likewise.
- * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h
- (SINGLE_THREAD_P): Likewise.
- * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
- (SINGLE_THREAD_P): Likewise.
- * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h
- (SINGLE_THREAD_P): Likewise.
- * pthread.c (__pthread_initialize_manager): Likewise.
- * manager.c (pthread_handle_create): Likewise.
-
- * sysdeps/powerpc/tls.h [HAVE_TLS_SUPPORT]: Define USE_TLS and all
- related macros.
-
-2003-01-31 Steven Munroe <sjmunroe@us.ibm.com>
-
- * sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S [SHARED]:
- Conditionalize .toc section magic on this.
-
-2003-02-21 Roland McGrath <roland@redhat.com>
-
- * cancel.c (__pthread_perform_cleanup): Call __libc_thread_freeres
- instead of __rpc_thread_destroy.
-
-2003-02-21 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S (__vfork): Call
- __fork instead of branching to it if BROKEN_SPARC_WDISP22.
- * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h (PSEUDO):
- Fix typo.
- * sysdeps/unix/sysv/linux/sparc/Makefile (specs): Add ./ prefix
- to crti.o and crtn.o.
- * sysdeps/unix/sysv/linux/x86_64/Makefile (specs): Likewise.
-
-2003-02-21 Roland McGrath <roland@redhat.com>
-
- * Makefile (install-lib-ldscripts): New variable.
-
-2003-02-20 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
-
- * sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S: Avoid short
- interprocedure branches.
-
-2003-02-19 Ulrich Drepper <drepper@redhat.com>
-
- * specific.c (pthread_key_delete_helper): Don't use GETMEM, we
- need the target thread's lock.
-
-2003-02-17 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/bits/local_lim.h: Define TTY_NAME_MAX
- and LOGIN_NAME_MAX.
-
-2003-02-17 Kevin B. Hendricks <kevin.hendricks@sympatico.ca>
- Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
-
- * sysdeps/powerpc/Makefile: Handle tcb-offsets.sym.
- * sysdeps/powerpc/tcb-offsets.sym: New file.
- * sysdeps/powerpc/tls.h: New file.
- * sysdeps/powerpc/powerpc32/pt-machine.h (FLOATING_STACKS): Define.
- (ARCH_STACK_MAX_SIZE): Define.
- (THREAD_SELF): Define.
- (INIT_THREAD_SELF): Define.
- (THREAD_GETMEM): Define.
- (THREAD_GETMEM_NC): Define.
- (THREAD_SETMEM): Define.
- (THREAD_SETMEM_NC): Define.
- (__thread_self): Declare.
- * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Adjust
- for thread register.
-
-2003-02-14 Steven Munroe <sjmunroe@us.ibm.com>
-
- * sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S (__vfork):
- Check pthread_create existance, not __pthread_fork.
-
-2003-02-12 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/Makefile: Define CFLAGS-confstr.c.
-
-2003-02-10 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/alpha/vfork.S (__vfork): Check
- pthread_create existance, not __pthread_fork.
- * sysdeps/unix/sysv/linux/i386/vfork.S (__vfork): Likewise.
- * sysdeps/unix/sysv/linux/ia64/vfork.S (__vfork): Likewise.
- * sysdeps/unix/sysv/linux/m68k/vfork.S (__vfork): Likewise.
- * sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S (__vfork):
- Likewise.
- * sysdeps/unix/sysv/linux/s390/s390-64/vfork.S (__vfork): Likewise.
- * sysdeps/unix/sysv/linux/x86_64/vfork.S (__vfork): Likewise.
- * sysdeps/unix/sysv/linux/sh/vfork.S (__vfork): Likewise.
- Add .weak pthread_create.
- * sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S (__vfork): Fix a typo.
- Check pthread_create existance, not __pthread_fork.
- * sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S (__vfork): Likewise.
- * sysdeps/unix/sysv/linux/s390/s390-32/vfork.S (__vfork): Branch to
- __fork whenever libpthread.so is loaded.
-
-2003-02-09 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h:
- Rework: %r9 is destroyed by functions so don't use it as
- temporary, align stack correctly, fix parameter for CDISABLE.
-
-2003-02-07 Kaz Kojima <kkojima@rr.iij4u.or.jp>
-
- * sysdeps/sh/Makefile: New file.
- * sysdeps/sh/tcb-offsets.sym: Likewise.
- * sysdeps/sh/tls.h: Don't include sysdep.h. Move include
- of linuxthreads/descr.h after the definition of THREAD_SELF.
- (tcbhead_t): Use IA64 type tcbhead_t for TLS case.
- (TLS_TCB_SIZE): Set size of tcbhead_t.
- (TLS_PRE_TCB_SIZE): Define.
- (INSTALL_NEW_DTV): Set dtv of tcbhead_t structure instead of
- a member of thread structure.
- (THREAD_DTV): Likewise.
- (TLS_INIT_TP_EXPENSIVE): Remove.
- (TLS_INIT_TP): Set gbr register only.
- (THREAD_SELF): New.
- (INIT_THREAD_SELF): Likewise.
- (NONTLS_INIT_TP): New.
- * sysdeps/unix/sysv/linux/sh/pt-initfini.c (__fpscr_values):
- Remove.
- * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h (PSEUDO): Add
- SYSCALL_INST_PAD macro after DO_CALL.
- (SINGLE_THREAD_P): Fix non-PIC and TLS case so to read the
- correct variable.
- * sysdeps/unix/sysv/linux/sh/vfork.S (__vfork): Branch to __fork
- whenever libpthread.so is loaded.
-
-2003-02-08 Andreas Schwab <schwab@suse.de>
-
- * sysdeps/unix/sysv/linux/m68k/vfork.S: Branch to __fork whenever
- libpthread.so is loaded.
-
-2003-02-07 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/i386/vfork.S: Make sure
- __ASSUME_VFORK_SYSCALL is not defined if the kernel headers have
- no __NR_vfork definition.
-
-2003-02-07 Jakub Jelinek <jakub@redhat.com>
-
- * tst-popen2.c: New test.
- * Makefile (tests): Add tst-popen2.
- * sysdeps/unix/sysv/linux/alpha/vfork.S (__vfork): Branch to __fork
- whenever libpthread.so is loaded.
- * sysdeps/unix/sysv/linux/i386/vfork.S (__vfork): Likewise.
- * sysdeps/unix/sysv/linux/ia64/vfork.S (__vfork): Likewise.
- * 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/sparc/sparc32/vfork.S (__vfork): Likewise.
- * sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S (__vfork): Likewise.
- * sysdeps/unix/sysv/linux/x86_64/vfork.S (__vfork): Likewise.
-
-2003-02-05 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/bits/libc-lock.h (__libc_once): Set control
- variable for non-libpthread case to the same value the
- pthread_once function would use.
-
-2003-02-03 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S (__vfork): If
- BROKEN_SPARC_WDISP22, handle SHARED the same way as non-SHARED.
-
-2003-02-04 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/unix/sysv/linux/hppa/pt-initfini.c: Do not use
- multi-line strings.
-
-2003-01-30 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/s390/tls.h (TLS_INIT_TP): Return NULL, not 0.
-
-2003-01-30 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/alpha/tls.h (THREAD_GETMEM, THREAD_GETMEM_NC,
- THREAD_SETMEM, THREAD_SETMEM_NC): Avoid warnings about unused self
- variable.
- * sysdeps/ia64/pt-machine.h (THREAD_GETMEM, THREAD_GETMEM_NC,
- THREAD_SETMEM, THREAD_SETMEM_NC): Likewise.
- * sysdeps/s390/s390-32/pt-machine.h (THREAD_GETMEM, THREAD_GETMEM_NC,
- THREAD_SETMEM, THREAD_SETMEM_NC): Likewise.
- * sysdeps/s390/s390-64/pt-machine.h (THREAD_GETMEM, THREAD_GETMEM_NC,
- THREAD_SETMEM, THREAD_SETMEM_NC): Likewise.
- * sysdeps/sh/pt-machine.h (THREAD_GETMEM, THREAD_GETMEM_NC,
- THREAD_SETMEM, THREAD_SETMEM_NC): Likewise.
- * sysdeps/sparc/sparc32/pt-machine.h (THREAD_GETMEM, THREAD_GETMEM_NC,
- THREAD_SETMEM, THREAD_SETMEM_NC): Likewise.
- * sysdeps/sparc/sparc64/pt-machine.h (THREAD_GETMEM, THREAD_GETMEM_NC,
- THREAD_SETMEM, THREAD_SETMEM_NC): Likewise.
-
-2003-01-27 Martin Schwidefsky <schwidefsky@de.ibm.com>
-
- * sysdeps/s390/s390-32/pt-machine.h (THREAD_SELF, INIT_THREAD_SELF):
- Define TLS versions.
- * sysdeps/s390/s390-64/pt-machine.h (THREAD_SELF, INIT_THREAD_SELF):
- Likewise.
- * sysdeps/s390/tls.h [HAVE_TLS_SUPPORT] (USE_TLS, TLS_INIT_TCB_SIZE,
- TLS_INIT_TCB_ALIGN, TLS_TCB_SIZE, TLS_TCB_ALIGN, TLS_TCB_AT_TP,
- INSTALL_DTV, INSTALL_NEW_DTV, GET_DTV, TLS_INIT_TP, THREAD_DTV):
- Define.
- * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h (PSEUDO): Use
- branch with 32 bit offset.
- * sysdeps/unix/sysv/linux/s390/s390-64/vfork.S: Likewise.
-
-2003-01-24 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/sparc/sparc32/pt-machine.h (__thread_self): Change to %g7,
- as required by TLS ABI.
- * sysdeps/sparc/sparc64/pt-machine.h (__thread_self): Likewise.
- * sysdeps/sparc/tls.h [HAVE_TLS_SUPPORT] (USE_TLS, TLS_INIT_TCB_SIZE,
- TLS_INIT_TCB_ALIGN, TLS_TCB_SIZE, TLS_TCB_ALIGN, TLS_TCB_AT_TP,
- INSTALL_DTV, INSTALL_NEW_DTV, GET_DTV, TLS_INIT_TP, THREAD_DTV):
- Define.
- [HAVE_TLS_SUPPORT]: Include descr.h and sysdep.h.
- * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Use %g7
- instead of %g6 for thread pointer.
- * sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S: Likewise.
- * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise.
- * sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S: Likewise.
-
-2003-01-25 Guido Guenther <agx@sigxcpu.org>
-
- * sysdeps/unix/sysv/linux/mips/sysdep-cancel.h: New file.
- * sysdeps/unix/sysv/linux/mips/Makefile: New file.
-
-2003-01-20 Martin Schwidefsky <schwidefsky@de.ibm.com>
-
- * sysdeps/unix/sysv/linux/s390/s390-32/vfork.S: Avoid non pc relative
- reference to __fork.
-
-2003-01-17 Richard Henderson <rth@redhat.com>
-
- * sysdeps/alpha/tls.h (tcbhead_t): Clarify second member.
- (TLS_TCB_SIZE, TLS_TCB_ALIGN): Set for tcbhead_t.
- (TLS_PRE_TCB_SIZE): New.
- (TLS_INIT_TP, THREAD_SELF, INIT_THREAD_SELF): Update for
- new ia64-style thread pointer layout.
- (THREAD_GETMEM, THREAD_GETMEM_NC): New.
- (THREAD_SETMEM, THREAD_SETMEM_NC): New.
- * sysdeps/unix/sysv/linux/alpha/vfork.S: Don't tail-call to __fork
- if !SHARED.
-
-2003-01-15 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/ia64/tls.h (tcbhead_t): Use the TLS ABI required layout
- if USE_TLS only.
- (NONTLS_INIT_TP): Revert last change.
- * sysdeps/ia64/tcb-offsets.sym (MULTIPLE_THREADS_OFFSET): Define to
- offsetof (tcbhead_t, multiple_threads) if USE_TLS not defined.
-
-2003-01-16 Jakub Jelinek <jakub@redhat.com>
-
- * pthread.c (_pthread_initialize_minimal): Use
- GL(dl_tls_dtv_slotinfo_list) != NULL to check whether TLS has
- been already initialized.
-
-2003-01-16 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/i386/tls.h (INIT_SYSINFO): Initialize head->sysinfo even
- if not SHARED.
-
-2003-01-15 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/pthread/bits/libc-lock.h (__libc_lock_init,
- __libc_lock_init_recursive): Initialize fields directly.
-
-2003-01-15 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/alpha/vfork.S (__vfork): Allow
- __fork to be far away from __vfork ifndef SHARED.
- * sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S (__vfork):
- Likewise.
- * sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S (__vfork): Likewise.
- * sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S (__vfork): Likewise.
- Add a missing instruction.
- * sysdeps/unix/sysv/linux/arm/vfork.S (__vfork): Conditionally
- branch to __fork even if __NR_vfork is not defined.
-
-2003-01-14 Ulrich Drepper <drepper@redhat.com>
-
- * tst-cancel-wrappers.sh: Allow .__*_asynccancel functions names
- as well.
-
-2003-01-14 Steven Munroe <sjmunroe@us.ibm.com>
-
- * sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S: New file.
-
-2003-01-14 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/ia64/vfork.S (JUMPTARGET): Remove.
-
-2003-01-13 Martin Schwidefsky <schwidefsky@de.ibm.com>
-
- * sysdeps/unix/sysv/linux/s390/s390-32/pt-initfini.c: Avoid
- unterminated string literals.
- * sysdeps/unix/sysv/linux/s390/s390-64/pt-initfini.c: Likewise.
-
-2003-01-13 Martin Schwidefsky <schwidefsky@de.ibm.com>
-
- * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h
- (PSEUDO): Code reordering. Move CENABLE and CDISABLE literals from
- PSEUDO_END to PSEUDO.
- (PSEUDO_END): Remove.
- (SINGLE_THREAD_P): Save an instruction.
- * sysdeps/unix/sysv/linux/s390/s390-32/vfork.S (__vfork): Add missing
- parameter to SINGLE_THREAD_P call.
- * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h (PSEUDO):
- Code reordering.
-
-2003-01-10 Andreas Schwab <schwab@suse.de>
-
- * sysdeps/unix/sysv/linux/m68k/vfork.S: New file.
-
-2003-01-10 Martin Schwidefsky <schwidefsky@de.ibm.com>
-
- * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h (PSEUDO): Setup
- backchain in pseudo_cancel. Minor code improvements.
- * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h (PSEUDO):
- Likewise.
-
-2003-01-10 Martin Schwidefsky <schwidefsky@de.ibm.com>
-
- * sysdeps/unix/sysv/linux/s390/s390-32/vfork.S: New file.
- * sysdeps/unix/sysv/linux/s390/s390-64/vfork.S: New file.
-
-2002-01-12 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
-
- * sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S: New file.
-
-2002-01-09 Richard Henderson <rth@redhat.com>
-
- * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h: Assume only
- ret follows pseudo, and thus avoid branch-to-branch in cancel
- case. Use SYSCALL_ERROR_LABEL.
-
-2003-01-11 Philip Blundell <philb@gnu.org>
-
- * sysdeps/unix/sysv/linux/arm/vfork.S: New file.
- * sysdeps/unix/sysv/linux/arm/sysdep-cancel.h (PSEUDO_RET):
- Correctly unstack lr.
- (UNDOARGS_5): Fix ordering of pushes and pops.
- (SINGLE_THREAD_P_PIC): New.
- (SINGLE_THREAD_P_INT): New.
- (SINGLE_THREAD_P): Implement in terms of above. Restore lr if it
- was stacked.
- (PSEUDO): Use SINGLE_THREAD_P_INT.
-
-2003-01-11 Kaz Kojima <kkojima@rr.iij4u.or.jp>
-
- * sysdeps/unix/sysv/linux/sh/vfork.S: New file.
-
-2003-01-11 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/ia64/tls.h (tcbhead_t): Change into dtv_t *, void *.
- [HAVE_TLS_SUPPORT] (USE_TLS, TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN,
- TLS_TCB_SIZE, TLS_PRE_TCB_SIZE, TLS_TCB_ALIGN, TLS_DTV_AT_TP,
- INSTALL_DTV, INSTALL_NEW_DTV, GET_DTV, TLS_INIT_TP, THREAD_SELF,
- INIT_THREAD_SELF): Define.
- [HAVE_TLS_SUPPORT]: Include descr.h.
- (NONTLS_INIT_TP): Point __thread_self at the end of dummy
- struct _pthread_descr_struct.
- * sysdeps/ia64/pt-machine.h (THREAD_GETMEM, THREAD_GETMEM_NC,
- THREAD_SETMEM, THREAD_SETMEM_NC): Define using THREAD_SELF,
- not __thread_self.
- * sysdeps/ia64/tcb-offsets.sym (MULTIPLE_THREADS_OFFSET): Adjust
- computation.
- * pthread.c (__pthread_initialize_minimal): Use tcbp, not self
- for TCB pointer.
- (__pthread_initialize_manager): Rename tcb to mgr.
- Use tcbp for TCB pointer, if TLS_DTV_AT_TP set mgr to sizeof (struct
- _pthread_descr) below tcbp, otherwise to tcbp.
- * manager.c (pthread_handle_create): If TLS_DTV_AT_TP, set
- new_thread to be below _dl_allocate_tls (). Adjust new_thread back
- before freeing. Fix clone arguments if report_events and USE_TLS.
- (pthread_free): Adjust th back before freeing.
-
-2003-01-10 Steven Munroe <sjmunroe@us.ibm.com>
-
- * sysdeps/unix/sysv/linux/powerpc/powerpc32/Makefile: Moved to ...
- * sysdeps/unix/sysv/linux/powerpc/Makefile: ...here.
- * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: New File.
-
-2003-01-09 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/i386/vfork.S: New file.
- * sysdeps/unix/sysv/linux/ia64/vfork.S: New file.
- * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
- [__ASSEMBLER__] (SINGLE_THREAD_P): Remove trailing ;;.
- * sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S: New file.
- * sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S: New file.
- * sysdeps/unix/sysv/linux/x86_64/vfork.S: New file.
- * sysdeps/unix/sysv/linux/alpha/vfork.S: New file.
- * tst-popen.c: New test.
- * Makefile (tests): Add tst-popen.
-
-2003-01-06 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/sigwait.c (do_sigwait): Add
- INTERNAL_SYSCALL_DECL, add err argument to INTERNAL_SYSCALL* macros.
-
-2003-01-06 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h (PSEUDO): Use
- PSEUDO_PREPARE_ARGS. Fix branch condition after SINGLE_THREAD_P.
-
-2003-01-06 Philip Blundell <philb@gnu.org>
-
- * sysdeps/unix/sysv/linux/arm/sysdep-cancel.h: New file.
-
-2003-01-06 Jakub Jelinek <jakub@redhat.com>
-
- * internals.h (LIBC_CANCEL_HANDLED): Define.
- * sysdeps/unix/sysv/linux/sigwait.c (LIBC_CANCEL_HANDLED): Add.
- * signals.c (LIBC_CANCEL_HANDLED): Add.
- * pt-system.c (LIBC_CANCEL_HANDLED): Add.
- * tst-cancel-wrappers.sh: Remove all exceptions.
-
- * sysdeps/unix/sysv/linux/alpha/Makefile: New file.
-
-2003-01-05 Andreas Schwab <schwab@suse.de>
-
- * sysdeps/m68k/Makefile: New file, use -fPIC for nonshared
- objects.
-
- * sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h (SINGLE_THREAD_P):
- Fix for PIC.
- (CENABLE): Likewise.
- (CDISABLE): Likewise.
-
-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>.
-
- * Makefile (libc.so-no-z-defs): Define to yes.
-
-2003-01-05 Kaz Kojima <kkojima@rr.iij4u.or.jp>
-
- * sysdeps/sh/tls.h: Include dl-sysdep.h and stdint.h.
- (tcbhead_t): Add multiple_threads member.
- (TLS_INIT_TP_EXPENSIVE): Define.
- * sysdeps/unix/sysv/linux/sh/pt-initfini.c: Don't use multi-line
- strings. Remove unused code.
- * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: New file.
-
-2003-01-04 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
-
- * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: New file.
- * sysdeps/unix/sysv/linux/powerpc/powerpc32/Makefile: New file.
-
-2003-01-04 Jakub Jelinek <jakub@redhat.com>
-
- * internals.h (LIBC_THREAD_GETMEM, LIBC_THREAD_SETMEM): Define
- even if NOT_IN_libc is defined.
-
-2003-01-05 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h: New file.
- * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h: New file.
- * sysdeps/s390/Makefile: New file.
- * sysdeps/s390/tcb-offsets.sym: New file.
- * sysdeps/s390/tls.h: New file.
-
-2003-01-03 Richard Henderson <rth@redhat.com>
-
- * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h: New file.
-
-2003-01-03 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/pthread/bits/libc-tsd.h: Declare weak_extern functions.
-
-2003-01-03 Jakub Jelinek <jakub@redhat.com>
-
- * Makefile ($(objpfx)libpthread.so): Depend on ld.so.
-
-2003-01-02 Ulrich Drepper <drepper@redhat.com>
-
- * tst-cancel-wrappers.sh: Exclude sigwait.c as well, it does not have
- cancellation tests.
-
-2003-01-02 Jakub Jelinek <jakub@redhat.com>
-
- * internals.h (struct pthread_functions): Rename
- ptr_pthread_cond_* fields to ptr___pthread_cond_*.
- * pthread.c (pthread_functions): Adjust.
- * forward.c: Export both pthread_cond_*@@GLIBC_2.3.2 and
- pthread_cond_*@GLIBC_2.0 compatibility symbols.
- * Versions [libc] (GLIBC_2.3.2): Export pthread_cond_broadcast,
- pthread_cond_destroy, pthread_cond_init, pthread_cond_signal
- and pthread_cond_wait.
-
- * sysdeps/pthread/bits/pthreadtypes.h (__pthread_cond_align_t): New
- type.
- (pthread_cond_t): Add __align member, shorten __padding.
- * sysdeps/pthread/pthread.h (PHTREAD_COND_INITIALIZER): Initialize
- __padding and __align too.
-
- * sysdeps/pthread/bits/libc-lock.h (__libc_maybe_call2): Add
- __builtin_expect.
- * sysdeps/pthread/sigaction.c: New file.
- * sysdeps/unix/sysv/linux/raise.c: New file.
- * sysdeps/unix/sysv/linux/sigwait.c: New file.
- * sysdeps/unix/sysv/linux/fork.c (__pthread_fork): Protect
- weak_extern with #ifndef SHARED.
- * sysdeps/unix/sysv/linux/jmp-unwind.c (__pthread_cleanup_upto):
- Likewise.
- * signals.c (__sigaction): Renamed to...
- (__pthread_sigaction): ... this.
- (__sigaction): New strong alias, #ifdef SHARED only.
- (sigaction): Protect with #ifdef SHARED.
- (sigwait): Renamed to...
- (__pthread_sigwait): ... this.
- (sigwait): New strong alias, #ifdef SHARED only.
- (raise): Renamed to...
- (__pthread_raise): ... this.
- (raise): New strong alias, #ifdef SHARED only.
- * internals.h (__pthread_sigaction, __pthread_sigwait,
- __pthread_raise): New prototypes.
- (struct pthread_functions): Add ptr_pthread_sigaction,
- ptr_pthread_sigwait, ptr_pthread_raise.
- * pthread.c (pthread_functions): Renamed to...
- (__pthread_functions): ... this. No longer static, no longer
- SHARED only. Initialize ptr_pthread_sigaction, ptr_pthread_sigwait
- and ptr_pthread_raise.
- [SHARED] (ptr_pthread_functions): Change to &__pthread_functions.
- * libc-cancellation.c (__pthread_thread_self): Remove weak_extern.
- * ptfork.c (__fork, __vfork): Protect with #ifdef SHARED.
- * ptlongjmp.c (siglongjmp, longjmp): Protect with #ifdef SHARED.
-
- * Makefile (tests, tests-static): Add tst-cancel-static.
- * tst-cancel-static.c: New test.
-
-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/pthread/bits/pthreadtypes.h (pthread_cond_t): Add padding.
- * condvar.c: Add symbol versioning. The compatibility versions
- are the same as the change in the interface does not effect this
- implementation.
- * Versions [libpthread]: Add definitions for new pthread_cond_*
- interfaces for version GLIBC_2.3.2.
-
-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/i386/i686/pt-machine.h: Use __ASSEMBLER__ instead of
- ASSEMBLER test macro.
- * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Likewise.
- * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h: Likewise.
- * sysdeps/unix/sysv/linux/m68k/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/x86_64/sysdep-cancel.h: Likewise.
-
- * sysdeps/pthread/errno-loc.c (__errno_location): Add
- libc_hidden_def.
- * sysdeps/pthread/herrno-loc.c (__h_errno_location): Likewise.
- * sysdeps/pthread/res-state.c (__res_state): Likewise.
- * sysdeps/unix/sysv/linux/allocrtsig.c (__libc_current_sigrtmin,
- __libc_current_sigrtmax): Likewise.
- * Versions [libc] (GLIBC_PRIVATE): Remove __libc_internal_tsd_get,
- __libc_internal_tsd_set, __libc_internal_tsd_address,
- __libc_alloca_cutoff.
- [libpthread] (GLIBC_PRIVATE): Remove __libc_internal_tsd_get,
- __libc_internal_tsd_set, __libc_internal_tsd_address.
-
- * sysdeps/pthread/list.h: Remove assert.h include.
- * sysdeps/unix/sysv/linux/fork.c: Include <fork.h>, not "fork.h".
-
- * sysdeps/pthread/list.h: New file.
- * sysdeps/unix/sysv/linux/jmp-unwind.c: New file.
- * sysdeps/unix/sysv/linux/fork.c: New file.
- * sysdeps/unix/sysv/linux/fork.h: New file.
- * sysdeps/unix/sysv/linux/ia64/fork.h: New file.
- * sysdeps/unix/sysv/linux/sparc/fork.h: New file.
- * sysdeps/unix/sysv/linux/register-atfork.c: New file.
- * sysdeps/unix/sysv/linux/unregister-atfork.c: New file.
- * sysdeps/unix/sysv/linux/Makefile: New file.
- * sysdeps/unix/sysv/linux/Versions: New file.
- * ptlongjmp.c (pthread_cleanup_upto): Rename to...
- (__pthread_cleanup_upto): ...this. Add targetframe argument,
- use it instead of currentframe. No longer static.
- (siglongjmp, longjmp): Remove pthread_cleanup_upto calls.
- * internals.h (__pthread_cleanup_upto, __pthread_fork): New prototypes.
- (struct pthread_functions): Add ptr_pthread_fork,
- ptr_pthread_cleanup_upto.
- * pthread.c (pthread_functions): Initialize ptr_pthread_fork and
- ptr_pthread_cleanup_upto.
- * ptfork.c: Include fork.h.
- (struct handler_list, struct handler_list_block): Remove.
- (pthread_atfork_lock, pthread_atfork_prepare, pthread_atfork_parent,
- pthread_atfork_child): Remove.
- (pthread_insert_list, __pthread_atfork, pthread_call_handlers): Remove.
- (__pthread_fork): New function.
- (__fork, __vfork): Call __libc_fork.
- * Makefile (libpthread-routines): Add old_pthread_atfork.
- (libpthread-nonshared): Add pthread_atfork.
- (others): Depend on $(objpfx)libpthread_nonshared.a.
- ($(objpfx)libpthread_nonshared.a): New rule.
- (install): Depend on $(inst_libdir)/libpthread.so.
- ($(inst_libdir)/libpthread.so, $(inst_libdir)/libpthread_nonshared.a):
- New rules.
- (tests): Depend on libpthread_nonshared.a too.
- * old_pthread_atfork.c: New file.
- * pthread_atfork.c: New file.
- * Makeconfig (shared-thread-library): Include libpthread_nonshared.a
- too.
-
-2002-12-30 Jakub Jelinek <jakub@redhat.com>
-
- * forward.c: Make all functions available by default again. It
- caused too much trouble.
- * internals.h (struct pthread_functions): Rename ptr_pthread_exit
- and ptr_pthread_attr_init_2_* to ptr___pthread_exit and
- ptr___pthread_attr_init_2_*.
- * pthread.c (pthread_functions): Adjust.
-
-2002-12-28 Jakub Jelinek <jakub@redhat.com>
-
- * libc_pthread_init.c (__libc_pthread_init): Remove
- MULTIPLE_THREADS_OFFSET check.
- * sysdeps/i386/tls.h: Include tcb-offsets.h in assembler.
- (SYSINFO_OFFSET): Remove.
- * sysdeps/i386/Makefile [csu] (gen-as-const-headers): Add
- tcb-offsets.sym.
- * sysdeps/i386/tcb-offsets.sym: New file.
- * sysdeps/pthread/tcb-offsets.h: New file.
- * sysdeps/sparc/sparc32/tls.h: Removed.
- * sysdeps/sparc/sparc64/tls.h: Move...
- * sysdeps/sparc/tls.h: ...here. Include tcb-offsets.h in assembler.
- * sysdeps/sparc/Makefile: New file.
- * sysdeps/sparc/tcb-offsets.sym: New file.
- * sysdeps/ia64/tls.h: Include tcb-offsets.h in assembler.
- * sysdeps/ia64/Makefile: New file.
- * sysdeps/ia64/tcb-offsets.sym: New file.
- * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
- (MULTIPLE_THREADS_OFFSET): Remove.
- Replace defined MULTIPLE_THREADS_OFFSET
- with defined FLOATING_STACKS && USE___THREAD.
- * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
- (MULTIPLE_THREADS_OFFSET): Remove.
- * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
- (MULTIPLE_THREADS_OFFSET): Remove.
- * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
- (MULTIPLE_THREADS_OFFSET): Remove.
- * pthread.c (__pthread_initialize_manager): Remove
- MULTIPLE_THREADS_OFFSET cbeck.
-
- * tst-cancel-wrappers.sh: Add line continuations.
-
-2002-12-27 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/pthread/bits/libc-tsd.h: Include linuxthreads/descr.h
- and bits/libc-lock.h.
- (__libc_internal_tsd_get, __libc_internal_tsd_set,
- __libc_internal_tsd_address): Remove.
- (__pthread_internal_tsd_address, __pthread_internal_tsd_get,
- __pthread_internal_tsd_set): New weak_externs.
- (__libc_tsd_address, __libc_tsd_get, __libc_tsd_set): Define
- using __libc_maybe_call2.
- (__libc_tsd_key_t): Move to ...
- * descr.h (__libc_tsd_key_t): ...here.
- Remove bits/libc-tsd.h include.
- * sysdeps/pthread/errno-loc.c: New file.
- * sysdeps/pthread/herrno-loc.c: New file.
- * sysdeps/pthread/res-state.c: New file.
- * libc-cancellation.c (THREAD_GETMEM, THREAD_SETMEM): Remove.
- (__libc_enable_asynccancel, __libc_disable_asynccancel): Use
- thread_self unconditionally. Use LIBC_THREAD_[SG]ETMEM instead
- of THREAD_[SG]ETMEM.
- * specific.c (libc_internal_tsd_set): Renamed to...
- __pthread_internal_tsd_set. Remove static.
- (libc_internal_tsd_get): Renamed to...
- __pthread_internal_tsd_get. Remove static.
- (libc_internal_tsd_address): Renamed to...
- __pthread_internal_tsd_address. Remove static.
- (__libc_internal_tsd_set, __libc_internal_tsd_get,
- __libc_internal_tsd_address, __libc_alloca_cutoff): Remove.
- * internals.h [!NOT_IN_libc] (LIBC_THREAD_GETMEM, LIBC_THREAD_SETMEM):
- Define.
- (__pthread_internal_tsd_set, __pthread_internal_tsd_get,
- __pthread_internal_tsd_address): New prototypes.
- (struct pthread_functions): Add
- ptr_pthread_internal_tsd_([sg]et|address) fields.
- [!NOT_IN_libc && !FLOATING_STACKS] (thread_self): Define.
- * pthread.c (pthread_functions) [!USE_TLS && !HAVE___THREAD]:
- Initialize ptr_pthread_internal_tsd_([sg]et|address) fields.
- * Versions (libpthread): Remove __libc_alloca_cutoff@GLIBC_PRIVATE.
- * alloca_cutoff.c: New file.
- * no-tsd.c: Removed.
- * Makefile (routines): Remove no-tsd. Add alloca_cutoff.
- * pt-system.c (system): Remove cancellation handling.
- * tst-cancel-wrappers.sh: Allow pt-system.o* to not use the
- cancellation routines.
-
- * sysdeps/i386/tls.h: Include dl-sysdep.h and stdint.h.
- (tcbhead_t): Add sysinfo field.
- (SYSINFO_OFFSET, INIT_SYSINFO): Define.
- (TLS_INIT_TP): Use INIT_SYSINFO.
- * sysdeps/unix/sysv/linux/i386/dl-sysdep.h: New file.
- * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
- (MULTIPLE_THREADS_OFFSET): Adjust.
- * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
- (MULTIPLE_THREADS_OFFSET): Likewise.
- * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
- (MULTIPLE_THREADS_OFFSET): Likewise.
- * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
- (MULTIPLE_THREADS_OFFSET): Likewise.
- * descr.h: Include stdint.h.
- (struct _pthread_descr_struct): Add p_header.data.sysinfo field.
-
-2002-12-22 Jakub Jelinek <jakub@redhat.com>
-
- * libc_pthread_init.c: Include stdlib.h.
- * sysdeps/i386/tls.h (tcbhead_t): Add multiple_threads member.
- (TLS_INIT_TP_EXPENSIVE): Define.
- * sysdeps/pthread/bits/libc-lock.h (__libc_maybe_call,
- __libc_maybe_call2): In _LIBC check SHARED define.
- * sysdeps/ia64/tls.h: New file.
- * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h: New file.
- * sysdeps/unix/sysv/linux/ia64/Makefile: New file.
- * sysdeps/x86_64/tls.h (TLS_INIT_TP_EXPENSIVE): Define.
- * sysdeps/sparc/sparc32/tls.h: New file.
- * sysdeps/sparc/sparc64/tls.h: New file.
- * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: New file.
- * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: New file.
- * Makefile (tests): Add tst-cancel[1-6].
- (tests-reverse): Add tst-cancel5.
- Link libc.so before libpthread.so for tests-reverse.
- * tst-cancel1.c: New file.
- * tst-cancel2.c: New file.
- * tst-cancel3.c: New file.
- * tst-cancel4.c: New file.
- * tst-cancel5.c: New file.
- * tst-cancel6.c: New file.
-
-2002-12-27 Andreas Schwab <schwab@suse.de>
-
- * sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h: New file.
-
-2002-12-22 Roland McGrath <roland@redhat.com>
-
- * Makefile (omit-deps): Add $(unix-syscalls:%=ptw-%).
-
-2002-12-21 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c (init_rtsigs): Remove incomplete __builtin_expect.
- Reported by Art Hass <ahaas@airmail.net>.
-
-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.
-
-2002-12-18 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/i386/useldt.h (FLOATING_STACKS, ARCH_STACK_MAX_SIZE): Only
- define if __ASSUME_LDT_WORKS > 0.
- * libc-cancellation.c (THREAD_GETMEM, THREAD_SETMEM): Redefine to
- struct member access if !FLOATING_STACKS.
- * sysdeps/pthread/flockfile.c (flockfile): Change into weak alias.
-
-2002-12-18 Jakub Jelinek <jakub@redhat.com>
-
- * internals.h (__pthread_thread_self): New prototype.
- (struct pthread_functions): Add ptr_pthread_thread_self field.
- * pthread.c (pthread_functions): Initialize ptr_pthread_thread_self.
- (__pthread_thread_self): New function.
- * libc-cancellation.c (__pthread_thread_self): Add weak_extern.
- (__libc_enable_asynccancel, __libc_disable_asynccancel): Don't
- use thread_self() directly if not FLOATING_STACKS.
-
-2002-12-18 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/x86_64/pt-machine.h: Guard most of the header
- with #ifndef __ASSEMBLER__.
- * pthread.c (pthread_functions): Use SHLIB_COMPAT around
- pthread_attr_init_2_0 use.
-
-2002-12-17 Jakub Jelinek <jakub@redhat.com>
-
- * wrapsyscall.c: Removed.
- * weaks.c: Removed.
- * Makefile (distribute): Add tst-cancel-wrappers.sh.
- (routines): Remove weaks. Add forward,
- libc_pthread_init, libc-cancellation.
- (shared-only-routines): Remove weaks. Add forward.
- (libpthread-routines): Remove wrapsyscall.
- Add ptw-write, ptw-read, ptw-close, ptw-fcntl, ptw-accept,
- ptw-connect, ptw-recv, ptw-recvfrom, ptw-recvmsg, ptw-send,
- ptw-sendmsg, ptw-sendto, ptw-fsync, ptw-lseek, ptw-lseek64,
- ptw-llseek, ptw-msync, ptw-nanosleep, ptw-open, ptw-open64,
- ptw-pause, ptw-pread, ptw-pread64, ptw-pwrite, ptw-pwrite64,
- ptw-tcdrain, ptw-wait, ptw-waitpid, pt-system, pt-allocrtsig.
- (libpthread-shared-only-routines): Add pt-allocrtsig.
- (tests): Depend on $(objpfx)tst-cancel-wrappers.out.
- ($(objpfx)tst-cancel-wrappers.out): New rule.
- * sysdeps/pthread/bits/libc-lock.h: Include linuxthreads/internals.h
- if in libc.
- (__libc_maybe_call): In libpthread.* don't check for existance
- of the function.
- (__libc_maybe_call2): Define.
- (__libc_lock_init, __libc_lock_fini, __libc_lock_lock,
- __libc_lock_trylock, __libc_lock_unlock): Use it.
- * sysdeps/pthread/flockfile.c: New file.
- * sysdeps/pthread/ftrylockfile.c: New file.
- * sysdeps/pthread/funlockfile.c: New file.
- * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: New file.
- * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h: New file.
- * sysdeps/unix/sysv/linux/allocrtsig.c: New file.
- * libc-cancellation.c: New file.
- * forward.c: New file.
- * libc_pthread_init.c: New file.
- * pt-system.c: New file.
- * pthread.c: Remove locale.h.
- (__pthread_manager_thread): Initialize multiple_threads.
- (__pthread_multiple_threads): Declare.
- (pthread_functions): New variable.
- (__pthread_initialize_minimal): Remove __uselocale call.
- Call __libc_pthread_init.
- (__pthread_initialize_manager): Initialize __pthread_multiple_threads,
- initial thread's multiple_threads and __libc_multiple_threads.
- Check MULTIPLE_THREADS_OFFSET value. Initialize manager thread's
- multiple_threads.
- (pthread_setschedparam, pthread_getschedparam): Rename to __
- prefixed variants. Add strong_alias.
- (current_rtmin, current_rtmax, __libc_current_sigrtmin,
- __libc_current_sigrtmax, __libc_allocate_rtsig): Remove.
- (init_rtsigs): Use __libc_current_sigrtmin_private.
- (pthread_initialize): Only call init_rtsigs if
- !__ASSUME_REALTIME_SIGNALS.
- (__pthread_require_wrappers, __pthread_require_lockfile): Remove.
- * internals.h (__pthread_attr_destroy, __pthread_attr_setdetachstate,
- __pthread_attr_getdetachstate, __pthread_attr_setschedparam,
- __pthread_attr_getschedparam, __pthread_attr_setschedpolicy,
- __pthread_attr_getschedpolicy, __pthread_attr_setinheritsched,
- __pthread_attr_getinheritsched, __pthread_attr_setscope,
- __pthread_attr_getscope, __pthread_cond_init,
- __pthread_cond_destroy, __pthread_cond_wait,
- __pthread_cond_signal, __pthread_cond_broadcast,
- __pthread_condattr_init, __pthread_condattr_destroy,
- __pthread_equal, __pthread_getschedparam,
- __pthread_setschedparam, __pthread_setcancelstate,
- __pthread_setcanceltype, __pthread_enable_asynccancel,
- __libc_enable_asynccancel, __libc_pthread_init): New prototype.
- (__pthread_mutex_init, __pthread_mutex_destroy,
- __pthread_mutex_lock, __pthread_mutex_unlock,
- __pthread_mutex_trylock): Likewise.
- Add hidden_proto.
- (struct pthread_functions): New type.
- (__libc_pthread_functions): New variable.
- (LIBC_CANCEL_ASYNC, LIBC_CANCEL_RESET): Define.
- * descr.h (struct _pthread_descr_struct): Add
- p_header.data.multiple_threads field.
- * manager.c (pthread_handle_create): Initialize multiple_threads.
- * cancel.c (__pthread_enable_asynccancel,
- __pthread_disable_asynccancel): New functions.
- (__pthread_provide_wrappers): Remove.
- (pthread_setcancelstate, pthread_setcanceltype): Rename to __
- prefixed variants. Add strong_alias.
- * condvar.c (pthread_cond_init, pthread_cond_destroy,
- pthread_cond_wait, pthread_cond_signal, pthread_cond_broadcast,
- pthread_condattr_init, pthread_condattr_destroy): Likewise.
- * join.c (pthread_exit): Likewise.
- * attr.c (pthread_attr_destroy, pthread_attr_setdetachstate,
- pthread_attr_getdetachstate, pthread_attr_setschedparam,
- pthread_attr_getschedparam, pthread_attr_setschedpolicy,
- pthread_attr_getschedpolicy, pthread_attr_setinheritsched,
- pthread_attr_getinheritsched, pthread_attr_setscope,
- pthread_attr_getscope): Likewise.
- * mutex.c (__pthread_mutex_init, __pthread_mutex_destroy,
- __pthread_mutex_lock, __pthread_mutex_unlock,
- __pthread_mutex_trylock): Add hidden_def.
- * Versions (libc): Add __libc_pthread_init,
- __libc_current_sigrtmin_private, __libc_current_sigrtmax_private,
- __libc_allocate_rtsig_private @@GLIBC_PRIVATE.
- * lockfile.c: Remove some USE_IN_LIBIO guards.
- (__pthread_provide_lockfile): Remove.
- * pt-allocrtsig.c: New file.
- * tst-cancel-wrappers.sh: New test.
-
-2002-12-15 Ulrich Drepper <drepper@redhat.com>
-
- * Versions [libpthread: GLIBC_2.3.2]: Remove creat, poll, pselect,
- readv, select, sigpause, sigsuspend, sigwaitinfo, waitid, writev.
- * wrapsyscall.c: Remove creat, poll, pselect, readv, select,
- sigpause, sigsuspend, sigwaitinfo, waitid, and writev wrappers.
-
-2002-12-10 Ulrich Drepper <drepper@redhat.com>
-
- * wrapsyscall.c (CANCELABLE_SYSCALL): Don't define function as
- weak. There is no reason for that.
- (CANCELABLE_SYSCALL_VA): Likewise.
-
-2002-12-09 Ulrich Drepper <drepper@redhat.com>
-
- * wrapsyscall.c: Add wrappers for creat, poll, pselect, readv, select,
- sigpause, __xpg_sigpause, sigsuspend, sigwaitinfo, waitid, and writev.
- * Versions: Export creat, poll, pselect, readv, select, sigpause,
- __xpg_sigpause, sigsuspend, sigwaitinfo, waitid, and writev from
- libpthread in version GLIBC_2.3.2.
-
-2002-12-06 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/bits/libc-lock.h: Define __rtld_lock_* macros.
-
-2002-12-05 Roland McGrath <roland@redhat.com>
-
- * pthread.c (__pthread_initialize_minimal)
- [USE_TLS && SHARED && !USE___THREAD]: Initialize TLS and set up the
- TCB if the dynamic linker didn't do it at startup.
-
- * sysdeps/i386/tls.h (TLS_INIT_TP): Make it return zero or an error
- string.
- (TLS_DO_SET_THREAD_AREA, TLS_DO_MODIFY_LDT, TLS_SETUP_GS_SEGMENT):
- Submacros updated.
- * sysdeps/x86_64/tls.h (TLS_INIT_TP): Likewise.
- * sysdeps/alpha/tls.h (TLS_INIT_TP): Likewise (always zero).
-
-2002-12-03 Roland McGrath <roland@redhat.com>
-
- * pthread.c (pthread_initialize) [SHARED]: Copy dl_error_tsd value
- from dynamic linker internal cell to new libc cell.
-
-2002-11-28 Roland McGrath <roland@redhat.com>
-
- * tst-context.c: #define IS_IN_libpthread around #include <tls.h>
- before other headers, so FLOATING_STACKS is not defined wrongly.
-
- * sysdeps/i386/tls.h [!IS_IN_libpthread]: Enable TLS support
- even if [! FLOATING_STACKS].
- (TLS_DO_MODIFY_LDT_KERNEL_CHECK): New macro.
- If not under [__ASSUME_LDT_WORKS > 0], then do a runtime check of
- dl_osversion >= 2.3.99 and fatal if not.
- (TLS_DO_MODIFY_LDT): Use it.
-
-2002-11-28 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define macros which
- require it to 200112L. Remove _POSIX_POLL and _POSIX_SELECT.
- * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise.
-
-2002-11-19 Ulrich Drepper <drepper@redhat.com>
-
- * Versions (libc: GLIBC_2.0): Remove names of functions which are
- not defined in libc.
- * Makefile (shared-only-routines): Add weaks.
- * weaks.c: Remove functions which are not exported from libc.so.
-
-2002-11-14 Roland McGrath <roland@redhat.com>
-
- * libc-tsd.c: New file.
- * Makefile (distribute): Add it.
- (libc-link.so): New variable.
- ($(objpfx)libpthread.so): Depend on that instead of libc.so file name.
- (libc-ok-for-link): New variable.
- [$(versioning) = yes]: Include $(common-objpfx)tls.make and define
- libc-ok-for-link to $(use-thread).
- [$(libc-ok-for-link) = no]
- (libc-link.so): Set to $(objpfx)libc.so, not $(common-objpfx)libc.so.
- ($(objpfx)libc_pic_lite.a,$(objpfx)libc_pic_lite.os, $(objpfx)libc.so):
- New targets.
- (generated): Append them.
- (extra-objs): Append libc-tsd.os.
-
- * libc-tls-loc.c: New file.
- * Makefile (libpthread-routines): Add it.
-
-2002-11-14 Andreas Schwab <schwab@suse.de>
-
- * sysdeps/unix/sysv/linux/ia64/pt-initfini.c: Fix unterminated
- string.
-
-2002-11-13 Roland McGrath <roland@redhat.com>
-
- * Examples/ex6.c (main): Improve error reporting.
-
-2002-11-04 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/Makefile: Compile pthread.c and sighandler.c with
- -fno-omit-frame-pointer. Patch by Andreas Steinmetz <ast@domdv.de>.
-
- * sysdeps/i386/useldt.h [PIC] (USETLS_LOAD_EBX): Use correct input
- register number.
- (DO_SET_THREAD_AREA): Mark asm output specifiers correctly.
-
-2002-10-22 Jakub Jelinek <jakub@redhat.com>
-
- * manager.c (pthread_start_thread): Call __uselocale even
- if [! SHARED]. Patch by Leon Kanter <leon@geon.donetsk.ua>.
-
-2002-10-17 Roland McGrath <roland@redhat.com>
-
- * Makefile (unload): Don't link in libpthread.so.
- ($(objpfx)unload.out): Do depend on it.
- * unload.c (main): Improve error reporting.
-
-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)
- (__libc_atfork): Use it.
-
- * pthread.c [SHARED] (__libc_dl_error_tsd): New function.
- (pthread_initialize) [SHARED]: Set _dl_error_catch_tsd to that.
- * Versions (libc: GLIBC_PRIVATE): Add __libc_dl_error_tsd.
- (ld: GLIBC_PRIVATE): Set removed.
-
-2002-10-11 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/execve.c: New file.
-
-2002-10-09 Jakub Jelinek <jakub@redhat.com>
-
- * no-tsd.c: Include stdlib.h.
-
-2002-10-07 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/allocalim.h: New file.
- * descr.h (struct _pthread_descr_struct): Add p_alloca_cutoff
- field.
- * manager.c (__pthread_allocate_stack): Add out_stacksize argument.
- Pass stack size to caller.
- (pthread_handle_create): Set p_alloca_cutoff.
- * pthread.c (__pthread_initial_thread): Use C99 designated
- initializers. Set p_alloca_cutoff.
- (__pthread_manager_thread): Likewise.
- (__pthread_initialize_minimal) [USE_TLS]: Set p_alloca_cutoff
- for initial thread.
- (__pthread_init_max_stacksize): Possibly decrease p_alloca_cutoff
- for initial thread.
- (__pthread_initialize_manager) [USE_TLS]: Set p_alloca_cutoff
- for manager thread.
- * specific.c (__libc_alloca_cutoff): New function.
- * no-tsd.c (__libc_alloca_cutoff): New function.
- * Versions: Export __libc_alloca_cutoff@@GLIBC_PRIVATE from libc
- and libpthread.
-
-2002-10-02 Kaz Kojima <kkojima@rr.iij4u.or.jp>
-
- * sysdeps/sh/pt-machine.h: Make C code ifndef'ed with __ASSEMBLER__.
- * sysdeps/sh/tls.h: Likewise.
- * sysdeps/unix/sysv/linux/sh/smp.h: New file.
-
-2002-09-29 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/pthread/tst-timer.c (main): Clear
- SIGEV2.sigev_notify_attributes.
-
-2002-09-29 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/useldt.h (DO_SET_THREAD_AREA): Don't use
- INLINE_SYSCALL for set_thread_area syscall.
-
-2002-09-28 Roland McGrath <roland@redhat.com>
-
- * pthread.c (__pthread_reset_main_thread) [FLOATING_STACKS]:
- Don't call setrlimit, since we did no prior bogon we need to undo.
-
-2002-09-27 Roland McGrath <roland@redhat.com>
-
- * sysdeps/x86_64/tls.h [__ASSEMBLER__]: Don't include <pt-machine.h>.
-
-2002-09-24 Roland McGrath <roland@redhat.com>
-
- * sysdeps/x86_64/tls.h: New file.
-
-2002-09-23 Roland McGrath <roland@redhat.com>
-
- * Examples/ex13.c (dump_mut): int -> size_t for counter.
-
-2002-09-18 Bruno Haible <bruno@clisp.org>
-
- * Examples/ex10.c (thread): Fail if pthread_mutex_timedlock() returns
- an unexpected error code.
-
- * internals.h (__pthread_message): Add const to first parameter type.
- * pthread.c (__pthread_message): Likewise.
-
- * sysdeps/unix/sysv/linux/configure: Moved to ../sysdeps/pthread.
-
-2002-09-17 Roland McGrath <roland@redhat.com>
-
- * sysdeps/i386/tls.h (TLS_DO_MODIFY_LDT, TLS_DO_SET_THREAD_AREA):
- Set the descriptor limit to the full 4GB, so %gs:OFFSET works for any
- offset (positive or negative) relative to the thread struct.
- * sysdeps/i386/useldt.h (DO_MODIFY_LDT, DO_SET_THREAD_AREA): Likewise.
-
-2002-09-12 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/sparc/sparc64/Makefile: Move...
- * sysdeps/unix/sysv/linux/sparc/Makefile: ...here.
- Replace /usr/lib/crt[in].o with crt[in].o too.
-
-2002-09-11 Steven Munroe <sjmunroe@us.ibm.com>
-
- * sysdeps/powerpc/powerpc64/pt-machine.h: New file.
-
-2002-09-04 Bruno Haible <bruno@clisp.org>
-
- * pthread.c: Include <sys/time.h>.
- (is_smp_system): Move to sysdeps/unix/sysv/linux/smp.h.
- * sysdeps/unix/sysv/linux/smp.h: New file, extracted from pthread.c.
- * Makefile (distribute): Add smp.h to the list.
-
-2002-09-04 Bruno Haible <bruno@clisp.org>
-
- * sysdeps/alpha/pt-machine.h: Choose different include file location
- on non-Linux platforms.
-
- * wrapsyscall.c (PROMOTE_INTEGRAL_TYPE): New macro.
- (open, open64): Change va_arg argument type to the integral type to
- which mode_t promotes.
-
- * sysdeps/pthread/tst-timer.c (main): Don't assume anything about
- the structure of 'struct sigevent'.
-
- * errno.c (__errno_location, __h_errno_location, __res_state):
- Use prototype function definitions.
-
-2002-07-29 Steven Munroe <sjmunroe@us.ibm.com>
-
- * shlib-versions: Set libpthread version to 2.3 for powerpc64.
- * sysdeps/powerpc/pt-machine.h: moved to...
- * sysdeps/powerpc/powerpc32/pt-machine.h: ...here
- * sysdeps/powerpc/powerpc64/pt-machine.h: New file.
-
-2002-09-02 Roland McGrath <roland@redhat.com>
-
- * sysdeps/powerpc/Makefile (CFLAGS-pt-initfini.s): New variable.
-
-2002-09-01 Roland McGrath <roland@redhat.com>
-
- * sysdeps/pthread/bits/libc-tsd.h (enum __libc_tsd_key_t): Add new keys
- CTYPE_B, CTYPE_TOLOWER, CTYPE_TOUPPER.
-
- * sysdeps/pthread/bits/libc-tsd.h (__libc_tsd_address): New macro.
- (__libc_internal_tsd_address): Declare it.
- * Versions (libc, ld, libpthread: GLIBC_PRIVATE): Add
- __libc_internal_tsd_address.
- * specific.c (libc_internal_tsd_address): New function.
- (__libc_internal_tsd_address): New variable.
- * no-tsd.c (__libc_internal_tsd_address): New variable.
-
-2002-08-31 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile: Don't use rule for crt%.o, spell it out as rules for
- crti.o and crtn.o.
-
-2002-08-30 Roland McGrath <roland@redhat.com>
-
- * Makefile (extra-objs, omit-deps): Add crtn.
- ($(objpfx)libpthread.so): Depend on $(objpfx)crtn.o.
- ($(objpfx)libpthread.so: +postinit): Append $(objpfx)crtn.o.
- ($(objpfx)crtn.S): New target.
- ($(objpfx)crt%.o): Pattern rule replaces crti.o target.
- (generated): Add crtn.S.
-
- * sysdeps/unix/sysv/linux/x86_64/Makefile ($(objpfx)specs): Massage
- crtn.o pathname too.
-
-2002-08-30 Jakub Jelinek <jakub@redhat.com>
-
- * pthread.c (__pthread_initialize_minimal): Call __uselocale even
- if [! SHARED].
-
-2002-08-30 Roland McGrath <roland@redhat.com>
-
- * tst-static-locale.c: New file.
- * Makefile (tests, tests-static): Add it.
-
-2002-04-24 Steven Munroe <sjmunroe@us.ibm.com>
-
- * spinlock.c (__pthread_lock): Fix spurious wakeup
- handling. Don't clear lowest bit of list pointer as sign the thread
- is still on the wait list. Don't restart after spurious wakeup
- with spinning to get the lock.
- (__pthread_unlock): Take set lowest bit into account when handling
- pointer to list elements.
- Patch by Steve Munroe <sjmunroe@us.ibm.com>.
-
-2002-08-28 Roland McGrath <roland@redhat.com>
-
- * sysdeps/pthread/timer_routines.c (thread_func): Fix type in cast.
-
-2002-08-28 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/hppa/aio_cancel.c: New file.
- * sysdeps/unix/sysv/linux/sparc/aio_cancel.c: New file.
- * sysdeps/unix/sysv/linux/alpha/aio_cancel.c: New file.
-
-2002-08-28 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/timer_routines.c (thread_func): Change return
- type to void and add casts in use to avoid warnings with all gcc
- versions.
-
-2002-08-08 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/bits/local_lim.h (PTHREAD_THREADS_MAX):
- Bump to 16384.
- * manager.c (__pthread_handles): Remove.
- * pthandles.c: New file.
- * pthread.c (__pthread_initialize_minimal): Initialize
- __pthread_handles[0] and __pthread_handles[1].
- * Makefile (libpthread-routines): Add pthandles (must be last).
-
-2002-08-26 Brian Youmans <3diff@gnu.org>
-
- * Examples/ex10.c: Corrected version number in Lesser GPL copying
- permission notice from 2 to 2.1.
- * Examples/ex11.c: Likewise.
- * Examples/ex13.c: Likewise.
- * Examples/ex8.c: Likewise.
- * Examples/ex9.c: Likewise.
- * barrier.c: Likewise.
- * events.c: Likewise.
- * lockfile.c: Likewise.
- * no-tsd.c: Likewise.
- * pt-machine.c: Likewise.
- * ptclock_gettime.c: Likewise.
- * ptclock_settime.c: Likewise.
- * rwlock.c: Likewise.
- * sysdeps/alpha/pspinlock.c: Likewise.
- * sysdeps/alpha/pt-machine.h: Likewise.
- * sysdeps/arm/pspinlock.c: Likewise.
- * sysdeps/arm/pt-machine.h: Likewise.
- * sysdeps/cris/pspinlock.c: Likewise.
- * sysdeps/cris/pt-machine.h: Likewise.
- * sysdeps/hppa/pspinlock.c: Likewise.
- * sysdeps/hppa/pt-machine.h: Likewise.
- * sysdeps/i386/i686/pt-machine.h: Likewise.
- * sysdeps/i386/pspinlock.c: Likewise.
- * sysdeps/i386/pt-machine.h: Likewise.
- * sysdeps/i386/useldt.h: Likewise.
- * sysdeps/ia64/pspinlock.c: Likewise.
- * sysdeps/ia64/pt-machine.h: Likewise.
- * sysdeps/m68k/pspinlock.c: Likewise.
- * sysdeps/m68k/pt-machine.h: Likewise.
- * sysdeps/mips/pspinlock.c: Likewise.
- * sysdeps/mips/pt-machine.h: Likewise.
- * sysdeps/powerpc/pspinlock.c: Likewise.
- * sysdeps/powerpc/pt-machine.h: Likewise.
- * sysdeps/pthread/bits/initspin.h: Likewise.
- * sysdeps/pthread/bits/libc-lock.h: Likewise.
- * sysdeps/pthread/bits/libc-tsd.h: Likewise.
- * sysdeps/pthread/getcpuclockid.c: Likewise.
- * sysdeps/pthread/posix-timer.h: Likewise.
- * sysdeps/pthread/timer_create.c: Likewise.
- * sysdeps/pthread/timer_delete.c: Likewise.
- * sysdeps/pthread/timer_getoverr.c: Likewise.
- * sysdeps/pthread/timer_gettime.c: Likewise.
- * sysdeps/pthread/timer_routines.c: Likewise.
- * sysdeps/pthread/timer_settime.c: Likewise.
- * sysdeps/pthread/tst-timer.c: Likewise.
- * sysdeps/s390/pspinlock.c: Likewise.
- * sysdeps/s390/s390-32/pt-machine.h: Likewise.
- * sysdeps/s390/s390-64/pt-machine.h: Likewise.
- * sysdeps/sh/pspinlock.c: Likewise.
- * sysdeps/sh/pt-machine.h: Likewise.
- * sysdeps/sparc/sparc32/pspinlock.c: Likewise.
- * sysdeps/sparc/sparc32/pt-machine.h: Likewise.
- * sysdeps/sparc/sparc32/sparcv9/pspinlock.c: Likewise.
- * sysdeps/sparc/sparc64/pspinlock.c: Likewise.
- * sysdeps/sparc/sparc64/pt-machine.h: Likewise.
- * sysdeps/unix/sysv/linux/bits/local_lim.h: Likewise.
- * sysdeps/unix/sysv/linux/bits/posix_opt.h: Likewise.
- * sysdeps/unix/sysv/linux/bits/sigthread.h: Likewise.
- * sysdeps/unix/sysv/linux/hppa/bits/initspin.h: Likewise.
- * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise.
- * tststack.c: Likewise.
- * unload.c: Likewise.
- * weaks.c: Likewise.
- * wrapsyscall.c: Likewise.
-
- * sysdeps/pthread/pt-initfini.c: Changed copying
- permission notice to Lesser GPL from Library GPL, including the
- references in the special exception.
- * sysdeps/unix/sysv/linux/hppa/pt-initfini.c: Likewise.
- * sysdeps/unix/sysv/linux/ia64/pt-initfini.c: Likewise.
- * sysdeps/unix/sysv/linux/s390/s390-32/pt-initfini.c:
- Likewise.
- * sysdeps/unix/sysv/linux/s390/s390-64/pt-initfini.c:
- Likewise.
- * sysdeps/unix/sysv/linux/sh/pt-initfini.c: Likewise.
-
-2002-08-26 Ulrich Drepper <drepper@redhat.com>
-
- * Examples/ex10.c (thread): tv_nsec == 1000000000 is already
- overflow [PR libc/4244].
-
-2002-08-25 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/timer_routines.c (thread_func): Make the
- compiler happy by adding a return statement which will never be
- reached.
-
- * tst-context.c (main): Cast to long before casting to pointer.
-
- * Examples/ex17.c (main): Use correct format string.
-
- * Examples/ex9.c (thread): Remove incorrect return statement.
-
-2002-08-23 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c (__linuxthreads_version): New global constant.
-
-2002-08-23 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/x86_64/pt-machine.h: Use %fs instead of %gs
- as thread specific register.
- (testandset): Fix inline asm.
- (THREAD_GETMEM): Fix inline asm.
-
-2002-08-22 Roland McGrath <roland@redhat.com>
-
- * sysdeps/i386/useldt.h (INIT_THREAD_SELF): Remove [HAVE_TLS_SUPPORT]
- conditional.
- (INIT_THREAD_SELF): Pass second arg to DO_SET_THREAD_AREA.
- (DO_SET_THREAD_AREA): Take second arg, pass to DO_SET_THREAD_AREA_REUSE
- macro. That chooses whether to reuse %gs value or let kernel set it.
- [USE_TLS] (DO_SET_THREAD_AREA_REUSE): New macro, always 1.
- [!USE_TLS] (DO_SET_THREAD_AREA_REUSE): New macro, true if arg is
- not constant 0.
-
-2002-08-21 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/tls.h (TLS_SETUP_GS_SEGMENT): Add new parameter
- also to the third definition of this macro.
-
-2002-06-17 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/unix/sysv/linux/x86_64/Makefile (CFLAGS-pt-initfini.s):
- Set it.
-
-2002-08-20 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/useldt.h: Go back to using 16-bit instructions when
- loading/reading segment registers. Some old hardware doesn't
- handle the 32-bit instructions as expected.
- * sysdeps/i386/tls.h: Likewise.
-
- * sysdeps/i386/tls.h (TLS_DO_SET_THREAD_AREA): Second parameter is
- renamed to secondcall and use is negated.
- (TLS_SETUP_GS_SEGMENT): Likewise.
- (TLS_INIT_TP): Likewise.
- * sysdeps/sh/tls.h (TLS_INIT_TP): Second parameter is renamed to
- secondcall.
-
- * sysdeps/i386/tls.h: Use 32-bit operations when handling segment
- registers. No need to mask upper 16 bits in this case.
- * sysdeps/i386/useldt.h: Likewise.
- (DO_SET_THREAD_AREA): We have to load %gs again even if the value
- is the same since the GDT content changed.
-
- * sysdeps/i386/tls.h (TLS_INIT_TP): Add new parameter and pass it on
- to TLS_SETUP_GS_SEGMENT.
- (TLS_SETUP_GS_SEGMENT): Add new parameter and pass it on to
- TLS_DO_SET_THREAD_AREA.
- (TLS_DO_SET_THREAD_AREA): If new parameter is zero determine
- entry number from %gs value.
- * sysdeps/sh/tls.h (TLS_INIT_TP): Add new parameter and simply
- ignore it.
-
- * manager.c (pthread_handle_create): Pass NULL to _dl_allocate_tls.
- Pass true to _dl_deallocate_tls.
- (pthread_free): Likewise.
- * pthread.c (__pthread_initialize_manager): Likewise.
-
-2002-08-19 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/useldt.h (DO_SET_THREAD_AREA): Use correct shift when
- computing index from %gs value.
-
-2002-08-16 Roland McGrath <roland@redhat.com>
-
- * sysdeps/i386/tls.h (TLS_DO_SET_THREAD_AREA): Calculate segment
- register value from entry number properly.
-
- * sysdeps/i386/tls.h (TLS_DO_MODIFY_LDT): Rewrite asm to use %ebx
- optimally conditional on [__PIC__].
- (TLS_DO_SET_THREAD_AREA): New macro, implement inline syscall
- without touching errno, and use latest modify_ldt-like interface.
- (TLS_SETUP_GS_SEGMENT): Use that instead of INLINE_SYSCALL.
- * sysdeps/i386/useldt.h (DO_MODIFY_LDT): Set %gs in this macro.
- (DO_SET_THREAD_AREA): New macro, uses current syscall interface with
- existing %gs value as the segment to set.
- (INIT_THREAD_SELF): Rewritten using those. Use set_thread_area only
- under [HAVE_TLS_SUPPORT] so we can rely on the initialization done
- by the first thread's early TLS setup.
-
-2002-08-15 Roland McGrath <roland@redhat.com>
-
- * sysdeps/i386/tls.h (TLS_INIT_TP): Use statement expression and
- return a value as callers now expect.
-
-2002-08-11 Roland McGrath <roland@redhat.com>
-
- * pthread.c (__pthread_initialize_manager): Initialize
- p_header.data.tcb field of manager thread's descriptor.
- (__pthread_initialize_minimal): Don't initialize p_header.data.self
- field, already done by TLS_INIT_TP.
-
- * manager.c (pthread_handle_create): Move p_header field initializers
- together.
-
-2002-08-08 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/tls.h (TLS_DO_SET_THREAD_AREA): Removed.
-
-2002-08-07 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c (__linuxthreads_initial_report_events): New variable.
- (__pthread_initialize_manager): Use it to initialize p_report_events
- of initial thread.
- [TLS]: Store pointer to descriptor of manager in __pthread_handles.
-
-2002-08-07 Roland McGrath <roland@redhat.com>
-
- * sysdeps/i386/tls.h (TLS_DO_MODIFY_LDT): Add an extra argument with
- an "m" constraint to the asm so the compiler knows LDT_ENTRY was used.
-
-2002-08-02 Roland McGrath <roland@redhat.com>
-
- * sysdeps/pthread/bits/libc-tsd.h (enum __libc_tsd_key_t):
- Add _LIBC_TSD_KEY_LOCALE.
- * manager.c (pthread_start_thread) [!(USE_TLS && HAVE___THREAD)]:
- Call __uselocale to initialize our per-thread locale pointer to
- the global one.
- * pthread.c (__pthread_initialize_minimal): Likewise.
-
- * sysdeps/i386/tls.h (TLS_DO_SET_THREAD_AREA): Add missing \s.
-
-2002-08-02 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c: Declare _errno, _h_errno, and _res unless we use TLS
- internally.
-
- * cancel.c (__pthread_perform_cleanup) [USE_TLS && HAVE___THREAD]:
- Don't use p_libc_specific element in thread descriptor.
-
-2002-07-30 Roland McGrath <roland@redhat.com>
-
- * sysdeps/pthread/bits/libc-tsd.h: Include <tls.h>.
- [USE_TLS && HAVE___THREAD]: Just include the sysdeps/generic file,
- which does the right thing when __thread support is available.
- * descr.h (struct _pthread_descr_struct) [USE_TLS && HAVE___THREAD]:
- Omit `p_libc_specific', `p_errnop', `p_errno', `p_h_errnop',
- `p_h_errno', `p_resp', and `p_res' members.
- * pthread.c (__pthread_initialize_minimal) [USE_TLS && HAVE___THREAD]:
- Don't initialize `p_errnop' and `p_h_errnop' members.
- (__pthread_reset_main_thread): Likewise.
- (__pthread_initialize_manager): Likewise.
- * manager.c (__pthread_manager, pthread_handle_create): Likewise.
- * pthread.c (pthread_initialize) [USE_TLS && HAVE___THREAD]:
- Don't initialize `p_resp' member.
- (__pthread_reset_main_thread): Likewise.
- * manager.c (pthread_handle_create): Likewise.
- * specific.c (libc_internal_tsd_set, libc_internal_tsd_get):
- Conditionalize these on [!(USE_TLS && HAVE___THREAD)].
- * no-tsd.c: Conditionalize contents on [!(USE_TLS && HAVE___THREAD)].
- * errno.c [USE_TLS && HAVE___THREAD]
- (__h_errno_location, __res_state): Don't define these at all.
-
- * sysdeps/i386/tls.h (INSTALL_DTV): Add parens around arguments!
- (INSTALL_NEW_DTV, GET_DTV): Likewise.
- * sysdeps/sh/tls.h (INSTALL_DTV, INSTALL_NEW_DTV, GET_DTV): Likewise.
-
- * weaks.c: Don't include <errno.h> here.
-
-2002-08-01 Roland McGrath <roland@redhat.com>
-
- * sysdeps/i386/tls.h (TLS_DO_MODIFY_LDT): New macro, broken out of
- TLS_INIT_TP.
- (TLS_DO_SET_THREAD_AREA): New macro, uses thread_set_area syscall.
- (TLS_SETUP_GS_SEGMENT): New macro, try one or the other or both.
- (TLS_INIT_TP): Use that.
-
-2002-08-02 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/i386/useldt.h (DO_MODIFY_LDT): Move from INIT_THREAD_SELF.
- (INIT_THREAD_SELF): Use sys_thread_area syscall instead if available.
- (FREE_THREAD): Avoid modify_ldt if using GDT.
- * sysdeps/i386/pspinlock.c (__have_no_set_thread_area): New variable.
-
-2002-07-25 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/i386/tls.h: Use __ASSEMBLER__ test macro not ASSEMBLER.
- * sysdeps/i386/pt-machine.h: Likewise.
- * sysdeps/i386/useldt.h: Likewise.
-
-2002-07-22 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c (__pthread_initialize_minimal): If !SHARED and TLS
- call __libc_setup_tls first.
- * Makefile: Actually create tst-signal.out file when running the test.
- (tests): Add tststatic.
- * Examples/tststatic.c: New file.
-
-2002-07-19 Ulrich Drepper <drepper@redhat.com>
-
- * errno.c (__errno_location): Don't define unless !USE_TLS
- || !HAVE___THREAD.
- * sysdeps/i386/pt-machine.c: Protect C code with #ifndef ASSEMBLER.
- * sysdeps/i386/tls.h: Likewise.
- * sysdeps/i386/useldt.h: Likewise.
- * sysdeps/i386/i686/pt-machine.h: Likewise.
-
-2002-07-02 H.J. Lu <hjl@gnu.org>
-
- * sysdeps/mips/pspinlock.c: Don't include <sgidefs.h>. Always
- use ll/sc.
- * sysdeps/mips/pt-machine.h: Likewise.
-
-2002-07-14 Ulrich Drepper <drepper@redhat.com>
-
- * manager.c (pthread_handle_create): Initialize self-reference in
- descriptor.
-
-2002-07-01 Jakub Jelinek <jakub@redhat.com>
-
- * Examples/ex9.c (main): Remove unused th variable.
-
-2002-07-10 Ulrich Drepper <drepper@redhat.com>
-
- * wrapsyscall.c: Add __nanosleep alias.
- * Versions (GLIBC_2.2.6): Add __nanosleep.
- * bug-sleep.c: New file.
- * Makefile (tests): Add bug-sleep.
-
-2002-06-19 Steven Munroe <sjmunroe@vnet.ibm.com>
-
- * Examples/ex9.c (main): Use list of children and join them.
- (thread): Do not call exit.
-
-2002-06-20 Ulrich Drepper <drepper@redhat.com>
-
- * spinlock.c (wait_node_alloc): We cannot use compare-and-exchange.
- Unconditionally use the code using spinlock. Use __pthread_release
- to free a spinlock.
- (wait_node_free): Likewise.
- (__pthread_acquire, __pthread_release): Unconditionally define.
-
-2002-06-07 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/ia64/pt-machine.h (MEMORY_BARRIER): Fix typo.
-
-2002-05-24 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/ia64/pt-machine.h (MEMORY_BARRIER): Use __sync_synchronize.
-
-2002-05-21 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/pthread.h (pthread_create): Rename first
- parameter.
- (pthread_cancel): Likewise.
- * internals.h (__pthread_create_2_1): Likewise.
- * sysdeps/unix/sysv/linux/bits/sigthread.h (pthread_kill): Likewise.
-
-2002-05-20 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/alpha/pt-machine.c (THREAD_SELF): Remove clobber.
- Patch by Glen Nakamura <gen@flex.com>.
-
-2002-05-03 Ulrich Drepper <drepper@redhat.com>
-
- * signals.c: Move sighandler functions to...
- * sighandler.c: ...here. New file.
- * signals.c: Move signal handler related type definitions to...
- * internals.h: ...here. Add prototypes for signal handlers.
- * Makefile (libpthread-routines): Add sighandler.
- (CFLAGS-sighandler.c): Add $(exceptions).
-
-2002-04-30 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/x86_64/Makefile: New file.
-
-2002-04-08 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/timer_getoverr.c: Return real overrun.
- * sysdeps/pthread/posix-timer.h (struct timer_node): Add overrun_count.
- * sysdeps/pthread/timer_routines.c (thread_func): Schedule next timeout
- based on previous one and not on current time. Count overruns.
- Patch by Eric F. Sorton <eric@cctcorp.com>.
-
- * sysdeps/unix/sysv/linux/bits/local_lim.h: Add DELAYTIMER_MAX.
-
-2002-04-08 kaz Kojima <kkojima@rr.iij4u.or.jp>
-
- * sysdeps/sh/pt-machine.h: Define _PT_MACHINE_H
- if it isn't defined yet.
- (FLOATING_STACKS, ARCH_STACK_MAX_SIZE): Defined.
- (THREAD_GETMEM, THREAD_GETMEM_NC, THREAD_SETMEM, THREAD_SETMEM_NC):
- Likewise.
- * sysdeps/sh/tls.h: New file.
-
-2002-04-08 Jakub Jelinek <jakub@redhat.com>
-
- * manager.c (__pthread_manager_event): Use self instead of arg
- for INIT_THREAD_SELF.
- * sysdeps/i386/useldt.h (INIT_THREAD_SELF): Use sizeof (struct
- _pthread_descr_struct) instead of sizeof (*descr).
-
-2002-04-05 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/ia64/pt-machine.h: Protect against multiple inclusion.
- * sysdeps/alpha/pt-machine.h: Likewise.
- * sysdeps/arm/pt-machine.h: Likewise.
- * sysdeps/cris/pt-machine.h: Likewise.
- * sysdeps/hppa/pt-machine.h: Likewise.
- * sysdeps/m68k/pt-machine.h: Likewise.
- * sysdeps/mips/pt-machine.h: Likewise.
- * sysdeps/powerpc/pt-machine.h: Likewise.
- * sysdeps/s390/s390-32/pt-machine.h: Likewise.
- * sysdeps/s390/s390-64/pt-machine.h: Likewise.
- * sysdeps/sh/pt-machine.h: Likewise.
- * sysdeps/sparc/sparc32/pt-machine.h: Likewise.
- * sysdeps/sparc/sparc64/pt-machine.h: Likewise.
- * sysdeps/x86_64/pt-machine.h: Likewise.
-
-2002-04-05 Jakub Jelinek <jakub@redhat.com>
-
- * man/pthread_mutexattr_init.man (pthread_mutexattr_settype): Document
- instead of pthread_mutexattr_setkind_np.
- (pthread_mutexattr_gettype): Similarly.
- * man/pthread_mutexattr_setkind_np.man: New.
- * man/Makefile (SOURCES): Add pthread_mutexattr_setkind_np.man.
-
-2002-04-02 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/ia64/pt-machine.h (MEMORY_BARRIER): Define.
-
-2002-03-22 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/mips/pt-machine.h (MEMORY_BARRIER): Remove.
-
-2002-03-22 Ulrich Drepper <drepper@redhat.com>
-
- * internals.h (MEMORY_BARRIER): Define as asm with memory as clobber.
-
-2002-03-17 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/i386/pt-machine.h: Add testandset and __compare_and_swap
- prototpyes.
- * sysdeps/alpha/pt-machine.h: Likewise.
- * sysdeps/arm/pt-machine.h: Likewise.
- * sysdeps/cris/pt-machine.h: Likewise.
- * sysdeps/hppa/pt-machine.h: Likewise.
- * sysdeps/i386/i686/pt-machine.h: Likewise.
- * sysdeps/ia64/pt-machine.h: Likewise.
- * sysdeps/m68k/pt-machine.h: Likewise.
- * sysdeps/mips/pt-machine.h: Likewise.
- * sysdeps/powerpc/pt-machine.h: Likewise.
- * sysdeps/s390/s390-32/pt-machine.h: Likewise.
- * sysdeps/s390/s390-64/pt-machine.h: Likewise.
- * sysdeps/sh/pt-machine.h: Likewise.
- * sysdeps/sparc/sparc32/pt-machine.h: Likewise.
- * sysdeps/sparc/sparc64/pt-machine.h: Likewise.
- * sysdeps/x86_64/pt-machine.h: Likewise.
-
- * internals.h: Move testandset and __compare_and_swap prototypes
- to pt-machine.h.
-
-2002-03-03 Andreas Jaeger <aj@suse.de>
-
- * errno.c: Include resolv.h to avoid warning.
-
-2002-02-27 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c [USE_TLS] (thread_self_stack): Correct check for upper
- stack limit.
-
-2002-02-23 Ulrich Drepper <drepper@redhat.com>
-
- * attr.c (pthread_getattr_np): Don't take thread descriptor size
- into account if USE_TLS.
- * manager.c (pthread_handle_create): Free TLS data structures if call
- failed. Pass correct stack to clone if USE_TLS.
- * sysdeps/i386/pt-machine.h: Handle multiple inclusion.
- * sysdeps/i386/i686/pt-machine.h: Likewise.
- * sysdeps/i386/tls.h: Unconditionally include <pt-machine.h>.
-
- * descr.h (struct _pthread_descr_struct): Update p_header for TLS.
- Add p_stackaddr element #if USE_TLS.
- * internals.c: Include <tls.h>.
- * manager.c: Integrate creating and handling of thread descriptor
- for TLS.
- * pthread.c: Likewise.
- * sysdeps/i386/tls.h (tcbhead_t): Add self pointer.
- Include <linuxthreads/descr.h> only if TLS is really used.
- (GET_DTV): New macro.
- (TLS_INIT_TP): Initialize self pointer.
-
-2002-02-17 Andreas Schwab <schwab@suse.de>
-
- * signals.c (sigwait): Check for old sighandler being SIG_ERR,
- not NULL.
-
-2002-02-12 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/tls.c (INSTALL_NEW_DTV): Define.
- (INSTALL_DTV): Adjust for being passed pointer to element with length.
-
-2002-02-08 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/tls.h (TLS_INIT_TP): Also initialize %gs.
-
-2002-02-08 Richard Henderson <rth@redhat.com>
-
- * sysdeps/alpha/elf/pt-initfini.c: Use \n\ for multiline string.
-
-2002-02-08 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/tls.h: TLS cannot be supported with FLOATING_STACKS
- after all.
-
-2002-02-07 H.J. Lu <hjl@gnu.org>
-
- * sysdeps/mips/pspinlock.c (__pthread_spin_lock): Silence the
- gcc warning.
- (__pthread_spin_lock): Remove ".set noreorder".
- * sysdeps/mips/pt-machine.h (__compare_and_swap): Liekwise.
-
-2002-02-05 H.J. Lu <hjl@gnu.org>
-
- * sysdeps/mips/pspinlock.c (__pthread_spin_lock): Not use
- branch likely.
- * sysdeps/mips/pt-machine.h (testandset): Likewise.
- (__compare_and_swap): Likewise.
-
-2002-02-07 Ulrich Drepper <drepper@redhat.com>
-
- * internals.h: Move declarations/definitions of
- __pthread_initial_thread_bos, __pthread_initial_thread,
- __pthread_manager_thread_bos, __pthread_manager_thread_tos,
- __pthread_manager_thread, __pthread_nonstandard_stacks, STACK_SIZE,
- CURRENT_STACK_FRAME, __pthread_find_self, and thread_self...
- * descr.h: ...here.
- * sysdeps/i386/tls.h: Add TLS definitions also for !FLOATING_STACKS.
- Define THREAD_GETMEM accordingly.
-
-2002-02-06 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/tls.h: Include <stddef.h> for size_t.
-
- * sysdeps/i386/tls.h: Define THREAD_DTV.
-
-2002-02-04 Ulrich Drepper <drepper@redhat.com>
-
- * internals.h: Move thread descriptor definition...
- * descr.h.: ...here. New file.
- * sysdeps/i386/tls.h: New file.
-
-2002-02-01 H.J. Lu <hjl@gnu.org>
-
- * sysdeps/mips/pspinlock.c (__pthread_spin_lock): Use a
- different register in the delayed slot. Use branch likely.
-
- * sysdeps/mips/pt-machine.h (testandset): Call _test_and_set.
- (__compare_and_swap): Return 0 only when failed to compare. Use
- branch likely.
-
-2002-02-01 Jakub Jelinek <jakub@redhat.com>
-
- * Versions (__libc_internal_tsd_get, __libc_internal_tsd_set,
- __pthread_kill_other_threads_np): Move to GLIBC_PRIVATE.
- * sysdeps/i386/i586/Versions: Move all symbols to GLIBC_PRIVATE.
- * sysdeps/i386/i686/Versions: Move all symbols to GLIBC_PRIVATE.
- * sysdeps/sparc/sparc32/sparcv9/Versions: New file.
- * sysdeps/sparc/sparc64/Versions: New file.
- * sysdeps/ia64/Versions: Move all symbols to GLIBC_PRIVATE.
-
-2002-01-31 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c: _dl_cpuclock_offset is not any longer a global variable
- in SHARED code, use GL(dl_cpuclock_offset).
-
-2002-01-28 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/mips/pspinlock.c (__pthread_spin_init): Clear *LOCK to
- 0. Patch by Machida Hiroyuki <machida@sm.sony.co.jp>.
-
-2002-01-16 Martin Schwidefsky <schwidefsky@de.ibm.com>
-
- * sysdeps/s390/s390-32/pt-machine.h (MEMORY_BARRIER): Define.
- (CURRENT_STACK_FRAME): Remove duplicate definition.
- * sysdeps/s390/s390-64/pt-machine.h: Likewise.
-
-2002-01-14 Martin Schwidefsky <schwidefsky@de.ibm.com>
-
- * Makefile (CFLAGS-tst-cancel.c): Add -fno-inline-functions to prevent
- automatic inline.
-
-2002-01-12 Andreas Schwab <schwab@suse.de>
-
- * Makefile (test-srcs): Add tst-signal.
- (tests): Run tst-signal.
- (distribute): Add tst-signal.sh.
- * tst-signal.c, tst-signal.sh: New files.
-
-2002-01-14 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/x86_64/pt-machine.h (INIT_THREAD_SELF): Avoid warning.
-
-2002-01-11 Andreas Schwab <schwab@suse.de>
-
- * signals.c (sighandler): Initialize all elements to SIG_ERR.
- (__sigaction): Don't use value from sighandler if it is SIG_ERR.
-
-2002-01-06 Richard Henderson <rth@redhat.com>
-
- * sysdeps/alpha/elf/pt-initfini.c: New file.
-
-2001-12-29 Andreas Jaeger <aj@suse.de>
-
- * Examples/ex9.c: Add noreturn attribute for thread.
- * Examples/ex10.c: Likewise.
- * Examples/ex13.c (thread_start): Likewise.
- * Examples/ex15.c (worker): Likewise.
-
- * Examples/ex18.c: Include unistd.h for prototype of sleep.
-
-2001-12-14 Ulrich Drepper <drepper@redhat.com>
-
- * man/pthread_atfork.man: Adjust description of mutex handling
- after fork for current implementation.
- * linuxthreads.texi: Likewise [PR libc/2519].
-
-2001-12-13 Andreas Schwab <schwab@suse.de>
-
- * specific.c (pthread_key_delete): Don't contact the thread
- manager if no threads have been created yet.
-
-2001-12-12 NIIBE Yutaka <gniibe@m17n.org>
-
- * sysdeps/sh/pt-machine.h (INIT_THREAD_SELF): Added __volatile__
- qualifier to be safe.
-
-2001-11-30 Andreas Schwab <schwab@suse.de>
-
- * pthread.c (pthread_handle_sigcancel) [THREAD_SELF]: Double check
- that self is the manager thread, and initialize the thread
- register if not.
- (thread_self_stack) [THREAD_SELF]: New function to find self via
- stack pointer.
- * manager.c (pthread_handle_create): Don't block cancel signal any
- more.
-
-2001-11-29 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/x86_64/pt-machine.h: Use %gs as thread specific register.
- (THREAD_SELF): New.
- (INIT_THREAD_SELF): New.
- (THREAD_GETMEM): New.
- (THREAD_GETMEM_NC):
- (THREAD_SETMEM): New.
- (THREAD_SETMEM_NC): New.
- (FLOATING_STACKS): Define.
- (ARCH_STACK_MAX_SIZE): Define.
-
-2001-11-28 Kaz Kylheku <kaz@ashi.footprints.net>
-
- Bugfix to pthread_key_delete. It was iterating over the thread
- manager's linked list of threads, behind the thread manager's
- back causing a race. The fix is to have the manager iterate over
- the threads instead, using a new request type for doing so.
- * internals.h (struct pthread_request): New manager request type
- REQ_FOR_EACH_THREAD.
- * manager.c (pthread_for_each_thread): New function.
- (__pthread_manager): Handle new REQ_FOR_EACH_THREAD request.
- * specific.c (struct pthread_key_delete_helper_args): New type.
- (pthread_key_delete_helper): New static function.
- (pthread_key_delete): Use the new thread manager
- REQ_FOR_EACH_THREAD function to iterate over the threads and set
- the delete key slot to a null value in each thread.
- * Examples/ex18.c: New test.
- * Makefile (tests): Add ex18.
-
-2001-11-22 Wolfram Gloger <wg@malloc.de>
-
- * pthread.c (pthread_onexit_process): Don't call free
- after threads have been asynchronously terminated.
-
- * manager.c (pthread_handle_exit): Surround cancellation
- of threads with __flockfilelist()/__funlockfilelist().
-
-2001-11-26 Andreas Schwab <schwab@suse.de>
-
- * manager.c (pthread_handle_create): Start the child thread with
- the cancel signal blocked, so that it does not handle it before
- the thread register is set up. Save errno from failed clone call.
-
-2001-11-15 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/i686/Implies: Removed.
- * sysdeps/i386/i686/Versions: New file.
-
-2001-10-31 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/x86_64/Makefile: Remove, we do not need it anymore.
-
-2001-10-05 Kevin Buettner <kevinb@cygnus.com>
-
- * pthread.c (__linuxthread_pthread_sizeof_descr): Change name
- to __linuxthreads_pthread_sizeof_descr to match name used by
- symbol_list_arr[LINUXTHREADS_PTHREAD_SIZEOF_DESCR] in
- linuxthreads_db/td_symbol_list.c.
-
-2001-09-22 Andreas Jaeger <aj@suse.de>
-
- * linuxthreads/tst-context.c: Avoid compile warning.
-
-2001-09-20 Andreas Jaeger <aj@suse.de>
-
- * shlib-versions: Add x86-64.
-
-2001-09-19 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/x86_64/Makefile: New file.
- * sysdeps/x86_64/pspinlock.c: New file.
- * sysdeps/x86_64/pt-machine.h: New file.
-
-2001-09-12 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/pthread/timer_delete.c (timer_delete): Thread may be NULL
- for SIGEV_NONE.
- * sysdeps/pthread/timer_settime.c (timer_settime): Likewise.
-
-2001-09-11 Ulrich Drepper <drepper@redhat.com>
- Wolfram Gloger <wg@malloc.de>
-
- * join.c: Protect all communications from and to manager with
- TEMP_FAILURE_RETRY.
- * manager.c: Likewise.
- * pthread.c: Likewise.
- * smeaphore.c: Likewise.
-
-2001-08-29 Ulrich Drepper <drepper@redhat.com>
-
- * spinlock.c (__pthread_lock): Top max_count value with
- MAX_ADAPTIVE_SPIN_COUNT.
- * internals.h (MAX_ADAPTIVE_SPIN_COUNT): Define if not already done.
-
- * sysdeps/i386/i686/pt-machine.h (BUSY_WAIT_NOP): New macro to
- help P4.
-
-2001-08-27 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/pthread/bits/libc-lock.h (__libc_rwlock_t): Only define to
- non-opaque type if __USE_UNIX98.
-
-2001-08-26 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/pthread/bits/libc-lock.h (__libc_lock_t): Define
- non-opaque lock types also if _IO_MTSAFE_IO is defined.
-
-2001-08-23 Roland McGrath <roland@frob.com>
-
- * sysdeps/pthread/bits/libc-lock.h (__libc_cleanup_region_start): Take
- new first argument, skip the cleanup handler if it's zero.
- (_LIBC_LOCK_RECURSIVE_INITIALIZER): New macro.
- (__libc_lock_define_initialized_recursive): Use it.
- * sysdeps/pthread/bits/stdio-lock.h: File removed.
- The sysdeps/generic file from the main tree now suffices.
-
-2001-08-22 Roland McGrath <roland@frob.com>
-
- * sysdeps/pthread/bits/stdio-lock.h: Include <bits/libc-lock.h>
- instead of <pthread.h>.
- (_IO_lock_t): Define this typedef using __libc_lock_define_recursive.
- (_IO_lock_initializer): Add braces.
- (_IO_lock_lock): Use __libc_lock_lock_recursive.
- (_IO_lock_unlock): Use __libc_lock_unlock_recursive.
-
- * sysdeps/pthread/bits/libc-lock.h (__libc_lock_recursive_t): New type.
- (__libc_lock_define_initialized_recursive): Use it.
- (__libc_lock_init_recursive): Likewise.
- (__libc_lock_fini_recursive): Likewise.
- (__libc_lock_lock_recursive): Likewise.
- (__libc_lock_trylock_recursive): Likewise.
- (__libc_lock_unlock_recursive): Likewise.
- (__libc_lock_define_recursive): New macro.
-
-2001-08-14 Jakub Jelinek <jakub@redhat.com>
-
- * lockfile.c (__pthread_provide_lockfile): New variable.
- * pthread.c (__pthread_require_lockfile): New variable.
- * cancel.c (__pthread_require_lockfile): New variable.
-
-2001-07-31 Ulrich Drepper <drepper@redhat.com>
-
- * tst-context.c (threadfct): Initialize context before calling
- makecontext.
-
- * Examples/ex17.c: Make sure test thread is around long enough.
-
-2001-07-26 kaz Kojima <kkojima@rr.iij4u.or.jp>
-
- * sysdeps/sh/pt-machine.h (THREAD_SELF, INIT_THREAD_SELF): Defined.
-
-2001-07-24 Ulrich Drepper <drepper@redhat.com>
-
- * tst-context.c (main): Print explanation before bailing out
- because context handling is not supported.
-
-2001-07-23 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile (tests): Add tst-context.
- * tst-context.c: New file.
-
- * sysdeps/pthread/bits/stdio-lock.h: Define
- _IO_cleanup_region_start_noarg.
-
-2001-07-23 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/alpha/pt-machine.h (FLOATING_STACKS): Define.
- (ARCH_STACK_MAX_SIZE): Define.
- * sysdeps/sparc/sparc32/pt-machine.h: Likewise.
- * sysdeps/sparc/sparc64/pt-machine.h: Likewise.
-
-2001-07-19 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/i386/useldt.h: Fix typo in ARCH_STACK_MAX_SIZE comment.
-
- * sysdeps/ia64/pt-machine.h (FLOATING_STACKS): Define.
- (ARCH_STACK_MAX_SIZE): Define.
- * manager.c (pthread_allocate_stack): Handle FLOATING_STACKS with
- NEED_SEPARATE_REGISTER_STACK.
-
-2001-07-16 Andreas Schwab <schwab@suse.de>
-
- * Makefile (before-compile): Don't add $(objpfx)crti.o.
- (omit-deps): Add crti.
- ($(objpfx)libpthread.so): Depend on $(objpfx)crti.o, but make sure
- it is filtered out of the link command.
-
-2001-07-16 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c (pthread_initialize): For FLOATING_STACKS don't bother
- to find the right value for __pthread_initial_thread_bos, it's not
- used. If not FLOATING_STACKS first run
- __pthread_init_max_stacksize.
-
-2001-06-16 H.J. Lu <hjl@gnu.org>
-
- * internals.h: Include <stackinfo.h>.
-
- * attr.c: Don't include <stackinfo.h> here.
- * cancel.c: Likewise.
- * manager.c: Likewise.
- * pthread.c: Likewise.
- * ptlongjmp.c: Likewise.
-
-2001-03-23 Matthew Wilcox <willy@ldl.fc.hp.com>
-
- * attr.c: Make _STACK_GROWS_UP work.
- * internals.h: Likewise.
- * manager.c: Likewise.
- * pthread.c: Likewise.
-
-2001-06-15 H.J. Lu <hjl@gnu.org>
-
- * pthread.c (__pthread_reset_main_thread): Fix a typo.
-
-2001-02-02 John S. Marvin <jsm@udlkern.fc.hp.com>
-
- * semaphore.h: Use struct _pthread_fastlock as an element of
- sem_t instead of an identical struct.
- * rwlock.c: Remove casts.
- * semaphore.c: Likewise.
-
-2001-04-30 Alan Modra <amodra@one.net.au>
-
- * sysdeps/unix/sysv/linux/hppa/pt-initfini.c: New.
-
-2001-05-25 Bruce Mitchener <bruce@cubik.org>
-
- * linuxthreads.texi: Spelling corrections.
-
-2001-05-25 Ulrich Drepper <drepper@redhat.com>
-
- * oldsemaphore.c (__old_sem_wait): Clear p_nextwaiting before
- returning successfully.
- Patch by Gene Cooperman <gene@ccs.neu.edu>.
-
-2001-05-24 Ulrich Drepper <drepper@redhat.com>
-
- * spinlock.c (__pthread_lock) [HAS_COMPARE_AND_SWAP]: Before doing any
- serious work try once whether the lock is uncontested.
- Remove duplicate reading of __status before loop.
- Change suggested by Hans Boehm <hans_boehm@hp.com>.
-
- * spinlock.h (__pthread_trylock): Remove need for oldstatus variable.
- (__pthread_alt_trylock): Likewise.
-
-2001-05-01 Kaz Kylheku <kaz@ashi.footprints.net>
-
- Memory barrier overhaul following line by line inspection.
- * mutex.c (pthread_once): Missing memory barriers added.
- * pthread.c (__pthread_wait_for_restart_signal,
- __pthread_timedsuspend_new, __pthread_restart_new): Added
- memory barriers ``just in case'' and for documentary value.
- * spinlock.c (__pthread_release): New inline function for releasing
- spinlock, to complement __pthread_acquire. Includes memory
- barrier prior to assignment to spinlock, and __asm __volatile
- dance to prevent reordering or optimization of the spinlock access.
- * spinlock.c (__pthread_unlock, __pthread_alt_lock,
- __pthread_alt_timedlock, __pthread_alt_unlock,
- __pthread_compare_and_swap): Updated to use new __pthread_release
- instead of updating spinlock directly.
- * spinlock.c (__pthread_lock, __pthread_unlock, wait_node_alloc,
- wait_node_free, wait_node_dequeue, __pthread_alt_lock,
- __pthread_alt_timedlock, __pthread_alt_unlock, __pthread_acquire):
- Memory barrier overhaul. Lots of missing memory barriers added,
- a couple needless ones removed.
- * spinlock.c (__pthread_compare_and_swap): testandset optimization
- removed, just calls __pthread_acquire, which has the new read
- barrier in it before its testandset.
-
-2001-05-20 Roland McGrath <roland@frob.com>
-
- * Makeconfig: New file, variables used to be in main libc Makeconfig.
-
-2001-05-09 Geoff Keating <geoffk@redhat.com>
-
- * sysdeps/powerpc/pt-machine.h
- (HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS): Define.
- (__compare_and_swap): Remove memory barriers.
- (__compare_and_swap_with_release_semantics): New function.
-
-2001-04-24 Andreas Jaeger <aj@suse.de>
-
- * wrapsyscall.c: send* and recv* return ssize_t.
-
- * sysdeps/pthread/timer_getoverr.c (timer_getoverrun): Unlock the
- mutex instead of double locking it.
- Reported by Pierre Artaud <partaud@sodatec.com>.
-
-2001-04-23 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/getcpuclockid.c: Make function generic, test
- using #ifdef whether the clock is available.
- * sysdeps/unix/sysv/linux/i386/getcpuclockid.c: Removed.
-
- * sysdeps/ia64/Versions: New file.
-
- * sysdeps/unix/sysv/linux/ia64/pt-initfini.c (_init): We don't
- have to call __gmon_start__ in the libpthread DSO.
- * sysdeps/pthread/pt-initfini.c (_init): Likewise.
-
- * Makefile (libpthread-routines): Add ptclock_gettime and
- ptclock_settime.
- * internals.h: Don't use cpuclock-init.h definitions, use
- hp-timing.h definitions.
- * pthread.c: Likewise.
- * manager.c: Likewise.
- * ptclock_gettime.c: New file.
- * ptclock_settime.c: New file.
- * internals.h: Fix parameter type for __pthread_clock_gettime and
- __pthread_clock_settime.
-
- * sysdeps/i386/i586/ptclock_gettime.c: Removed.
- * sysdeps/i386/i586/ptclock_settime.c: Removed.
- * sysdeps/i386/i586/Makefile: Removed.
-
-2001-04-22 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define _POSIX_ASYNCH_IO.
- * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise.
-
-2001-04-21 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/pthread/timer_routines.c (thread_func): Add noreturn
- attribute, remove statements that will never be executed.
- (thread_func): Remove mutex_unlock call since it's never executed.
- (thread_func): Fix comment as suggested by Jakub Jelinek.
-
- * manager.c (__pthread_manager): Add noreturn
- attribute.
- (pthread_start_thread): Likewise, remove return statement.
- (pthread_start_thread_event): Likewise.
- Add noreturn attribute for pthread_handle_exit.
- * weaks.c: Add noreturn attribute for pthread_exit.
-
- * internals.h: Add __pthread_clock_gettime and
- __pthread_clock_settime prototypes.
-
-2001-04-21 Ulrich Drepper <drepper@redhat.com>
-
- * internals.h: Include <cpuclock-init.h>.
- (struct _pthread_descr_struct): Add p_cpuclock_offset field if
- CPUCLOCK_VARDEF is defined.
- * pthread.c (__pthread_initialize_minimal): Initialize
- p_cpuclock_offset field for main thread if CPUCLOCK_INIT is defined.
- * manager.c (pthread_start_thread): Set p_cpuclock_offset field
- for new thread to current CPU clock value.
-
- * sysdeps/i386/useldt.h: Extend all the macros to handle 8-byte values.
-
- * sysdeps/i386/i586/Makefile: New file.
- * sysdeps/i386/i586/Versions: New file.
- * sysdeps/i386/i586/ptclock_gettime.c: New file.
- * sysdeps/i386/i586/ptclock_settime.c: New file.
- * sysdeps/i386/i686/Implies: New file.
-
-2001-04-18 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/sparc/sparc64/Makefile: Put specs into
- $generated, not $postclean-generated.
-
-2001-04-18 Andreas Jaeger <aj@suse.de>
-
- * Makefile (otherlibs): Added.
-
-2001-04-18 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/sparc/sparc64/Makefile: New file.
-
-2001-04-16 Ulrich Drepper <drepper@redhat.com>
-
- * signals.c (sigwait): NSIG is no signal number. Block all
- signals while in signal handler for signals in SET.
- Patch by Manfred Spraul <manfred@colorfullife.com>.
-
-2001-04-12 Ulrich Drepper <drepper@redhat.com>
-
- * tst-cancel.c: Disable most tests. Add new test where all
- cleanup handlers must run.
- * Makefile (tests): Add tst-cancel again.
-
- * cancel.c (__pthread_perform_cleanup): Correct condition for
- leaving cleanup loop early.
-
- * sysdeps/i386/Makefile: Make sure gcc uses a frame pointer for
- all the files which use CURRENT_STACK_FRAME.
- * sysdeps/i386/pt-machine.h (CURRENT_STACK_FRAME): Define using
- __builtin_frame_address.
- * sysdeps/i386/i686/pt-machine.h: Likewise.
-
-2001-04-11 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile (tests): Comment out tst-cancel for now.
-
- * tst-cancel.c (main): Cleanup 4 is supposed to run. Create
- temporary file in object directory.
- * Makefile: Don't allow inlining when compiling tst-cancel.c.
- Pass $(objpfx) to tst-cancel.
-
-2001-04-11 David S. Miller <davem@redhat.com>
-
- * sysdeps/sparc/sparc32/pt-machine.h (stack_pointer): Advance
- up closer to user local variables so that new cleanup heuristics work.
- * sysdeps/sparc/sparc64/pt-machine.h (stack_pointer): Likewise.
-
-2001-04-11 Ulrich Drepper <drepper@redhat.com>
-
- * cancel.c (_pthread_cleanup_push): Catch invalid __prev buffer
- and remove it.
- (_pthread_cleanup_push_defer): Likewise.
-
- * tst-cancel.c (main): Fix loop printing cleanup output.
-
-2001-04-10 kaz Kojima <kkojima@rr.iij4u.or.jp>
-
- * sysdeps/sh/pspinlock.c (__pthread_spin_lock): Fix a reverse
- test.
- (__pthread_spin_trylock): Likewise.
- * sysdeps/sh/pt-machine.h (testandset): Likewise.
-
-2001-04-10 Ulrich Drepper <drepper@redhat.com>
-
- * join.c (pthread_exit): Move code to new function __pthread_do_exit
- which takes an extra parameter with the current frame pointer.
- Call new function with CURRENT_STACK_FRAME.
- (__pthread_do_exit): New function. Call __pthread_perform_cleanup
- with the new parameter.
- (pthread_join): Call __pthread_do_exit instead of pthread_exit.
- * cancel.c (__pthread_perform_cleanup): Takes extra parameter. Use
- this parameter as the initial value the cleanup handler records are
- compared against. No active cleanup handler record must have an
- address lower than the previous one and the initial record must be
- above (below on PA) the frame address passed in.
- (pthread_setcancelstate): Call __pthread_do_exit instead of
- pthread_exit.
- (pthread_setcanceltype): Likewise.
- (pthread_testcancel): Likewise.
- (_pthread_cleanup_pop_restore): Likewise.
- * condvar.c (pthread_cond_wait): Likewise.
- (pthread_cond_timedwait_relative): Likewise.
- * manager.c (pthread_start_thread): Likewise.
- * oldsemaphore.c (__old_sem_wait): Likewise.
- * pthread.c (pthread_handle_sigcancel): Likewise.
- * semaphore.c (__new_sem_wait): Likewise.
- (sem_timedwait): Likewise.
- * ptlongjmp.c (pthread_cleanup_upto): Also use current stack frame
- to limit the cleanup handlers which get run.
- * internals.h: Add prototype for __pthread_do_exit. Adjust prototype
- for __pthread_perform_cleanup.
-
- * Makefile (tests): Add tst-cancel.
- * tst-cancel.c: New file.
-
-2001-04-08 Hans-Peter Nilsson <hp@axis.com>
-
- * sysdeps/cris/pt-machine.h: New file.
- * sysdeps/cris/pspinlock.c: New file.
-
-2001-04-09 Hans-Peter Nilsson <hp@axis.com>
-
- * shlib-versions: Add case for Linux on CRIS.
-
-2001-03-26 Ulrich Drepper <drepper@redhat.com>
-
- * attr.c (pthread_getattr_np): Correct computation of stack size
- for machiens with register stack.
-
- * Examples/ex17.c (main): Correct detection of failed mmap call.
-
-2001-03-21 Jakub Jelinek <jakub@redhat.com>
-
- * pthread.c (__pthread_initialize_manager): Fix a typo.
-
-2001-03-21 Jakub Jelinek <jakub@redhat.com>
-
- * attr.c (__pthread_attr_setstack): Fix alignment check.
- (pthread_getattr_np): __stackaddr is top of stack, not bottom.
- * Makefile (tests): Add ex17 test.
- * Examples/ex17.c: New test.
-
-2001-03-20 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile: Define -D_RPC_THREAD_SAFE_ for cancel.c.
- * cancel.c (__pthread_perform_cleanup): Call __rpc_thread_destroy.
- * sysdeps/pthread/bits/libc-tsd.h: Define _LIBC_TSD_KEY_VARS.
-
-2001-03-18 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile: When generating DSO link with libc_nonshared.a.
-
-2001-02-26 Jakub Jelinek <jakub@redhat.com>
-
- * signals.c (pthread_sighandler): Use CALL_SIGHANDLER.
-
-2001-02-23 Jakub Jelinek <jakub@redhat.com>
-
- * internals.h (__pthread_init_max_stacksize): New prototype.
- * attr.c (__pthread_attr_setstacksize): Call
- __pthread_init_max_stacksize if not yet initialized.
- * pthread.c (__pthread_init_max_stacksize): New function.
- (__pthread_initialize_manager): Call it.
- Patch by <dtc@cmucl.cons.org>.
-
-2001-03-16 Ulrich Drepper <drepper@redhat.com>
-
- * attr.c (pthread_getattr_np): Fix __stacksize computation for IA-64.
-
-2001-03-13 Martin Schwidefsky <schwidefsky@de.ibm.com>
-
- * shlib-versions: Add rule for Linux on 64 bit S/390.
- * sysdeps/s390/s390-64/pt-machine.h: New file.
- * sysdeps/unix/sysv/linux/s390/s390-64/pt-initfini.c: New file.
-
-2001-03-13 Martin Schwidefsky <schwidefsky@de.ibm.com>
-
- * sysdeps/s390/pt-machine.h: Move to...
- * sysdeps/s390/s390-32/pt-machine.h: ...here.
- Add defines for FLOATING_STACK and ARCH_STACK_MAX_SIZE.
-
-2001-03-15 Ulrich Drepper <drepper@redhat.com>
-
- * Versions [libpthread] (GLIBC_2.2.3): Add pthread_getattr_np.
- * attr.c: Implement pthread_getattr_np.
- * sysdeps/pthread/pthread.h: Add prototype for pthread_getattr_np.
- * internals.h (struct _pthread_descr_struct): Add p_inheritsched.
- * manager.c (pthread_handle_create): Initialize p_inheritsched.
-
-2001-03-09 Martin Schwidefsky <schwidefsky@de.ibm.com>
-
- * sysdeps/unix/sysv/linux/s390/pt-initfini.c: Use 0x07 padding for
- code alignment.
-
-2001-02-20 Hans Boehm <hans_boehm@hp.com>
-
- * manager.c (manager_mask): Removed static vesion. Now always local
- to __pthread_manager().
- (manager_mask_all): Removed completely.
- (__pthread_manager): Remove manager_mask_all initialization.
- (pthread_handle_create): Remove code to set and reset signal mask
- around __clone2() calls.
-
-2001-02-17 Jakub Jelinek <jakub@redhat.com>
-
- * spinlock.c (__pthread_lock): Force lock->__status to be read from
- memory on every spin.
-
-2001-02-10 Andreas Jaeger <aj@suse.de>
-
- * Makefile (extra-objs): New.
-
-2001-02-09 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/pthread/pt-initfini.c (call_initialize_minimal): Add
- __pthread_initialize_minimal prototype.
-
-2001-02-08 kaz Kojima <kkojima@rr.iij4u.or.jp>
-
- * sysdeps/unix/sysv/linux/sh/pt-initfini.c: New file.
-
-2001-02-06 Martin Schwidefsky <schwidefsky@de.ibm.com>
-
- * sysdeps/unix/sysv/linux/s390/pt-initfini.c: New file.
-
-2001-02-06 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/ia64/pt-initfini.c: First attempt to fix the
- broken code. Patch by Jes Sorensen.
-
-2001-02-06 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/pthread/pthread.h: Move __pthread_initialize from here
- to...
- * internals.h: ...here.
-
-2001-02-05 Jes Sorensen <jes@linuxcare.com>
-
- * sysdeps/unix/sysv/linux/ia64/pt-initfini.c: New file.
-
-2001-02-02 Ulrich Drepper <drepper@redhat.com>
-
- * Versions: Remove __pthread_initialize_minimal.
-
-2001-02-01 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile: Add rules to build crti.o and make it being used in
- building libpthread.so.
- * sysdeps/i386/Makefile: New file.
- * sysdeps/pthread/pt-initfini.c: New file.
-
- * pthread.c: Cleanups.
-
-2001-01-28 Andreas Jaeger <aj@suse.de>
-
- * oldsemaphore.c (__old_sem_init): Adjust for last change.
- * sysdeps/pthread/bits/libc-lock.h: Likewise.
- * spinlock.c: Likewise.
-
-2001-01-28 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/bits/initspin.h: Make all names namespace clean.
- * sysdeps/unix/sysv/linux/hppa/bits/initspin.h: Likewise.
- * manager.c: Adjust for namespace cleanup in bits/initspin.h.
- * pthread.c: Likewise.
- * spinlock.h: Likewise.
- * sysdeps/pthread/pthread.h: Likewise.
-
-2001-01-26 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/bits/pthreadtypes.h: Define pthread_attr_t also
- as struct __pthread_attr_s.
-
- * semaphore.h (sem_t): Cleanup namespace, rename status and
- spinlock elements.
-
-2001-01-13 Jakub Jelinek <jakub@redhat.com>
-
- * pthread.c (pthread_onexit_process): Clear
- __pthread_manager_thread_bos after freeing it.
- * Makefile (tests): Add ex16.
- * Examples/ex16.c: New file.
-
-2001-01-11 Jakub Jelinek <jakub@redhat.com>
-
- * Makefile (CFLAGS-pthread.c): Pass -DHAVE_Z_NODELETE if ld supports
- -z nodelete.
- * pthread.c (pthread_exit_process): Rename to...
- (pthread_onexit_process): ...this.
- (pthread_atexit_process, pthread_atexit_retcode): New.
- (pthread_initialize): Call __cxa_atexit instead of __cxa_on_exit
- and only if HAVE_Z_NODELETE is not defined.
- (__pthread_initialize_manager): Register pthread_atexit_retcode
- with __cxa_atexit.
-
-2001-01-11 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c (pthread_initialize): Use __cxs_on_exit not __cxa_atexit.
-
-2001-01-11 Jakub Jelinek <jakub@redhat.com>
-
- * Makefile (tests): Add ex15.
- * Examples/ex15.c: New test.
-
-2001-01-08 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c (pthread_exit_process): Free memory allocated for
- manager stack.
-
-2000-12-31 Ulrich Drepper <drepper@redhat.com>
-
- * manager.c (pthread_alloca_stack): Remove MAP_FIXED from mmap calls.
- (pthread_free): Always unmap the stack. It's safe now that we don't
- use MAP_FIXED to allocate stacks.
-
-2000-12-31 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/powerpc/pspinlock.c: Don't include pt-machine.h here.
-
- * manager.c (pthread_allocate_stack): Prepare for removal of MAP_FIXED.
-
-2000-11-15 Wolfram Gloger <wg@malloc.de>
-
- * manager.c (pthread_free): [!FLOATING_STACKS]: Only remap the
- stack to PROT_NONE, don't unmap it, avoiding collisions with malloc.
-
-2000-12-27 Andreas Jaeger <aj@suse.de>
-
- * Examples/ex13.c: Make local functions static.
- * ecmutex.c: Likewise.
- * joinrace.c: Likewise.
- * Examples/ex14.c: Likewise.
-
- * Examples/ex2.c: Make local functions static; reformat.
- * Examples/ex1.c: Likewise.
- * Examples/ex4.c: Likewise.
- * Examples/ex5.c: Likewise.
- * Examples/ex7.c: Likewise.
-
- * oldsemaphore.c: Add prototypes to shut up GCC.
- * pt-machine.c: Likewise.
-
- * weaks.c: Add prototype for pthread_exit.
-
- * internals.h: Add some prototypes, format prototypes and add
- missing externs.
- Move __libc_waitpid prototype to include/sys/wait.h.
-
- * rwlock.c: Include <bits/libc-lock.h> for prototypes.
- * mutex.c: Likewise.
- * specific.c: Likewise.
- * ptfork.c: Likewise.
-
- * lockfile.c: Include internals.h to get prototypes.
- * events.c: Likewise.
- * sysdeps/alpha/pspinlock.c: Likewise.
- * sysdeps/arm/pspinlock.c: Likewise.
- * sysdeps/hppa/pspinlock.c: Likewise.
- * sysdeps/i386/pspinlock.c: Likewise.
- * sysdeps/ia64/pspinlock.c: Likewise.
- * sysdeps/m68k/pspinlock.c: Likewise.
- * sysdeps/mips/pspinlock.c: Likewise.
- * sysdeps/powerpc/pspinlock.c: Likewise.
- * sysdeps/s390/pspinlock.c: Likewise.
- * sysdeps/sh/pspinlock.c: Likewise.
- * sysdeps/sparc/sparc32/pspinlock.c: Likewise.
- * sysdeps/sparc/sparc32/sparcv9/pspinlock.c: Likewise.
- * sysdeps/sparc/sparc64/pspinlock.c: Likewise.
-
-2000-12-27 Ulrich Drepper <drepper@redhat.com>
-
- * attr.c (__pthread_attr_setstack): Fix setting of __stackaddr element.
- (__pthread_attr_getstack): Return correct address.
- Add warnings for using pthread_attr_getstackaddr and
- pthread_attr_setstackaddr.
-
-2000-12-26 Ulrich Drepper <drepper@redhat.com>
-
- * Examples/ex6.c (test_thread): Make static.
- * Examples/ex12.c (test_thread): Make static and add noreturn
- attribute.
-
-2000-12-18 Jes Sorensen <jes@linuxcare.com>
-
- * linuxthreads/sysdeps/ia64/pt-machine.h: __compare_and_swap
- and compare_and_swap_with_release_semantics returns int not long.
-
-2000-12-17 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/s390/pt-machine.h (testandset): Use long int as return
- value.
- * sysdeps/arm/pt-machine.h (testandset): Likewise.
- * sysdeps/hppa/pt-machine.h (testandset): Likewise.
- * sysdeps/m68k/pt-machine.h (testandset): Likewise.
- * sysdeps/sh/pt-machine.h (testandset): Likewise.
- * sysdeps/sparc/sparc32/pt-machine.h (testandset): Likewise.
- * sysdeps/sparc/sparc64/pt-machine.h (testandset): Likewise.
-
-2000-12-17 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/pt-machine.h (testandset): Adjust for prototype change.
- * sysdeps/i386/i686/pt-machine.h (testandset): Likewise.
-
-2000-12-17 Andreas Jaeger <aj@suse.de>
-
- * internals.h: Add prototypes for testandset and
- __compare_and_swap to shut up gcc warnings.
-
-2000-12-06 Wolfram Gloger <wg@malloc.de>
-
- * join.c (pthread_detach): Allow case where the thread has already
- terminated.
-
-2000-12-05 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/mips/pspinlock.c (__pthread_spin_lock): Don't set mips2.
- * sysdeps/mips/pt-machine.h (testandset): Likewise.
- (__compare_and_swap): Likewise.
- Patches by Maciej W. Rozycki <macro@ds2.pg.gda.pl>.
-
-2000-11-20 Jakub Jelinek <jakub@redhat.com>
-
- * Examples/ex3.c (main): Cast int to long before casting to void *.
- (search): Cast void * to long, not int.
- * Examples/ex8.c (main, thread): Similarly.
- * Examples/ex11.c (main): Similarly.
- * Examples/ex14.c (worker, do_test): Similarly.
- * ecmutex.c (worker, do_test): Similarly.
- (nlocks): Cast to int.
-
-2000-11-08 Bruce Mitchener <bruce@cubik.org>
-
- * linuxthreads.texi: Add documentation for pthreads attributes
- guardsize, stackaddr, stacksize, and stack. Fix typo in previous
- patch. Document pthread_[sg]etconcurrency(). Mark
- pthread_mutexattr_[sg]ettype() as POSIX rather than GNU.
-
-2000-11-07 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/bits/posix_opt.h (_POSIX_MESSAGE_PASSING):
- Don't define it.
- * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise.
- Reported by Christopher Yeoh <cyeoh@linuxcare.com.au>.
-
-2000-11-06 Ulrich Drepper <drepper@redhat.com>
-
- * cancel.c (pthread_cancel): Always set p_canceled, even if we are
- not doing it right now.
- Reported by Kaz Kylheku <kaz@ashi.footprints.net>.
-
-2000-10-30 Ulrich Drepper <drepper@redhat.com>
-
- * Examples/ex4.c (main): Don't use exit() to avoid warning with
- broken compilers.
-
-2000-10-29 Ulrich Drepper <drepper@redhat.com>
-
- * attr.c (__pthread_attr_setguardsize): Don't round guardsize
- here. Reported by Bruce Mitchener <bruce@cubik.org>.
-
- * linuxthreads.texi: Changes terminology to 'type' from 'kind' when
- discussing mutexes. (As per the Unix98 name for the API.)
- Changes documentation for pthread_mutexattr_setkind_np() and
- pthread_mutexattr_getkind_np() over to the Unix98 APIs for the
- same: pthread_mutexattr_settype() and pthread_mutexattr_gettype().
- Changes references to PTHREAD_MUTEXATTR_FAST_NP to
- PTHREAD_MUTEXATTR_ADAPTIVE_NP.
- Begins to introduce discussion of the ``timed'' mutex type. This
- discussion is currently incomplete.
- Patch by Bruce Mitchener <bruce@cubik.org>.
-
-2000-10-26 Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
- Yutaka Niibe <gniibe@chroot.org>
-
- * sysdeps/sh/pt-machine.h (testandset): Since the operand of TAS.B
- has restrictions, use register.
-
-2000-10-23 Andreas Schwab <schwab@suse.de>
-
- * Examples/ex14.c (TIMEOUT): Override default timeout.
-
-2000-10-16 Ulrich Drepper <drepper@redhat.com>
-
- * specific.c: Protect tsd array modification in thread data
- structures by getting the thread lock in pthread_key_delete and
- __pthread_destroy_specifics.
- Patch by Wolfram Gloger <Wolfram.Gloger@dent.med.uni-muenchen.de>.
-
-2000-10-12 Alan Modra <alan@linuxcare.com.au>
-
- * sysdeps/pthread/bits/initspin.h: New file.
- * spinlock.h: Move LOCK_INITIALIZER definition to <bits/initspin.h>.
- (__pthread_init_lock): Initialize lock with LT_SPINLOCK_INIT.
- (__pthread_alt_init_lock): Likewise.
- (__pthread_alt_trylock): Release lock with LT_SPINLOCK_INIT.
-
-2000-10-12 David Huggins-Daines <dhd@linuxcare.com>
-
- * oldsemaphore.c (__old_sem_init): Release lock with
- LT_SPINLOCK_INIT, not zero.
- * spinlock.c (__pthread_unlock): Likewise.
- (__pthread_alt_lock): Likewise.
- (__pthread_alt_timedlock): Likewise.
- (__pthread_alt_unlock): Likewise.
- * sysdeps/pthread/bits/libc-lock.h: Initialize locks with
- LT_SPINLOCK_INIT if it is non-zero. Likewise for init-once flags.
- * sysdeps/pthread/pthread.h: Include bits/initspin.h. Use
- LT_SPINLOCK_INIT do initialize spinlocks not 0.
-
-2000-10-12 David Huggins-Daines <dhd@linuxcare.com>
-
- * shlib-versions: Add version definitions for hppa-linux.
-
-2000-10-12 Alan Modra <alan@linuxcare.com.au>
-
- * sysdeps/hppa/pspinlock.c: New file.
- * sysdeps/hppa/pt-machine.h: New file.
- * sysdeps/unix/sysv/linux/hppa/bits/initspin.h: New file.
-
-2000-10-05 Jakub Jelinek <jakub@redhat.com>
-
- * mutex.c (__pthread_mutex_destroy): Correct test of
- busy mutex for mutexes using alternate fastlocks.
- Patch by dtc@cmucl.cons.org.
-
-2000-09-28 Martin Schwidefsksy <schwidefsky@de.ibm.com>
-
- * sysdeps/s390/pt-machine.h: Make %a0 the thread register.
-
-2000-09-28 Ulrich Drepper <drepper@redhat.com>
-
- * mutex.c (__pthread_mutex_unlock): For PTHREAD_MUTEX_RECURSIVE_NP
- test for owner first.
- Patch by Kaz Kylheku <kaz@ashi.footprints.net>.
-
- * cancel.c (pthread_cancel): Don't do anything if cancelation is
- disabled.
-
-2000-09-26 Ulrich Drepper <drepper@redhat.com>
-
- * spinlock.h (__pthread_set_own_extricate_if): Optimize a bit.
- Patch by Kaz Kylheku <kaz@ashi.footprints.net>.
-
- * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Remove
- _POSIX_MONOTONIC_CLOCK.
-
- * spinlock.h (__pthread_set_own_extricate_if): Add back locking
- and explain why.
-
-2000-09-20 Andreas Jaeger <aj@suse.de>
-
- * pthread.c [!__ASSUME_REALTIME_SIGNALS]: Make inclusion of
- "testrtsig.h" conditional.
-
-2000-09-11 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/pthread.h: Declare pthread_attr_getstack and
- pthread_attr_setstack.
- * Versions [libpthread] (GLIBC_2.2): Export pthread_attr_getstack and
- pthread_attr_setstack.
- * attr.c (pthread_attr_getstack, pthread_attr_setstack): New functions.
-
-2000-09-05 Ulrich Drepper <drepper@redhat.com>
-
- * Examples/ex14.c: New file.
- * Makefile (tests): Add ex14.
-
- * mutex.c (__pthread_mutex_unlock): Correct test for already unlocked
- mutex. Patch by dtc@cmucl.cons.org.
-
- * ecmutex.c: New file.
- * Makefile (tests): Add ecmutex.
-
-2000-09-04 H.J. Lu <hjl@gnu.org>
-
- * attr.c (__pthread_attr_setguardsize): Use page_roundup
- instead of roundup to round up to the page size.
-
-2000-09-03 Mark Kettenis <kettenis@gnu.org>
-
- * manager.c (pthread_exited): Correctly report event as TD_REAP
- instead of TD_DEATH. Fix comments.
-
-2000-09-03 Ulrich Drepper <drepper@redhat.com>
-
- * spinlock.h (testandset): Add cast to avoid warning.
- Patch by Franz Sirl <Franz.Sirl-kernel@lauterbach.com>.
-
-2000-09-02 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/pthread/timer_routines.c: Include stdlib.h for abort
- prototype.
-
-2000-09-01 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/bits/stdio-lock.h (_IO_cleanup_region_start):
- Fix typo in last patch (_mode -> _flags).
-
- * sysdeps/pthread/bits/stdio-lock.h (_IO_cleanup_region_start):
- Provide definition which respects _IO_USER_LOCK flag.
-
-2000-08-30 Ulrich Drepper <drepper@redhat.com>
-
- * manager.c (pthread_allocate_stack): Clear descriptor only if not
- mmaped.
-
-2000-08-25 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile: Add rules to build and run unload.
- * unload.c: New file.
-
- * pthread.c (pthread_exit_process): Move thread_self use inside `if'.
-
- * sysdeps/pthread/pthread.h
- (PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP): Defined.
- (PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: Defined.
-
-2000-08-24 Andreas Jaeger <aj@suse.de>
-
- * Examples/ex13.c: Include <string.h> for strerror prototype and
- <stdlib.h> for abort prototype.
- (pthr_cond_signal_mutex): Rewrite to silence GCC.
- (thread_start): Remove unused variable err.
- (main): Silence GCC warnings.
-
-2000-08-22 Andreas Jaeger <aj@suse.de>
-
- * Examples/ex13.c: New test by Kurt Garloff <garloff@suse.de>.
-
- * Makefile (tests): Add ex13.
-
-2000-08-20 Ulrich Drepper <drepper@redhat.com>
-
- * semaphore.h: Add restrict where required by AGd4.
- * sysdeps/pthread/pthread.h: Likewise.
- * sysdeps/pthread/unix/sysv/linux/bits/sigthread.h: Likewise.
-
-2000-08-15 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile (tests): Add ex12. Add rule to build it.
- * Examples/ex12.c: New file.
-
-2000-08-13 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define _POSIX_SEMAPHORES
- even though the implementation is not quite complete (but it reports
- it). Define _POSIX_MESSAGE_PASSING to -1.
- * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise.
-
-2000-08-12 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/mips/pt-machine.h (testandset): Add .set mips2 for
- assembler.
- (__compare_and_swap): Likewise.
- * sysdeps/mips/pspinlock.c (__pthread_spin_lock): Likewise.
-
-2000-08-10 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c (__pthread_initial_thread): Initialize p_errnop and
- p_h_errnop correctly and not to NULL.
-
-2000-08-05 Ulrich Drepper <drepper@redhat.com>
-
- * Banner: Bump version number to 0.9.
-
-2000-08-04 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile (tests): Add tststack. Add rule to build the program.
- * tststack.c: New file.
-
- * internals.h: Declare __pthread_max_stacksize.
- * pthread.c (__pthread_max_stacksize): New variable.
- (__pthread_initialize_manager): Determine __pthread_initialize_manager
- value.
- * manager.c (thread_segment): Return always NULL if FLOATING_STACKS.
- (pthread_allocate_stack): Allow kernel to choose stack address if
- FLOATING_STACKS. This also handles variable-sized stacks.
- Always allocate stack and guardpage together. Use mprotect to
- change guardpage access.
- * sysdeps/i386/useldt.h: Define FLOATING_STACKS and
- ARCH_STACK_MAX_SIZE.
-
- * attr.c (__pthread_attr_setstacksize): Also test value against
- upper limit.
-
- * manager.c (__pthread_nonstandard_stacks): Define only if
- THREAD_SELF is not defined.
- (pthread_allocate_stack): Always initialize gardaddr to a correct
- value.
- (pthread_handle_create): Unmap thread with one call.
- (pthread_free): Remove test for initial thread before removing stack.
- Unmap stack with one call.
-
- * pthread.c (__pthread_initial_thread): Initialize p_userstack to
- 1 to avoid removing the stack.
-
-2000-07-27 Jes Sorensen <jes@linuxcare.com>
-
- * sysdeps/ia64/pspinlock.c (__pthread_spin_lock): Add
- load of spin lock to prime the cache before the atomic compare and
- exchange operation (cmpxchg4). This avoids the spinning on the
- cmpxchg4 instruction and reduces movement of the cache line back
- and forth between the processors (explanation by Asis K. Mallick
- from Intel). This basically makes the implementation operate the
- same as the Linux kernel implementation.
-
- * shlib-versions: Use GLIBC_2_2 for Linux/ia64.
- * sysdeps/ia64/pspinlock.c: New file.
-
-2000-08-03 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c: Move definition of __pthread_set_own_extricate_if...
- * spinlock.h: ...here. Remove locking.
- * internals.h: Remove __pthread_set_own_extricate_if prototype.
-
- * rwlock.c: Use THREAD_GETMEM And THREAD_SETMEM.
- (rwlock_rd_extricate_func): Don't determine self, let
- __pthread_lock do it.
- (rwlock_wr_extricate_func): Likewise.
- (rwlock_have_already): Optimize *pself handling a bit.
-
- * mutex.c: Use __builtin_expect.
- * pthread.c: Likewise.
-
-2000-08-02 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/s390/pspinlock.c: New file.
- * sysdeps/s390/pt-machine.h: New file.
- Patches by Martin Schwidefsky <schwidefsky@de.ibm.com>.
-
-2000-07-12 Maciej W. Rozycki <macro@ds2.pg.gda.pl>
-
- * sysdeps/mips/pspinlock.c (__pthread_spin_lock): Implement for
- R3K.
- * sysdeps/mips/pt-machine.h (testandset): Likewise.
-
-2000-07-26 Andreas Jaeger <aj@suse.de>
-
- * pthread.c: Initialize p_sem_avail.
-
-2000-07-25 Ulrich Drepper <drepper@redhat.com>
-
- * internals.h (struct __pthread_descr_struct): Add p_sem_avail.
- * semaphore.c: Handle spurious wakeups.
-
- * sysdeps/pthread/pthread.h: Add back PTHREAD_MUTX_FAST_NP as an alias
- for PTHREAD_MUTEX_ADAPTIVE_NP for source code compatibility.
-
- * pthread.c (__pthread_set_own_extricate): Use THREAD_GETMEM.
- (__pthread_wait_for_restart): Likewise.
-
- * condvar.c (pthread_cond_wait): Also check whether thread is
- cancelable before aborting loop.
- (pthread_cond_timedwait): Likewise.
-
- * signals.c (pthread_sighandler): Remove special code to restrore
- %gs on x86.
- (pthread_sighandler_t): Likewise.
-
-2000-07-25 Mark Kettenis <kettenis@gnu.org>
-
- * internals.h (__RES_PTHREAD_INTERNAL): Remove define.
- * pthread.c: Include <resolv.h>.
- (_res): Undefine. Add extern declaration.
-
-2000-07-24 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c (__pthread_initial_thread): Update initializer.
- (__pthread_manager_thread): Likewise.
- (pthread_initialize): Move setrlimit call to...
- (__pthread_initialize_manager): ...here.
- (__pthread_reset_main_thread): Reset also soft limit on stack size.
-
- * condvar.c: Handle spurious wakeups. [PR libc/1749].
- * internals.h (struct _pthread_descr_struct): Add p_condvar_avail.
-
-2000-07-21 Ulrich Drepper <drepper@redhat.com>
-
- * spinlock.h: If IMPLEMENT_TAS_WITH_CAS is defined use
- __compare_and_swap to define testandset.
- * sysdeps/powerpc/pt-machine.h: Add volatile to asms.
- Define IMPLEMENT_TAS_WITH_CAS.
-
-2000-07-20 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile: Pass -z nodelete to linker for libpthread.so
- generation if it understand this option.
-
-2000-07-18 Mark Kettenis <kettenis@gnu.org>
-
- * manager.c (pthread_handle_create): Remove initialization of
- new_thread->p_res._sock.
-
-2000-07-19 Kaz Kylheku <kaz@ashi.footprints.net>
-
- Bugfixes to the variant of the code for machines with no compare
- and swap.
-
- * spinlock.c (__pthread_alt_lock, __pthread_alt_timedlock): Wait
- node was not being properly enqueued, due to failing to update
- the lock->__status field.
-
- * spinlock.c (__pthread_alt_timedlock): The oldstatus variable was
- being set inappropriately, causing the suspend function to be called
- with a null self pointer and crash.
-
-2000-07-18 Ulrich Drepper <drepper@redhat.com>
-
- * spinlock.h (__pthread_alt_trylock): Fix code used if no
- compare&swap is available.
-
- * spinlock.h (__pthread_trylock): Use __compare_and_swap, not
- compare_and_swap.
-
- * pthread.c (pthread_initialize): Don't use sysconf to determine
- whether the machine has more than one processor.
-
- * spinlock.c (__pthread_alt_timedlock): Add back one of the
- removed thread_self calls.
-
-2000-07-18 Kaz Kylheku <kaz@ashi.footprints.net>
-
- * spinlock.c (__pthread_alt_lock, __pthread_alt_timedlock): Changed
- __compare_and_swap to compare_and_swap in code which assumes
- compare swap is available.
-
-2000-07-18 Kaz Kylheku <kaz@ashi.footprints.net>
-
- * spinlock.c (__pthread_alt_lock, __pthread_alt_timedlock): Fixed
- bug whereby thr field of waitnode structure would not be correctly
- set unless a null self pointer is passed to the functions.
- Eliminated redundant calls to thread_self().
-
-2000-07-18 Jakub Jelinek <jakub@redhat.com>
-
- * pthread.c (__pthread_initialize_manager): Lock
- __pthread_manager_thread.p_lock before calling clone.
-
-2000-05-05 H.J. Lu <hjl@gnu.org>
-
- * sysdeps/ia64/pt-machine.h (__compare_and_swap): Change it to
- have acquire semantics.
- (__compare_and_swap_with_release_semantics): New inline
- function.
- (HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS): New macro.
-
-2000-01-28 Hans Boehm <hboehm@exch.hpl.hp.com>
-
- * manager.c: Fix the problem with signals at startup.
- Change the way that thread stacks are allocated on IA64.
- Clean up some of the guard page allocation stuff.
-
-1999-12-19 H.J. Lu <hjl@gnu.org>
-
- * internals.h (page_roundup): New.
- * attr.c (__pthread_attr_setguardsize); Use page_roundup
- instead of roundup.
- * manager.c (pthread_allocate_stack): Make sure guardaddr is
- page aligned with page_roundup if NEED_SEPARATE_REGISTER_STACK
- is define.
-
-1999-12-17 Hans Boehm <hboehm@exch.hpl.hp.com>
-
- * manager.c (pthread_allocate_stack): Unmap the stack top
- if failed to map the stack bottom.
- Fix the guard page.
- (pthread_free): Fix the guard page.
-
- * pthread.c (pthread_initialize): Set rlimit correctly for
- NEED_SEPARATE_REGISTER_STACK.
-
-1999-12-16 H.J. Lu <hjl@gnu.org>
-
- * pthread.c (__pthread_initialize_manager): Pass
- __pthread_manager_thread_bos instead of
- __pthread_manager_thread_tos to __clone2.
-
-1999-12-16 H.J. Lu <hjl@gnu.org>
-
- * manager.c (pthread_allocate_stack): Correct the calculation
- of "new_thread_bottom". Remove MAP_GROWSDOWN from mmap for
- stack bottom.
-
-1999-12-13 H.J. Lu <hjl@gnu.org>
-
- * sysdeps/ia64/pt-machine.h (__compare_and_swap): Added a stop
- bit after setting ar.ccv.
-
-1999-12-12 H.J. Lu <hjl@gnu.org>
-
- * manager.c (pthread_allocate_stack): Make the starting
- address of the stack bottom page aligned. FIXME: it may
- need changes in other places.
- (pthread_handle_create): Likewise.
-
-1999-12-11 Hans Boehm <hboehm@exch.hpl.hp.com>
-
- * manager.c (pthread_allocate_stack): Handle
- NEED_SEPARATE_REGISTER_STACK.
- (pthread_handle_create): Likewise.
- * pthread.c (__pthread_initialize_manager): Likewise.
-
- * sysdeps/ia64/pt-machine.h: Use r13 for thread pointer.
-
-1999-12-02 H.J. Lu <hjl@gnu.org>
-
- * sysdeps/ia64/pt-machine.h: New.
-
-2000-07-13 Ulrich Drepper <drepper@redhat.com>
-
- * wrapsyscall.c: Mark non-__ protected names as weak.
- PR libc/1466.
-
-2000-07-12 Bruno Haible <haible@clisp.cons.org>
-
- * Examples/ex8.c: Include <sys/wait.h>, not <wait.h>.
-
-2000-07-12 Ulrich Drepper <drepper@redhat.com>
-
- * spinlock.c: Fix code for TEST_FOR_COMPARE_AND_SWAP being defined.
- Add tests also to new alternative spinlock implementation.
- * spinlock.h: Likewise.
- Patch by Kaz Kylheku <kaz@ashi.footprints.net>.
-
-2000-07-06 Ulrich Drepper <drepper@redhat.com>
-
- * Version: Export __sigaction.
- * signals.c: Define __sigaction alias. Use __libc_sigaction instead
- of __sigaction.
- * pthread.c: Use __libc_sigaction instead of __sigaction.
-
- * condvar.c: Implement pthread_condattr_getpshared and
- pthread_condattr_setpshared.
- * mutex.c: Implement pthread_mutexattr_getpshared and
- pthread_mutexattr_setpshared.
- * Versions: Export new functions.
- * sysdeps/pthread/pthread.h: Add prototypes for new functions.
-
- * rwlock.c (pthread_rwlockattr_init): Use PTHREAD_PROCESS_PRIVATE.
- (pthread_rwlockattr_setpshared): Fail if PTHREAD_PROCESS_PRIVATE
- is not selected.
-
-2000-07-04 Greg McGary <greg@mcgary.org>
-
- * sysdeps/pthread/bits/libc-lock.h: Remove BP_SYM from
- pragmas. Include bp-sym.h only if _LIBC.
-
-2000-07-04 Ulrich Drepper <drepper@redhat.com>
-
- * spinlock.c (__pthread_unlock): Properly place write barrier.
- Patch by Kaz Kylheku <kaz@ashi.footprints.net>.
-
-2000-07-03 Ulrich Drepper <drepper@redhat.com>
-
- * spinlock.c: Replace fast spinlocks by adaptive spinlocks which are
- faster on SMP systems. No more emulation of compare&swap for adaptive
- spinlocks.
- * spinlock.h: Likewise.
- * sysdeps/pthread/pthread.h: Shuffle PTHREAD_MUTEX_* values around.
- Replace fast with adaptive mutex.
- * mutex.c: Rewrite for replacement of fast by adaptive mutex.
- * condvar.c: Likewise.
- * pthread.c: Define and initialize __pthread_smp_kernel variable.
- * internals.h: Declare __pthread_smp_kernel.
- * sysdeps/pthread/bits/pthreadtypes.h: Update comment of
- _pthread_fastlock structure.
- Patch by Kaz Kylheku <kaz@ashi.footprints.net>.
-
- * pthread.c: Remove initialization to zero from global variables.
-
-2000-06-29 Jakub Jelinek <jakub@redhat.com>
-
- * shlib-versions: Make sparc64 GLIBC_2.2+ only.
-
-2000-06-28 Greg McGary <greg@mcgary.org>
-
- * weaks.c: Wrap BP_SYM () around weak extern declarations of
- pthread functions that have pointers in their return+arg signatures.
-
-2000-06-27 Greg McGary <greg@mcgary.org>
-
- * sysdeps/pthread/bits/libc-lock.h: Wrap BP_SYM () around weak
- extern declarations of pthread functions that have pointers in
- their return+arg signatures.
-
-2000-06-26 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile (tests): Add ex11. Add rules to build it.
- * Examples/ex11.c: New file.
- * rwlock.c: Fix complete braindamaged previous try to implement
- timedout functions.
-
- * spinlock.c: Pretty print.
-
-2000-06-25 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile (tests): Add ex10. Add rules to build it.
- * Versions [GLIBC_2.2] (libpthread): Add pthread_mutex_timedlock,
- pthread_rwlock_timedrdlock, and pthread_rwlock_timedwrlock.
- * condvar.c (pthread_cond_wait): Allow mutex of kind
- PTHREAD_MUTEX_TIMED_NP.
- (pthread_cond_timedwait_relative): Likewise.
- * mutex.c (__pthread_mutex_init): Default is PTHREAD_MUTEX_TIMED_NP.
- (__pthread_mutex_trylock): Use __pthread_alt_trylock for
- PTHREAD_MUTEX_ERRORCHECK_NP. Handle PTHREAD_MUTEX_TIMED_NP.
- (__pthread_mutex_lock): Use __pthread_alt_lock for
- PTHREAD_MUTEX_ERRORCHECK_NP. Handle PTHREAD_MUTEX_TIMED_NP.
- (__pthread_mutex_timedlock): New function.
- (__pthread_mutex_unlock): Use __pthread_alt_unlock for
- PTHREAD_MUTEX_ERRORCHECK_NP. Handle PTHREAD_MUTEX_TIMED_NP.
- (__pthread_mutexattr_init): Use PTHREAD_MUTEX_TIMED_NP.
- (__pthread_mutexattr_settype): Allow PTHREAD_MUTEX_TIMED_NP.
- * spinlock.c: Implement alternate fastlocks.
- * spinlock.h: Add prototypes.
- * Examples/ex10.c: New file.
- * sysdeps/pthread/pthread.h: Add prototypes for new functions.
- Patch by Kaz Kylheku <kaz@ashi.footprints.net>.
-
- * rwlock.c (__pthread_rwlock_rdlock): Optimize loop a bit.
- (__pthread_rwlock_timedrdlock): New function.
- (__pthread_rwlock_timedwrlock): New function.
- Use laternate fastlock function everywhere.
-
-2000-06-21 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/pthread/timer_routines.c: Include <string.h> for memset
- prototype.
-
- * join.c: Include <stdlib.h> for exit prototype.
-
-2000-06-20 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/useldt.h: Include <stdlib.h>.
-
- * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define _POSIX_BARRIERS.
- * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise.
-
- * Makefile (libpthread-routines): Add barrier.
- (tests): Add ex9. Add rule to build ex9.
- * Versions: Export barrier functions.
- * barrier.c: New file.
- * Examples/ex9.c: New file.
- * sysdeps/pthread/pthread.h: Add barrier data types and declarations.
- * sysdeps/pthread/bits/pthreadtypes.h: Likewise.
- Patch by Kaz Kylheku <kaz@ashi.footprints.net>.
-
-2000-06-19 H.J. Lu <hjl@gnu.org>
-
- * spinlock.h (HAS_COMPARE_AND_SWAP): Defined if
- HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS is defined.
- (compare_and_swap_with_release_semantics): New. Default to
- compare_and_swap if HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS
- is not defined.
-
- * spinlock.c (__pthread_unlock): Call
- compare_and_swap_with_release_semantics () instead of
- compare_and_swap ().
-
-2000-06-19 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/timer_create.c: Use _set_errno instead of assigning
- to errno directly.
- * sysdeps/pthread/timer_delete.c: Likewise.
- * sysdeps/pthread/timer_getoverr.c: Likewise.
- * sysdeps/pthread/timer_gettime.c: Likewise.
- * sysdeps/pthread/timer_settime.c: Likewise.
-
-2000-06-13 Kaz Kylheku <kaz@ashi.footprints.net>
-
- Timer nodes are now reference counted, and can be marked
- as deleted. This allows for the safe release of the global mutex
- in the middle without losing the timer being operated on.
-
- * sysdeps/pthread/posix-timer.h (struct timer_node): The inuse
- member is now an enum with three values, so that an intermediate
- state can be represented (deleted but not free for reuse yet).
- New refcount member added.
- * sysdeps/pthread/timer_routines.c: Likewise.
-
- * sysdeps/pthread/posix-timer.h (timer_addref, timer_delref,
- timer_valid): New inline functions added.
-
- * sysdeps/pthread/timer_gettime.c (timer_gettime): Function
- restructured, recursive deadlock bug fixed.
-
- * sysdeps/pthread/timer_gettime.c (timer_gettime): Uses new
- timer_addref to ensure that timer won't be deleted while mutex is not
- held. Also uses timer_invalid to perform validation of timer handle.
- * sysdeps/pthread/timer_settime.c (timer_settime): Likewise.
- * sysdeps/pthread/timer_getoverr.c (timer_getoverrun): Likewise.
-
-2000-06-14 Ulrich Drepper <drepper@redhat.com>
-
- * shlib-versions: Add entry for SH.
- Patch by Kaz Kojima <kkojima@rr.iij4u.or.jp>.
-
-2000-06-13 Kaz Kylheku <kaz@ashi.footprints.net>
-
- A few optimizations. Got rid of unnecessary wakeups of timer threads,
- tightened up some critical regions and micro-optimized some list
- manipulation code.
-
- * sysdeps/pthread/timer_routines.c (__timer_thread_queue_timer):
- Returns int value now to indicate whether timer was queued at head.
- * sysdeps/pthread/posix-timer.h: Likewise.
- * sysdeps/pthread/timer_settime.c (timer_settime): Takes advantage of
- new return value from __timer_thread_queue_timer to avoid waking
- up timer thread unnecessarily.
-
- * sysdeps/pthread/posix-timer.h (timer_id2ptr): No longer checks
- inuse flag, because this requires mutex to be held. Callers updated
- to do the check when they have the mutex.
- * sysdeps/pthread/timer_getoverr.c: Add check for inuse here.
-
- * sysdeps/pthread/timer_settime.c (timer_settime): Tighter critical
- regions: avoids making system calls while holding timer mutex, and
- a few computations were moved outside of the mutex as well.
- * sysdeps/pthread/timer_gettime.c (timer_gettime): Likewise.
-
- * sysdeps/pthread/posix-timer.h (list_unlink_ip): Function name changed
- to list_unlink_ip, meaning idempotent. Pointer manipulation
- changed to get better better code out of gcc.
- * sysdeps/pthread/timer_routines.c (list_unlink): Non-idempotent
- version of list_unlink added here.
- * sysdeps/pthread/timer_delete.c: Use appropriate list unlink
- function in all places: idempotent one for timers, non-idempotent
- one for thread nodes.
- * sysdeps/pthread/timer_settime: Likewise.
- * sysdeps/pthread/timer_routines.c: Likewise.
-
-2000-06-13 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/bits/posix_opt.h (_POSIX_TIMERS): Define.
- * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise.
-
- * sysdeps/pthread/Makefile: Remove tests definition.
-
-2000-06-12 Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
- Yutaka Niibe <gniibe@chroot.org>
-
- * sysdeps/sh/pspinlock.c: New file.
- * sysdeps/sh/pt-machine.h: New file.
-
-2000-06-12 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile (tests): Add joinrace.
-
- * Examples/ex6.c: Test return value of pthread_join.
-
-2000-06-11 Geoff Keating <geoffk@cygnus.com>
-
- * sysdeps/powerpc/pspinlock.c (__pthread_spin_lock): Implement.
- (__pthread_spin_trylock): Implement.
- (__pthread_spin_unlock): Implement.
- (__pthread_spin_init): Implement.
- (__pthread_spin_destroy): Implement.
-
-2000-06-10 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/timer_routines.c (list_append): Little fix to
- really append the entry.
-
-2000-06-10 Andreas Jaeger <aj@suse.de>
-
- * lockfile.c (__fresetlockfiles): Remove unused variable fp.
-
-2000-06-10 Kaz Kylheku <kaz@ashi.footprints.net>
-
- * sysdeps/pthread/timer_create.c: Thread matching now done on
- clock type as well as thread attributes.
- There are individual global signal-delivering threads for
- different clock types.
- * sysdeps/pthread/posix-timer.h: Likewise.
- * sysdeps/pthread/timer_routines.c: Likewise.
-
- * sysdeps/pthread/timer_routines.c: Thread allocation and
- deallocation function now remembers to put thread on active
- list and remove from active list.
- Thus now the feature of binding multiple timers
- to a single thread actually works.
-
-2000-06-10 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c (__pthread_create_2_1): Optimize a bit.
-
- * internals.h (invalid_handle): Also test for p_terminated != 0.
- (nonexisting_handle): New function. Same as old invalid_handle.
- * join.c (pthread_join): Use nonexisting_handle instead of
- invalid_handle to test for acceptable thread handle.
- * manager.c (pthread_handle_free): Likewise.
- * joinrace.c: New file.
- Reported by Permaine Cheung <pcheung@cygnus.com>.
-
-2000-06-08 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/pthread/timer_routines.c (__timer_thread_queue_timer):
- Correct handling of matching variable.
-
- * sysdeps/pthread/tst-timer.c (main): Rewrite initializers to
- avoid warnings.
-
- * sysdeps/pthread/timer_routines.c (__timer_thread_queue_timer):
- Be prepared for empty timer list.
-
- * sysdeps/pthread/timer_create.c (timer_create): Correct names of
- CPUTIME clock ID. Add support for thread clocks.
-
- * sysdeps/pthread/posix-timer.h (timer_ptr2id): Operands in
- subtraction were switched.
-
- * sysdeps/pthread/timer_routines.c (init_module): Use
- THREAD_MAXNODES threads.
-
- * sysdeps/pthread/posix-timer.h (struct timer_node): Add creator_pid.
- * sysdeps/pthread/timer_create.c: Fill in creator_pid.
- * sysdeps/pthread/timer_routines.c (thread_expire_timer): Send signal
- with sigqueueinfo is this system call is available.
-
- * sysdeps/pthread/timer_create.c (timer_create): Allow
- CLOCK_CPUTIME if _POSIX_CPUTIME is defined.
-
- * sysdeps/pthread/Makefile: New file. Add rules to build timer
- functionality.
- * sysdeps/unix/sysv/linux/bits/local_lim.h: Add TIMER_MAX.
-
-2000-06-04 Kaz Kylheku <kaz@ashi.footprints.net>
-
- * sysdeps/pthread/posix-timer.h: New file.
- * sysdeps/pthread/timer_create.c: New file.
- * sysdeps/pthread/timer_delete.c: New file.
- * sysdeps/pthread/timer_getoverr.c: New file.
- * sysdeps/pthread/timer_gettime.c: New file.
- * sysdeps/pthread/timer_routines.c: New file.
- * sysdeps/pthread/timer_settime.c: New file.
- * sysdeps/pthread/tst-timer.c: New file.
-
-2000-06-08 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/bits/local_lim.h: Remove OPEN_MAX and
- LINK_MAX definitions if necessary.
-
-2000-06-04 Kaz Kylheku <kaz@ashi.footprints.net>
-
- Added missing fork time handling of global libio lock.
-
- * lockfile.c (__fresetlockfiles): Now also resets the list lock,
- not just the individual stream locks. Rewritten to use new
- iterator interface provided by libio rather than accessing
- global variable.
-
- * lockfile.c (__flockfilelist, _funlockfilelist): New functions
- which lock and unlock the stream list using the new interface
- provied by libio.
- * internals.h: Likewise.
-
- * ptfork.c (__fork): Now calls __flockfilelist before fork,
- and __funlockfilelist in the parent after the fork.
- Child still calls __fresetlockfiles as before.
-
- * linuxthreads.texi: Now explains what happens to streams at
- fork time. Also whole new section on forking and thread added.
- Definition of pthread_atfork moved out of Miscellaneous Functions
- to this new section.
-
-2000-06-04 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/sparc/sparc32/sparcv9/pspinlock.c (__pthread_spin_lock):
- Add missing register.
- * sysdeps/sparc/sparc64/pspinlock.c (__pthread_spin_lock): Likewise.
-
-2000-06-02 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/sparc/sparc32/pspinlock.c: Implement spinlocks.
- * sysdeps/sparc/sparc32/sparcv9/pspinlock.c: New.
- * sysdeps/sparc/sparc64/pspinlock.c: Implement spinlocks.
-
-2000-05-31 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/mips/pspinlock.c: Implement spinlocks.
-
-2000-05-28 Ulrich Drepper <drepper@redhat.com>
-
- * spinlock.c (__pthread_lock): Remove ASSERT.
-
- * Makefile (tests): Add ex8.
- * Examples/ex8.c: New file.
-
-2000-05-12 Kaz Kylheku <kaz@ashi.footprints.net>
-
- Bugfix: The pthread_atfork mechanism now takes care of its
- own internal mutex at fork time.
-
- * ptfork.c (__fork): Revised so that the mutex is held across
- the fork operation and while the handlers are called, and so that
- the child resets the mutex.
-
- * linuxthreads.texi: Updated pthread_atfork documentation to make
- it clear that fork and pthread_atfork can't be reentered from
- atfork handlers, that pthread_atfork and fork are mutually atomic,
- and that the handlers are inherited by the child process.
-
-2000-05-24 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile (libpthread-routines): Add pspinlock.
- * cancel.c: Rename __pthread_spin_unlock back to __pthread_unlock.
- Use struct _pthread_fastlock instead of pthread_spinlock_t.
- * condvar.c: Likewise.
- * internals.h: Likewise.
- * join.c: Likewise.
- * manager.c: Likewise.
- * mutex.c: Likewise.
- * pthread.c: Likewise.
- * rwlock.c: Likewise.
- * semaphore.c: Likewise.
- * signals.c: Likewise.
- * spinlock.h: Likewise.
- * spinlock.c: Likewise. Remove pthread_spin_lock functions.
- * sysdeps/alpha/pspinlock.c: New file.
- * sysdeps/arm/pspinlock.c: New file.
- * sysdeps/i386/pspinlock.c: New file.
- * sysdeps/m68k/pspinlock.c: New file.
- * sysdeps/mips/pspinlock.c: New file.
- * sysdeps/powerpc/pspinlock.c: New file.
- * sysdeps/sparc/sparc32/pspinlock.c: New file.
- * sysdeps/sparc/sparc64/pspinlock.c: New file.
- * sysdeps/pthread/bits/pthreadtypes.h: Remove pthread_spinlock_t
- back to _pthread_fastlock. Define new pthread_spinlock_t.
-
-2000-05-24 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/i386/i686/pt-machine.h: Only use LDT on newer kernels.
-
-2000-05-21 Jakub Jelinek <jakub@redhat.com>
-
- * manager.c (pthread_handle_create): Initialize p_res._sock to -1.
-
-2000-05-13 Jakub Jelinek <jakub@redhat.com>
-
- * internals.h (__RES_PTHREAD_INTERNAL): Define.
-
-2000-05-06 Kaz Kylheku <kaz@ashi.footprints.net>
-
- * mutex.c (pthread_once): IN_PROGRESS state of pthread_once_t
- object state is represented with additional bits which distinguish
- whether that state was set up in the current process, or
- in an ancestor process. If that state was set in an ancestor,
- it means that a fork happened while thread was executing the init
- function. In that case, the state is reset to NEVER.
- * mutex.c (__pthread_once_fork_prepare): New function.
- (__pthread_once_fork_child): Likewise
- (__pthread_once_fork_parent): Likewise
- (__pthread_reset_pthread_once): Removed.
- * ptfork.c (__fork): Call new handlers in mutex.c.
- * internals.h: Declarations of new mutex.c functions added.
- Declaration of removed function deleted.
- * linuxthreads.texi: Updated documentation about pthread_once
- to clarify what happens under cancellation and forking.
-
-2000-05-06 Kaz Kylheku <kaz@ashi.footprints.net>
-
- * internals.h: New thread manager request type, REQ_KICK.
- * join.c (pthread_exit): main thread now calls exit() instead
- of _exit() in order to proper process cleanup.
- * manager.c (__pthread_manager): Do not terminate manager
- after unblocking main thread; wait for main thread's
- REQ_PROCESS_EXIT request instead.
- Also, added REQ_KICK case to handle new request; this just does
- nothing.
- * manager.c (pthread_exited): Do not terminate manager after
- unblocking main thread.
- * manager.c (__pthread_manager_sighandler): If the main thread
- is waiting for all other threads to die, send a REQ_KICK into
- the thread manager request pipe to get it to clean out the threads
- and unblock the main thread as soon as possible. This fixes
- the 2000 millisecond hang on shutdown bug.
- * Examples/ex7.c: New file, tests shutdown behavior when all threads
- including the main one call pthread_exit(), or implicitly do so.
- * Makefile (tests): Add ex7.
-
-2000-05-05 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/unix/sysv/linux/i386/getcpuclockid.c
- (pthread_getcpuclockid): Correct test for ourselves.
-
-2000-05-05 Ulrich Drepper <drepper@redhat.com>
-
- * internals.h (struct _pthread_descr_struct): Reorganization.
- Allocate room for 16 pointers at head of the structure for future
- thread-local data handling. Move p_self member in this area.
- * manager.c (pthread_handle_create): Adjust use of p_self.
- * sysdeps/i386/useldt.h (THREAD_SELF): Likewise.
- * pthread.c (__pthread_initial_thread): Adjust initialization.
- (__pthread_manager_thread): Likewise.
-
-2000-04-29 Bruno Haible <haible@clisp.cons.org>
-
- * join.c (pthread_exit): Use THREAD_GETMEM_NC instead of THREAD_GETMEM
- for eventmask larger than 1 word.
-
-2000-04-27 Ulrich Drepper <drepper@redhat.com>
-
- * Versions [libpthread] (GLIBC_2.2): Add __pthread_initialize_minimal.
- * pthread.c (__pthread_initialize_minimal): New function. Perform
- minimal initialization.
- (pthread_initialize): Remove this code here.
- * sysdeps/i386/i686/pt-machine.h: Include "../useldt.h" again. We
- are working around the problem in glibc.
-
-2000-04-25 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/i386/i686/pt-machine.h: Do not use "../useldt.h" for
- now. First gcc must be fixed (more concrete: libgcc).
-
-2000-04-24 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c: Remove special treatement for interrupt handlers on x86.
- * manager.c (pthread_free): Use FREE_THREAD not FREE_THREAD_SELF.
- * sysdeps/i386/useldt.h: Use "q" constraint instead of "r" where
- necessary.
- * sysdeps/i386/i686/pt-machine.h: Include "../useldt.h".
-
-2000-04-24 Mark Kettenis <kettenis@gnu.org>
-
- * join.c (pthread_exit): Set p_terminated after reporting the
- termination event instead of before.
-
-2000-04-20 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/pthread/bits/libc-lock.h: Only declare __pthread_rwlock_*
- if __USE_UNIX98.
-
-2000-04-18 Andreas Jaeger <aj@suse.de>
-
- * Versions: Use ld instead of ld.so.
-
-2000-04-18 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/unix/sysv/linux/sparc/bits/sigcontext.h (struct sigcontext):
- Remove the typedef keyword.
-
-2000-04-18 Jakub Jelinek <jakub@redhat.com>
-
- * sysdeps/sparc/sparc64/pt-machine.h (MEMORY_BARRIER): Use membar,
- not stbar.
- (READ_MEMORY_BARRIER): Define.
- * spinlock.c (__pthread_spin_unlock): Use READ_MEMORY_BARRIER, not
- MEMORY_BARRIER.
- * internals.h (READ_MEMORY_BARRIER): Define if not defined in sysdep
- headers.
-
-2000-04-17 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/i386/getcpuclockid.c
- (pthread_getcpuclockid): Don't compare thread_id with thread_self,
- use thread_handle().
-
-2000-04-16 Ulrich Drepper <drepper@redhat.com>
-
- * condvar.c (pthread_cond_timedwait_relative): Don't test for owner
- if fast mutex is used. Don't initialize `already_canceled' twice.
- Correctly test for return value of timedsuspend.
-
- * pthread.c: Correct long-time braino. We never set SA_SIGINFO and
- therefore don't need the _rt versions of the signal handlers.
-
-2000-04-15 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c (pthread_yield): New function.
- * sysdeps/pthread/pthread.h (pthread_yield): Add prototype.
- * Versions [libpthread] (GLIBC_2.2): Add pthread_yield.
- * internals.h: Declare __pthread_yield.
-
- * pthread.c (pthread_initialize): Avoid a bit more code if
- realtime signals are known to exist.
-
- * pthread.c: Is __ASSUME_REALTIME_SIGNALS then avoid generating code
- to dynamically detect RT signals and avoid generating compatibility
- functions with old kernel.
- * restart.h (restart) [__ASSUME_REALTIME_SIGNALS]: Use
- __pthread_restart_new directly.
- (suspend) [__ASSUME_REALTIME_SIGNALS]: Use
- __pthread_wait_for_restart_signal directly.
- (timedsuspend) [__ASSUME_REALTIME_SIGNALS]: Use
- __pthread_timedsuspend_new directly.
-
-2000-04-15 Ulrich Drepper <drepper@redhat.com>
-
- * condvar.c: Remove all the special code to handle cond_timedwait.
- Use timedsuspend instead.
- * internals.h: Declare __pthread_timedsuspend_old,
- __pthread_timedsuspend_new, and __pthread_timedsuspend.
- Remove declaration of __pthread_init_condvar.
- * pthread.c: Define __pthread_timedsuspend variable.
- (__pthread_timedsuspend_old): New function. Timed suspension
- implementation for old Linux kernels.
- (__pthread_timedsuspend_new): New function. Timed suspension
- implementation for new Linux kernels.
- * restart.h (timedsuspend): New function. Call appropriate
- suspension function through __pthread_timedsuspend.
- * semaphore.c (sem_timedwait): Use timedsuspend, don't duplicate
- the code.
- Patch by Kaz Kylheku <kaz@ashi.footprints.net>.
-
- * internals.h (WRITE_MEMORY_BARRIER): Define as MEMORY_BARRIER if
- undefined.
- * spinlock.c: Use WRITE_MEMORY_BARRIER instead of MEMORY_BARRIER
- where possible.
- * sysdeps/alpha/pt-machine.h: Define WRITE_MEMORY_BARRIER.
- * sysdeps/sparc/sparc64/pt-machine.h: Likewise.
-
- * sysdeps/unix/sysv/linux/bits/posix_opt.h: Add _POSIX_SPAWN.
- * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise.
-
-2000-04-14 Andreas Jaeger <aj@suse.de>
-
- * weaks.c: Fix typo.
-
- * shlib-versions (mips.*-.*-linux.*): Support only GLIBC 2.0 and
- 2.2 for linuxthreads.
-
-2000-04-13 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/i386/getcpuclockid.c
- (pthread_getcpuclockid): Fix typo.
-
-2000-04-12 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile (libpthread-routines): Add getcpuclockid.
- * Versions [libpthread] (GLIBC_2.2): Add pthread_getcpuclockid.
- * sysdeps/pthread/getcpuclockid.c: New file.
- * sysdeps/unix/sysv/linux/i386/getcpuclockid.c: New file.
- * sysdeps/pthread/pthread.h: Add prototype for pthread_getcpuclockid.
-
- * sysdeps/unix/sysv/linux/bits/posix_opt.h (_POSIX_SPIN_LOCKS):
- Defined.
- * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise.
-
- * sysdeps/pthread/pthread.h: Add prototypes for pthread_spin_init,
- pthread_spin_destroy, pthread_spin_lock, pthread_spin_trylock,
- and pthread_spin_unlock.
- * sysdeps/pthread/bits/pthreadtypes.h: Change struct _pthread_fastlock
- into pthread_spinlock_t. Change all uses.
- * spinlock.c: Implement pthread_spin_lock.
- Rename __pthread_unlock to __pthread_spin_unlock and define weak
- alias for real name.
- Define pthread_spin_trylock, pthread_spin_init, and
- pthread_spin_destroy.
- Change all uses of _pthread_fastlock to pthread_spinlock_t.
- * spinlock.h: Rename __pthread_unlock to __pthread_spin_unlock.
- Change all uses of _pthread_fastlock to pthread_spinlock_t.
- * Versions [libpthread] (GLIBC_2.2): Add pthread_spin_init,
- pthread_spin_destroy, pthread_spin_lock, pthread_spin_trylock,
- and pthread_spin_unlock.
- * cancel.c: Use __pthread_spin_unlock instead of __pthread_unlock.
- Change all uses of _pthread_fastlock to pthread_spinlock_t.
- * condvar.c: Likewise.
- * internals.h: Likewise.
- * join.c: Likewise.
- * manager.c: Likewise.
- * mutex.c: Likewise.
- * pthread.c: Likewise.
- * rwlock.c: Likewise.
- * semaphore.c: Likewise.
- * signals.c: Likewise.
-
- * sysdeps/unix/sysv/linux/bits/posix_opt.h: Add various new POSIX
- macros.
- * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: New file.
-
-2000-04-11 Ulrich Drepper <drepper@redhat.com>
-
- * sysdeps/unix/sysv/linux/bits/posix_opt.h: Add
- _POSIX_SHARED_MEMORY_OBJECTS.
-
-2000-04-11 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/mips/pt-machine.h (MEMORY_BARRIER): Define.
- (__compare_and_swap): Mark as modifying memory.
-
-2000-04-11 Geoff Keating <geoffk@cygnus.com>
-
- * sysdeps/powerpc/pt-machine.h (MEMORY_BARRIER): Don't be
- __volatile__.
- (__compare_and_swap): Replace other 'sync' with MEMORY_BARRIER.
- Don't have the 'asm' __volatile__.
-
-2000-04-11 Ulrich Drepper <drepper@redhat.com>
-
- * internals.h: Define MEMORY_BARRIER as empty if not defined already.
- * spinlock.c (__pthread_lock): Add memory barriers.
- (__pthread_unlock): Likewise.
- * sysdeps/alpha/pt-machine.h (MEMORY_BARRIER): Define using mb
- instruction.
- (RELEASE): Not needed anymore.
- (__compare_and_swap): Mark asm as modifying memory.
- * sysdeps/powerpc/pt-machine.h (sync): Remove. Replace with definition
- of MEMORY_BARRIER.
- (__compare_and_swap): Use MEMORY_BARRIER instead of sync.
- * sysdeps/sparc/sparc32/pt-machine.h (RELEASE): Not needed anymore.
- (MEMORY_BARRIER): Define using stbar.
- * sysdeps/sparc/sparc64/pt-machine.h (MEMORY_BARRIER): Define using
- stbar.
- (__compare_and_swap): Use MEMORY_BARRIER to ensure ordering.
- Patch by Xavier Leroy <Xavier.Leroy@inria.fr> based on comments by
- Mike Burrows <m3b@pa.dec.com>.
-
-2000-04-09 Ulrich Drepper <drepper@redhat.com>
-
- * signals.c (sigaction): Fix return value for the case SIG is one
- of the signals the implementation uses.
- Patch by Xavier.Leroy@inria.fr.
-
-2000-04-01 Andreas Jaeger <aj@suse.de>
-
- * attr.c: Use shlib-compat macros.
- * oldsemaphore.c: Likewise.
- * pthread.c: Likewise.
- * weaks.c: Likewise.
-
-2000-03-26 Ulrich Drepper <drepper@redhat.com>
-
- * semaphore.c (sem_timedwait): New function.
- Patch by Carl Mailloux <carlm@oricom.ca>.
- * semaphore.h: Declare sem_timedwait.
- * Versions [libpthread] (GLIBC_2.2): Add sem_timedwait.
-
-2000-03-26 Roland McGrath <roland@baalperazim.frob.com>
-
- * sysdeps/pthread/Makefile: File removed.
-
-2000-03-23 Ulrich Drepper <drepper@redhat.com>
-
- * mutex.c (__pthread_reset_pthread_once): Reset once_masterlock.
- * internals.h (__pthread_reset_pthread_once): Add prototype.
- * ptfork.c (__fork): Call __pthread_reset_pthread_once.
-
- * manager.c (pthread_handle_create): Store ID of new thread before
- clone call.
-
-2000-03-21 Ulrich Drepper <drepper@redhat.com>
-
- * attr.c: Use new macros from shlib-compat.h to define versions.
- * oldsemaphore.c: Likewise.
- * semaphore.c: Likewise.
- * weaks.c: Likewise.
-
- * pthread.c: Update for new SHLIB_COMPAT definition.
-
- * manager.c (__pthread_manager): Unmask debug signal.
-
- * pthread.c (pthread_initialize): Test for address of __dso_handle
- being NULL, not value. Use __on_exit, not on_exit.
- Patch by Andreas Jaeger <aj@suse.de>.
-
- * pthread.c: Use new macros from shlib-compat.h to define versions.
-
-2000-03-19 Ulrich Drepper <drepper@redhat.com>
-
- * pthread.c (pthread_initialize): Instead of on_exit use
- __cxa_atexit if __dso_label is available to allow unloading the
- libpthread shared library.
-
-2000-03-16 Ulrich Drepper <drepper@redhat.com>
-
- * condvar.c: Make tests for ownership of mutex less strict.
-
-2000-03-14 Ulrich Drepper <drepper@redhat.com>
-
- * condvar.c (pthread_cond_wait): Check whether mutex is owned by
- current thread and return error if not.
- (pthread_cond_timedwait_relative_old): Likewise.
- (pthread_cond_timedwait_relative_new): Likewise.
-
- * mutex.c (__pthread_once): Handle cancelled init function correctly.
- (pthread_once_cancelhandler): New function.
- Patch by Kaz Kylheku <kaz@ashi.footprints.net>.
-
-2000-03-14 Andreas Jaeger <aj@suse.de>
-
- * pthread.c (pthread_handle_sigcancel_rt): GS has been renamed to
- REG_GS.
- (pthread_handle_sigrestart_rt): Likewise.
- * signals.c (pthread_sighandler_rt): Likewise.
-
-2000-03-02 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/pthread/bits/libc-lock.h: Fix typo.
- Reported by Sean Chen <sean.chen@turbolinux.com>.
-
-2000-02-28 Andreas Jaeger <aj@suse.de>
-
- * rwlock.c: Fix typo.
-
-2000-02-27 Ulrich Drepper <drepper@redhat.com>
-
- * rwlock.c: Define __* variants of the functions and make old names
- aliases.
- * Versions [GLIBC_2.2]: Export the __pthread_rwlock_* functions.
- * sysdeps/pthread/bits/libc-lock.h: Define __libc_rwlock_* macros.
-
-2000-02-25 Andreas Jaeger <aj@suse.de>
-
- * Versions: Export pread, __pread64, pread64, pwrite, __pwrite64,
- pwrite64, lseek64, open64, and __open64 with version 2.2.
-
-2000-02-22 Ulrich Drepper <drepper@redhat.com>
-
- * semaphore.h (SEM_FAILED): Use 0 not NULL.
-
-2000-02-14 Ulrich Drepper <drepper@redhat.com>
-
- * condvar.c (pthread_cond_timedwait_relative_old): Tight loop with
- nanosleep does not work either. Get absolute time inside the
- loop.
- (pthread_cond_timedwait_relative_new): Likewise.
- Patch by Kaz Kylheku <kaz@ashi.footprints.net>.
-
-2000-02-13 Andreas Jaeger <aj@suse.de>
-
- * condvar.c (pthread_cond_timedwait_relative_new): Fix last patch.
- (pthread_cond_timedwait_relative_old): Likewise.
-
-2000-02-13 Ulrich Drepper <drepper@redhat.com>
-
- * condvar.c (pthread_cond_timedwait_relative_old): Undo last patch
- but keep the code around. A bug in the kernel prevent us from
- using the code.
- (pthread_cond_timedwait_relative_new): Likewise.
- (PR libc/1597 and libc/1598).
-
-2000-02-01 Kaz Kylheku <kaz@ashi.footprints.net>
-
- * condvar.c (pthread_cond_timedwait_relative_old): Do tight
- loop around nanosleep calls instead of around most of the function
- (pthread_cond_timedwait_relative_new): Likewise.
- body. Got rid of backwards goto and one local.
-
-2000-01-31 Ulrich Drepper <drepper@redhat.com>
-
- * condvar.c (pthread_cond_timedwait_relative_old): Recompute time
- before every nanosleep call to account for time spent in the rest
- of the function.
- (pthread_cond_timedwait_relative_new): Likewise.
- Patch by khendricks@ivey.uwo.ca (PR libc/1564).
-
-2000-01-29 Ulrich Drepper <drepper@redhat.com>
-
- * condvar.c (pthread_cond_timedwait_relative_old): Get remaining time
- from nanosleep call so that in case we restart we only wait for the
- remaining time.
- (pthread_cond_timedwait_relative_new): Likewise.
- Patch by khendricks@ivey.uwo.ca (PR libc/1561).
-
-2000-01-18 Ulrich Drepper <drepper@cygnus.com>
-
- * manager.c (pthread_allocate_stack): Compute guard page address
- correctly. Patch by HJ Lu.
-
- * sysdeps/pthread/pthread.h: Define
- PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP.
-
-2000-01-16 Ulrich Drepper <drepper@cygnus.com>
-
- * rwlock.c (pthread_rwlock_unlock): Correct one more problem with
- preference handling.
- (pthread_rwlockattr_setkind_np): Allow
- PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP.
- Patches by Kaz Kylheku <kaz@ashi.footprints.net>.
-
-2000-01-12 Ulrich Drepper <drepper@cygnus.com>
-
- * internals.h (pthread_readlock_info): New structure.
- (_pthread_descr_struct): Add p_readlock_list, p_readlock_free, and
- p_untracked_readlock_count.
- * pthread.c (__pthread_initial_thread, pthread_manager_thread):
- Add initializers for new fields.
- * manager.c (pthread_free): Free read/write lock lists.
- * queue.h (queue_is_empty): New function.
- * rwlock.c: Implement requirements about when readers should get
- locks assigned.
- * sysdeps/pthread/pthread.h
- (PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP): New definition.
- * sysdeps/pthread/bits/pthreadtypes.h (struct _pthread_rwlock_t):
- Define this name as well.
- Patches by Kaz Kylheku <kaz@ashi.footprints.net>.
-
-2000-01-05 Ulrich Drepper <drepper@cygnus.com>
-
- * pthread.c (__pthread_initial_thread, pthread_manager_thread):
- Adjust initializers for struct _pthread_descr_struct change.
- * internals.h (struct _pthread_descr_struct): Move new elements to
- the end.
-
-2000-01-03 Kaz Kylheku <kaz@ashi.footprints.net>
-
- Redesigned how cancellation unblocks a thread from internal
- cancellation points (sem_wait, pthread_join,
- pthread_cond_{wait,timedwait}).
- Cancellation won't eat a signal in any of these functions
- (*required* by POSIX and Single Unix Spec!).
- * condvar.c: Spontaneous wakeup on pthread_cond_timedwait won't eat a
- simultaneous condition variable signal (not required by POSIX
- or Single Unix Spec, but nice).
- * spinlock.c: __pthread_lock queues back any received restarts
- that don't belong to it instead of assuming ownership of lock
- upon any restart; fastlock can no longer be acquired by two threads
- simultaneously.
- * restart.h: Restarts queue even on kernels that don't have
- queued real time signals (2.0, early 2.1), thanks to atomic counter,
- avoiding a rare race condition in pthread_cond_timedwait.
-
-1999-12-31 Andreas Jaeger <aj@suse.de>
-
- * internals.h: Remove duplicate prototype declarations.
-
- * weaks.c: Remove __THROW from prototypes since the file is not
- compiled by a C++ compiler.
- * internals.h: Likewise.
-
-1999-12-30 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/pthread/pthread.h: Move internal functions to...
- * sysdeps/pthread/bits/libc-lock.h: ...here.
-
-1999-12-29 Andreas Jaeger <aj@suse.de>
-
- * sysdeps/pthread/pthread.h: Fix typos, reformat comments.
-
-1999-12-28 Ulrich Drepper <drepper@cygnus.com>
-
- * sysdeps/alpha/pt-machine.h: Move stack_pointer definition to the
- beginning.
-
- * manager.c (__pthread_start): Add one more cast to prevent
- warning on 64bit machines.
-
-1999-12-21 Ulrich Drepper <drepper@cygnus.com>
-
- * manager.c (pthread_handle_create): Set p_pid of new thread
- before calling the callback function to report a new thread.
-
-1999-12-20 Andreas Jaeger <aj@suse.de>
-
- * pthread.c (pthread_initialize): Move getrlimit call after
- setting of errno.
-
-1999-12-18 Ulrich Drepper <drepper@cygnus.com>
-
- * Versions: Export pread, __pread64, pread64, pwrite, __pwrite64,
- pwrite64, lseek64, open64, and __open64.
- * wrapsyscall.c: Define pread, __pread64, pread64, pwrite, __pwrite64,
- pwrite64, lseek64, open64, and __open64.
-
- * manager.c (pthread_allocate_stack): Correct computation of
- new_thread_bottom. Correct handling of stack size and when the
- rlimit method to guard for stack growth is used.
- * pthread.c (pthread_initialize): Stack limit must be STACK_SIZE
- minus one pagesize (not two).
-
-1999-12-03 Andreas Jaeger <aj@suse.de>
-
- * Versions: Add __res_state with version GLIBC_2.2.
-
- * errno.c (__res_state): New function to return thread specific
- resolver state.
-
- * pthread.c (pthread_initialize): Initialize p_resp.
- (__pthread_reset_main_thread): Also set p_resp.
-
- * manager.c (pthread_handle_create): Initialize p_resp.
-
- * internals.h: Add thread specific resolver state.
- Based on patches by Adam D. Bradley <artdodge@cs.bu.edu>.
-
-1999-12-01 Ulrich Drepper <drepper@cygnus.com>
-
- * sysdeps/i386/pt-machine.h: Move stack_pointer definition to the
- beginning.
- * sysdeps/i386/i686/pt-machine.h: Likewise.
- Patches by Alan Modra <alan@SPRI.Levels.UniSA.Edu.Au>.
-
-1999-11-23 Ulrich Drepper <drepper@cygnus.com>
-
- * manager.c (pthread_start_thread_event): Initialize p_pid already
- here.
-
-1999-11-22 Ulrich Drepper <drepper@cygnus.com>
-
- * internals.h: Add prototype for __pthread_manager_event.
- * manager.c (__pthread_manager_event): New function.
- (pthread_start_thread_event): Correct computation of self.
- Use INIT_THREAD_SELF.
- * pthread.c (__pthread_manager_thread): Initialize p_lock.
- (__pthread_initialize_manager): Respect event flags also for creation
- of the manager thread.
-
-1999-11-08 Ulrich Drepper <drepper@cygnus.com>
-
- * pthread.c (__pthread_initialize_manager): Initialize
- __pthread_manager_thread.p_tid.
-
-1999-11-02 Ulrich Drepper <drepper@cygnus.com>
-
- * internals.h: Declare __pthread_last_event.
- * manager.c: Define __pthread_last_event.
- (pthread_handle_create): Set __pthread_last_event.
- (pthread_exited): Likewise.
- * join.c (pthread_exit): Likewise.
-
- * Makefile (libpthread-routines): Add events.
- * events.c: New file.
- * internals.h: Protect against multiple inclusion.
- Include thread_dbP.h header.
- (struct _pthread_descr_struct): Add new fields p_report_events and
- p_eventbuf.
- Declare event reporting functions.
- * join.c (pthread_exit): Signal event if this is wanted.
- * manager.c (__pthread_threads_events): New variable.
- (pthread_handle_create): Take new parameters with event information.
- Signal TD_CREATE event if wanted.
- (__pthread_manager): Adjust pthread_handle_create call.
- (pthread_start_thread_event): New function. Block until manager is
- finished and then call pthread_start_thread.
- (pthread_exited): Signal TD_REAP event if wanted.
-
-1999-10-26 Ulrich Drepper <drepper@cygnus.com>
-
- * restart.h (suspend_with_cancellation): Rewrite as a macro.
-
- * condvar.c (pthread_cond_timedwait_relative): Don't mark as inline.
-
-1999-10-25 Andreas Jaeger <aj@suse.de>
-
- * internals.h: Remove K&R compatibility.
- * no-tsd.c: Likewise.
- * semaphore.h: Likewise.
- * signals.c: Likewise.
- * sysdeps/pthread/bits/libc-tsd.h: Likewise.
- * sysdeps/unix/sysv/linux/bits/sigthread.h: Likewise.
- * weaks.c: Likewise.
-
-1999-10-21 Xavier Leroy <Xavier.Leroy@inria.fr>
-
- * pthread.c: For i386, wrap pthread_handle_sigrestart and
- pthread_handle_sigcancel with functions that restore %gs from the
- signal context. For each signal handling function, two wrappers
- are required, one for a non-RT signal and one for a RT signal.
- * signal.c: For i386, add code to restore %gs from the signal
- context in pthread_sighandler and pthread_sighandler_rt.
-
-1999-10-17 Ulrich Drepper <drepper@cygnus.com>
-
- * internals.h (PTHREAD_START_ARGS_INITIALIZER): Add cast.
-
-1999-10-14 Ulrich Drepper <drepper@cygnus.com>
-
- * pthread.c (__pthread_initial_thread): Pass argument to
- PTHREAD_START_ARGS_INITIALIZER.
- (__pthread_manager_thread): Likewise.
-
- * internals.h (PTHREAD_START_ARGS_INITIALIZER): Add parameter to
- initialize function.
-
- * manager.c (pthread_handle_create): Remove p_startfct initialization.
-
- * internals.h (_pthread_descr_struct): We don't need p_startfct field.
-
-1999-10-12 Ulrich Drepper <drepper@cygnus.com>
-
- * internals.h: Correct return types for __libc_read and __libc_write.
-
-1999-10-09 Andreas Jaeger <aj@suse.de>
-
- * internals.h: Add __new_sem_post to get prototype in
- manager.c; include semaphore.h for needed types.
-
-1999-10-08 Ulrich Drepper <drepper@cygnus.com>
-
- * manager.c (__pthread_manager) [REQ_POST]: Use __new_sem_post
- directly instead of calling sem_post which should not be necessary
- but is faster and might help in some case to work around problems.
- Patch by khendricks@ivey.uwo.ca [libc/1382].
-
-1999-10-08 Andreas Schwab <schwab@suse.de>
-
- * sysdeps/pthread/Subdirs: New file.
- * Implies: Removed.
-
-1999-10-07 Ulrich Drepper <drepper@cygnus.com>
-
- * Implies: New file.
- * internals.h (struct _pthread_descr_struct): Add p_startfct.
- * manager.c (pthread_handle_create): Initialize p_startfct.
- * pthread.c: Define __linuxthread_pthread_sizeof_descr variable.
-
-1999-09-25 Ulrich Drepper <drepper@cygnus.com>
-
- * manager.c (__linuxthreads_pthread_threads_max): New variable.
- * specific.c (__linuxthreads_pthread_keys_max): New variable.
- (__linuxthreads_pthread_key_2ndlevel_size): New variable.
-
- * condvar.c (pthread_cond_timedwait_relative): Never return with
- EINTR. Patch by Andreas Schwab.
-
-1999-09-19 Ulrich Drepper <drepper@cygnus.com>
-
- * signals.c (sigaction): Correct last patch. Don't select
- pthread_sighandler_rt based on the signal number but instead of
- the SA_SIGINFO flag.
-
-1999-09-23 Ulrich Drepper <drepper@cygnus.com>
-
- * specific.c: Move definitions of struct pthread_key_struct and
- destr_function to ...
- * internals.h: ...here.
-
-1999-09-18 Ulrich Drepper <drepper@cygnus.com>
-
- * pthread.c (pthread_handle_sigrestart_rt): New function. Use
- this instead of pthread_handle_sigrestart if the signal is an RT
- signal.
-
- * signals.c: Handle passing through of sighandler arguments also
- for real-time signals.
-
-1999-09-03 Andreas Schwab <schwab@suse.de>
-
- * ptfork.c (__fork): Renamed from fork and use __libc_fork. Add
- fork as weak alias.
- (__vfork): New function, alias vfork.
- * Versions: Export __fork, vfork, and __vfork in libpthread.
-
-1999-08-23 Andreas Schwab <schwab@suse.de>
-
- * signals.c (pthread_sighandler): Add SIGCONTEXT_EXTRA_ARGS to
- call to signal handler.
-
-1999-08-20 Ulrich Drepper <drepper@cygnus.com>
-
- * pthread.c (__pthread_reset_main_thread): Undo last change.
- (__pthread_kill_other_threads_np): Reset signal handlers for the
- signals we used in the thread implementation here.
-
-1999-08-19 Ulrich Drepper <drepper@cygnus.com>
-
- * pthread.c (__pthread_reset_main_thread): Reset signal handlers
- for the signals we used in the thread implementation [PR libc/1234].
-
- * Versions: Export __pthread_kill_other_threads_np from libpthread
- for GLIBC_2.1.2.
-
- * signals.c: Pass sigcontext through wrapper to the user function.
-
-1999-08-01 Ulrich Drepper <drepper@cygnus.com>
-
- * Versions [ld.so] (GLIBC_2.0): Export __libc_internal_tsd_get and
- __libc_internal_tsd_set.
-
-1999-07-29 Andreas Jaeger <aj@arthur.rhein-neckar.de>
-
- * manager.c: Remove inclusion of <linux/tasks.h> since it's not
- needed anymore.
-
-1999-07-16 Andreas Jaeger <aj@arthur.rhein-neckar.de>
-
- * internals.h: Align _pthread_descr_struct to 32 bytes.
- Reported by Tim Hockin <thockin@cobaltnet.com>, close PR
- libc/1206.
-
-1999-07-09 Ulrich Drepper <drepper@cygnus.com>
-
- * oldsemaphore.c (sem_compare_and_swap): Fix use of compare and
- swap function.
-
-1999-07-09 Cristian Gafton <gafton@redhat.com>
-
- * Makefile (libpthread-routines): Add oldsemaphore routine.
- * Versions: Add sem_destroy, sem_getvalue, sem_init, sem_post,
- sem_trywait, and sem_wait to GLIBC_2.1.
- * oldsemaphore.c: New file.
- * semaphore.c: Add default_symbol_versions for the changed functions.
- (__new_sem_init): Rename from sem_init.
- (__new_sem_post): Rename from sem_post.
- (__new_sem_wait): Rename from sem_wait.
- (__new_sem_trywait): Rename from sem_trywait.
- (__new_sem_getvalue): Rename from sem_getvalue.
- (__new_sem_destroy): Rename from sem_destroy.
-
-1999-06-23 Robey Pointer <robey@netscape.com>
-
- * internals.h: Added p_nextlock entry to separate queueing for a
- lock from queueing for a CV (sometimes a thread queues on a lock
- to serialize removing itself from a CV queue).
- * pthread.c: Added p_nextlock to initializers.
- * spinlock.c: Changed to use p_nextlock instead of p_nextwaiting.
-
-1999-07-09 Ulrich Drepper <drepper@cygnus.com>
-
- * manager.c (pthread_handle_create): Free mmap region after stack
- if clone failed. Patch by Kaz Kylheku <kaz@ashi.FootPrints.net>.
-
-1999-05-23 Andreas Jaeger <aj@arthur.rhein-neckar.de>
-
- * man/pthread_cond_init.man: Correct example.
- Reported by Tomas Berndtsson <tomas@nocrew.org>.
-
- * linuxthreads.texi (Condition Variables): Likewise.
-
-1999-05-18 Jakub Jelinek <jj@ultra.linux.cz>
-
- * sysdeps/sparc/sparc64/pt-machine.h (__compare_and_swap): Use
- casx not cas, also successful casx returns the old value in rd
- and not the new value.
-
-1999-05-16 Xavier Leroy <Xavier.Leroy@inria.fr>
-
- * manager.c: If pthread_create() is given a NULL attribute
- and the thread manager runs with a realtime policy, set the
- scheduling policy of the newly created thread back to SCHED_OTHER.
- * manager.c: If the PTHREAD_INHERIT_SCHED attribute is given,
- initialize the schedpolicy field of new_thread->p_start_args
- to that of the calling thread.
-
-1999-04-29 Ulrich Drepper <drepper@cygnus.com>
-
- * sysdeps/sparc/sparc64/pt-machine.h (__compare_and_swap): cas
- instruction does not allow memory element to use offset.
-
-1999-04-28 Ulrich Drepper <drepper@cygnus.com>
-
- * manager.c (pthread_allocate_stack): Optimize initialization of new
- thread descriptor.
-
- * sysdeps/pthread/bits/libc-lock.h (__libc_lock_define_initialized):
- Don't use initializer since it is all zeroes.
- (__libc_once_define): Likewise.
-
-1999-04-16 Andreas Jaeger <aj@arthur.rhein-neckar.de>
-
- * sysdeps/arm/Implies: Removed since cmpxchg/no-cmpxchg
- doesn't exist anymore.
- * sysdeps/i386/Implies: Likewise.
- * sysdeps/m68k/Implies: Likewise.
- * sysdeps/mips/Implies: Likewise.
- * sysdeps/powerpc/Implies: Likewise.
- * sysdeps/sparc/sparc32/Implies: Likewise.
- * sysdeps/sparc/sparc64/Implies: Likewise.
-
-1999-04-15 Ulrich Drepper <drepper@cygnus.com>
-
- * sysdeps/alpha/bits/semaphore.h: Removed.
- * sysdeps/powerpc/bits/semaphore.h: Removed.
- * sysdeps/pthread/cmpxchg/bits/semaphore.h: Removed.
- * sysdeps/pthread/no-cmpxchg/bits/semaphore.h: Removed.
- * Makefile (headers): Remove bits/semaphore.h.
-
- * semaphore.h: Define _pthread_descr if necessary.
- Don't include limits.h. Define SEM_VALUE_MAX directly.
- Define SEM_FAILED.
- (sem_t): Protect element names with leading __.
- Add declarations for sem_close, sem_open, and sem_unlink.
- * semaphore.c: Adjust all functions for new element names.
- Define sem_close, sem_open, and sem_unlink.
- * Versions (libthread): Add sem_close, sem_open, and sem_unlink for
- GLIBC_2.1.1.
- * sysdeps/pthread/bits/pthreadtypes.h: Define _pthread_descr only if
- necessary.
-
-1999-03-16 H.J. Lu <hjl@gnu.org>
-
- * specific.c (pthread_key_delete): Check th->p_terminated to see
- if the thread is running.
-
- * Versions (__libc_internal_tsd_get, __libc_internal_tsd_set):
- Added to GLIBC_2.0 for libc.so.
-
-1999-02-12 H.J. Lu <hjl@gnu.org>
-
- * Versions (__libc_current_sigrtmin, __libc_current_sigrtmax,
- __libc_allocate_rtsig): Added to GLIBC_2.1.
-
- * internals.h (DEFAULT_SIG_RESTART): Removed.
- (DEFAULT_SIG_CANCEL): Removed.
-
- * pthread.c (init_rtsigs, __libc_current_sigrtmin,
- __libc_current_sigrtmax, __libc_allocate_rtsig): New functions.
- (__pthread_sig_restart, __pthread_sig_cancel,
- __pthread_sig_debug): Initialized.
- (pthread_initialize): Call init_rtsigs () to initialize
- real-time signals.
-
-1999-02-03 H.J. Lu <hjl@gnu.org>
-
- * manager.c (__pthread_manager): Do block __pthread_sig_debug.
- Don't restart the thread which sent REQ_DEBUG.
- (pthread_start_thread): Check if __pthread_sig_debug > 0
- before debugging.
-
- * pthread.c (__pthread_initialize_manager): Suspend ourself
- after sending __pthread_sig_debug to gdb instead of
- __pthread_sig_cancel.
-
-1999-01-24 H.J. Lu <hjl@gnu.org>
-
- * manager.c (__pthread_manager): Delete __pthread_sig_debug
- from mask if __pthread_sig_debug > 0.
- (pthread_handle_create): Increment __pthread_handles_num.
-
- * manager.c (pthread_handle_create): Don't pass CLONE_PTRACE to clone.
- * pthread.c (__pthread_initialize_manager): Likewise.
-
- * pthread.c (pthread_initialize): Use __libc_allocate_rtsig (1)
- instead of __libc_allocate_rtsig (2).
- (__pthread_initialize_manager): Send __pthread_sig_debug to gdb
- instead of __pthread_sig_cancel.
- (pthread_handle_sigdebug): Fix comments.
-
-1999-01-21 Ulrich Drepper <drepper@cygnus.com>
-
- * manager.c (pthread_allocate_stack): Set
- __pthread_nonstandard_stacks if user-specified stack is used.
-
-1999-01-16 Ulrich Drepper <drepper@cygnus.com>
-
- * sysdeps/unix/sysv/linux/bits/posix_opt.h: Add _LFS_ASYNCHRONOUS_IO,
- _LFS_LARGEFILE, _LFS64_LARGEFILE, and _LFS64_STDIO from Unix98.
-
-1999-01-07 Xavier Leroy <Xavier.Leroy@inria.fr>
-
- * pthread.c: Use a third signal __pthread_sig_debug distinct
- from __pthread_sig_cancel to notify gdb when a thread is
- created
- * manager.c: Likewise.
- * internals.h: Likewise.
- * signals.c: The implementation of sigwait(s) assumed that
- all signals in s have signal handlers already attached.
- This is not required by the standard, so make it work
- also if some of the signals have no handlers.
-
-1999-01-05 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
-
- * linuxthreads.texi: Remove pointers from first @node. Move old
- @node spec inside comment.
-
-1998-12-31 Ulrich Drepper <drepper@cygnus.com>
-
- * sysdeps/pthread/bits/stdio-lock.h: Define _IO_lock_lock and
- _IO_lock_unlock.
-
-1998-12-29 Ulrich Drepper <drepper@cygnus.com>
-
- * semaphore.c (sem_trywait): Don't forget to unlock the semaphore
- lock. Patch by Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>.
-
-1998-12-21 Ulrich Drepper <drepper@cygnus.com>
-
- * manager.c: Threads now send __pthread_sig_cancel on termination.
- Change clone call and signal masks.
- * thread.c (pthread_handle_sigrestart): Remove special code for
- manager.
- (pthread_handle_sigcancel): In manager thread call
- __pthread_manager_sighandler.
- * sysdeps/i386/pt-machine.h (__compare_and_swap): Add memory clobber.
- * sysdeps/i386/i686/pt-machine.h: Likewise.
- Patches by Xavier Leroy.
-
-1998-12-14 Ulrich Drepper <drepper@cygnus.com>
-
- * spinlock.c (__pthread_unlock): Don't crash if called for an
- untaken mutex. Reported by Ruslan V. Brushkoff <rus@Snif.Te.Net.UA>.
-
- * Examples/ex6.c: Unbuffer stdout and reduce sleep time to reduce
- overall runtime.
-
-1998-12-13 Ulrich Drepper <drepper@cygnus.com>
-
- * Examples/ex3.c: Wait until all threads are started before
- searching for the number to avoid race condition on very fast
- systems.
-
-1998-12-08 Andreas Jaeger <aj@arthur.rhein-neckar.de>
-
- * sysdeps/pthread/pthread.h: Remove __pthread_setcanceltype
- declaration since it's not needed.
-
- * sysdeps/pthread/pthread.h: Move internal functions to ...
- * internals.h: ...here.
-
-1998-12-02 H.J. Lu <hjl@gnu.org>
-
- * pthread.c (__pthread_sig_restart): Initiliaze to 0 if
- SIGRTMIN is defined.
- (__pthread_sig_cancel): Likewise.
-
-1998-12-01 Andreas Jaeger <aj@arthur.rhein-neckar.de>
-
- * wrapsyscall.c: Include <sys/mman.h> for msync,
- <stdlib.h> for system and <termios.h> for tcdrain prototype.
- Correct msync declaration.
-
-1998-11-29 Roland McGrath <roland@baalperazim.frob.com>
-
- * sysdeps/pthread/bits/libc-tsd.h (__libc_tsd_define, __libc_tsd_get,
- __libc_tsd_set): New macros for new interface.
- * no-tsd.c: New file, provide uninitialized defns of
- __libc_internal_tsd_get and __libc_internal_tsd_set.
- * Makefile (routines): Add no-tsd.
-
-1998-10-12 Roland McGrath <roland@baalperazim.frob.com>
-
- * internals.h: Include <bits/libc-tsd.h>, not <bits/libc-lock.h>.
- * sysdeps/pthread/bits/libc-lock.h (__libc_internal_tsd_get,
- __libc_internal_tsd_set): Move decls to ...
- * sysdeps/pthread/bits/libc-tsd.h: New file for __libc_internal_tsd_*
- declarations.
-
- * sysdeps/pthread/bits/libc-lock.h (__libc_internal_tsd_get,
- __libc_internal_tsd_set): Make these pointers to functions, not
- functions; remove #pragma weak decls for them.
- * specific.c (__libc_internal_tsd_get, __libc_internal_tsd_set):
- Define static functions and initialized pointers to them.
-
-1998-11-18 Ulrich Drepper <drepper@cygnus.com>
-
- * Makefile (CFLAGS-mutex.c): Define as -D__NO_WEAK_PTHREAD_ALIASES.
- (CFLAGS-specific.c): Likewise.
- (CFLAGS-pthread.c): Likewise.
- (CFLAGS-ptfork.c): Likewise.
- (CFLAGS-cancel.c): Likewise.
- * sysdeps/pthread/bits/libc-lock.h: Don't mark __pthread_* functions
- as weak references if __NO_WEAK_PTHREAD_ALIASES is defined.
-
- * mutex.c (pthread_mutex_init): Define as strong symbol.
- (pthread_mutex_destroy): Likewise.
- (pthread_mutex_trylock): Likewise.
- (pthread_mutex_lock): Likewise.
- (pthread_mutex_unlock): Likewise.
- (pthread_mutexattr_init): Likewise.
- (pthread_mutexattr_destroy): Likewise.
- (pthread_once): Likewise.
- * ptfork.c (pthread_atfork): Likewise.
- * specific.c (pthread_key_create): Likewise.
- (pthread_setspecific): Likewise.
- (pthread_getspecific): Likewise.
-
-1998-11-15 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
-
- * linuxthreads.texi: Fix punctuation after xref.
-
-1998-11-10 H.J. Lu <hjl@gnu.org>
-
- * sysdeps/unix/sysv/linux/bits/local_lim.h: Undefine NR_OPEN
- if it is defined in <linux/limits.h>.
-
-1998-10-29 14:28 Ulrich Drepper <drepper@cygnus.com>
-
- * spinlock.h (__pthread_trylock): Define inline.
- (__pthread_lock): Add extra parameter to declaration. Declare
- using internal_function.
- (__pthread_unlock): Declare using internal_function.
- * spinlock.c (__pthread_lock): Add new parameter. Use it instead
- of local variable self. Avoid recomputing self. Define using
- internal_function.
- (__pthread_trylock): Remove.
- (__pthread_unlock): Define using internal_function.
- * cancel.c: Adjust for __pthread_lock interface change. Use already
- computed self value is possible.
- * condvar.c: Likewise.
- * join.c: Likewise.
- * manager.c: Likewise.
- * mutex.c: Likewise.
- * pthread.c: Likewise.
- * rwlock.c: Likewise.
- * semaphore.c: Likewise.
- * signals.c: Likewise.
-
-1998-10-27 13:46 Ulrich Drepper <drepper@cygnus.com>
-
- * sysdeps/pthread/pthread.h (struct _pthread_cleanup_buffer): Prepend
- __ to field names of the struct.
- * sysdeps/pthread/bits/pthreadtypes.h (struct _pthread_fastlock):
- Likewise.
- (pthread_attr_t): Likewise.
- (pthread_cond_t): Likewise.
- (pthread_condattr_t): Likewise.
- (pthread_mutex_t): Likewise.
- (pthread_mutexattr_t): Likewise.
- (pthread_rwlock_t): Likewise.
- (pthread_rwlockattr_t): Likewise.
- * attr.c: Adjust for pthread.h and pthreadtypes.h change.
- * cancel.c: Likewise.
- * condvar.c: Likewise.
- * manager.c: Likewise.
- * mutex.c: Likewise.
- * pthread.c: Likewise.
- * ptlongjmp.c: Likewise.
- * rwlock.c: Likewise.
- * spinlock.c: Likewise.
-
-1998-10-09 Ulrich Drepper <drepper@cygnus.com>
-
- * sysdeps/i386/pt-machine.h (get_eflags, set_eflags): Mark these
- also with PT_EI.
-
- * sysdeps/i386/i686/pt-machine.h: Remove unused inline
- definitions.
-
- * Makefile (libpthread-routines): Add pt-machine.
- * pt-machine.c: New file.
- * sysdeps/alpha/pt-machine.h: Define PT_EI as extern inline is not
- yet defined. Use PT_EI in extern inline definitions.
- * sysdeps/arm/pt-machine.h: Likewise.
- * sysdeps/i386/pt-machine.h: Likewise.
- * sysdeps/i386/i686/pt-machine.h: Likewise.
- * sysdeps/m68k/pt-machine.h: Likewise.
- * sysdeps/mips/pt-machine.h: Likewise.
- * sysdeps/powerpc/pt-machine.h: Likewise.
- * sysdeps/sparc/sparc32/pt-machine.h: Likewise.
- * sysdeps/sparc/sparc64/pt-machine.h: Likewise.
-
-1998-10-02 Andreas Jaeger <aj@arthur.rhein-neckar.de>
-
- * semaphore.h: Include <sys/types.h> so that _pthread_descr
- is declared.
-
-1998-09-15 David S. Miller <davem@pierdol.cobaltmicro.com>
-
- * sysdeps/sparc/sparc32/pt-machine.h (INIT_THREAD_SELF): Add nr
- argument.
- * sysdeps/sparc/sparc64/pt-machine.h (INIT_THREAD_SELF): Likewise.
-
-1998-09-12 14:24 -0400 Zack Weinberg <zack@rabi.phys.columbia.edu>
-
- * sysdeps/unix/sysv/linux/bits/sigthread.h: Add multiple inclusion
- guard.
-
-1998-09-02 11:08 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
-
- * signals.c (sigaction): Check that sig is less than NSIG to avoid
- array index overflow.
-
-1998-09-06 10:56 Ulrich Drepper <drepper@cygnus.com>
-
- * sysdeps/pthread/semaphore.h: New file.
-
-1998-09-06 09:08 Ulrich Drepper <drepper@cygnus.com>
-
- * sysdeps/pthread/bits/libc-lock.h (enum __libc_tsd_key_t): Add
- _LIBC_TSD_KEY_DL_ERROR.
-
-1998-08-31 Ulrich Drepper <drepper@cygnus.com>
-
- * sysdeps/i386/i686/pt-machine.h (testandset): Add memory clobber.
- * sysdeps/i386/pt-machine.h: Likewise.
- Suggested by Roland McGrath.
-
-1998-08-28 13:58 Ulrich Drepper <drepper@cygnus.com>
-
- * internals.h: Also define THREAD_GETMEM_NC and THREAD_SETMEM_NC to
- access thread data with non-constant offsets.
- * specific.c: Use THREAD_GETMEM_NC and THREAD_SETMEM_NC where
- necessary.
-
- * sysdeps/i386/useldt.h: Fix typo. Add THREAD_GETMEM_NC and
- THREAD_SETMEM_NC definitions.
-
- * sysdeps/sparc/sparc32/pt-machine.h: Define THREAD_GETMEM_NC and
- THREAD_SETMEM_NC.
- * sysdeps/sparc/sparc64/pt-machine.h: Likewise.
-
-1998-08-26 15:46 Ulrich Drepper <drepper@cygnus.com>
-
- * internals.h: Define THREAD_GETMEM and THREAD_SETMEM to default if
- not already defined.
- (struct _pthread_descr_struct): Add p_self and p_nr field.
- * manager.c (__pthread_handles): Define second element to point
- to manager thread.
- (__pthread_handles_num): Initialize to 2.
- (__pthread_manager): Use INIT_THREAD_SELF with two arguments.
- (pthread_start_thread): Likewise.
- (pthread_handle_create): Start search for free slot at entry 2.
- Initialize new fields p_self and p_nr.
- Call __clone with CLONE_PTRACE if available.
- (pthread_free): Call FREE_THREAD_SELF if available.
- * pthread.c (__pthread_initial_thread): Initialize new fields.
- (__pthread_manager_thread): Likewise.
- (__pthread_initialize_manager): Call __clone with CLONE_PTRACE.
-
- * cancel.c: Use THREAD_GETMEM and THREAD_SETMEM to access the
- elements of the thread descriptor.
- * condvar.c: Likewise.
- * errno.c: Likewise.
- * join.c: Likewise.
- * manager.c: Likewise.
- * pthread.c: Likewise.
- * ptlongjmp.c: Likewise.
- * semaphore.c: Likewise.
- * signals.c: Likewise.
- * specific.c: Likewise.
- * spinlock.c: Likewise.
-
- * sysdeps/alpha/pt-machine.h (INIT_THREAD_SELF): Add extra parameter.
-
- * sysdeps/i386/useldt.h: New file.
- * sysdeps/i386/i686/pt-machine.h: Show how to use this file.
-
- * sysdeps/sparc/sparc32/pt-machine.h: Define THREAD_GETMEM and
- THREAD_SETMEM using __thread_self.
- * sysdeps/sparc/sparc64/pt-machine.h: Likewise.
-
-1998-08-24 Geoff Keating <geoffk@ozemail.com.au>
-
- * spinlock.c (__pthread_lock): Reset p_nextwaiting to NULL if it
- turned out that we didn't need to queue after all.
-
-1998-08-22 Geoff Keating <geoffk@ozemail.com.au>
-
- * sysdeps/powerpc/pt-machine.h: Remove testandset, it's not used
- and wastes space; correct types.
-
-1998-08-08 11:18 H.J. Lu <hjl@gnu.org>
-
- * signals.c (sigaction): Handle NULL argument.
-
-1998-08-04 Ulrich Drepper <drepper@cygnus.com>
-
- * sysdeps/unix/sysv/linux/bits/sigthread.h: Use __sigset_t instead
- of sigset_t.
-
-1998-08-02 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
-
- * Makefile (linuxthreads-version): Extract correct number from
- Banner.
-
-1998-07-29 Xavier Leroy <Xavier.Leroy@inria.fr>
-
- * Banner: Bump version number to 0.8
- * FAQ.html: Many updates, in particular w.r.t. debugging.
- * manager.c: Support for non-default stacksize for
- LinuxThreads-allocated stacks;
- don't use guard pages for stacks with default size, rely on
- rlimit(RLIMIT_STACK) instead (it's cheaper).
- * attr.c: Likewise.
- * cancel.c: Use __pthread_sig_cancel and __pthread_sig_restart
- everywhere instead of PTHREAD_SIG_CANCEL and PTHREAD_SIG_RESTART.
- * condvar.c: Likewise.
- * internals.h: Likewise.
- * restart.h: Likewise.
- * signals.c: Likewise.
- * pthread.c: Likewise; set rlimit(RLIMIT_STACK) as we need it.
-
-1998-07-23 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
-
- * weaks.c: Define pthread_mutexattr_[sg]ettype instead of
- __pthread_mutexattr_[sg]ettype. Add more weak aliases.
- * Versions: Put __pthread_mutexattr_settype under version
- GLIBC_2.0. Don't export __pthread_mutexattr_setkind_np and
- __pthread_mutexattr_gettype.
-
-1998-07-23 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
-
- * sysdeps/pthread/bits/libc-lock.h: Make
- __pthread_mutexattr_settype weak. Don't make
- __pthread_mutexattr_setkind_np weak.
-
-1998-07-16 10:52 Ulrich Drepper <drepper@cygnus.com>
-
- * manager.c (pthread_handle_create): Check whether sched_setscheduler
- call can succeed here.
-
- * mutex.c: Define __pthread_mutexattr_settype and make
- __pthread_mutexattr_setkind_np an alias.
- Likewise for __pthread_mutexattr_gettype.
-
-1998-07-15 11:00 -0400 Zack Weinberg <zack@rabi.phys.columbia.edu>
-
- * attr.c (pthread_attr_setschedpolicy): Don't check whether caller
- is root.
-
-1998-07-14 19:38 Ulrich Drepper <drepper@cygnus.com>
-
- * sysdeps/pthread/bits/libc-lock.h: Define __libc_cleanup_end.
-
-1998-07-11 Andreas Jaeger <aj@arthur.rhein-neckar.de>
-
- * Examples/ex6.c: Include <unistd.h> for usleep.
-
-1998-06-13 11:04 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
-
- * Examples/ex4.c (main): Use exit, not pthread_exit.
-
-1998-07-09 13:39 Ulrich Drepper <drepper@cygnus.com>
-
- * Versions: Add __pthread_mutexattr_gettype and
- __pthread_mutexattr_settype.
- * lockfile.c: Use __pthread_mutexattr_settype instead of
- __pthread_mutexattr_setkind_np.
- * mutex.c: Define __pthread_mutexattr_gettype and
- __pthread_mutexattr_settype.
- * weak.c: Likewise.
- * sysdeps/pthread/pthread.h: Declare __pthread_mutexattr_gettype and
- __pthread_mutexattr_settype.
- * sysdeps/pthread/bits/libc-lock.h (__libc_lock_init_recursive):
- Use __pthread_mutexattr_settype.
-
-1998-07-08 22:26 Ulrich Drepper <drepper@cygnus.com>
-
- * Versions: Add pthread_mutexattr_gettype, pthread_mutexattr_settype.
- * mutex.c: Define weak alias pthread_mutexattr_gettype and
- pthread_mutexattr_settype.
- * sysdeps/pthread/pthread.h: Declare these functions.
- Move pthread_sigmask and pthread_kill declaration in separate header.
- * sysdeps/unix/sysv/linux/bits/sigthread.h: New file.
-
-1998-07-07 15:20 Ulrich Drepper <drepper@cygnus.com>
-
- * Makefile: Add rules to compile and run tests.
- * Examples/ex1.c: Little changes to fix warnings.
- * Examples/ex2.c: Likewise.
- * Examples/ex3.c: Likewise.
- * Examples/ex4.c: Likewise.
- * Examples/ex5.c: Likewise.
- * Examples/ex6.c: New file.
-
-1998-07-05 11:54 Ulrich Drepper <drepper@cygnus.com>
-
- * Versions: Add pthread_attr_init to GLIBC_2.1 version in libc.
-
-1998-07-01 Andreas Jaeger <aj@arthur.rhein-neckar.de>
-
- * attr.c: Include <string.h>.
-
-1998-06-30 11:47 Ulrich Drepper <drepper@cygnus.com>
-
- * attr.c: Include errno.h. Use memcpy to copy sched_param.
- * internals.h: Include limits.h.
- * manager.c: Use memcpy to copy sched_param.
- * ptfork.c: Include errno.h.
- * pthread.c: Likewise.
- * semaphore.c: Likewise.
- * specific.c: Likewise.
- * spinlock.h: Likewise.
- * sysdeps/pthread/pthread.h: Include only allowed headers. Move
- type definition to ...
- * sysdeps/pthread/bits/pthreadtypes.h: ...here. New file.
-
-1998-06-29 12:34 Ulrich Drepper <drepper@cygnus.com>
-
- * sysdeps/pthread/pthread.h: Use __PMT not __P for function pointers.
-
- * sysdeps/pthread/pthread.h: Define various PTHREAD_* symbols also
- as macros as demanded in POSIX.1, Annex C.
-
-1998-06-29 12:29 Ulrich Drepper <drepper@cygnus.com>
-
- * internals.h (struct pthread_request): For free use pthread_t
- instead of pthread_descr.
- * join.c (pthread_join): Pass thread_id, not th to manager.
- (pthread_detach): Likewise.
- * manager.c (__pthread_manager): Except thread ID in FREE_REQ case.
- (pthread_exited): Remove detached queue code.
- (pthread_handle_free): Expect thread ID parameter and use it to
- validate the thread decsriptor. Don't use detached queue.
- Patches by Xavier Leroy.
-
-1998-06-27 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
-
- * libpthread.map: Export accept, longjmp, sigaction, siglongjmp,
- _IO_flockfile, _IO_ftrylockfile, _IO_funlockfile,
- __pthread_atfork, __pthread_key_create, __pthread_once.
- * internals.h: Doc fix.
- * pthread.c (__pthread_initialize): Define again.
-
-1998-06-26 Ulrich Drepper <drepper@cygnus.com>
-
- * manager.c (pthread_exited): If thread is not detached put it on
- special list.
- (pthread_handle_free): If thread is not on list with living threads
- search on list with detached threads.
-
- * sysdeps/pthread/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Correct
- for new definition of pthread_rwlock_t.
-
- * spinlock.c: Correct test whether to compile
- __pthread_compare_and_swap or not.
-
-1998-06-25 19:27 Ulrich Drepper <drepper@cygnus.com>
-
- * attr.c: Finish user stack support. Change locking code to be safe
- in situations with different priorities.
- * cancel.c: Likewise.
- * condvar.c: Likewise.
- * internals.h: Likewise.
- * join.c: Likewise.
- * manager.c: Likewise.
- * mutex.c: Likewise.
- * pthread.c: Likewise.
- * ptlongjmp.c: Likewise.
- * queue.h: Likewise.
- * rwlock.c: Likewise.
- * semaphore.c: Likewise.
- * semaphore.h: Likewise.
- * signals.c: Likewise.
- * spinlock.c: Likewise.
- * spinlock.h: Likewise.
- * sysdeps/pthread/pthread.h: Likewise.
- Patches by Xavier Leroy.
-
- * sysdeps/i386/i686/pt-machine.h: New file.
-
-1998-06-25 Ulrich Drepper <drepper@cygnus.com>
-
- * sysdeps/pthread/pthread.h: Make [sg]et_stacksize and
- [sg]et_stackaddr prototypes always available.
-
- * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define
- _POSIX_THREAD_ATTR_STACKSIZE and _POSIX_THREAD_ATTR_STACKADDR.
-
-1998-06-24 Ulrich Drepper <drepper@cygnus.com>
-
- * manager.c (pthread_free): Undo patch from 980430.
- Reported by David Wragg <dpw@doc.ic.ac.uk>.
-
-1998-06-09 15:07 Ulrich Drepper <drepper@cygnus.com>
-
- * manager.c: Define __pthread_manager_adjust_prio and use it to
- increase priority when needed.
- * internals.h: Add prototype for __pthread_manager_adjust_prio.
- * mutex.c: Optimize mutexes to wake up only one thread.
- * pthread.c: Move PID of manager for global variable in structure
- element.
- Patches by Xavier Leroy.
-
-1998-06-07 13:47 Ulrich Drepper <drepper@cygnus.com>
-
- * sysdeps/pthread/bits/libc-lock.h: Optimize cleanup handlers a bit.
-
-1998-06-03 Andreas Jaeger <aj@arthur.rhein-neckar.de>
-
- * attr.c: Correct typo.
-
-1998-05-01 Ulrich Drepper <drepper@cygnus.com>
-
- * manager.c (pthread_free): Unmap guard before the stack.
- Patch by Matthias Urlichs.
-
-1998-04-30 Ulrich Drepper <drepper@cygnus.com>
-
- * manager.c (pthread_free): Detect already free child.
- Patch by Xavier Leroy, reported by Matthias Urlichs.
-
-1998-04-23 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
-
- * Makefile (linuxthreads-version): Renamed back from
- libpthread-version.
-
-1998-04-21 Ulrich Drepper <drepper@cygnus.com>
-
- * ptlongjmp.c: Add prototypes for __libc_siglongjmp and
- __libc_longjmp.
-
-1998-04-20 14:55 Ulrich Drepper <drepper@cygnus.com>
-
- * Makefile (libpthread-routines): Add ptlongjmp and spinlock.
- * internals.h: Add definitions for new spinlock implementation.
- * ptlongjmp.c: New file.
- * spinlock.c: New file.
- * spinlock.h (acquire): Don't reschedule using __sched_yield, use
- new function __pthread_acquire to prevent deadlocks with thread
- with different priorities.
- Patches by Xavier Leroy <Xavier.Leroy@inria.fr>.
-
-1998-03-16 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
-
- * manager.c (__pthread_manager): Reduce first argument to select
- to include just the needed file descriptor.
-
-1998-03-17 00:06 Ulrich Drepper <drepper@cygnus.com>
-
- * manager.c: Fix last patch which caused core dumps.
-
- * pthread.c: Correctly handle missing SIGRTMIN.
-
-1998-03-15 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
-
- * libpthread.map: Add __libc_internal_tsd_get and
- __libc_internal_tsd_set. Add missing cancelable functions. Export
- libc internal versions of the cancelable functions.
-
-1998-03-13 16:51 Ulrich Drepper <drepper@cygnus.com>
-
- * weaks.c: Define pthread_attr_init as GLIBC_2.0 and GLIBC_2.1.
-
-1998-03-13 00:46 Ulrich Drepper <drepper@cygnus.com>
-
- * attr.c: Implement pthread_attr_[gs]etguardsize,
- pthread_attr_[gs]setstackaddr, pthread_attr_[gs]etstacksize.
- Change pthread_attr_init to have two interfaces.
- * internals.h (struct _pthread_descr_struct): Add new fields for
- above functions.
- * libpthread.map: Add names in GLIBC_2.1 section.
- * manager.c (pthread_handle_create): Implement guardsize and
- user stack.
- (pthread_free): Likewise.
- * pthread.c (pthread_create): Add new interface for changed
- pthread_attr_t.
- * sysdeps/pthread/pthread.h: Add prototypes for new functions.
- * sysdeps/unix/sysv/linux/bits/local_lim.h: Add definition of
- PTHREAD_STACK_MIN.
-
-1998-03-11 00:42 Wolfram Gloger <wmglo@dent.med.uni-muenchen.de>
-
- * manager.c: Enable resetting of the thread scheduling policy
- to SCHED_OTHER when the parent thread has a different one.
-
-1998-02-01 13:51 Ulrich Drepper <drepper@cygnus.com>
-
- * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define
- _POSIX_ASYNCHRONOUS_IO.
-
- * sysdeps/pthread/pthread.h: Define bits for Unix98 variants of
- mutexes.
- * mutex.c: Implement new mutex types.
-
- * internals.h: Include <signal.h>.
-
- * libpthread.map: Add __erno_location and __h_errno_location.
-
- * errno.c: Return pointer to variable actually in use. This might
- not be the one in the thread structure.
- * internals.h (struct _pthread_descr_struct): Add new fields p_errnop
- and p_h_errnop.
- * manager.c (__pthread_manager): Set p_errnop and p_h_errnop member
- of manager thread structure.
- (pthread_handle_create): Set p_errnop and p_h_errnop members for new
- thread.
- * pthread.c: Adapt initializer for thread structures.
- (__pthread_initial_thread): Set p_errnop and p_h_errnop member.
- (__pthread_reset_main_thread): Reset p_errnop and p_h_errnop of
- current thread to global variables.
-
-1998-01-31 17:27 Ulrich Drepper <drepper@cygnus.com>
-
- * rwlock.c: New file.
- * Makefile (libpthread-routines): Add rwlock.
- * sysdeps/pthread/pthread.h: Define data structures and declare
- functions.
- * libpthread.map: Add new functions.
-
-1997-12-18 13:50 Philip Blundell <pb@nexus.co.uk>
-
- * sysdeps/arm/pt-machine.h: New file; add ARM support.
- * sysdeps/arm/Implies: likewise.
- * README: Document it.
-
-1997-12-13 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
-
- * signals.c: Remove unneeded initializer for sigwaited, saving a
- warning.
-
-1997-04-11 01:18 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
-
- * semaphore.c (sem_init): Set sem_spinlock only if available.
-
-1997-12-04 01:48 Ulrich Drepper <drepper@cygnus.com>
-
- * mutex.c: Implement PTHREAD_MUTEX_CHECKERROR.
- * sysdeps/pthread/pthread.h: Define PTHREAD_MUTEX_CHECKERROR.
-
- * Makefile: Update from LinuxThreads 0.7.
- * internals.h. Likewise.
- * manager.c: Likewise.
- * mutex.c: Likewise.
- * pthread.c: Likewise.
- * signals.c: Likewise.
- * specific.c: Likewise.
- * Examples/ex3.c: Likewise.
-
-1997-11-20 18:13 Ulrich Drepper <drepper@cygnus.com>
-
- * pthread.c (__pthread_reset_main_thread): Close pipe only if still
- open.
-
-1997-10-29 05:38 Ulrich Drepper <drepper@cygnus.com>
-
- * wrapsyscall.c: Add socket functions which are also cancelation
- points.
-
-1997-10-19 21:40 Wolfram Gloger <wg@wolfram.dent.med.uni-muenchen.de>
-
- * specific.c (__libc_internal_tsd_set, __libc_internal_tsd_get):
- New functions for fast thread specific data within libc.
-
- * internals.h: Add new array p_libc_specific to struct
- _pthread_descr_struct.
-
- * sysdeps/pthread/bits/libc-lock.h: Declare new functions.
-
-1997-10-13 05:39 Ulrich Drepper <drepper@cygnus.com>
-
- * semaphore.h: Add __BEGIN_DECLS/__END_DECLS.
- Reported by Ralf Corsepius <corsepiu@faw.uni-ulm.de>.
-
-1997-08-29 03:05 Ulrich Drepper <drepper@cygnus.com>
-
- * internals.h (struct _pthread_descr_struct): Add definitions for
- two-level specific key handling.
- * manager.c (pthread_handle_create): Initialize specific memory array.
- * specific.c: Implement two-level key handling.
- * weaks.c: Don't provide dummy key handling.
- * sysdeps/pthread/bits/libc-lock.h: Typedef __libc_lock_t (no #define).
- Add definition of __libc_key_t.
- * sysdeps/unix/sysv/linux/bits/local_lim.h: Define PTHREAD_KEYS_MAX
- as 1024.
- Add definition of _POSIX_THREAD_DESTRUCTOR_ITERATIONS and
- PTHREAD_DESTRUCTOR_ITERATIONS.
-
- * manager.c (pthread_handle_create): Compare mmap result with
- MAP_FAILED.
-
- * ptfork.c: Rename to __pthread_atfork and make old name a weak alias.
- * sysdeps/pthread/bits/pthread.h: Add prototype for __pthread_atfork.
-
-1997-08-22 19:04 Richard Henderson <rth@cygnus.com>
-
- sysdeps/sparc -> sysdeps/sparc/sparc32
- sysdeps/sparc64 -> sysdeps/sparc/sparc64
-
- * internals.h: Change definition of THREAD_SELF to be an expression,
- not a statement that did a return.
- * sysdeps/alpha/pt-machine.h (THREAD_SELF): Update accordingly.
- * sysdeps/sparc/sparc32/pt-machine.h (THREAD_SELF, INIT_THREAD_SELF):
- Follow Solaris and use a "system reserved" register (%g6) to hold
- the thread descriptor.
- * sysdeps/sparc/sparc64/pt-machine.h: Likewise.
-
-1997-08-03 00:09 Ulrich Drepper <drepper@cygnus.com>
-
- * mutex.c: Correct pthread_once. Patch by Xavier Leroy.
- * sysdeps/pthread/pthread.h: Add prototype for __pthread_once.
- * sysdeps/pthread/bits/pthread.h: Add macros for __libc_once.
-
- * semaphore.c: Include spinlock.h only when needed.
-
- * specific.c (__pthread_setsepcific, __pthread_getspecific): Reject
- keys for entries not in use.
-
- * weaks.c: Implement key handling functions for real.
-
-1997-06-29 01:04 Richard Henderson <richard@gnu.ai.mit.edu>
-
- Initial sparc64-linux support:
- * sysdeps/sparc64/Implies: New file.
- * sysdeps/sparc64/pt-machine.h: Likewise.
-
-1997-06-29 00:48 Ulrich Drepper <drepper@cygnus.com>
-
- * semaphore.c: Include spinlock.h at correct place.
- Patch by HJ Lu.
-
-1997-06-13 10:06 Richard Henderson <rth@tamu.edu>
-
- The Great Bit File Move:
- * sysdeps/alpha/semaphorebits.h: -> .../bits/semaphore.h.
- * sysdeps/powerpc/semaphorebits.h: Likewise.
- * sysdeps/pthread/cmpxchg/semaphorebits.h: Likewise.
- * sysdeps/pthread/no-cmpxchg/semaphorebits.h: Likewise.
- * sysdeps/pthread/libc-lock.h: -> bits/
- * sysdeps/pthread/stdio-lock.h: Likewise.
- * sysdeps/unix/sysv/linux/local_lim.h: Likewise.
- * sysdeps/unix/sysv/linux/posix_opt.h: Likewise.
- * semaphore.h: Likewise.
- * sysdeps/pthread/pthread.h: Likewise.
-
- * lockfile.c: <foo.h> -> <bits/foo.h>.
- * semaphore.h: Likewise.
-
- * Makefile: (headers): foo.h -> bits/foo.h.
- * sysdeps/pthread/Makefile: Likewise.
-
-1997-04-11 01:18 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
-
- * semaphore.c (sem_init): Set sem_spinlock only if available.
-
- * sysdeps/m68k/pt-machine.h (testandset, __compare_and_swap): Fix
- asm constraints.
-
-1997-04-09 03:00 Ulrich Drepper <drepper@cygnus.com>
-
- Update from LinuxThreads 0.6.
-
- * attr.c (pthread_attr_getdetachstate): Use __sched_get_priority_max
- and __sched_get_priority_min instead of names without `__'.
-
- * manager.c: Rewrite large parts to implement opaque pthread_t.
-
- * cancel.c: Adapt for opaque pthread_t type.
- * condvar.c: Likewise.
- * errno.c: Likewise.
- * join.c: Likewise.
- * mutex.c: Likewise.
- * pthread.c: Likewise.
- * signals.c: Likewise.
- * specific.c: Likewise.
- * restart.h: Likewise.
- * queue.h: Likewise.
- * Examples/ex3.c: Likewise.
- * Examples/ex4.c: Likewise.
- * sysdeps/pthread/pthread.h: Likewise.
-
- * pthread.c: Accumulate time for all threads in thread manager.
-
- * semaphore.c: Implement fallback implementation for architectures
- sometimes missing compare-exchange operations.
-
- * cancel.c (pthread_cancel): Validate handle argument.
- * join.c (pthread_join): Likewise.
- (pthread_detach): Likewise.
- * signals.c (pthread_kill): Likewise.
-
- * spinlock.h (acquire): Use __sched_yield not sched_yield.
-
- * queue.h (enqueue): Enqueue thread according to priority.
-
- * internals.c (struct pthread_start_args): New struct for passing
- args to cloning function.
- (struct _pthread): Rename to _pthread_descr_struct and adapt for
- opaque pthread_t.
-
- * Examples/Makefile (clean): Pass -f option to rm.
-
- * sysdeps/i386/pt-machine.h: Add check for compare-exchange instruction
- and define TEST_FOR_COMPARE_AND_SWAP.
- * sysdeps/i386/i486/pt-machine.h: Removed.
-
- * sysdeps/unix/sysv/linux/local_lim.h (PTHREAD_THREADS_MAX): Increase
- to 1024.
-
-1997-04-04 16:38 Ulrich Drepper <drepper@cygnus.com>
-
- * restart.h (suspend): Clear p_signal before suspending.
- (suspend_with_cancellation): Likewise.
- Patch by Xavier Leroy <Xavier.Leroy@inria.fr>.
-
- * weaks.c: Make __pthread_key_create return 1.
- * sysdeps/pthread/libc-lock.h: Define __libc_key_create,
- __libc_getspecific, __libc_setspecific, and __libc_key_t.
- * sysdeps/pthread/stdio-lock.h: Don't care for implementation not
- using libio.
-
-1997-03-19 15:13 Miguel de Icaza <miguel@nuclecu.unam.mx>
-
- * sysdeps/sparc/pt-machine (RELEASE): Fix.
-
-1997-03-01 07:55 Geoff Keating <geoffk@ozemail.com.au>
-
- * sysdeps/powerpc/Implies: Added.
- * sysdeps/powerpc/pt-machine.h: Added.
- * sysdeps/powerpc/semaphorebits.h: Added.
-
-1997-01-22 01:22 Ulrich Drepper <drepper@cygnus.com>
-
- * pthread.c (__pthread_initial_thread): Correct
- initializer.
- (__pthread_manager_thread): Likewise.
- Reported by Andreas Jaeger.
-
-1997-01-18 22:15 Richard Henderson <rth@tamu.edu>
-
- Since sigset_t no longer fits in a register, we can't pass in the
- thread's initial mask so easily. Take this opportunity to simplify
- the clone implementation by only accepting a single void* argument.
-
- * manager.c (__pthread_manager): Put thread vitals in the thread
- struct instead of as arguments through clone.
- (pthread_start_thread): Look for them there.
- * internals.h (struct _pthread): Add p_initial_fn,
- p_initial_fn_arg, p_initial_mask. Fix __pthread_manager proto.
- * pthread.c (pthread_initialize_manager): Revise clone invocation.
diff --git a/linuxthreads/Changes b/linuxthreads/Changes
deleted file mode 100644
index b213f36c57..0000000000
--- a/linuxthreads/Changes
+++ /dev/null
@@ -1,85 +0,0 @@
-Release 0.9:
-- more ports (SH, IA-64, s390)
-- many bug fixes
-- timed sync object wait functions
-- barrier implementation
-- spinlocks implementation
-- thread register on x86
-- variable stack size and position on some platforms
-
-Release 0.8:
-(ehmm, forgot to update, don't know anymore)
-
-Release 0.7:
-- Destructors for thread-specific data now conform to the POSIX semantics
- (call destructors again if non-NULL TSD remains after a round of
- destruction).
-- Implemented thread-specific data as a sparse array, allows more TSD keys
- and smaller thread descriptors (Ulrich Drepper).
-- Added "error checking" mutexes.
-- Protect against multiple sigwait() on the same signals.
-- Simplified implementation of semaphores when compare_and_swap is
- not available.
-- Fixed bug in fork() where stdin was closed if fork() was called before
- the first pthread_create().
-- Fixed bug in the gethostby*_r functions (bad result if null bytes
- in addresses).
-- Typos in manual pages corrected.
-- First cut at a PowerPC port (not working yet, runs into problems
- with gcc and with the C library).
-
-Release 0.6:
-- Validation of thread identifiers: no more crashes when operating on
- a thread that has exited (based on Pavel Krauz's ideas).
-- Added fallback implementation of semaphores for the 386 and the
- Sparc.
-- Fixed a bug in signal handling causing false restarts of suspended
- threads.
-- Fixed a bug in realtime scheduling causing all threads to have
- default scheduling on Ix86 with libc5.
-- With realtime scheduling, unlocking a mutex now restarts the
- highest priority thread waiting on the mutex, not the
- first-suspended thread (Richard Neitzel).
-- Timing a process now returns cumulative times for all threads, not
- just times for the initial thread (suggested by Wolfram Gloger).
-- Cleaned up name space (internal defs prefixed by __, weak aliases
- for non-portable extensions).
-- MIPS port (contributed by Ralf Baechle).
-
-Release 0.5:
-- Signal-safe semaphores a la POSIX 1003.1b added.
-- Locking bug in pthread_mutex_trylock over recursive mutexes fixed.
-- Race conditions in thread cancellation fixed.
-- Sparc port (contributed by Miguel de Icaza).
-- Support for getpwnam_r and getpwuid_r.
-- Added pthread_kill_other_threads_np to be used in conjunction with
- exec*().
-
-Release 0.4:
-- Manual pages for all functions.
-- Synchronization bug causing accumulation of zombie processes fixed.
-- Race condition in pthread_cond_timedwait fixed.
-- Recursive mutexes are back by popular demand.
-- Partial support for realtime scheduling (initiated by Richard Neitzel).
-- pthread.h cleaned up a lot: now C++ compatible, added missing "const"
- qualifiers, added short documentation, put to GNU libc standards
- for name space pollution (Ulrich Drepper).
-- Motorola 68k port (contributed by Andreas Schwab).
-- Interaction with fork(2) cleaned up a lot.
-
-Release 0.3:
-- Thread creation and reclaimation now performed by a centralized
- "thread manager" thread.
-- Removed recursive mutexes to make regular mutexes more efficient.
-- Now available as a shared library (contributed by Richard Henderson).
-- Alpha port (contributed by Richard Henderson).
-- Fixed many small discrepancies with Posix 1003.1c.
-- Put under the LGPL instead of the GPL.
-
-Release 0.2:
-- Reentrant libc functions (adapted from libc 5.3.9 by Peeter Joot)
-- pthread_cond_wait did not reacquire the mutex correctly on return
-- More efficient pthread_cond_broadcast
-
-Release 0.1:
-- First public release
diff --git a/linuxthreads/Examples/Makefile b/linuxthreads/Examples/Makefile
deleted file mode 100644
index c68b3676a4..0000000000
--- a/linuxthreads/Examples/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-CC=gcc
-CFLAGS=-g -O -Wall -I.. -D_REENTRANT
-LIBPTHREAD=../libpthread.a
-
-PROGS=ex1 ex2 ex3 ex4 ex5 proxy
-
-all: $(PROGS)
-
-.c:
- $(CC) $(CFLAGS) -o $* $*.c $(LIBPTHREAD)
-
-$(PROGS):
-
-clean:
- rm -f $(PROGS)
diff --git a/linuxthreads/Examples/ex1.c b/linuxthreads/Examples/ex1.c
deleted file mode 100644
index 29138cf761..0000000000
--- a/linuxthreads/Examples/ex1.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Creates two threads, one printing 10000 "a"s, the other printing
- 10000 "b"s.
- Illustrates: thread creation, thread joining. */
-
-#include <stddef.h>
-#include <stdio.h>
-#include <unistd.h>
-#include "pthread.h"
-
-static void *
-process (void *arg)
-{
- int i;
- fprintf (stderr, "Starting process %s\n", (char *) arg);
- for (i = 0; i < 10000; i++)
- {
- write (1, (char *) arg, 1);
- }
- return NULL;
-}
-
-int
-main (void)
-{
- int retcode;
- pthread_t th_a, th_b;
- void *retval;
-
- retcode = pthread_create (&th_a, NULL, process, (void *) "a");
- if (retcode != 0)
- fprintf (stderr, "create a failed %d\n", retcode);
- retcode = pthread_create (&th_b, NULL, process, (void *) "b");
- if (retcode != 0)
- fprintf (stderr, "create b failed %d\n", retcode);
- retcode = pthread_join (th_a, &retval);
- if (retcode != 0)
- fprintf (stderr, "join a failed %d\n", retcode);
- retcode = pthread_join (th_b, &retval);
- if (retcode != 0)
- fprintf (stderr, "join b failed %d\n", retcode);
- return 0;
-}
diff --git a/linuxthreads/Examples/ex10.c b/linuxthreads/Examples/ex10.c
deleted file mode 100644
index f3ad517283..0000000000
--- a/linuxthreads/Examples/ex10.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/* Tests for pthread_mutex_timedlock function.
- Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
- Contributed by Kaz Kylheku <kaz@ashi.footprints.net>, 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <error.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <pthread.h>
-#include <time.h>
-
-#define NUM_THREADS 10
-#define NUM_ITERS 50
-#define TIMEOUT_NS 100000000L
-
-static void *thread (void *) __attribute__ ((__noreturn__));
-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-
-int
-main (void)
-{
- pthread_t th;
- int i;
-
- for (i = 0; i < NUM_THREADS; i++)
- {
- if (pthread_create (&th, NULL, thread, NULL) != 0)
- error (EXIT_FAILURE, 0, "cannot create thread");
- }
-
- (void) thread (NULL);
- /* notreached */
- return 0;
-}
-
-
-static void *
-thread (void *arg)
-{
- int i;
- pthread_t self = pthread_self ();
- static int linecount; /* protected by flockfile(stdout) */
-
- for (i = 0; i < NUM_ITERS; i++)
- {
- struct timespec ts;
-
- for (;;)
- {
- int err;
-
- clock_gettime (CLOCK_REALTIME, &ts);
-
- ts.tv_nsec += TIMEOUT_NS;
-
- if (ts.tv_nsec >= 1000000000L) {
- ts.tv_sec++;
- ts.tv_nsec -= 1000000000L;
- }
-
- switch ((err = pthread_mutex_timedlock (&mutex, &ts)))
- {
- case 0:
- flockfile (stdout);
- printf ("%04d: thread %lu got mutex\n", ++linecount,
- (unsigned long) self);
- funlockfile (stdout);
- break;
- case ETIMEDOUT:
- flockfile (stdout);
- printf ("%04d: thread %lu timed out on mutex\n", ++linecount,
- (unsigned long) self);
- funlockfile (stdout);
- continue;
- default:
- error (EXIT_FAILURE, err, "pthread_mutex_timedlock failure");
- }
- break;
- }
-
- ts.tv_sec = 0;
- ts.tv_nsec = TIMEOUT_NS;
- nanosleep (&ts, NULL);
-
- flockfile (stdout);
- printf ("%04d: thread %lu releasing mutex\n", ++linecount,
- (unsigned long) self);
- funlockfile (stdout);
- pthread_mutex_unlock (&mutex);
- }
-
- pthread_exit (NULL);
-}
diff --git a/linuxthreads/Examples/ex11.c b/linuxthreads/Examples/ex11.c
deleted file mode 100644
index abb5b5385a..0000000000
--- a/linuxthreads/Examples/ex11.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/* Test program for timedout read/write lock functions.
- Copyright (C) 2000 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#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 TIMEOUT 1000000
-#define DELAY 1000000
-
-static pthread_rwlock_t lock = PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP;
-
-
-static void *
-writer_thread (void *nr)
-{
- struct timespec ts;
- struct timespec delay;
- int n;
-
- ts.tv_sec = 0;
- ts.tv_nsec = TIMEOUT;
-
- delay.tv_sec = 0;
- delay.tv_nsec = DELAY;
-
- for (n = 0; n < WRITETRIES; ++n)
- {
- do
- {
- clock_gettime (CLOCK_REALTIME, &ts);
-
- ts.tv_nsec += 2 * TIMEOUT;
-
- printf ("writer thread %ld tries again\n", (long int) nr);
- }
- //while (pthread_rwlock_wrlock (&lock), 0);
- while (pthread_rwlock_timedwrlock (&lock, &ts) == ETIMEDOUT);
-
- printf ("writer thread %ld succeeded\n", (long int) nr);
-
- nanosleep (&delay, NULL);
-
- pthread_rwlock_unlock (&lock);
-
- 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)
- {
- do
- {
- clock_gettime (CLOCK_REALTIME, &ts);
-
- ts.tv_nsec += TIMEOUT;
-
- printf ("reader thread %ld tries again\n", (long int) nr);
- }
- //while (pthread_rwlock_rdlock (&lock), 0);
- while (pthread_rwlock_timedrdlock (&lock, &ts) == ETIMEDOUT);
-
- printf ("reader thread %ld succeeded\n", (long int) nr);
-
- nanosleep (&delay, NULL);
-
- pthread_rwlock_unlock (&lock);
-
- printf ("reader thread %ld released\n", (long int) nr);
- }
-
- return NULL;
-}
-
-
-int
-main (void)
-{
- pthread_t thwr[NWRITERS];
- pthread_t thrd[NREADERS];
- int n;
- void *res;
-
- /* 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)
- {
- int err = pthread_create (&thwr[n], NULL, writer_thread,
- (void *) (long int) n);
-
- if (err != 0)
- error (EXIT_FAILURE, err, "cannot create writer thread");
- }
-
- for (n = 0; n < NREADERS; ++n)
- {
- int err = pthread_create (&thrd[n], NULL, reader_thread,
- (void *) (long int) n);
-
- if (err != 0)
- error (EXIT_FAILURE, err, "cannot create reader thread");
- }
-
- /* Wait for all the threads. */
- for (n = 0; n < NWRITERS; ++n)
- pthread_join (thwr[n], &res);
- for (n = 0; n < NREADERS; ++n)
- pthread_join (thrd[n], &res);
-
- return 0;
-}
diff --git a/linuxthreads/Examples/ex12.c b/linuxthreads/Examples/ex12.c
deleted file mode 100644
index e986fec97f..0000000000
--- a/linuxthreads/Examples/ex12.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Variant of ex6, but this time we use pthread_exit (). */
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <pthread.h>
-#include <unistd.h>
-
-static void *
-__attribute__ ((noreturn))
-test_thread (void *v_param)
-{
- pthread_exit (NULL);
-}
-
-int
-main (void)
-{
- unsigned long count;
-
- setvbuf (stdout, NULL, _IONBF, 0);
-
- for (count = 0; count < 2000; ++count)
- {
- pthread_t thread;
- int status;
-
- status = pthread_create (&thread, NULL, test_thread, NULL);
- if (status != 0)
- {
- printf ("status = %d, count = %lu: %s\n", status, count,
- strerror (errno));
- return 1;
- }
- else
- {
- printf ("count = %lu\n", count);
- }
- /* pthread_detach (thread); */
- if (pthread_join (thread, NULL) != 0)
- {
- printf ("join failed, count %lu\n", count);
- return 2;
- }
- usleep (10);
- }
- return 0;
-}
diff --git a/linuxthreads/Examples/ex13.c b/linuxthreads/Examples/ex13.c
deleted file mode 100644
index 14add6c773..0000000000
--- a/linuxthreads/Examples/ex13.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/* Test for Pthreads/mutexes.
- Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Kurt Garloff <garloff@suse.de>, 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-static void *thread_start (void *ptr) __attribute__ ((__noreturn__));
-
-
-struct thr_ctrl
-{
- pthread_mutex_t mutex;
- pthread_cond_t cond;
- int retval;
-};
-
-static void
-dump_mut (pthread_mutex_t * mut)
-{
- size_t i;
- for (i = 0; i < sizeof (*mut); i++)
- printf (" %02x", *((unsigned char *) mut + i));
- printf ("\n");
-};
-
-/* Helper, the opposite of pthread_cond_wait (cond, mut). */
-static void
-pthr_cond_signal_mutex (pthread_cond_t * cond, pthread_mutex_t * mut)
-{
- int err;
- err = pthread_mutex_lock (mut);
- if (err)
- printf ("mutex_lock : %s\n", strerror (err));
- err = pthread_cond_signal (cond);
- if (err)
- printf ("cond_signal : %s\n", strerror (err));
- err = pthread_mutex_unlock (mut);
- if (err)
- printf ("mutex_unlock: %s\n", strerror (err));
-}
-
-static void *
-thread_start (void *ptr)
-{
- struct thr_ctrl *tc = ptr;
- /* Do initialization. */
- /* ... */
- /* Signal that we are ready. */
- pthr_cond_signal_mutex (&tc->cond, &tc->mutex);
- sleep (2);
- pthr_cond_signal_mutex (&tc->cond, &tc->mutex);
- tc->retval = 0;
- pthread_exit (&tc->retval);
-}
-
-int
-main (void)
-{
- struct thr_ctrl threadctrl;
- pthread_t thread;
- int err;
- void *res = &threadctrl.retval;
- pthread_mutexattr_t mutattr;
- pthread_mutexattr_init (&mutattr);
- pthread_mutex_init (&threadctrl.mutex, &mutattr);
- pthread_cond_init (&threadctrl.cond, NULL);
- err = pthread_mutex_lock (&threadctrl.mutex);
- if (err)
- printf ("mutex_lock : %s\n", strerror (err));
- dump_mut (&threadctrl.mutex);
- pthread_create (&thread, NULL, thread_start, &threadctrl);
- /* Wait until it's ready. */
- err = pthread_cond_wait (&threadctrl.cond, &threadctrl.mutex);
- if (err)
- printf ("cond_wait : %s\n", strerror (err));
- /* Now, we should have acquired the mutex again! */
- dump_mut (&threadctrl.mutex);
- sleep (1);
- dump_mut (&threadctrl.mutex);
- err = pthread_cond_wait (&threadctrl.cond, &threadctrl.mutex);
- if (err)
- {
- printf ("cond_wait : %s\n", strerror (err));
- printf ("ERROR\n");
- abort ();
- };
- dump_mut (&threadctrl.mutex);
- pthread_join (thread, &res);
- printf ("OK\n");
- return 0;
-}
diff --git a/linuxthreads/Examples/ex14.c b/linuxthreads/Examples/ex14.c
deleted file mode 100644
index 406e03f346..0000000000
--- a/linuxthreads/Examples/ex14.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/* Test of POSIX barriers. */
-
-#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;
- }
-
- if (result == 0)
- puts ("all OK");
-
- return result;
-}
-
-#include "../test-skeleton.c"
diff --git a/linuxthreads/Examples/ex15.c b/linuxthreads/Examples/ex15.c
deleted file mode 100644
index e953b231d7..0000000000
--- a/linuxthreads/Examples/ex15.c
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <pthread.h>
-#include <unistd.h>
-
-static void *worker (void *dummy) __attribute__ ((__noreturn__));
-
-static void *
-worker (void *dummy)
-{
- exit (26);
-}
-
-#define TEST_FUNCTION do_test ()
-#define TIMEOUT 10
-static int
-do_test (void)
-{
- pthread_t th;
- pid_t pid;
- int status;
-
- switch ((pid = fork ()))
- {
- case -1:
- puts ("Could not fork");
- exit (1);
- case 0:
- if (pthread_create(&th, NULL, worker, NULL) != 0)
- {
- puts ("Failed to start thread");
- exit (1);
- }
- for (;;);
- exit (1);
- default:
- break;
- }
-
- if (waitpid (pid, &status, 0) != pid)
- {
- puts ("waitpid failed");
- exit (1);
- }
-
- if (!WIFEXITED (status) || WEXITSTATUS (status) != 26)
- {
- printf ("Wrong exit code %d\n", status);
- exit (1);
- }
-
- puts ("All OK");
- return 0;
-}
-
-#include "../../test-skeleton.c"
diff --git a/linuxthreads/Examples/ex16.c b/linuxthreads/Examples/ex16.c
deleted file mode 100644
index 6509ae4515..0000000000
--- a/linuxthreads/Examples/ex16.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Tst case by Jakub Jelinek <jakub@redhat.com>. */
-#include <stdlib.h>
-#include <unistd.h>
-#include <pthread.h>
-
-static void *
-task (void *p)
-{
- sleep (30);
- return NULL;
-}
-
-int
-main (void)
-{
- pthread_t t;
- int status;
-
- status = pthread_create (&t, NULL, task, NULL);
- if (status)
- exit (status);
-
- status = pthread_detach (t);
- pthread_kill_other_threads_np ();
- return status;
-}
diff --git a/linuxthreads/Examples/ex17.c b/linuxthreads/Examples/ex17.c
deleted file mode 100644
index 1bc09a5bda..0000000000
--- a/linuxthreads/Examples/ex17.c
+++ /dev/null
@@ -1,112 +0,0 @@
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <pthread.h>
-#include <unistd.h>
-#include <limits.h>
-#include <sys/mman.h>
-
-static pthread_mutex_t synch = PTHREAD_MUTEX_INITIALIZER;
-
-static void *
-test_thread (void *v_param)
-{
- pthread_mutex_lock (&synch);
- return NULL;
-}
-
-#define STACKSIZE 0x100000
-
-int
-main (void)
-{
- pthread_t thread;
- pthread_attr_t attr;
- int status;
- void *stack, *stack2;
- size_t stacksize;
-
- pthread_attr_init (&attr);
- stack = mmap (NULL, STACKSIZE,
- PROT_READ | PROT_WRITE | PROT_EXEC,
- MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-
- if (stack == MAP_FAILED)
- {
- perror ("mmap failed");
- return 1;
- }
-
- status = pthread_attr_setstack (&attr, stack, STACKSIZE);
- if (status != 0)
- {
- printf ("pthread_attr_setstack failed: %s\n", strerror (status));
- return 1;
- }
-
- status = pthread_attr_getstack (&attr, &stack2, &stacksize);
- if (status != 0)
- {
- printf ("pthread_attr_getstack failed: %s\n", strerror (status));
- return 1;
- }
-
- if (stack2 != stack || stacksize != STACKSIZE)
- {
- printf ("first pthread_attr_getstack returned different stack (%p,%zx)\n"
- "than was set by setstack (%p,%x)\n",
- stack2, stacksize, stack, STACKSIZE);
- return 2;
- }
-
- status = pthread_mutex_lock (&synch);
- if (status != 0)
- {
- printf ("cannot get lock: %s\n", strerror (status));
- return 1;
- }
-
- status = pthread_create (&thread, &attr, test_thread, NULL);
- if (status != 0)
- {
- printf ("pthread_create failed: %s\n", strerror (status));
- return 1;
- }
-
- status = pthread_getattr_np (thread, &attr);
- if (status != 0)
- {
- printf ("pthread_getattr_np failed: %s\n", strerror (status));
- return 1;
- }
-
- status = pthread_attr_getstack (&attr, &stack2, &stacksize);
- if (status != 0)
- {
- printf ("pthread_attr_getstack failed: %s\n", strerror (status));
- return 1;
- }
-
- if (stack2 != stack || stacksize != STACKSIZE)
- {
- printf ("second pthread_attr_getstack returned different stack (%p,%zx)\n"
- "than was set by setstack (%p,%x)\n",
- stack2, stacksize, stack, STACKSIZE);
- return 3;
- }
-
- status = pthread_mutex_unlock (&synch);
- if (status != 0)
- {
- printf ("cannot release lock: %s\n", strerror (status));
- return 1;
- }
-
- /* pthread_detach (thread); */
- if (pthread_join (thread, NULL) != 0)
- {
- printf ("join failed\n");
- return 1;
- }
- return 0;
-}
diff --git a/linuxthreads/Examples/ex18.c b/linuxthreads/Examples/ex18.c
deleted file mode 100644
index 283396bede..0000000000
--- a/linuxthreads/Examples/ex18.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Beat up the pthread_key_create and pthread_key_delete
- * functions.
- */
-
-#if 0
-#define CHATTY
-#endif
-
-#include <stdio.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <pthread.h>
-#include <unistd.h>
-
-const int beatup_iterations = 10000;
-const int num_threads = 30;
-const int max_keys = 500;
-
-struct key_list {
- struct key_list *next;
- pthread_key_t key;
-};
-
-struct key_list *key_list;
-pthread_mutex_t key_lock = PTHREAD_MUTEX_INITIALIZER;
-
-/*
- * Create a new key and put it at the tail of a linked list.
- * If the linked list grows to a certain length, delete a key from the
- * head of * the list.
- */
-
-static void
-beat_up(void)
-{
- struct key_list *new = malloc(sizeof *new);
- struct key_list **iter, *old_key = 0;
- int key_count = 0;
-
- if (new == 0) {
- fprintf(stderr, "malloc failed\n");
- abort();
- }
-
- new->next = 0;
-
- if (pthread_key_create(&new->key, 0) != 0) {
- fprintf(stderr, "pthread_key_create failed\n");
- abort();
- }
-
- if (pthread_getspecific(new->key) != 0) {
- fprintf(stderr, "new pthread_key_t resolves to non-null value\n");
- abort();
- }
-
- pthread_setspecific(new->key, (void *) 1);
-
-#ifdef CHATTY
- printf("created key\n");
-#endif
-
- pthread_mutex_lock(&key_lock);
-
- for (iter = &key_list; *iter != 0; iter = &(*iter)->next)
- key_count++;
-
- *iter = new;
-
- if (key_count > max_keys) {
- old_key = key_list;
- key_list = key_list->next;
- }
-
- pthread_mutex_unlock(&key_lock);
-
- if (old_key != 0) {
-#ifdef CHATTY
- printf("deleting key\n");
-#endif
- pthread_key_delete(old_key->key);
- }
-}
-
-static void *
-thread(void *arg)
-{
- int i;
- for (i = 0; i < beatup_iterations; i++)
- beat_up();
- return 0;
-}
-
-int
-main(void)
-{
- int i;
- pthread_attr_t detached_thread;
-
- pthread_attr_init(&detached_thread);
- pthread_attr_setdetachstate(&detached_thread, PTHREAD_CREATE_DETACHED);
-
- for (i = 0; i < num_threads; i++) {
- pthread_t thread_id;
- while (pthread_create(&thread_id, &detached_thread, thread, 0) == EAGAIN) {
- /* let some threads die, so system can breathe. :) */
- sleep(1);
- }
- }
-
- pthread_exit(0);
-}
diff --git a/linuxthreads/Examples/ex2.c b/linuxthreads/Examples/ex2.c
deleted file mode 100644
index f2556a4206..0000000000
--- a/linuxthreads/Examples/ex2.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/* The classic producer-consumer example.
- Illustrates mutexes and conditions.
- All integers between 0 and 9999 should be printed exactly twice,
- once to the right of the arrow and once to the left. */
-
-#include <stdio.h>
-#include "pthread.h"
-
-#define BUFFER_SIZE 16
-
-/* Circular buffer of integers. */
-
-struct prodcons
-{
- int buffer[BUFFER_SIZE]; /* the actual data */
- pthread_mutex_t lock; /* mutex ensuring exclusive access to buffer */
- int readpos, writepos; /* positions for reading and writing */
- pthread_cond_t notempty; /* signaled when buffer is not empty */
- pthread_cond_t notfull; /* signaled when buffer is not full */
-};
-
-/* Initialize a buffer */
-static void
-init (struct prodcons *b)
-{
- pthread_mutex_init (&b->lock, NULL);
- pthread_cond_init (&b->notempty, NULL);
- pthread_cond_init (&b->notfull, NULL);
- b->readpos = 0;
- b->writepos = 0;
-}
-
-/* Store an integer in the buffer */
-static void
-put (struct prodcons *b, int data)
-{
- pthread_mutex_lock (&b->lock);
- /* Wait until buffer is not full */
- while ((b->writepos + 1) % BUFFER_SIZE == b->readpos)
- {
- pthread_cond_wait (&b->notfull, &b->lock);
- /* pthread_cond_wait reacquired b->lock before returning */
- }
- /* Write the data and advance write pointer */
- b->buffer[b->writepos] = data;
- b->writepos++;
- if (b->writepos >= BUFFER_SIZE)
- b->writepos = 0;
- /* Signal that the buffer is now not empty */
- pthread_cond_signal (&b->notempty);
- pthread_mutex_unlock (&b->lock);
-}
-
-/* Read and remove an integer from the buffer */
-static int
-get (struct prodcons *b)
-{
- int data;
- pthread_mutex_lock (&b->lock);
- /* Wait until buffer is not empty */
- while (b->writepos == b->readpos)
- {
- pthread_cond_wait (&b->notempty, &b->lock);
- }
- /* Read the data and advance read pointer */
- data = b->buffer[b->readpos];
- b->readpos++;
- if (b->readpos >= BUFFER_SIZE)
- b->readpos = 0;
- /* Signal that the buffer is now not full */
- pthread_cond_signal (&b->notfull);
- pthread_mutex_unlock (&b->lock);
- return data;
-}
-
-/* A test program: one thread inserts integers from 1 to 10000,
- the other reads them and prints them. */
-
-#define OVER (-1)
-
-struct prodcons buffer;
-
-static void *
-producer (void *data)
-{
- int n;
- for (n = 0; n < 10000; n++)
- {
- printf ("%d --->\n", n);
- put (&buffer, n);
- }
- put (&buffer, OVER);
- return NULL;
-}
-
-static void *
-consumer (void *data)
-{
- int d;
- while (1)
- {
- d = get (&buffer);
- if (d == OVER)
- break;
- printf ("---> %d\n", d);
- }
- return NULL;
-}
-
-int
-main (void)
-{
- pthread_t th_a, th_b;
- void *retval;
-
- init (&buffer);
- /* Create the threads */
- pthread_create (&th_a, NULL, producer, 0);
- pthread_create (&th_b, NULL, consumer, 0);
- /* Wait until producer and consumer finish. */
- pthread_join (th_a, &retval);
- pthread_join (th_b, &retval);
- return 0;
-}
diff --git a/linuxthreads/Examples/ex3.c b/linuxthreads/Examples/ex3.c
deleted file mode 100644
index b80b323a33..0000000000
--- a/linuxthreads/Examples/ex3.c
+++ /dev/null
@@ -1,152 +0,0 @@
-/* Multi-thread searching.
- Illustrates: thread cancellation, cleanup handlers. */
-
-#include <errno.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <pthread.h>
-
-/* Defines the number of searching threads */
-#define NUM_THREADS 5
-
-/* Function prototypes */
-void *search(void *);
-void print_it(void *);
-
-/* Global variables */
-pthread_t threads[NUM_THREADS];
-pthread_mutex_t lock;
-int tries;
-volatile int started;
-
-int main(int argc, char ** argv)
-{
- int i;
- int pid;
-
- /* create a number to search for */
- pid = getpid();
- printf("Searching for the number = %d...\n", pid);
-
- /* Initialize the mutex lock */
- pthread_mutex_init(&lock, NULL);
-
- /* Create the searching threads */
- for (started=0; started<NUM_THREADS; started++)
- pthread_create(&threads[started], NULL, search, (void *) (long int) pid);
-
- /* Wait for (join) all the searching threads */
- for (i=0; i<NUM_THREADS; i++)
- pthread_join(threads[i], NULL);
-
- printf("It took %d tries to find the number.\n", tries);
-
- /* Exit the program */
- return 0;
-}
-
-/* This is the cleanup function that is called
- when the threads are cancelled */
-
-void print_it(void *arg)
-{
- int *try = (int *) arg;
- pthread_t tid;
-
- /* Get the calling thread's ID */
- tid = pthread_self();
-
- /* Print where the thread was in its search when it was cancelled */
- printf("Thread %lx was canceled on its %d try.\n", tid, *try);
-}
-
-/* This is the search routine that is executed in each thread */
-
-void *search(void *arg)
-{
- int num = (long int) arg;
- int i, j, ntries;
- pthread_t tid;
-
- /* get the calling thread ID */
- tid = pthread_self();
-
- /* use the thread ID to set the seed for the random number generator */
- /* Since srand and rand are not thread-safe, serialize with lock */
-
- /* Try to lock the mutex lock --
- if locked, check to see if the thread has been cancelled
- if not locked then continue */
- while (pthread_mutex_trylock(&lock) == EBUSY)
- pthread_testcancel();
-
- srand((int)tid);
- i = rand() & 0xFFFFFF;
- pthread_mutex_unlock(&lock);
- ntries = 0;
-
- /* Set the cancellation parameters --
- - Enable thread cancellation
- - Defer the action of the cancellation */
-
- pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
- pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
-
- while (started < NUM_THREADS)
- sched_yield ();
-
- /* Push the cleanup routine (print_it) onto the thread
- cleanup stack. This routine will be called when the
- thread is cancelled. Also note that the pthread_cleanup_push
- call must have a matching pthread_cleanup_pop call. The
- push and pop calls MUST be at the same lexical level
- within the code */
-
- /* Pass address of `ntries' since the current value of `ntries' is not
- the one we want to use in the cleanup function */
-
- pthread_cleanup_push(print_it, (void *)&ntries);
-
- /* Loop forever */
- while (1) {
- i = (i + 1) & 0xFFFFFF;
- ntries++;
-
- /* Does the random number match the target number? */
- if (num == i) {
- /* Try to lock the mutex lock --
- if locked, check to see if the thread has been cancelled
- if not locked then continue */
- while (pthread_mutex_trylock(&lock) == EBUSY)
- pthread_testcancel();
-
- /* Set the global variable for the number of tries */
- tries = ntries;
- printf("Thread %lx found the number!\n", tid);
-
- /* Cancel all the other threads */
- for (j=0; j<NUM_THREADS; j++)
- if (threads[j] != tid) pthread_cancel(threads[j]);
-
- /* Break out of the while loop */
- break;
- }
-
- /* Every 100 tries check to see if the thread has been cancelled. */
- if (ntries % 100 == 0) {
- pthread_testcancel();
- }
- }
-
- /* The only way we can get here is when the thread breaks out
- of the while loop. In this case the thread that makes it here
- has found the number we are looking for and does not need to run
- the thread cleanup function. This is why the pthread_cleanup_pop
- function is called with a 0 argument; this will pop the cleanup
- function off the stack without executing it */
-
- pthread_cleanup_pop(0);
- return((void *)0);
-}
diff --git a/linuxthreads/Examples/ex4.c b/linuxthreads/Examples/ex4.c
deleted file mode 100644
index 5c8b929e22..0000000000
--- a/linuxthreads/Examples/ex4.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/* Making a library function that uses static variables thread-safe.
- Illustrates: thread-specific data, pthread_once(). */
-
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <pthread.h>
-
-/* This is a typical example of a library function that uses
- static variables to accumulate results between calls.
- Here, it just returns the concatenation of all string arguments
- that were given to it. */
-
-#if 0
-
-char *
-str_accumulate (char *s)
-{
- static char accu[1024] = { 0 };
- strcat (accu, s);
- return accu;
-}
-
-#endif
-
-/* Of course, this cannot be used in a multi-threaded program
- because all threads store "accu" at the same location.
- So, we'll use thread-specific data to have a different "accu"
- for each thread. */
-
-/* Key identifying the thread-specific data */
-static pthread_key_t str_key;
-/* "Once" variable ensuring that the key for str_alloc will be allocated
- exactly once. */
-static pthread_once_t str_alloc_key_once = PTHREAD_ONCE_INIT;
-
-/* Forward functions */
-static void str_alloc_key (void);
-static void str_alloc_destroy_accu (void *accu);
-
-/* Thread-safe version of str_accumulate */
-
-static char *
-str_accumulate (const char *s)
-{
- char *accu;
-
- /* Make sure the key is allocated */
- pthread_once (&str_alloc_key_once, str_alloc_key);
- /* Get the thread-specific data associated with the key */
- accu = (char *) pthread_getspecific (str_key);
- /* It's initially NULL, meaning that we must allocate the buffer first. */
- if (accu == NULL)
- {
- accu = malloc (1024);
- if (accu == NULL)
- return NULL;
- accu[0] = 0;
- /* Store the buffer pointer in the thread-specific data. */
- pthread_setspecific (str_key, (void *) accu);
- printf ("Thread %lx: allocating buffer at %p\n", pthread_self (), accu);
- }
- /* Now we can use accu just as in the non thread-safe code. */
- strcat (accu, s);
- return accu;
-}
-
-/* Function to allocate the key for str_alloc thread-specific data. */
-
-static void
-str_alloc_key (void)
-{
- pthread_key_create (&str_key, str_alloc_destroy_accu);
- printf ("Thread %lx: allocated key %d\n", pthread_self (), str_key);
-}
-
-/* Function to free the buffer when the thread exits. */
-/* Called only when the thread-specific data is not NULL. */
-
-static void
-str_alloc_destroy_accu (void *accu)
-{
- printf ("Thread %lx: freeing buffer at %p\n", pthread_self (), accu);
- free (accu);
-}
-
-/* Test program */
-
-static void *
-process (void *arg)
-{
- char *res;
- res = str_accumulate ("Result of ");
- res = str_accumulate ((char *) arg);
- res = str_accumulate (" thread");
- printf ("Thread %lx: \"%s\"\n", pthread_self (), res);
- return NULL;
-}
-
-int
-main (int argc, char **argv)
-{
- char *res;
- pthread_t th1, th2;
-
- res = str_accumulate ("Result of ");
- pthread_create (&th1, NULL, process, (void *) "first");
- pthread_create (&th2, NULL, process, (void *) "second");
- res = str_accumulate ("initial thread");
- printf ("Thread %lx: \"%s\"\n", pthread_self (), res);
- pthread_join (th1, NULL);
- pthread_join (th2, NULL);
- return 0;
-}
diff --git a/linuxthreads/Examples/ex5.c b/linuxthreads/Examples/ex5.c
deleted file mode 100644
index d39d487603..0000000000
--- a/linuxthreads/Examples/ex5.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/* The classic producer-consumer example, implemented with semaphores.
- All integers between 0 and 9999 should be printed exactly twice,
- once to the right of the arrow and once to the left. */
-
-#include <stdio.h>
-#include "pthread.h"
-#include "semaphore.h"
-
-#define BUFFER_SIZE 16
-
-/* Circular buffer of integers. */
-
-struct prodcons
-{
- int buffer[BUFFER_SIZE]; /* the actual data */
- int readpos, writepos; /* positions for reading and writing */
- sem_t sem_read; /* number of elements available for reading */
- sem_t sem_write; /* number of locations available for writing */
-};
-
-/* Initialize a buffer */
-
-static void
-init (struct prodcons *b)
-{
- sem_init (&b->sem_write, 0, BUFFER_SIZE - 1);
- sem_init (&b->sem_read, 0, 0);
- b->readpos = 0;
- b->writepos = 0;
-}
-
-/* Store an integer in the buffer */
-
-static void
-put (struct prodcons *b, int data)
-{
- /* Wait until buffer is not full */
- sem_wait (&b->sem_write);
- /* Write the data and advance write pointer */
- b->buffer[b->writepos] = data;
- b->writepos++;
- if (b->writepos >= BUFFER_SIZE)
- b->writepos = 0;
- /* Signal that the buffer contains one more element for reading */
- sem_post (&b->sem_read);
-}
-
-/* Read and remove an integer from the buffer */
-
-static int
-get (struct prodcons *b)
-{
- int data;
- /* Wait until buffer is not empty */
- sem_wait (&b->sem_read);
- /* Read the data and advance read pointer */
- data = b->buffer[b->readpos];
- b->readpos++;
- if (b->readpos >= BUFFER_SIZE)
- b->readpos = 0;
- /* Signal that the buffer has now one more location for writing */
- sem_post (&b->sem_write);
- return data;
-}
-
-/* A test program: one thread inserts integers from 1 to 10000,
- the other reads them and prints them. */
-
-#define OVER (-1)
-
-struct prodcons buffer;
-
-static void *
-producer (void *data)
-{
- int n;
- for (n = 0; n < 10000; n++)
- {
- printf ("%d --->\n", n);
- put (&buffer, n);
- }
- put (&buffer, OVER);
- return NULL;
-}
-
-static void *
-consumer (void *data)
-{
- int d;
- while (1)
- {
- d = get (&buffer);
- if (d == OVER)
- break;
- printf ("---> %d\n", d);
- }
- return NULL;
-}
-
-int
-main (void)
-{
- pthread_t th_a, th_b;
- void *retval;
-
- init (&buffer);
- /* Create the threads */
- pthread_create (&th_a, NULL, producer, 0);
- pthread_create (&th_b, NULL, consumer, 0);
- /* Wait until producer and consumer finish. */
- pthread_join (th_a, &retval);
- pthread_join (th_b, &retval);
- return 0;
-}
diff --git a/linuxthreads/Examples/ex6.c b/linuxthreads/Examples/ex6.c
deleted file mode 100644
index 9a0266828b..0000000000
--- a/linuxthreads/Examples/ex6.c
+++ /dev/null
@@ -1,46 +0,0 @@
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <pthread.h>
-#include <unistd.h>
-
-static void *
-test_thread (void *v_param)
-{
- return NULL;
-}
-
-int
-main (void)
-{
- unsigned long count;
-
- setvbuf (stdout, NULL, _IONBF, 0);
-
- for (count = 0; count < 2000; ++count)
- {
- pthread_t thread;
- int status;
-
- status = pthread_create (&thread, NULL, test_thread, NULL);
- if (status != 0)
- {
- printf ("status = %d, count = %lu: %s\n", status, count,
- strerror (errno));
- return 1;
- }
- else
- {
- printf ("count = %lu\n", count);
- }
- /* pthread_detach (thread); */
- int err = pthread_join (thread, NULL);
- if (err != 0)
- {
- printf ("join failed (%s), count %lu\n", strerror (err), count);
- return 2;
- }
- usleep (10);
- }
- return 0;
-}
diff --git a/linuxthreads/Examples/ex7.c b/linuxthreads/Examples/ex7.c
deleted file mode 100644
index d9db33c5cd..0000000000
--- a/linuxthreads/Examples/ex7.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* This is a test of the special shutdown that occurs
- when all threads, including the main one, call
- pthread_exit(). It demonstrates that atexit
- handlers are properly called, and that the
- output is properly flushed even when stdout is
- redirected to a file, and therefore fully buffered. */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <pthread.h>
-
-#define NTHREADS 20 /* number of threads */
-
-static void *
-thread (void *arg)
-{
- printf ("thread terminating\n");
- return 0;
-}
-
-static void
-cleanup (void)
-{
- printf ("atexit handler called\n");
-}
-
-int
-main (void)
-{
- int i;
-
- atexit (cleanup);
-
- for (i = 0; i < NTHREADS; i++)
- {
- pthread_t id;
- if (pthread_create (&id, 0, thread, 0) != 0)
- {
- fprintf (stderr, "pthread_create failed\n");
- abort ();
- }
- }
-
- pthread_exit (0);
-}
diff --git a/linuxthreads/Examples/ex8.c b/linuxthreads/Examples/ex8.c
deleted file mode 100644
index bda81b9c61..0000000000
--- a/linuxthreads/Examples/ex8.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/* Tests for fork in multi-threaded environment.
- Copyright (C) 2000 Free Software Foundation, Inc.
- Contributed by Ulrich Drepper <drepper@cygnus.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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <error.h>
-#include <stdlib.h>
-#include <pthread.h>
-#include <unistd.h>
-#include <sys/wait.h>
-
-enum
-{
- PREPARE_BIT = 1,
- PARENT_BIT = 2,
- CHILD_BIT = 4
-};
-
-static int var;
-
-static void
-prepare (void)
-{
- var |= PREPARE_BIT;
-}
-
-static void
-parent (void)
-{
- var |= PARENT_BIT;
-}
-
-static void
-child (void)
-{
- var |= CHILD_BIT;
-}
-
-
-static void *thread (void *arg);
-
-
-int
-main (void)
-{
- pthread_t th;
- void *res;
-
- pthread_atfork (prepare, parent, child);
-
- if (pthread_create (&th, NULL, thread, NULL) != 0)
- error (EXIT_FAILURE, 0, "cannot create thread");
-
- pthread_join (th, &res);
-
- return (int) (long int) res;
-}
-
-
-static void *
-thread (void *arg)
-{
- int status;
- pid_t pid;
-
- pid = fork ();
- if (pid == 0)
- {
- /* We check whether the `prepare' and `child' function ran. */
- exit (var != (PREPARE_BIT | CHILD_BIT));
- }
- else if (pid == (pid_t) -1)
- error (EXIT_FAILURE, errno, "cannot fork");
-
- if (waitpid (pid, &status, 0) != pid)
- error (EXIT_FAILURE, errno, "wrong child");
-
- if (WTERMSIG (status) != 0)
- error (EXIT_FAILURE, 0, "Child terminated incorrectly");
- status = WEXITSTATUS (status);
-
- if (status == 0)
- status = var != (PREPARE_BIT | PARENT_BIT);
-
- return (void *) (long int) status;
-}
diff --git a/linuxthreads/Examples/ex9.c b/linuxthreads/Examples/ex9.c
deleted file mode 100644
index 3c8b8142e1..0000000000
--- a/linuxthreads/Examples/ex9.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/* Tests for pthread_barrier_* functions.
- Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
- Contributed by Kaz Kylheku <kaz@ashi.footprints.net>, 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <error.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <pthread.h>
-
-#define NUM_THREADS 10
-#define NUM_ITERS 500
-
-static void *thread (void *) __attribute__ ((__noreturn__));
-static pthread_barrier_t barrier;
-
-int
-main (void)
-{
- pthread_t thread_list[NUM_THREADS];
- int i;
-
- if (pthread_barrier_init (&barrier, NULL, NUM_THREADS + 1) != 0)
- error (EXIT_FAILURE, 0, "cannot initialize barrier");
-
- for (i = 0; i < NUM_THREADS; i++)
- {
- if (pthread_create (&thread_list[i], NULL, thread, NULL) != 0)
- error (EXIT_FAILURE, 0, "cannot create thread");
- }
-
- (void) thread (NULL);
-
- for (i = 0; i < NUM_THREADS; i++)
- {
- pthread_join(thread_list[i], NULL);
- }
-
- return 0;
-}
-
-
-static void *
-thread (void *arg)
-{
- int i;
- pthread_t self = pthread_self ();
- static pthread_t last_serial_thread;
- static int linecount; /* protected by flockfile(stdout) */
-
- for (i = 0; i < NUM_ITERS; i++)
- {
- switch (pthread_barrier_wait (&barrier))
- {
- case 0:
- flockfile (stdout);
- printf ("%04d: non-serial thread %lu\n", ++linecount,
- (unsigned long) self);
- funlockfile (stdout);
- break;
- case PTHREAD_BARRIER_SERIAL_THREAD:
- flockfile (stdout);
- printf ("%04d: serial thread %lu\n", ++linecount,
- (unsigned long) self);
- funlockfile (stdout);
- last_serial_thread = self;
- break;
- default:
- /* Huh? */
- error (EXIT_FAILURE, 0, "unexpected return value from barrier wait");
- }
- }
-
- if (pthread_equal (self, last_serial_thread))
- {
- flockfile (stdout);
- printf ("%04d: last serial thread %lu terminating process\n",
- ++linecount, (unsigned long) self);
- funlockfile (stdout);
- }
-
- pthread_exit(NULL);
-}
diff --git a/linuxthreads/Examples/tststatic.c b/linuxthreads/Examples/tststatic.c
deleted file mode 100644
index 421011a3c4..0000000000
--- a/linuxthreads/Examples/tststatic.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "ex1.c"
diff --git a/linuxthreads/FAQ.html b/linuxthreads/FAQ.html
deleted file mode 100644
index 21be33ec4c..0000000000
--- a/linuxthreads/FAQ.html
+++ /dev/null
@@ -1,1039 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE>LinuxThreads Frequently Asked Questions</TITLE>
-</HEAD>
-<BODY>
-<H1 ALIGN=center>LinuxThreads Frequently Asked Questions <BR>
- (with answers)</H1>
-<H2 ALIGN=center>[For LinuxThreads version 0.8]</H2>
-
-<HR><P>
-
-<A HREF="#A">A. The big picture</A><BR>
-<A HREF="#B">B. Getting more information</A><BR>
-<A HREF="#C">C. Issues related to the C library</A><BR>
-<A HREF="#D">D. Problems, weird behaviors, potential bugs</A><BR>
-<A HREF="#E">E. Missing functions, wrong types, etc</A><BR>
-<A HREF="#F">F. C++ issues</A><BR>
-<A HREF="#G">G. Debugging LinuxThreads programs</A><BR>
-<A HREF="#H">H. Compiling multithreaded code; errno madness</A><BR>
-<A HREF="#I">I. X-Windows and other libraries</A><BR>
-<A HREF="#J">J. Signals and threads</A><BR>
-<A HREF="#K">K. Internals of LinuxThreads</A><P>
-
-<HR>
-<P>
-
-<H2><A NAME="A">A. The big picture</A></H2>
-
-<H4><A NAME="A.1">A.1: What is LinuxThreads?</A></H4>
-
-LinuxThreads is a Linux library for multi-threaded programming.
-It implements the Posix 1003.1c API (Application Programming
-Interface) for threads. It runs on any Linux system with kernel 2.0.0
-or more recent, and a suitable C library (see section <A HREF="C">C</A>).
-<P>
-
-<H4><A NAME="A.2">A.2: What are threads?</A></H4>
-
-A thread is a sequential flow of control through a program.
-Multi-threaded programming is, thus, a form of parallel programming
-where several threads of control are executing concurrently in the
-program. All threads execute in the same memory space, and can
-therefore work concurrently on shared data.<P>
-
-Multi-threaded programming differs from Unix-style multi-processing in
-that all threads share the same memory space (and a few other system
-resources, such as file descriptors), instead of running in their own
-memory space as is the case with Unix processes.<P>
-
-Threads are useful for two reasons. First, they allow a program to
-exploit multi-processor machines: the threads can run in parallel on
-several processors, allowing a single program to divide its work
-between several processors, thus running faster than a single-threaded
-program, which runs on only one processor at a time. Second, some
-programs are best expressed as several threads of control that
-communicate together, rather than as one big monolithic sequential
-program. Examples include server programs, overlapping asynchronous
-I/O, and graphical user interfaces.<P>
-
-<H4><A NAME="A.3">A.3: What is POSIX 1003.1c?</A></H4>
-
-It's an API for multi-threaded programming standardized by IEEE as
-part of the POSIX standards. Most Unix vendors have endorsed the
-POSIX 1003.1c standard. Implementations of the 1003.1c API are
-already available under Sun Solaris 2.5, Digital Unix 4.0,
-Silicon Graphics IRIX 6, and should soon be available from other
-vendors such as IBM and HP. More generally, the 1003.1c API is
-replacing relatively quickly the proprietary threads library that were
-developed previously under Unix, such as Mach cthreads, Solaris
-threads, and IRIX sprocs. Thus, multithreaded programs using the
-1003.1c API are likely to run unchanged on a wide variety of Unix
-platforms.<P>
-
-<H4><A NAME="A.4">A.4: What is the status of LinuxThreads?</A></H4>
-
-LinuxThreads implements almost all of Posix 1003.1c, as well as a few
-extensions. The only part of LinuxThreads that does not conform yet
-to Posix is signal handling (see section <A HREF="#J">J</A>). Apart
-from the signal stuff, all the Posix 1003.1c base functionality,
-as well as a number of optional extensions, are provided and conform
-to the standard (to the best of my knowledge).
-The signal stuff is hard to get right, at least without special kernel
-support, and while I'm definitely looking at ways to implement the
-Posix behavior for signals, this might take a long time before it's
-completed.<P>
-
-<H4><A NAME="A.5">A.5: How stable is LinuxThreads?</A></H4>
-
-The basic functionality (thread creation and termination, mutexes,
-conditions, semaphores) is very stable. Several industrial-strength
-programs, such as the AOL multithreaded Web server, use LinuxThreads
-and seem quite happy about it. There used to be some rough edges in
-the LinuxThreads / C library interface with libc 5, but glibc 2
-fixes all of those problems and is now the standard C library on major
-Linux distributions (see section <A HREF="#C">C</A>). <P>
-
-<HR>
-<P>
-
-<H2><A NAME="B">B. Getting more information</A></H2>
-
-<H4><A NAME="B.1">B.1: What are good books and other sources of
-information on POSIX threads?</A></H4>
-
-The FAQ for comp.programming.threads lists several books:
-<A HREF="http://www.serpentine.com/~bos/threads-faq/">http://www.serpentine.com/~bos/threads-faq/</A>.<P>
-
-There are also some online tutorials. Follow the links from the
-LinuxThreads web page:
-<A HREF="http://pauillac.inria.fr/~xleroy/linuxthreads">http://pauillac.inria.fr/~xleroy/linuxthreads</A>.<P>
-
-<H4><A NAME="B.2">B.2: I'd like to be informed of future developments on
-LinuxThreads. Is there a mailing list for this purpose?</A></H4>
-
-I post LinuxThreads-related announcements on the newsgroup
-<A HREF="news:comp.os.linux.announce">comp.os.linux.announce</A>,
-and also on the mailing list
-<code>linux-threads@magenet.com</code>.
-You can subscribe to the latter by writing
-<A HREF="mailto:majordomo@magenet.com">majordomo@magenet.com</A>.<P>
-
-<H4><A NAME="B.3">B.3: What are good places for discussing
-LinuxThreads?</A></H4>
-
-For questions about programming with POSIX threads in general, use
-the newsgroup
-<A HREF="news:comp.programming.threads">comp.programming.threads</A>.
-Be sure you read the
-<A HREF="http://www.serpentine.com/~bos/threads-faq/">FAQ</A>
-for this group before you post.<P>
-
-For Linux-specific questions, use
-<A
-HREF="news:comp.os.linux.development.apps">comp.os.linux.development.apps</A>
-and <A
-HREF="news:comp.os.linux.development.kernel">comp.os.linux.development.kernel</A>.
-The latter is especially appropriate for questions relative to the
-interface between the kernel and LinuxThreads.<P>
-
-<H4><A NAME="B.4">B.4: How should I report a possible bug in
-LinuxThreads?</A></H4>
-
-If you're using glibc 2, the best way by far is to use the
-<code>glibcbug</code> script to mail a bug report to the glibc
-maintainers. <P>
-
-If you're using an older libc, or don't have the <code>glibcbug</code>
-script on your machine, then e-mail me directly
-(<code>Xavier.Leroy@inria.fr</code>). <P>
-
-In both cases, before sending the bug report, make sure that it is not
-addressed already in this FAQ. Also, try to send a short program that
-reproduces the weird behavior you observed. <P>
-
-<H4><A NAME="B.5">B.5: I'd like to read the POSIX 1003.1c standard. Is
-it available online?</A></H4>
-
-Unfortunately, no. POSIX standards are copyrighted by IEEE, and
-IEEE does not distribute them freely. You can buy paper copies from
-IEEE, but the price is fairly high ($120 or so). If you disagree with
-this policy and you're an IEEE member, be sure to let them know.<P>
-
-On the other hand, you probably don't want to read the standard. It's
-very hard to read, written in standard-ese, and targeted to
-implementors who already know threads inside-out. A good book on
-POSIX threads provides the same information in a much more readable form.
-I can personally recommend Dave Butenhof's book, <CITE>Programming
-with POSIX threads</CITE> (Addison-Wesley). Butenhof was part of the
-POSIX committee and also designed the Digital Unix implementations of
-POSIX threads, and it shows.<P>
-
-Another good source of information is the X/Open Group Single Unix
-specification which is available both
-<A HREF="http://www.rdg.opengroup.org/onlinepubs/7908799/index.html">on-line</A>
-and as a
-<A HREF="http://www.UNIX-systems.org/gosolo2/">book and CD/ROM</A>.
-That specification includes pretty much all the POSIX standards,
-including 1003.1c, with some extensions and clarifications.<P>
-
-<HR>
-<P>
-
-<H2><A NAME="C">C. Issues related to the C library</A></H2>
-
-<H4><A NAME="C.1">C.1: Which version of the C library should I use
-with LinuxThreads?</A></H4>
-
-The best choice by far is glibc 2, a.k.a. libc 6. It offers very good
-support for multi-threading, and LinuxThreads has been closely
-integrated with glibc 2. The glibc 2 distribution contains the
-sources of a specially adapted version of LinuxThreads.<P>
-
-glibc 2 comes preinstalled as the default C library on several Linux
-distributions, such as RedHat 5 and up, and Debian 2.
-Those distributions include the version of LinuxThreads matching
-glibc 2.<P>
-
-<H4><A NAME="C.2">C.2: My system has libc 5 preinstalled, not glibc
-2. Can I still use LinuxThreads?</H4>
-
-Yes, but you're likely to run into some problems, as libc 5 only
-offers minimal support for threads and contains some bugs that affect
-multithreaded programs. <P>
-
-The versions of libc 5 that work best with LinuxThreads are
-libc 5.2.18 on the one hand, and libc 5.4.12 or later on the other hand.
-Avoid 5.3.12 and 5.4.7: these have problems with the per-thread errno
-variable. <P>
-
-<H4><A NAME="C.3">C.3: So, should I switch to glibc 2, or stay with a
-recent libc 5?</A></H4>
-
-I'd recommend you switch to glibc 2. Even for single-threaded
-programs, glibc 2 is more solid and more standard-conformant than libc
-5. And the shortcomings of libc 5 almost preclude any serious
-multi-threaded programming.<P>
-
-Switching an already installed
-system from libc 5 to glibc 2 is not completely straightforward.
-See the <A HREF="http://sunsite.unc.edu/LDP/HOWTO/Glibc2-HOWTO.html">Glibc2
-HOWTO</A> for more information. Much easier is (re-)installing a
-Linux distribution based on glibc 2, such as RedHat 6.<P>
-
-<H4><A NAME="C.4">C.4: Where can I find glibc 2 and the version of
-LinuxThreads that goes with it?</A></H4>
-
-On <code>prep.ai.mit.edu</code> and its many, many mirrors around the world.
-See <A
-HREF="http://www.gnu.org/order/ftp.html">http://www.gnu.org/order/ftp.html</A>
-for a list of mirrors.<P>
-
-<H4><A NAME="C.5">C.5: Where can I find libc 5 and the version of
-LinuxThreads that goes with it?</A></H4>
-
-For libc 5, see <A HREF="ftp://sunsite.unc.edu/pub/Linux/devel/GCC/"><code>ftp://sunsite.unc.edu/pub/Linux/devel/GCC/</code></A>.<P>
-
-For the libc 5 version of LinuxThreads, see
-<A HREF="ftp://ftp.inria.fr/INRIA/Projects/cristal/Xavier.Leroy/linuxthreads/">ftp://ftp.inria.fr/INRIA/Projects/cristal/Xavier.Leroy/linuxthreads/</A>.<P>
-
-<H4><A NAME="C.6">C.6: How can I recompile the glibc 2 version of the
-LinuxThreads sources?</A></H4>
-
-You must transfer the whole glibc sources, then drop the LinuxThreads
-sources in the <code>linuxthreads/</code> subdirectory, then recompile
-glibc as a whole. There are now too many inter-dependencies between
-LinuxThreads and glibc 2 to allow separate re-compilation of LinuxThreads.
-<P>
-
-<H4><A NAME="C.7">C.7: What is the correspondence between LinuxThreads
-version numbers, libc version numbers, and RedHat version
-numbers?</A></H4>
-
-Here is a summary. (Information on Linux distributions other than
-RedHat are welcome.)<P>
-
-<TABLE>
-<TR><TD>LinuxThreads </TD> <TD>C library</TD> <TD>RedHat</TD></TR>
-<TR><TD>0.7, 0.71 (for libc 5)</TD> <TD>libc 5.x</TD> <TD>RH 4.2</TD></TR>
-<TR><TD>0.7, 0.71 (for glibc 2)</TD> <TD>glibc 2.0.x</TD> <TD>RH 5.x</TD></TR>
-<TR><TD>0.8</TD> <TD>glibc 2.1.1</TD> <TD>RH 6.0</TD></TR>
-<TR><TD>0.8</TD> <TD>glibc 2.1.2</TD> <TD>not yet released</TD></TR>
-</TABLE>
-<P>
-
-<HR>
-<P>
-
-<H2><A NAME="D">D. Problems, weird behaviors, potential bugs</A></H2>
-
-<H4><A NAME="D.1">D.1: When I compile LinuxThreads, I run into problems in
-file <code>libc_r/dirent.c</code></A></H4>
-
-You probably mean:
-<PRE>
- libc_r/dirent.c:94: structure has no member named `dd_lock'
-</PRE>
-I haven't actually seen this problem, but several users reported it.
-My understanding is that something is wrong in the include files of
-your Linux installation (<code>/usr/include/*</code>). Make sure
-you're using a supported version of the libc 5 library. (See question <A
-HREF="#C.2">C.2</A>).<P>
-
-<H4><A NAME="D.2">D.2: When I compile LinuxThreads, I run into problems with
-<CODE>/usr/include/sched.h</CODE>: there are several occurrences of
-<CODE>_p</CODE> that the C compiler does not understand</A></H4>
-
-Yes, <CODE>/usr/include/sched.h</CODE> that comes with libc 5.3.12 is broken.
-Replace it with the <code>sched.h</code> file contained in the
-LinuxThreads distribution. But really you should not be using libc
-5.3.12 with LinuxThreads! (See question <A HREF="#C.2">C.1</A>.)<P>
-
-<H4><A NAME="D.3">D.3: My program does <CODE>fdopen()</CODE> on a file
-descriptor opened on a pipe. When I link it with LinuxThreads,
-<CODE>fdopen()</CODE> always returns NULL!</A></H4>
-
-You're using one of the buggy versions of libc (5.3.12, 5.4.7., etc).
-See question <A HREF="#C.1">C.1</A> above.<P>
-
-<H4><A NAME="D.4">D.4: My program creates a lot of threads, and after
-a while <CODE>pthread_create()</CODE> no longer returns!</A></H4>
-
-This is known bug in the version of LinuxThreads that comes with glibc
-2.1.1. An upgrade to 2.1.2 is recommended. <P>
-
-<H4><A NAME="D.5">D.5: When I'm running a program that creates N
-threads, <code>top</code> or <code>ps</code>
-display N+2 processes that are running my program. What do all these
-processes correspond to?</A></H4>
-
-Due to the general "one process per thread" model, there's one process
-for the initial thread and N processes for the threads it created
-using <CODE>pthread_create</CODE>. That leaves one process
-unaccounted for. That extra process corresponds to the "thread
-manager" thread, a thread created internally by LinuxThreads to handle
-thread creation and thread termination. This extra thread is asleep
-most of the time.
-
-<H4><A NAME="D.6">D.6: Scheduling seems to be very unfair when there
-is strong contention on a mutex: instead of giving the mutex to each
-thread in turn, it seems that it's almost always the same thread that
-gets the mutex. Isn't this completely broken behavior?</A></H4>
-
-That behavior has mostly disappeared in recent releases of
-LinuxThreads (version 0.8 and up). It was fairly common in older
-releases, though.
-
-What happens in LinuxThreads 0.7 and before is the following: when a
-thread unlocks a mutex, all other threads that were waiting on the
-mutex are sent a signal which makes them runnable. However, the
-kernel scheduler may or may not restart them immediately. If the
-thread that unlocked the mutex tries to lock it again immediately
-afterwards, it is likely that it will succeed, because the threads
-haven't yet restarted. This results in an apparently very unfair
-behavior, when the same thread repeatedly locks and unlocks the mutex,
-while other threads can't lock the mutex.<P>
-
-In LinuxThreads 0.8 and up, <code>pthread_unlock</code> restarts only
-one waiting thread, and pre-assign the mutex to that thread. Hence,
-if the thread that unlocked the mutex tries to lock it again
-immediately, it will block until other waiting threads have had a
-chance to lock and unlock the mutex. This results in much fairer
-scheduling.<P>
-
-Notice however that even the old "unfair" behavior is perfectly
-acceptable with respect to the POSIX standard: for the default
-scheduling policy, POSIX makes no guarantees of fairness, such as "the
-thread waiting for the mutex for the longest time always acquires it
-first". Properly written multithreaded code avoids that kind of heavy
-contention on mutexes, and does not run into fairness problems. If
-you need scheduling guarantees, you should consider using the
-real-time scheduling policies <code>SCHED_RR</code> and
-<code>SCHED_FIFO</code>, which have precisely defined scheduling
-behaviors. <P>
-
-<H4><A NAME="D.7">D.7: I have a simple test program with two threads
-that do nothing but <CODE>printf()</CODE> in tight loops, and from the
-printout it seems that only one thread is running, the other doesn't
-print anything!</A></H4>
-
-Again, this behavior is characteristic of old releases of LinuxThreads
-(0.7 and before); more recent versions (0.8 and up) should not exhibit
-this behavior.<P>
-
-The reason for this behavior is explained in
-question <A HREF="#D.6">D.6</A> above: <CODE>printf()</CODE> performs
-locking on <CODE>stdout</CODE>, and thus your two threads contend very
-heavily for the mutex associated with <CODE>stdout</CODE>. But if you
-do some real work between two calls to <CODE>printf()</CODE>, you'll
-see that scheduling becomes much smoother.<P>
-
-<H4><A NAME="D.8">D.8: I've looked at <code>&lt;pthread.h&gt;</code>
-and there seems to be a gross error in the <code>pthread_cleanup_push</code>
-macro: it opens a block with <code>{</code> but does not close it!
-Surely you forgot a <code>}</code> at the end of the macro, right?
-</A></H4>
-
-Nope. That's the way it should be. The closing brace is provided by
-the <code>pthread_cleanup_pop</code> macro. The POSIX standard
-requires <code>pthread_cleanup_push</code> and
-<code>pthread_cleanup_pop</code> to be used in matching pairs, at the
-same level of brace nesting. This allows
-<code>pthread_cleanup_push</code> to open a block in order to
-stack-allocate some data structure, and
-<code>pthread_cleanup_pop</code> to close that block. It's ugly, but
-it's the standard way of implementing cleanup handlers.<P>
-
-<H4><A NAME="D.9">D.9: I tried to use real-time threads and my program
-loops like crazy and freezes the whole machine!</A></H4>
-
-Versions of LinuxThreads prior to 0.8 are susceptible to ``livelocks''
-(one thread loops, consuming 100% of the CPU time) in conjunction with
-real-time scheduling. Since real-time threads and processes have
-higher priority than normal Linux processes, all other processes on
-the machine, including the shell, the X server, etc, cannot run and
-the machine appears frozen.<P>
-
-The problem is fixed in LinuxThreads 0.8.<P>
-
-<H4><A NAME="D.10">D.10: My application needs to create thousands of
-threads, or maybe even more. Can I do this with
-LinuxThreads?</A></H4>
-
-No. You're going to run into several hard limits:
-<UL>
-<LI>Each thread, from the kernel's standpoint, is one process. Stock
-Linux kernels are limited to at most 512 processes for the super-user,
-and half this number for regular users. This can be changed by
-changing <code>NR_TASKS</code> in <code>include/linux/tasks.h</code>
-and recompiling the kernel. On the x86 processors at least,
-architectural constraints seem to limit <code>NR_TASKS</code> to 4090
-at most.
-<LI>LinuxThreads contains a table of all active threads. This table
-has room for 1024 threads at most. To increase this limit, you must
-change <code>PTHREAD_THREADS_MAX</code> in the LinuxThreads sources
-and recompile.
-<LI>By default, each thread reserves 2M of virtual memory space for
-its stack. This space is just reserved; actual memory is allocated
-for the stack on demand. But still, on a 32-bit processor, the total
-virtual memory space available for the stacks is on the order of 1G,
-meaning that more than 500 threads will have a hard time fitting in.
-You can overcome this limitation by moving to a 64-bit platform, or by
-allocating smaller stacks yourself using the <code>setstackaddr</code>
-attribute.
-<LI>Finally, the Linux kernel contains many algorithms that run in
-time proportional to the number of process table entries. Increasing
-this number drastically will slow down the kernel operations
-noticeably.
-</UL>
-(Other POSIX threads libraries have similar limitations, by the way.)
-For all those reasons, you'd better restructure your application so
-that it doesn't need more than, say, 100 threads. For instance,
-in the case of a multithreaded server, instead of creating a new
-thread for each connection, maintain a fixed-size pool of worker
-threads that pick incoming connection requests from a queue.<P>
-
-<HR>
-<P>
-
-<H2><A NAME="E">E. Missing functions, wrong types, etc</A></H2>
-
-<H4><A NAME="E.1">E.1: Where is <CODE>pthread_yield()</CODE> ? How
-comes LinuxThreads does not implement it?</A></H4>
-
-Because it's not part of the (final) POSIX 1003.1c standard.
-Several drafts of the standard contained <CODE>pthread_yield()</CODE>,
-but then the POSIX guys discovered it was redundant with
-<CODE>sched_yield()</CODE> and dropped it. So, just use
-<CODE>sched_yield()</CODE> instead.
-
-<H4><A NAME="E.2">E.2: I've found some type errors in
-<code>&lt;pthread.h&gt;</code>.
-For instance, the second argument to <CODE>pthread_create()</CODE>
-should be a <CODE>pthread_attr_t</CODE>, not a
-<CODE>pthread_attr_t *</CODE>. Also, didn't you forget to declare
-<CODE>pthread_attr_default</CODE>?</A></H4>
-
-No, I didn't. What you're describing is draft 4 of the POSIX
-standard, which is used in OSF DCE threads. LinuxThreads conforms to the
-final standard. Even though the functions have the same names as in
-draft 4 and DCE, their calling conventions are slightly different. In
-particular, attributes are passed by reference, not by value, and
-default attributes are denoted by the NULL pointer. Since draft 4/DCE
-will eventually disappear, you'd better port your program to use the
-standard interface.<P>
-
-<H4><A NAME="E.3">E.3: I'm porting an application from Solaris and I
-have to rename all thread functions from <code>thr_blah</code> to
-<CODE>pthread_blah</CODE>. This is very annoying. Why did you change
-all the function names?</A></H4>
-
-POSIX did it. The <code>thr_*</code> functions correspond to Solaris
-threads, an older thread interface that you'll find only under
-Solaris. The <CODE>pthread_*</CODE> functions correspond to POSIX
-threads, an international standard available for many, many platforms.
-Even Solaris 2.5 and later support the POSIX threads interface. So,
-do yourself a favor and rewrite your code to use POSIX threads: this
-way, it will run unchanged under Linux, Solaris, and quite a lot of
-other platforms.<P>
-
-<H4><A NAME="E.4">E.4: How can I suspend and resume a thread from
-another thread? Solaris has the <CODE>thr_suspend()</CODE> and
-<CODE>thr_resume()</CODE> functions to do that; why don't you?</A></H4>
-
-The POSIX standard provides <B>no</B> mechanism by which a thread A can
-suspend the execution of another thread B, without cooperation from B.
-The only way to implement a suspend/restart mechanism is to have B
-check periodically some global variable for a suspend request
-and then suspend itself on a condition variable, which another thread
-can signal later to restart B.<P>
-
-Notice that <CODE>thr_suspend()</CODE> is inherently dangerous and
-prone to race conditions. For one thing, there is no control on where
-the target thread stops: it can very well be stopped in the middle of
-a critical section, while holding mutexes. Also, there is no
-guarantee on when the target thread will actually stop. For these
-reasons, you'd be much better off using mutexes and conditions
-instead. The only situations that really require the ability to
-suspend a thread are debuggers and some kind of garbage collectors.<P>
-
-If you really must suspend a thread in LinuxThreads, you can send it a
-<CODE>SIGSTOP</CODE> signal with <CODE>pthread_kill</CODE>. Send
-<CODE>SIGCONT</CODE> for restarting it.
-Beware, this is specific to LinuxThreads and entirely non-portable.
-Indeed, a truly conforming POSIX threads implementation will stop all
-threads when one thread receives the <CODE>SIGSTOP</CODE> signal!
-One day, LinuxThreads will implement that behavior, and the
-non-portable hack with <CODE>SIGSTOP</CODE> won't work anymore.<P>
-
-<H4><A NAME="E.5">E.5: Does LinuxThreads implement
-<CODE>pthread_attr_setstacksize()</CODE> and
-<CODE>pthread_attr_setstackaddr()</CODE>?</A></H4>
-
-These optional functions are provided in recent versions of
-LinuxThreads (0.8 and up). Earlier releases did not provide these
-optional components of the POSIX standard.<P>
-
-Even if <CODE>pthread_attr_setstacksize()</CODE> and
-<CODE>pthread_attr_setstackaddr()</CODE> are now provided, we still
-recommend that you do not use them unless you really have strong
-reasons for doing so. The default stack allocation strategy for
-LinuxThreads is nearly optimal: stacks start small (4k) and
-automatically grow on demand to a fairly large limit (2M).
-Moreover, there is no portable way to estimate the stack requirements
-of a thread, so setting the stack size yourself makes your program
-less reliable and non-portable.<P>
-
-<H4><A NAME="E.6">E.6: LinuxThreads does not support the
-<CODE>PTHREAD_SCOPE_PROCESS</CODE> value of the "contentionscope"
-attribute. Why? </A></H4>
-
-With a "one-to-one" model, as in LinuxThreads (one kernel execution
-context per thread), there is only one scheduler for all processes and
-all threads on the system. So, there is no way to obtain the behavior of
-<CODE>PTHREAD_SCOPE_PROCESS</CODE>.
-
-<H4><A NAME="E.7">E.7: LinuxThreads does not implement process-shared
-mutexes, conditions, and semaphores. Why?</A></H4>
-
-This is another optional component of the POSIX standard. Portable
-applications should test <CODE>_POSIX_THREAD_PROCESS_SHARED</CODE>
-before using this facility.
-<P>
-The goal of this extension is to allow different processes (with
-different address spaces) to synchronize through mutexes, conditions
-or semaphores allocated in shared memory (either SVR4 shared memory
-segments or <CODE>mmap()</CODE>ed files).
-<P>
-The reason why this does not work in LinuxThreads is that mutexes,
-conditions, and semaphores are not self-contained: their waiting
-queues contain pointers to linked lists of thread descriptors, and
-these pointers are meaningful only in one address space.
-<P>
-Matt Messier and I spent a significant amount of time trying to design a
-suitable mechanism for sharing waiting queues between processes. We
-came up with several solutions that combined two of the following
-three desirable features, but none that combines all three:
-<UL>
-<LI>allow sharing between processes having different UIDs
-<LI>supports cancellation
-<LI>supports <CODE>pthread_cond_timedwait</CODE>
-</UL>
-We concluded that kernel support is required to share mutexes,
-conditions and semaphores between processes. That's one place where
-Linus Torvalds's intuition that "all we need in the kernel is
-<CODE>clone()</CODE>" fails.
-<P>
-Until suitable kernel support is available, you'd better use
-traditional interprocess communications to synchronize different
-processes: System V semaphores and message queues, or pipes, or sockets.
-<P>
-
-<HR>
-<P>
-
-<H2><A NAME="F">F. C++ issues</A></H2>
-
-<H4><A NAME="F.1">F.1: Are there C++ wrappers for LinuxThreads?</A></H4>
-
-Douglas Schmidt's ACE library contains, among a lot of other
-things, C++ wrappers for LinuxThreads and quite a number of other
-thread libraries. Check out
-<A HREF="http://www.cs.wustl.edu/~schmidt/ACE.html">http://www.cs.wustl.edu/~schmidt/ACE.html</A><P>
-
-<H4><A NAME="F.2">F.2: I'm trying to use LinuxThreads from a C++
-program, and the compiler complains about the third argument to
-<CODE>pthread_create()</CODE> !</A></H4>
-
-You're probably trying to pass a class member function or some
-other C++ thing as third argument to <CODE>pthread_create()</CODE>.
-Recall that <CODE>pthread_create()</CODE> is a C function, and it must
-be passed a C function as third argument.<P>
-
-<H4><A NAME="F.3">F.3: I'm trying to use LinuxThreads in conjunction
-with libg++, and I'm having all sorts of trouble.</A></H4>
-
->From what I understand, thread support in libg++ is completely broken,
-especially with respect to locking of iostreams. H.J.Lu wrote:
-<BLOCKQUOTE>
-If you want to use thread, I can only suggest egcs and glibc. You
-can find egcs at
-<A HREF="http://www.cygnus.com/egcs">http://www.cygnus.com/egcs</A>.
-egcs has libsdtc++, which is MT safe under glibc 2. If you really
-want to use the libg++, I have a libg++ add-on for egcs.
-</BLOCKQUOTE>
-<HR>
-<P>
-
-<H2><A NAME="G">G. Debugging LinuxThreads programs</A></H2>
-
-<H4><A NAME="G.1">G.1: Can I debug LinuxThreads program using gdb?</A></H4>
-
-Yes, but not with the stock gdb 4.17. You need a specially patched
-version of gdb 4.17 developed by Eric Paire and colleages at The Open
-Group, Grenoble. The patches against gdb 4.17 are available at
-<A HREF="http://www.gr.opengroup.org/java/jdk/linux/debug.htm"><code>http://www.gr.opengroup.org/java/jdk/linux/debug.htm</code></A>.
-Precompiled binaries of the patched gdb are available in RedHat's RPM
-format at <A
-HREF="http://odin.appliedtheory.com/"><code>http://odin.appliedtheory.com/</code></A>.<P>
-
-Some Linux distributions provide an already-patched version of gdb;
-others don't. For instance, the gdb in RedHat 5.2 is thread-aware,
-but apparently not the one in RedHat 6.0. Just ask (politely) the
-makers of your Linux distributions to please make sure that they apply
-the correct patches to gdb.<P>
-
-<H4><A NAME="G.2">G.2: Does it work with post-mortem debugging?</A></H4>
-
-Not very well. Generally, the core file does not correspond to the
-thread that crashed. The reason is that the kernel will not dump core
-for a process that shares its memory with other processes, such as the
-other threads of your program. So, the thread that crashes silently
-disappears without generating a core file. Then, all other threads of
-your program die on the same signal that killed the crashing thread.
-(This is required behavior according to the POSIX standard.) The last
-one that dies is no longer sharing its memory with anyone else, so the
-kernel generates a core file for that thread. Unfortunately, that's
-not the thread you are interested in.
-
-<H4><A NAME="G.3">G.3: Any other ways to debug multithreaded programs, then?</A></H4>
-
-Assertions and <CODE>printf()</CODE> are your best friends. Try to debug
-sequential parts in a single-threaded program first. Then, put
-<CODE>printf()</CODE> statements all over the place to get execution traces.
-Also, check invariants often with the <CODE>assert()</CODE> macro. In truth,
-there is no other effective way (save for a full formal proof of your
-program) to track down concurrency bugs. Debuggers are not really
-effective for subtle concurrency problems, because they disrupt
-program execution too much.<P>
-
-<HR>
-<P>
-
-<H2><A NAME="H">H. Compiling multithreaded code; errno madness</A></H2>
-
-<H4><A NAME="H.1">H.1: You say all multithreaded code must be compiled
-with <CODE>_REENTRANT</CODE> defined. What difference does it make?</A></H4>
-
-It affects include files in three ways:
-<UL>
-<LI> The include files define prototypes for the reentrant variants of
-some of the standard library functions,
-e.g. <CODE>gethostbyname_r()</CODE> as a reentrant equivalent to
-<CODE>gethostbyname()</CODE>.<P>
-
-<LI> If <CODE>_REENTRANT</CODE> is defined, some
-<code>&lt;stdio.h&gt;</code> functions are no longer defined as macros,
-e.g. <CODE>getc()</CODE> and <CODE>putc()</CODE>. In a multithreaded
-program, stdio functions require additional locking, which the macros
-don't perform, so we must call functions instead.<P>
-
-<LI> More importantly, <code>&lt;errno.h&gt;</code> redefines errno when
-<CODE>_REENTRANT</CODE> is
-defined, so that errno refers to the thread-specific errno location
-rather than the global errno variable. This is achieved by the
-following <code>#define</code> in <code>&lt;errno.h&gt;</code>:
-<PRE>
- #define errno (*(__errno_location()))
-</PRE>
-which causes each reference to errno to call the
-<CODE>__errno_location()</CODE> function for obtaining the location
-where error codes are stored. libc provides a default definition of
-<CODE>__errno_location()</CODE> that always returns
-<code>&errno</code> (the address of the global errno variable). Thus,
-for programs not linked with LinuxThreads, defining
-<CODE>_REENTRANT</CODE> makes no difference w.r.t. errno processing.
-But LinuxThreads redefines <CODE>__errno_location()</CODE> to return a
-location in the thread descriptor reserved for holding the current
-value of errno for the calling thread. Thus, each thread operates on
-a different errno location.
-</UL>
-<P>
-
-<H4><A NAME="H.2">H.2: Why is it so important that each thread has its
-own errno variable? </A></H4>
-
-If all threads were to store error codes in the same, global errno
-variable, then the value of errno after a system call or library
-function returns would be unpredictable: between the time a system
-call stores its error code in the global errno and your code inspects
-errno to see which error occurred, another thread might have stored
-another error code in the same errno location. <P>
-
-<H4><A NAME="H.3">H.3: What happens if I link LinuxThreads with code
-not compiled with <CODE>-D_REENTRANT</CODE>?</A></H4>
-
-Lots of trouble. If the code uses <CODE>getc()</CODE> or
-<CODE>putc()</CODE>, it will perform I/O without proper interlocking
-of the stdio buffers; this can cause lost output, duplicate output, or
-just crash other stdio functions. If the code consults errno, it will
-get back the wrong error code. The following code fragment is a
-typical example:
-<PRE>
- do {
- r = read(fd, buf, n);
- if (r == -1) {
- if (errno == EINTR) /* an error we can handle */
- continue;
- else { /* other errors are fatal */
- perror("read failed");
- exit(100);
- }
- }
- } while (...);
-</PRE>
-Assume this code is not compiled with <CODE>-D_REENTRANT</CODE>, and
-linked with LinuxThreads. At run-time, <CODE>read()</CODE> is
-interrupted. Since the C library was compiled with
-<CODE>-D_REENTRANT</CODE>, <CODE>read()</CODE> stores its error code
-in the location pointed to by <CODE>__errno_location()</CODE>, which
-is the thread-local errno variable. Then, the code above sees that
-<CODE>read()</CODE> returns -1 and looks up errno. Since
-<CODE>_REENTRANT</CODE> is not defined, the reference to errno
-accesses the global errno variable, which is most likely 0. Hence the
-code concludes that it cannot handle the error and stops.<P>
-
-<H4><A NAME="H.4">H.4: With LinuxThreads, I can no longer use the signals
-<code>SIGUSR1</code> and <code>SIGUSR2</code> in my programs! Why? </A></H4>
-
-The short answer is: because the Linux kernel you're using does not
-support realtime signals. <P>
-
-LinuxThreads needs two signals for its internal operation.
-One is used to suspend and restart threads blocked on mutex, condition
-or semaphore operations. The other is used for thread
-cancellation.<P>
-
-On ``old'' kernels (2.0 and early 2.1 kernels), there are only 32
-signals available and the kernel reserves all of them but two:
-<code>SIGUSR1</code> and <code>SIGUSR2</code>. So, LinuxThreads has
-no choice but use those two signals.<P>
-
-On recent kernels (2.2 and up), more than 32 signals are provided in
-the form of realtime signals. When run on one of those kernels,
-LinuxThreads uses two reserved realtime signals for its internal
-operation, thus leaving <code>SIGUSR1</code> and <code>SIGUSR2</code>
-free for user code. (This works only with glibc, not with libc 5.) <P>
-
-<H4><A NAME="H.5">H.5: Is the stack of one thread visible from the
-other threads? Can I pass a pointer into my stack to other threads?
-</A></H4>
-
-Yes, you can -- if you're very careful. The stacks are indeed visible
-from all threads in the system. Some non-POSIX thread libraries seem
-to map the stacks for all threads at the same virtual addresses and
-change the memory mapping when they switch from one thread to
-another. But this is not the case for LinuxThreads, as it would make
-context switching between threads more expensive, and at any rate
-might not conform to the POSIX standard.<P>
-
-So, you can take the address of an "auto" variable and pass it to
-other threads via shared data structures. However, you need to make
-absolutely sure that the function doing this will not return as long
-as other threads need to access this address. It's the usual mistake
-of returning the address of an "auto" variable, only made much worse
-because of concurrency. It's much, much safer to systematically
-heap-allocate all shared data structures. <P>
-
-<HR>
-<P>
-
-<H2><A NAME="I">I. X-Windows and other libraries</A></H2>
-
-<H4><A NAME="I.1">I.1: My program uses both Xlib and LinuxThreads.
-It stops very early with an "Xlib: unknown 0 error" message. What
-does this mean? </A></H4>
-
-That's a prime example of the errno problem described in question <A
-HREF="#H.2">H.2</A>. The binaries for Xlib you're using have not been
-compiled with <CODE>-D_REENTRANT</CODE>. It happens Xlib contains a
-piece of code very much like the one in question <A
-HREF="#H.2">H.2</A>. So, your Xlib fetches the error code from the
-wrong errno location and concludes that an error it cannot handle
-occurred.<P>
-
-<H4><A NAME="I.2">I.2: So, what can I do to build a multithreaded X
-Windows client? </A></H4>
-
-The best solution is to use X libraries that have been compiled with
-multithreading options set. Linux distributions that come with glibc
-2 as the main C library generally provide thread-safe X libraries.
-At least, that seems to be the case for RedHat 5 and later.<P>
-
-You can try to recompile yourself the X libraries with multithreading
-options set. They contain optional support for multithreading; it's
-just that the binaries provided by your Linux distribution were built
-without this support. See the file <code>README.Xfree3.3</code> in
-the LinuxThreads distribution for patches and info on how to compile
-thread-safe X libraries from the Xfree3.3 distribution. The Xfree3.3
-sources are readily available in most Linux distributions, e.g. as a
-source RPM for RedHat. Be warned, however, that X Windows is a huge
-system, and recompiling even just the libraries takes a lot of time
-and disk space.<P>
-
-Another, less involving solution is to call X functions only from the
-main thread of your program. Even if all threads have their own errno
-location, the main thread uses the global errno variable for its errno
-location. Thus, code not compiled with <code>-D_REENTRANT</code>
-still "sees" the right error values if it executes in the main thread
-only. <P>
-
-<H4><A NAME="I.2">This is a lot of work. Don't you have precompiled
-thread-safe X libraries that you could distribute?</A></H4>
-
-No, I don't. Sorry. But consider installing a Linux distribution
-that comes with thread-safe X libraries, such as RedHat 6.<P>
-
-<H4><A NAME="I.3">I.3: Can I use library FOO in a multithreaded
-program?</A></H4>
-
-Most libraries cannot be used "as is" in a multithreaded program.
-For one thing, they are not necessarily thread-safe: calling
-simultaneously two functions of the library from two threads might not
-work, due to internal use of global variables and the like. Second,
-the libraries must have been compiled with <CODE>-D_REENTRANT</CODE> to avoid
-the errno problems explained in question <A HREF="#H.2">H.2</A>.
-<P>
-
-<H4><A NAME="I.4">I.4: What if I make sure that only one thread calls
-functions in these libraries?</A></H4>
-
-This avoids problems with the library not being thread-safe. But
-you're still vulnerable to errno problems. At the very least, a
-recompile of the library with <CODE>-D_REENTRANT</CODE> is needed.
-<P>
-
-<H4><A NAME="I.5">I.5: What if I make sure that only the main thread
-calls functions in these libraries?</A></H4>
-
-That might actually work. As explained in question <A HREF="#I.1">I.1</A>,
-the main thread uses the global errno variable, and can therefore
-execute code not compiled with <CODE>-D_REENTRANT</CODE>.<P>
-
-<H4><A NAME="I.6">I.6: SVGAlib doesn't work with LinuxThreads. Why?
-</A></H4>
-
-Because both LinuxThreads and SVGAlib use the signals
-<code>SIGUSR1</code> and <code>SIGUSR2</code>. See question <A
-HREF="#H.4">H.4</A>.
-<P>
-
-
-<HR>
-<P>
-
-<H2><A NAME="J">J. Signals and threads</A></H2>
-
-<H4><A NAME="J.1">J.1: When it comes to signals, what is shared
-between threads and what isn't?</A></H4>
-
-Signal handlers are shared between all threads: when a thread calls
-<CODE>sigaction()</CODE>, it sets how the signal is handled not only
-for itself, but for all other threads in the program as well.<P>
-
-On the other hand, signal masks are per-thread: each thread chooses
-which signals it blocks independently of others. At thread creation
-time, the newly created thread inherits the signal mask of the thread
-calling <CODE>pthread_create()</CODE>. But afterwards, the new thread
-can modify its signal mask independently of its creator thread.<P>
-
-<H4><A NAME="J.2">J.2: When I send a <CODE>SIGKILL</CODE> to a
-particular thread using <CODE>pthread_kill</CODE>, all my threads are
-killed!</A></H4>
-
-That's how it should be. The POSIX standard mandates that all threads
-should terminate when the process (i.e. the collection of all threads
-running the program) receives a signal whose effect is to
-terminate the process (such as <CODE>SIGKILL</CODE> or <CODE>SIGINT</CODE>
-when no handler is installed on that signal). This behavior makes a
-lot of sense: when you type "ctrl-C" at the keyboard, or when a thread
-crashes on a division by zero or a segmentation fault, you really want
-all threads to stop immediately, not just the one that caused the
-segmentation violation or that got the <CODE>SIGINT</CODE> signal.
-(This assumes default behavior for those signals; see question
-<A HREF="#J.3">J.3</A> if you install handlers for those signals.)<P>
-
-If you're trying to terminate a thread without bringing the whole
-process down, use <code>pthread_cancel()</code>.<P>
-
-<H4><A NAME="J.3">J.3: I've installed a handler on a signal. Which
-thread executes the handler when the signal is received?</A></H4>
-
-If the signal is generated by a thread during its execution (e.g. a
-thread executes a division by zero and thus generates a
-<CODE>SIGFPE</CODE> signal), then the handler is executed by that
-thread. This also applies to signals generated by
-<CODE>raise()</CODE>.<P>
-
-If the signal is sent to a particular thread using
-<CODE>pthread_kill()</CODE>, then that thread executes the handler.<P>
-
-If the signal is sent via <CODE>kill()</CODE> or the tty interface
-(e.g. by pressing ctrl-C), then the POSIX specs say that the handler
-is executed by any thread in the process that does not currently block
-the signal. In other terms, POSIX considers that the signal is sent
-to the process (the collection of all threads) as a whole, and any
-thread that is not blocking this signal can then handle it.<P>
-
-The latter case is where LinuxThreads departs from the POSIX specs.
-In LinuxThreads, there is no real notion of ``the process as a whole'':
-in the kernel, each thread is really a distinct process with a
-distinct PID, and signals sent to the PID of a thread can only be
-handled by that thread. As long as no thread is blocking the signal,
-the behavior conforms to the standard: one (unspecified) thread of the
-program handles the signal. But if the thread to which PID the signal
-is sent blocks the signal, and some other thread does not block the
-signal, then LinuxThreads will simply queue in
-that thread and execute the handler only when that thread unblocks
-the signal, instead of executing the handler immediately in the other
-thread that does not block the signal.<P>
-
-This is to be viewed as a LinuxThreads bug, but I currently don't see
-any way to implement the POSIX behavior without kernel support.<P>
-
-<H4><A NAME="J.3">J.3: How shall I go about mixing signals and threads
-in my program? </A></H4>
-
-The less you mix them, the better. Notice that all
-<CODE>pthread_*</CODE> functions are not async-signal safe, meaning
-that you should not call them from signal handlers. This
-recommendation is not to be taken lightly: your program can deadlock
-if you call a <CODE>pthread_*</CODE> function from a signal handler!
-<P>
-
-The only sensible things you can do from a signal handler is set a
-global flag, or call <CODE>sem_post</CODE> on a semaphore, to record
-the delivery of the signal. The remainder of the program can then
-either poll the global flag, or use <CODE>sem_wait()</CODE> and
-<CODE>sem_trywait()</CODE> on the semaphore.<P>
-
-Another option is to do nothing in the signal handler, and dedicate
-one thread (preferably the initial thread) to wait synchronously for
-signals, using <CODE>sigwait()</CODE>, and send messages to the other
-threads accordingly.
-
-<H4><A NAME="J.4">J.4: When one thread is blocked in
-<CODE>sigwait()</CODE>, other threads no longer receive the signals
-<CODE>sigwait()</CODE> is waiting for! What happens? </A></H4>
-
-It's an unfortunate consequence of how LinuxThreads implements
-<CODE>sigwait()</CODE>. Basically, it installs signal handlers on all
-signals waited for, in order to record which signal was received.
-Since signal handlers are shared with the other threads, this
-temporarily deactivates any signal handlers you might have previously
-installed on these signals.<P>
-
-Though surprising, this behavior actually seems to conform to the
-POSIX standard. According to POSIX, <CODE>sigwait()</CODE> is
-guaranteed to work as expected only if all other threads in the
-program block the signals waited for (otherwise, the signals could be
-delivered to other threads than the one doing <CODE>sigwait()</CODE>,
-which would make <CODE>sigwait()</CODE> useless). In this particular
-case, the problem described in this question does not appear.<P>
-
-One day, <CODE>sigwait()</CODE> will be implemented in the kernel,
-along with others POSIX 1003.1b extensions, and <CODE>sigwait()</CODE>
-will have a more natural behavior (as well as better performances).<P>
-
-<HR>
-<P>
-
-<H2><A NAME="K">K. Internals of LinuxThreads</A></H2>
-
-<H4><A NAME="K.1">K.1: What is the implementation model for
-LinuxThreads?</A></H4>
-
-LinuxThreads follows the so-called "one-to-one" model: each thread is
-actually a separate process in the kernel. The kernel scheduler takes
-care of scheduling the threads, just like it schedules regular
-processes. The threads are created with the Linux
-<code>clone()</code> system call, which is a generalization of
-<code>fork()</code> allowing the new process to share the memory
-space, file descriptors, and signal handlers of the parent.<P>
-
-Advantages of the "one-to-one" model include:
-<UL>
-<LI> minimal overhead on CPU-intensive multiprocessing (with
-about one thread per processor);
-<LI> minimal overhead on I/O operations;
-<LI> a simple and robust implementation (the kernel scheduler does
-most of the hard work for us).
-</UL>
-The main disadvantage is more expensive context switches on mutex and
-condition operations, which must go through the kernel. This is
-mitigated by the fact that context switches in the Linux kernel are
-pretty efficient.<P>
-
-<H4><A NAME="K.2">K.2: Have you considered other implementation
-models?</A></H4>
-
-There are basically two other models. The "many-to-one" model
-relies on a user-level scheduler that context-switches between the
-threads entirely in user code; viewed from the kernel, there is only
-one process running. This model is completely out of the question for
-me, since it does not take advantage of multiprocessors, and require
-unholy magic to handle blocking I/O operations properly. There are
-several user-level thread libraries available for Linux, but I found
-all of them deficient in functionality, performance, and/or robustness.
-<P>
-
-The "many-to-many" model combines both kernel-level and user-level
-scheduling: several kernel-level threads run concurrently, each
-executing a user-level scheduler that selects between user threads.
-Most commercial Unix systems (Solaris, Digital Unix, IRIX) implement
-POSIX threads this way. This model combines the advantages of both
-the "many-to-one" and the "one-to-one" model, and is attractive
-because it avoids the worst-case behaviors of both models --
-especially on kernels where context switches are expensive, such as
-Digital Unix. Unfortunately, it is pretty complex to implement, and
-requires kernel support which Linux does not provide. Linus Torvalds
-and other Linux kernel developers have always been pushing the
-"one-to-one" model in the name of overall simplicity, and are doing a
-pretty good job of making kernel-level context switches between
-threads efficient. LinuxThreads is just following the general
-direction they set.<P>
-
-<HR>
-<ADDRESS>Xavier.Leroy@inria.fr</ADDRESS>
-</BODY>
-</HTML>
diff --git a/linuxthreads/LICENSE b/linuxthreads/LICENSE
deleted file mode 100644
index 7bcca60504..0000000000
--- a/linuxthreads/LICENSE
+++ /dev/null
@@ -1,501 +0,0 @@
-GNU LIBRARY GENERAL PUBLIC LICENSE
-**********************************
-
- Version 2, June 1991
-
- Copyright (C) 1991 Free Software Foundation, Inc.
- 59 Temple Place -- Suite 330, Boston, MA 02111-1307, USA
-
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- [This is the first released version of the library GPL. It is
- numbered 2 because it goes with version 2 of the ordinary GPL.]
-
-Preamble
-========
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Library General Public License, applies to some
-specially designated Free Software Foundation software, and to any
-other libraries whose authors decide to use it. You can use it for
-your libraries, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it in
-new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the library, or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link a program with the library, you must provide
-complete object files to the recipients so that they can relink them
-with the library, after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- Our method of protecting your rights has two steps: (1) copyright
-the library, and (2) offer you this license which gives you legal
-permission to copy, distribute and/or modify the library.
-
- Also, for each distributor's protection, we want to make certain
-that everyone understands that there is no warranty for this free
-library. If the library is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original
-version, so that any problems introduced by others will not reflect on
-the original authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that companies distributing free
-software will individually obtain patent licenses, thus in effect
-transforming the program into proprietary software. To prevent this,
-we have made it clear that any patent must be licensed for everyone's
-free use or not licensed at all.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License, which was designed for utility
-programs. This license, the GNU Library General Public License,
-applies to certain designated libraries. This license is quite
-different from the ordinary one; be sure to read it in full, and don't
-assume that anything in it is the same as in the ordinary license.
-
- The reason we have a separate public license for some libraries is
-that they blur the distinction we usually make between modifying or
-adding to a program and simply using it. Linking a program with a
-library, without changing the library, is in some sense simply using
-the library, and is analogous to running a utility program or
-application program. However, in a textual and legal sense, the linked
-executable is a combined work, a derivative of the original library,
-and the ordinary General Public License treats it as such.
-
- Because of this blurred distinction, using the ordinary General
-Public License for libraries did not effectively promote software
-sharing, because most developers did not use the libraries. We
-concluded that weaker conditions might promote sharing better.
-
- However, unrestricted linking of non-free programs would deprive the
-users of those programs of all benefit from the free status of the
-libraries themselves. This Library General Public License is intended
-to permit developers of non-free programs to use free libraries, while
-preserving your freedom as a user of such programs to change the free
-libraries that are incorporated in them. (We have not seen how to
-achieve this as regards changes in header files, but we have achieved
-it as regards changes in the actual functions of the Library.) The
-hope is that this will lead to faster development of free libraries.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, while the latter only
-works together with the library.
-
- Note that it is possible for a library to be covered by the ordinary
-General Public License rather than by this special one.
-
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library which
- contains a notice placed by the copyright holder or other
- authorized party saying it may be distributed under the terms of
- this Library General Public License (also called "this License").
- Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
- prepared so as to be conveniently linked with application programs
- (which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
- which has been distributed under these terms. A "work based on the
- Library" means either the Library or any derivative work under
- copyright law: that is to say, a work containing the Library or a
- portion of it, either verbatim or with modifications and/or
- translated straightforwardly into another language. (Hereinafter,
- translation is included without limitation in the term
- "modification".)
-
- "Source code" for a work means the preferred form of the work for
- making modifications to it. For a library, complete source code
- means all the source code for all modules it contains, plus any
- associated interface definition files, plus the scripts used to
- control compilation and installation of the library.
-
- Activities other than copying, distribution and modification are
- not covered by this License; they are outside its scope. The act
- of running a program using the Library is not restricted, and
- output from such a program is covered only if its contents
- constitute a work based on the Library (independent of the use of
- the Library in a tool for writing it). Whether that is true
- depends on what the Library does and what the program that uses
- the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
- complete source code as you receive it, in any medium, provided
- that you conspicuously and appropriately publish on each copy an
- appropriate copyright notice and disclaimer of warranty; keep
- intact all the notices that refer to this License and to the
- absence of any warranty; and distribute a copy of this License
- along with the Library.
-
- You may charge a fee for the physical act of transferring a copy,
- and you may at your option offer warranty protection in exchange
- for a fee.
-
- 2. You may modify your copy or copies of the Library or any portion
- of it, thus forming a work based on the Library, and copy and
- distribute such modifications or work under the terms of Section 1
- above, provided that you also meet all of these conditions:
-
- a. The modified work must itself be a software library.
-
- b. You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c. You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d. If a facility in the modified Library refers to a function or
- a table of data to be supplied by an application program that
- uses the facility, other than as an argument passed when the
- facility is invoked, then you must make a good faith effort
- to ensure that, in the event an application does not supply
- such function or table, the facility still operates, and
- performs whatever part of its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots
- has a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function
- must be optional: if the application does not supply it, the
- square root function must still compute square roots.)
-
- These requirements apply to the modified work as a whole. If
- identifiable sections of that work are not derived from the
- Library, and can be reasonably considered independent and separate
- works in themselves, then this License, and its terms, do not
- apply to those sections when you distribute them as separate
- works. But when you distribute the same sections as part of a
- whole which is a work based on the Library, the distribution of
- the whole must be on the terms of this License, whose permissions
- for other licensees extend to the entire whole, and thus to each
- and every part regardless of who wrote it.
-
- Thus, it is not the intent of this section to claim rights or
- contest your rights to work written entirely by you; rather, the
- intent is to exercise the right to control the distribution of
- derivative or collective works based on the Library.
-
- In addition, mere aggregation of another work not based on the
- Library with the Library (or with a work based on the Library) on
- a volume of a storage or distribution medium does not bring the
- other work under the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
- License instead of this License to a given copy of the Library.
- To do this, you must alter all the notices that refer to this
- License, so that they refer to the ordinary GNU General Public
- License, version 2, instead of to this License. (If a newer
- version than version 2 of the ordinary GNU General Public License
- has appeared, then you can specify that version instead if you
- wish.) Do not make any other change in these notices.
-
- Once this change is made in a given copy, it is irreversible for
- that copy, so the ordinary GNU General Public License applies to
- all subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
- the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
- derivative of it, under Section 2) in object code or executable
- form under the terms of Sections 1 and 2 above provided that you
- accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software
- interchange.
-
- If distribution of object code is made by offering access to copy
- from a designated place, then offering equivalent access to copy
- the source code from the same place satisfies the requirement to
- distribute the source code, even though third parties are not
- compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
- Library, but is designed to work with the Library by being
- compiled or linked with it, is called a "work that uses the
- Library". Such a work, in isolation, is not a derivative work of
- the Library, and therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
- creates an executable that is a derivative of the Library (because
- it contains portions of the Library), rather than a "work that
- uses the library". The executable is therefore covered by this
- License. Section 6 states terms for distribution of such
- executables.
-
- When a "work that uses the Library" uses material from a header
- file that is part of the Library, the object code for the work may
- be a derivative work of the Library even though the source code is
- not. Whether this is true is especially significant if the work
- can be linked without the Library, or if the work is itself a
- library. The threshold for this to be true is not precisely
- defined by law.
-
- If such an object file uses only numerical parameters, data
- structure layouts and accessors, and small macros and small inline
- functions (ten lines or less in length), then the use of the object
- file is unrestricted, regardless of whether it is legally a
- derivative work. (Executables containing this object code plus
- portions of the Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
- distribute the object code for the work under the terms of Section
- 6. Any executables containing that work also fall under Section 6,
- whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also compile or
- link a "work that uses the Library" with the Library to produce a
- work containing portions of the Library, and distribute that work
- under terms of your choice, provided that the terms permit
- modification of the work for the customer's own use and reverse
- engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
- Library is used in it and that the Library and its use are covered
- by this License. You must supply a copy of this License. If the
- work during execution displays copyright notices, you must include
- the copyright notice for the Library among them, as well as a
- reference directing the user to the copy of this License. Also,
- you must do one of these things:
-
- a. Accompany the work with the complete corresponding
- machine-readable source code for the Library including
- whatever changes were used in the work (which must be
- distributed under Sections 1 and 2 above); and, if the work
- is an executable linked with the Library, with the complete
- machine-readable "work that uses the Library", as object code
- and/or source code, so that the user can modify the Library
- and then relink to produce a modified executable containing
- the modified Library. (It is understood that the user who
- changes the contents of definitions files in the Library will
- not necessarily be able to recompile the application to use
- the modified definitions.)
-
- b. Accompany the work with a written offer, valid for at least
- three years, to give the same user the materials specified in
- Subsection 6a, above, for a charge no more than the cost of
- performing this distribution.
-
- c. If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the
- above specified materials from the same place.
-
- d. Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
- Library" must include any data and utility programs needed for
- reproducing the executable from it. However, as a special
- exception, the source code distributed need not include anything
- that is normally distributed (in either source or binary form)
- with the major components (compiler, kernel, and so on) of the
- operating system on which the executable runs, unless that
- component itself accompanies the executable.
-
- It may happen that this requirement contradicts the license
- restrictions of other proprietary libraries that do not normally
- accompany the operating system. Such a contradiction means you
- cannot use both them and the Library together in an executable
- that you distribute.
-
- 7. You may place library facilities that are a work based on the
- Library side-by-side in a single library together with other
- library facilities not covered by this License, and distribute
- such a combined library, provided that the separate distribution
- of the work based on the Library and of the other library
- facilities is otherwise permitted, and provided that you do these
- two things:
-
- a. Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b. Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same
- work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute the
- Library except as expressly provided under this License. Any
- attempt otherwise to copy, modify, sublicense, link with, or
- distribute the Library is void, and will automatically terminate
- your rights under this License. However, parties who have
- received copies, or rights, from you under this License will not
- have their licenses terminated so long as such parties remain in
- full compliance.
-
- 9. You are not required to accept this License, since you have not
- signed it. However, nothing else grants you permission to modify
- or distribute the Library or its derivative works. These actions
- are prohibited by law if you do not accept this License.
- Therefore, by modifying or distributing the Library (or any work
- based on the Library), you indicate your acceptance of this
- License to do so, and all its terms and conditions for copying,
- distributing or modifying the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
- Library), the recipient automatically receives a license from the
- original licensor to copy, distribute, link with or modify the
- Library subject to these terms and conditions. You may not impose
- any further restrictions on the recipients' exercise of the rights
- granted herein. You are not responsible for enforcing compliance
- by third parties to this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
- infringement or for any other reason (not limited to patent
- issues), conditions are imposed on you (whether by court order,
- agreement or otherwise) that contradict the conditions of this
- License, they do not excuse you from the conditions of this
- License. If you cannot distribute so as to satisfy simultaneously
- your obligations under this License and any other pertinent
- obligations, then as a consequence you may not distribute the
- Library at all. For example, if a patent license would not permit
- royalty-free redistribution of the Library by all those who
- receive copies directly or indirectly through you, then the only
- way you could satisfy both it and this License would be to refrain
- entirely from distribution of the Library.
-
- If any portion of this section is held invalid or unenforceable
- under any particular circumstance, the balance of the section is
- intended to apply, and the section as a whole is intended to apply
- in other circumstances.
-
- It is not the purpose of this section to induce you to infringe any
- patents or other property right claims or to contest validity of
- any such claims; this section has the sole purpose of protecting
- the integrity of the free software distribution system which is
- implemented by public license practices. Many people have made
- generous contributions to the wide range of software distributed
- through that system in reliance on consistent application of that
- system; it is up to the author/donor to decide if he or she is
- willing to distribute software through any other system and a
- licensee cannot impose that choice.
-
- This section is intended to make thoroughly clear what is believed
- to be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
- certain countries either by patents or by copyrighted interfaces,
- the original copyright holder who places the Library under this
- License may add an explicit geographical distribution limitation
- excluding those countries, so that distribution is permitted only
- in or among countries not thus excluded. In such case, this
- License incorporates the limitation as if written in the body of
- this License.
-
- 13. The Free Software Foundation may publish revised and/or new
- versions of the Library General Public License from time to time.
- Such new versions will be similar in spirit to the present version,
- but may differ in detail to address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
- Library specifies a version number of this License which applies
- to it and "any later version", you have the option of following
- the terms and conditions either of that version or of any later
- version published by the Free Software Foundation. If the Library
- does not specify a license version number, you may choose any
- version ever published by the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
- programs whose distribution conditions are incompatible with these,
- write to the author to ask for permission. For software which is
- copyrighted by the Free Software Foundation, write to the Free
- Software Foundation; we sometimes make exceptions for this. Our
- decision will be guided by the two goals of preserving the free
- status of all derivatives of our free software and of promoting
- the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
- WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE
- LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
- HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT
- WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
- NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE
- QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE
- LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
- SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
- WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
- MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE
- LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
- INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
- INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF
- DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
- OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY
- OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
- ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
-How to Apply These Terms to Your New Libraries
-==============================================
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of
-the ordinary General Public License).
-
- To apply these terms, attach the following notices to the library.
-It is safest to attach them to the start of each source file to most
-effectively convey the exclusion of warranty; and each file should have
-at least the "copyright" line and a pointer to where the full notice is
-found.
-
- ONE LINE TO GIVE THE LIBRARY'S NAME AND AN IDEA OF WHAT IT DOES.
- Copyright (C) YEAR NAME OF AUTHOR
-
- This 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.
-
- This library is distributed in the hope that 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 General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
-
- Also add information on how to contact you by electronic and paper
-mail.
-
- You should also get your employer (if you work as a programmer) or
-your school, if any, to sign a "copyright disclaimer" for the library,
-if necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the library
- `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- SIGNATURE OF TY COON, 1 April 1990
- Ty Coon, President of Vice
-
- That's all there is to it!
-
diff --git a/linuxthreads/Makeconfig b/linuxthreads/Makeconfig
deleted file mode 100644
index 5470c22b97..0000000000
--- a/linuxthreads/Makeconfig
+++ /dev/null
@@ -1,11 +0,0 @@
-# Makeconfig fragment for linuxthreads add-on.
-# This gets included at the end of the main glibc Makeconfig.
-
-have-thread-library = yes
-
-shared-thread-library = $(common-objpfx)linuxthreads/libpthread_nonshared.a \
- $(common-objpfx)linuxthreads/libpthread.so
-static-thread-library = $(common-objpfx)linuxthreads/libpthread.a
-bounded-thread-library = $(common-objpfx)linuxthreads/libpthread_b.a
-
-rpath-dirs += linuxthreads
diff --git a/linuxthreads/Makefile b/linuxthreads/Makefile
deleted file mode 100644
index c2b548b38b..0000000000
--- a/linuxthreads/Makefile
+++ /dev/null
@@ -1,348 +0,0 @@
-# Copyright (C) 1996-2003, 2004, 2005 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, write to the Free
-# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-# 02111-1307 USA.
-
-#
-# Sub-makefile for linuxthreads portion of the library.
-#
-subdir := linuxthreads
-
-all: # Make this the default target; it will be defined in Rules.
-
-linuxthreads-version := $(shell sed -n 's/^.*$(subdir)-\([0-9.]*\).*$$/\1/p' \
- Banner)
-libpthread-abi-frozen := GLIBC_2.3.2
-
-headers := pthread.h semaphore.h
-distribute := internals.h queue.h restart.h spinlock.h smp.h tst-signal.sh \
- tst-cancel-wrappers.sh libc-tsd.c
-
-routines := forward alloca_cutoff libc-cancellation libc_pthread_init
-shared-only-routines = forward
-
-extra-libs := libpthread
-extra-libs-others := $(extra-libs)
-install-lib-ldscripts := libpthread.so
-
-libpthread-routines := attr cancel condvar join manager mutex ptfork \
- ptlongjmp pthread pt-sigsuspend signals specific errno \
- lockfile semaphore spinlock rwlock pt-machine \
- oldsemaphore events getcpuclockid pspinlock barrier \
- ptclock_gettime ptclock_settime sighandler \
- pthandles libc-tls-loc pt-allocrtsig \
- ptw-write ptw-read ptw-close ptw-fcntl ptw-accept \
- ptw-connect ptw-recv ptw-recvfrom ptw-recvmsg \
- ptw-send ptw-sendmsg ptw-sendto ptw-fsync ptw-lseek \
- ptw-lseek64 ptw-llseek ptw-msync ptw-nanosleep \
- ptw-open ptw-open64 ptw-pause ptw-pread ptw-pread64 \
- ptw-pwrite ptw-pwrite64 ptw-tcdrain ptw-wait \
- ptw-waitpid pt-system old_pthread_atfork pthread_atfork \
- ptcleanup
-# pthread_setuid pthread_seteuid pthread_setreuid \
-# pthread_setresuid \
-# pthread_setgid pthread_setegid pthread_setregid \
-# pthread_setresgid
-
-# Don't generate deps for calls with no sources. See sysdeps/unix/Makefile.
-omit-deps = $(unix-syscalls:%=ptw-%)
-
-libpthread-shared-only-routines = pt-allocrtsig
-libpthread-static-only-routines = pthread_atfork
-
-linuxthreads-CPPFLAGS = -DIS_IN_linuxthreads=1
-
-CFLAGS-pthread_atfork.c = -DNOT_IN_libc
-
-nodelete-yes = -Wl,--enable-new-dtags,-z,nodelete
-initfirst-yes = -Wl,--enable-new-dtags,-z,initfirst
-LDFLAGS-pthread.so = $(nodelete-$(have-z-nodelete)) \
- $(initfirst-$(have-z-initfirst))
-
-vpath %.c Examples
-
-tst-cancel-ARGS = "$(objpfx)"
-CFLAGS-tst-cancel.c = -fno-inline -fno-inline-functions
-
-include ../Makeconfig
-
-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 $@
-generated += multidir.mk
-
-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
-omit-deps += $(multidir)/crti $(multidir)/crtn
-endif
-extra-objs += $(crti-objs) $(crtn-objs)
-omit-deps += crti crtn
-
-CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions $(fno-unit-at-a-time)
-endif
-
-librt-tests = ex10 ex11 tst-clock1
-tests = ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8 ex9 $(librt-tests) ex12 ex13 joinrace \
- tststack $(tests-nodelete-$(have-z-nodelete)) ecmutex ex14 ex15 ex16 \
- ex17 ex18 tst-cancel tst-context bug-sleep \
- tst-cancel1 tst-cancel2 tst-cancel3 tst-cancel4 tst-cancel5 \
- tst-cancel6 tst-cancel7 tst-cancel8 tst-popen tst-popen2 tst-attr1 \
- tst-stack1 tst-align tst-tsd1
-test-srcs = tst-signal
-# These tests are linked with libc before libpthread
-tests-reverse += tst-cancel5
-
-ifeq ($(build-static),yes)
-tests += tststatic tst-static-locale tst-cancel-static
-tests-static += tststatic tst-static-locale tst-cancel-static
-endif
-
-ifeq (yes,$(build-shared))
-tests-nodelete-yes = unload
-tests += tst-tls1 tst-_res1
-endif
-
-modules-names = tst-_res1mod1 tst-_res1mod2 \
- tst-tls1mod tst-tls1moda tst-tls1modb tst-tls1modc \
- tst-tls1modd tst-tls1mode tst-tls1modf
-extra-objs += $(addsuffix .os,$(strip $(modules-names)))
-generated += $(addsuffix .so,$(strip $(modules-names)))
-test-extras += $(modules-names)
-test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(modules-names)))
-
-tst-tls1mod.so-no-z-defs = yes
-tst-tls1moda.so-no-z-defs = yes
-tst-tls1modb.so-no-z-defs = yes
-tst-tls1modc.so-no-z-defs = yes
-tst-tls1modd.so-no-z-defs = yes
-tst-tls1mode.so-no-z-defs = yes
-tst-tls1modf.so-no-z-defs = yes
-
-$(test-modules): $(objpfx)%.so: $(objpfx)%.os $(common-objpfx)shlib.lds
- $(build-module)
-
-ifeq ($(build-shared),yes)
-# Build all the modules even when not actually running test programs.
-tests: $(test-modules)
-endif
-
-# 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 $@
-
-
-extra-B-pthread.so = -B$(common-objpfx)linuxthreads/
-$(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))
-
-znodelete-yes = -DHAVE_Z_NODELETE
-CFLAGS-mutex.c += -D__NO_WEAK_PTHREAD_ALIASES
-CFLAGS-specific.c += -D__NO_WEAK_PTHREAD_ALIASES
-CFLAGS-pthread.c += -D__NO_WEAK_PTHREAD_ALIASES $(znodelete-$(have-z-nodelete))
-CFLAGS-ptfork.c += -D__NO_WEAK_PTHREAD_ALIASES
-CFLAGS-cancel.c += -D__NO_WEAK_PTHREAD_ALIASES -D_RPC_THREAD_SAFE_
-CFLAGS-unload.c += -DPREFIX=\"$(objpfx)\"
-CFLAGS-mutex.c += $(uses-callbacks)
-CFLAGS-sighandler.c += $(uses-callbacks)
-
-ifeq (yes,$(versioning))
--include $(common-objpfx)tls.make
-libc-ok-for-link = $(use-thread)
-else
-libc-ok-for-link = yes
-endif
-
-ifeq (no,$(libc-ok-for-link))
-# These hacks are necessary to let us link against a libc.so that exports
-# the symbols _errno, _h_errno, and _res. Those symbols are accessible
-# in libc at runtime (dynamic linkable), but are not exported at link time
-# so that applications cannot link against them. However, libpthread.so
-# needs to link against them for its __errno_location et al functions to
-# find the locations that libc's symbols resolve to. We cannot do this
-# with aliases in libc.so(GLIBC_PRIVATE), because we need to refer to an
-# executable's symbols when it defines them with copy relocs.
-libc-link.so = $(objpfx)libc.so
-
-$(objpfx)libc_pic_lite.a: $(common-objpfx)libc_pic.a
- cp $< $@T
- $(AR) d $@T errno.os herrno.os res_libc.os
- mv -f $@T $@
-
-extra-objs += libc-tsd.os
-$(objpfx)libc_pic_lite.os: $(objpfx)libc_pic_lite.a $(objpfx)libc-tsd.os
- $(LINK.o) -nostdlib -nostartfiles -r -o $@ \
- $(LDFLAGS-c_pic.os) -Wl,-d -Wl,--whole-archive $^
-
-# This trick leaves errno and h_errno undefined.
-libc.so-no-z-defs = yes
-
-$(objpfx)libc.so: $(elfobjdir)/soinit.os \
- $(objpfx)libc_pic_lite.os \
- $(elfobjdir)/sofini.os \
- $(elfobjdir)/interp.os $(elfobjdir)/ld.so
- $(build-shlib)
-
-generated += libc_pic_lite.a libc_pic_lite.os libc.so libc-tsd.os
-else
-libc-link.so = $(common-objpfx)libc.so
-endif
-
-include ../Rules
-
-# Depend on libc.so so a DT_NEEDED is generated in the shared objects.
-# This ensures they will load libc.so for needed symbols if loaded by
-# a statically-linked program that hasn't already loaded it.
-# Depend on ld.so too to get proper versions of ld.so symbols.
-$(objpfx)libpthread.so: $(libc-link.so) $(common-objpfx)libc_nonshared.a \
- $(if $(filter yes,$(elf)), $(elfobjdir)/ld.so)
-
-# Make sure we link with the thread library.
-ifeq ($(build-shared),yes)
-$(addprefix $(objpfx), \
- $(filter-out $(tests-static) $(tests-reverse) unload, \
- $(tests) $(test-srcs))): $(objpfx)libpthread.so \
- $(objpfx)libpthread_nonshared.a
-# $(objpfx)linklibc.so is used instead of $(common-objpfx)libc.so,
-# since otherwise libpthread.so comes before libc.so when linking.
-$(addprefix $(objpfx), $(tests-reverse)): \
- $(objpfx)linklibc.so $(objpfx)libpthread.so \
- $(objpfx)libpthread_nonshared.a
-$(objpfx)../libc.so: $(common-objpfx)libc.so ;
-$(addprefix $(objpfx),$(librt-tests)): $(common-objpfx)rt/librt.so
-$(objpfx)unload: $(common-objpfx)dlfcn/libdl.so
-$(objpfx)unload.out: $(objpfx)libpthread.so $(objpfx)libpthread_nonshared.a
-$(objpfx)linklibc.so: $(common-objpfx)libc.so
- ln -s ../libc.so $@
-generated += libclink.so
-else
-$(addprefix $(objpfx),$(tests) $(test-srcs)): $(objpfx)libpthread.a
-$(addprefix $(objpfx),$(librt-tests)): $(common-objpfx)rt/librt.a
-endif
-ifeq ($(build-bounded),yes)
-$(tests:%=$(objpfx)%-bp): $(objpfx)libpthread_b.a
-$(librt-tests:%=$(objpfx)%-bp): $(common-objpfx)rt/librt_b.a
-endif
-
-ifeq ($(build-static),yes)
-$(addprefix $(objpfx), $(tests-static)): $(objpfx)libpthread.a
-endif
-
-ifeq ($(build-shared),yes)
-vpath pt-initfini.c $(full_config_sysdirs)
-
-$(objpfx)pt-initfini.s: pt-initfini.c
- $(compile.c) -S $(CFLAGS-pt-initfini.s) -finhibit-size-directive \
- $(patsubst -f%,-fno-%,$(exceptions)) -o $@
-
-# We only have one kind of startup code files. Static binaries and
-# shared libraries are build using the PIC version.
-$(objpfx)crti.S: $(objpfx)pt-initfini.s
- sed -n -e '1,/@HEADER_ENDS/p' \
- -e '/@_.*_PROLOG_BEGINS/,/@_.*_PROLOG_ENDS/p' \
- -e '/@TRAILER_BEGINS/,$$p' $< > $@
-$(objpfx)crtn.S: $(objpfx)pt-initfini.s
- sed -n -e '1,/@HEADER_ENDS/p' \
- -e '/@_.*_EPILOG_BEGINS/,/@_.*_EPILOG_ENDS/p' \
- -e '/@TRAILER_BEGINS/,$$p' $< > $@
-
-$(objpfx)defs.h: $(objpfx)pt-initfini.s
- sed -n -e '/@TESTS_BEGIN/,/@TESTS_END/p' $< | \
- $(AWK) -f ../csu/defs.awk > $@
-
-$(objpfx)crti.o: $(objpfx)crti.S $(objpfx)defs.h
- $(compile.S) -g0 $(ASFLAGS-.os) -o $@
-
-$(objpfx)crtn.o: $(objpfx)crtn.S $(objpfx)defs.h
- $(compile.S) -g0 $(ASFLAGS-.os) -o $@
-
-ifneq ($(multidir),.)
-$(objpfx)$(multidir):
- @mkdir -p $(objpfx)$(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 += crti.S crtn.S defs.h pt-initfini.s libpthread_nonshared.a
-endif
-
-ifeq (yes,$(build-static-nss))
-otherlibs += $(nssobjdir)/libnss_files.a $(resolvobjdir)/libnss_dns.a \
- $(resolvobjdir)/libresolv.a
-endif
-
-ifeq (yes,$(build-shared))
-$(objpfx)tst-_res1mod2.so: $(objpfx)tst-_res1mod1.so
-$(objpfx)tst-_res1: $(objpfx)tst-_res1mod2.so $(shared-thread-library)
-
-$(objpfx)tst-tls1: $(objpfx)tst-tls1mod.so $(shared-thread-library)
-
-tests: $(objpfx)tst-tls2.out
-$(objpfx)tst-tls2.out: tst-tls2.sh $(objpfx)tst-tls1 \
- $(objpfx)tst-tls1moda.so $(objpfx)tst-tls1modb.so \
- $(objpfx)tst-tls1modc.so $(objpfx)tst-tls1modd.so \
- $(objpfx)tst-tls1mode.so $(objpfx)tst-tls1modf.so
- $(SHELL) -e tst-tls2.sh $(common-objpfx) $(elf-objpfx) \
- $(rtld-installed-name)
-generated += tst-tls2.out
-endif
-
-ifeq (no,$(cross-compiling))
-ifeq (yes,$(build-shared))
-tests: $(objpfx)tst-signal.out $(objpfx)tst-cancel-wrappers.out
-$(objpfx)tst-signal.out: tst-signal.sh $(objpfx)tst-signal
- $(SHELL) -e $< $(common-objpfx) > $@
-$(objpfx)tst-cancel-wrappers.out: tst-cancel-wrappers.sh
- $(SHELL) $< $(common-objpfx)/libc_pic.a \
- $(common-objpfx)/libc.a \
- $(objpfx)/libpthread_pic.a \
- $(objpfx)/libpthread.a > $@
-generated += tst-signal.out tst-cancel-wrappers.out
-endif
-endif
diff --git a/linuxthreads/README b/linuxthreads/README
deleted file mode 100644
index 955bd59e7a..0000000000
--- a/linuxthreads/README
+++ /dev/null
@@ -1,166 +0,0 @@
- Linuxthreads - POSIX 1003.1c kernel threads for Linux
-
- Copyright 1996, 1997 Xavier Leroy (Xavier.Leroy@inria.fr)
-
-
-DESCRIPTION:
-
-This is release 0.7 (late beta) of LinuxThreads, a BiCapitalized
-implementation of the Posix 1003.1c "pthread" interface for Linux.
-
-LinuxThreads provides kernel-level threads: each thread is a separate
-Unix process, sharing its address space with the other threads through
-the new system call clone(). Scheduling between threads is handled by
-the kernel scheduler, just like scheduling between Unix processes.
-
-
-REQUIREMENTS:
-
-- Linux version 2.0 and up (requires the new clone() system call
- and the new realtime scheduler).
-
-- For Intel platforms: libc 5.2.18 or later is required.
- 5.2.18 or 5.4.12 or later are recommended;
- 5.3.12 and 5.4.7 have problems (see the FAQ.html file for more info).
-
-- Also supports glibc 2 (a.k.a. libc 6), which actually comes with
- a specially-adapted version of this library.
-
-- Currently supports Intel, Alpha, Sparc, Motorola 68k, ARM and MIPS
- platforms.
-
-- Multiprocessors are supported.
-
-
-INSTALLATION:
-
-- Edit the Makefile, set the variables in the "Configuration" section.
-
-- Do "make".
-
-- Do "make install".
-
-
-USING LINUXTHREADS:
-
- gcc -D_REENTRANT ... -lpthread
-
-A complete set of manual pages is included. Also see the subdirectory
-Examples/ for some sample programs.
-
-
-STATUS:
-
-- All functions in the Posix 1003.1c base interface implemented.
- Also supports priority scheduling.
-
-- For users of libc 5 (H.J.Lu's libc), a number of C library functions
- are reimplemented or wrapped to make them thread-safe, including:
- * malloc functions
- * stdio functions (define _REENTRANT before including <stdio.h>)
- * per-thread errno variable (define _REENTRANT before including <errno.h>)
- * directory reading functions (opendir(), etc)
- * sleep()
- * gmtime(), localtime()
-
- New library functions provided:
- * flockfile(), funlockfile(), ftrylockfile()
- * reentrant versions of network database functions (gethostbyname_r(), etc)
- and password functions (getpwnam_r(), etc).
-
-- libc 6 (glibc 2) provides much better thread support than libc 5,
- and comes with a specially-adapted version of LinuxThreads.
- For serious multithreaded programming, you should consider switching
- to glibc 2. It is available from ftp.gnu.org:/pub/gnu and its mirrors.
-
-
-WARNING:
-
-Many existing libraries are not compatible with LinuxThreads,
-either because they are not inherently thread-safe, or because they
-have not been compiled with the -D_REENTRANT. For more info, see the
-FAQ.html file in this directory.
-
-A prime example of the latter is Xlib. If you link it with
-LinuxThreads, you'll probably get an "unknown 0 error" very
-early. This is just a consequence of the Xlib binaries using the
-global variable "errno" to fetch error codes, while LinuxThreads and
-the C library use the per-thread "errno" location.
-
-See the file README.Xfree3.3 for info on how to compile the Xfree 3.3
-libraries to make them compatible with LinuxThreads.
-
-
-KNOWN BUGS AND LIMITATIONS:
-
-- Threads share pretty much everything they should share according
- to the standard: memory space, file descriptors, signal handlers,
- current working directory, etc. One thing that they do not share
- is their pid's and parent pid's. According to the standard, they
- should have the same, but that's one thing we cannot achieve
- in this implementation (until the CLONE_PID flag to clone() becomes
- usable).
-
-- The current implementation uses the two signals SIGUSR1 and SIGUSR2,
- so user-level code cannot employ them. Ideally, there should be two
- signals reserved for this library. One signal is used for restarting
- threads blocked on mutexes or conditions; the other is for thread
- cancellation.
-
- *** This is not anymore true when the application runs on a kernel
- newer than approximately 2.1.60.
-
-- The stacks for the threads are allocated high in the memory space,
- below the stack of the initial process, and spaced 2M apart.
- Stacks are allocated with the "grow on demand" flag, so they don't
- use much virtual space initially (4k, currently), but can grow
- up to 2M if needed.
-
- Reserving such a large address space for each thread means that,
- on a 32-bit architecture, no more than about 1000 threads can
- coexist (assuming a 2Gb address space for user processes),
- but this is reasonable, since each thread uses up one entry in the
- kernel's process table, which is usually limited to 512 processes.
-
- Another potential problem of the "grow on demand" scheme is that
- nothing prevents the user from mmap'ing something in the 2M address
- window reserved for a thread stack, possibly causing later extensions of
- that stack to fail. Mapping at fixed addresses should be avoided
- when using this library.
-
-- Signal handling does not fully conform to the Posix standard,
- due to the fact that threads are here distinct processes that can be
- sent signals individually, so there's no notion of sending a signal
- to "the" process (the collection of all threads).
- More precisely, here is a summary of the standard requirements
- and how they are met by the implementation:
-
- 1- Synchronous signals (generated by the thread execution, e.g. SIGFPE)
- are delivered to the thread that raised them.
- (OK.)
-
- 2- A fatal asynchronous signal terminates all threads in the process.
- (OK. The thread manager notices when a thread dies on a signal
- and kills all other threads with the same signal.)
-
- 3- An asynchronous signal will be delivered to one of the threads
- of the program which does not block the signal (it is unspecified
- which).
- (No, the signal is delivered to the thread it's been sent to,
- based on the pid of the thread. If that thread is currently
- blocking the signal, the signal remains pending.)
-
- 4- The signal will be delivered to at most one thread.
- (OK, except for signals generated from the terminal or sent to
- the process group, which will be delivered to all threads.)
-
-- The current implementation of the MIPS support assumes a MIPS ISA II
- processor or better. These processors support atomic operations by
- ll/sc instructions. Older R2000/R3000 series processors are not
- supported yet; support for these will have higher overhead.
-
-- The current implementation of the ARM support assumes that the SWP
- (atomic swap register with memory) instruction is available. This is
- the case for all processors except for the ARM1 and ARM2. On StrongARM,
- the SWP instruction does not bypass the cache, so multi-processor support
- will be more troublesome.
diff --git a/linuxthreads/README.Xfree3.2 b/linuxthreads/README.Xfree3.2
deleted file mode 100644
index ac08e15832..0000000000
--- a/linuxthreads/README.Xfree3.2
+++ /dev/null
@@ -1,352 +0,0 @@
-This file describes how to make a threaded X11R6.
-
-You need the source-code of XFree-3.2. I used the sources of X11R6.1
-(files: xc-1.tar.gz xc-2.tar.gz xc-3.tar.gz) and the patches to
-XFree-3.2 (files: README.X11.patch R6.1pl1-3.2.diff.gz cfont32.tgz).
-
-Untar the xc-?.tar.gz files in a directory called XF3.2 and apply
-the XFree-3.2 patches as described in README.X11.patch or use the
-whole XFree86 source.
-
-Now apply the thread patch with
-
-patch -p0 < XF3.2.xc.diff
-
-Go to the XF3.2/xc directory and make the whole thing:
-nice make World >& world.log &
-tail -f world.log
-
-Wait a few hours or interrupt the process after the shared libs
-are made. The shared libs are:
-
-XF3.2/xc/lib/ICE/libICE.so.6.0*
-XF3.2/xc/lib/PEX5/libPEX5.so.6.0*
-XF3.2/xc/lib/SM/libSM.so.6.0*
-XF3.2/xc/lib/X11/libX11.so.6.1*
-XF3.2/xc/lib/XIE/libXIE.so.6.0*
-XF3.2/xc/lib/XThrStub/libXThrStub.so.6.0*
-XF3.2/xc/lib/Xaw/libXaw.so.6.1*
-XF3.2/xc/lib/Xext/libXext.so.6.1*
-XF3.2/xc/lib/Xi/libXi.so.6.0*
-XF3.2/xc/lib/Xmu/libXmu.so.6.0*
-XF3.2/xc/lib/Xt/libXt.so.6.0*
-XF3.2/xc/lib/Xtst/libXtst.so.6.1*
-
-(The Program dga didn't compile, but I have not check out why.)
-
-Now you can copy the resulting libs
-
-cp XF3.2/xc/lib/*/*.so.?.? /usr/X11R6/lib/
-
-and create some links
-
-cd /usr/X11R6/lib/
-ln -s libXThrStub.so.6.0 libXThrStub.so.6
-ln -s libXThrStub.so.6 libXThrStub.so
-
-or use make install (not tested, and needs new configuration).
-
-It is possible with the libXThrSub to compile X11 programs without linking
-libpthread to them and not necessary to recompile already installed
-unthreaded X11 programs, because libXThrSub keeps the dynamic linker quit.
-On the other hand you can link libpthread to a X11 program to use threads.
-
-I used linux 2.0.23 and libc 5.4.7 .
-
-Hans-Helmut Bühmann hans@expmech.ing.tu-bs.de
-
-----------------------------------------------------------------------------
-
-XF3.2.xc.diff:
------------------------------------------------------------------------------
-diff -u --recursive XF3.2.orig/xc/config/cf/linux.cf XF3.2/xc/config/cf/linux.cf
---- XF3.2.orig/xc/config/cf/linux.cf Sun Nov 10 17:05:30 1996
-+++ XF3.2/xc/config/cf/linux.cf Sun Nov 10 16:30:55 1996
-@@ -61,6 +61,14 @@
- #define HasSnprintf YES
- #endif
-
-+#define HasPosixThreads YES
-+#define ThreadedX YES
-+#define BuildThreadStubLibrary YES
-+#define NeedUIThrStubs YES
-+#define HasThreadSafeAPI NO
-+#define SystemMTDefines -D_REENTRANT
-+#define ThreadsLibraries -lpthread
-+
- #define AvoidNullMakeCommand YES
- #define StripInstalledPrograms YES
- #define CompressAllFonts YES
-@@ -158,7 +166,7 @@
- #define LdPostLib /* Never needed */
-
- #ifdef i386Architecture
--#define OptimizedCDebugFlags DefaultGcc2i386Opt -m486
-+#define OptimizedCDebugFlags DefaultGcc2i386Opt -m486 -pipe
- #define StandardDefines -Dlinux -D__i386__ -D_POSIX_SOURCE \
- -D_BSD_SOURCE -D_SVID_SOURCE -DX_LOCALE
- #define XawI18nDefines -DUSE_XWCHAR_STRING -DUSE_XMBTOWC
-diff -u --recursive XF3.2.orig/xc/config/cf/lnxLib.tmpl XF3.2/xc/config/cf/lnxLib.tmpl
---- XF3.2.orig/xc/config/cf/lnxLib.tmpl Sun Nov 10 17:05:30 1996
-+++ XF3.2/xc/config/cf/lnxLib.tmpl Sat Nov 9 14:52:39 1996
-@@ -19,7 +19,7 @@
-
- #define CplusplusLibC
-
--#define SharedX11Reqs
-+#define SharedX11Reqs -L$(BUILDLIBDIR) -lXThrStub
- #define SharedOldXReqs $(LDPRELIB) $(XLIBONLY)
- #define SharedXtReqs $(LDPRELIB) $(XLIBONLY) $(SMLIB) $(ICELIB)
- #define SharedXawReqs $(LDPRELIB) $(XMULIB) $(XTOOLLIB) $(XLIB)
-diff -u --recursive XF3.2.orig/xc/include/Xthreads.h XF3.2/xc/include/Xthreads.h
---- XF3.2.orig/xc/include/Xthreads.h Thu Dec 7 02:19:09 1995
-+++ XF3.2/xc/include/Xthreads.h Sat Nov 9 01:04:55 1996
-@@ -229,12 +229,12 @@
- #define xcondition_wait(c,m) pthread_cond_wait(c,m)
- #define xcondition_signal(c) pthread_cond_signal(c)
- #define xcondition_broadcast(c) pthread_cond_broadcast(c)
--#ifdef _DECTHREADS_
-+#if defined(_DECTHREADS_) || defined(linux)
- static xthread_t _X_no_thread_id;
- #define xthread_have_id(id) !pthread_equal(id, _X_no_thread_id)
- #define xthread_clear_id(id) id = _X_no_thread_id
- #define xthread_equal(id1,id2) pthread_equal(id1, id2)
--#endif /* _DECTHREADS_ */
-+#endif /* _DECTHREADS_ || linux */
- #if _CMA_VENDOR_ == _CMA__IBM
- #ifdef DEBUG /* too much of a hack to enable normally */
- /* see also cma__obj_set_name() */
-diff -u --recursive XF3.2.orig/xc/lib/X11/util/makekeys.c XF3.2/xc/lib/X11/util/makekeys.c
---- XF3.2.orig/xc/lib/X11/util/makekeys.c Mon Apr 18 02:22:22 1994
-+++ XF3.2/xc/lib/X11/util/makekeys.c Sat Nov 9 00:44:14 1996
-@@ -73,7 +73,7 @@
- register char c;
- int first;
- int best_max_rehash;
-- int best_z;
-+ int best_z = 0;
- int num_found;
- KeySym val;
-
-diff -u --recursive XF3.2.orig/xc/lib/XThrStub/Imakefile XF3.2/xc/lib/XThrStub/Imakefile
---- XF3.2.orig/xc/lib/XThrStub/Imakefile Sun Nov 10 17:08:12 1996
-+++ XF3.2/xc/lib/XThrStub/Imakefile Sat Nov 9 19:04:51 1996
-@@ -25,7 +25,7 @@
- DEFINES = $(ALLOC_DEFINES)
- INCLUDES =
- SRCS = $(STUBSRCS)
-- OBJS = $(STUBOBJS
-+ OBJS = $(STUBOBJS)
- LINTLIBS = $(LINTXLIB)
-
- #include <Library.tmpl>
-diff -u --recursive XF3.2.orig/xc/lib/XThrStub/UIThrStubs.c XF3.2/xc/lib/XThrStub/UIThrStubs.c
---- XF3.2.orig/xc/lib/XThrStub/UIThrStubs.c Sun Nov 10 17:08:12 1996
-+++ XF3.2/xc/lib/XThrStub/UIThrStubs.c Sun Nov 10 15:14:55 1996
-@@ -37,16 +37,43 @@
- * specificies the thread library on the link line.
- */
-
-+#if defined(linux)
-+#include <pthread.h>
-+#else
- #include <thread.h>
- #include <synch.h>
-+#endif
-
-+#if defined(linux)
-+static pthread_t no_thread_id;
-+#endif /* defined(linux) */
-+
-+#if defined(linux)
-+#pragma weak pthread_self = _Xthr_self_stub_
-+pthread_t
-+_Xthr_self_stub_()
-+{
-+ return(no_thread_id);
-+}
-+#else /* defined(linux) */
- #pragma weak thr_self = _Xthr_self_stub_
- thread_t
- _Xthr_self_stub_()
- {
- return((thread_t)0);
- }
-+#endif /* defined(linux) */
-
-+#if defined(linux)
-+#pragma weak pthread_mutex_init = _Xmutex_init_stub_
-+int
-+_Xmutex_init_stub_(m, a)
-+ pthread_mutex_t *m;
-+ __const pthread_mutexattr_t *a;
-+{
-+ return(0);
-+}
-+#else /* defined(linux) */
- #pragma weak mutex_init = _Xmutex_init_stub_
- int
- _Xmutex_init_stub_(m, t, a)
-@@ -56,7 +83,17 @@
- {
- return(0);
- }
-+#endif /* defined(linux) */
-
-+#if defined(linux)
-+#pragma weak pthread_mutex_destroy = _Xmutex_destroy_stub_
-+int
-+_Xmutex_destroy_stub_(m)
-+ pthread_mutex_t *m;
-+{
-+ return(0);
-+}
-+#else /* defined(linux) */
- #pragma weak mutex_destroy = _Xmutex_destroy_stub_
- int
- _Xmutex_destroy_stub_(m)
-@@ -64,7 +101,17 @@
- {
- return(0);
- }
-+#endif /* defined(linux) */
-
-+#if defined(linux)
-+#pragma weak pthread_mutex_lock = _Xmutex_lock_stub_
-+int
-+_Xmutex_lock_stub_(m)
-+ pthread_mutex_t *m;
-+{
-+ return(0);
-+}
-+#else /* defined(linux) */
- #pragma weak mutex_lock = _Xmutex_lock_stub_
- int
- _Xmutex_lock_stub_(m)
-@@ -72,7 +119,17 @@
- {
- return(0);
- }
-+#endif /* defined(linux) */
-
-+#if defined(linux)
-+#pragma weak pthread_mutex_unlock = _Xmutex_unlock_stub_
-+int
-+_Xmutex_unlock_stub_(m)
-+ pthread_mutex_t *m;
-+{
-+ return(0);
-+}
-+#else /* defined(linux) */
- #pragma weak mutex_unlock = _Xmutex_unlock_stub_
- int
- _Xmutex_unlock_stub_(m)
-@@ -80,7 +137,18 @@
- {
- return(0);
- }
-+#endif /* defined(linux) */
-
-+#if defined(linux)
-+#pragma weak pthread_cond_init = _Xcond_init_stub_
-+int
-+_Xcond_init_stub_(c, a)
-+ pthread_cond_t *c;
-+ __const pthread_condattr_t *a;
-+{
-+ return(0);
-+}
-+#else /* defined(linux) */
- #pragma weak cond_init = _Xcond_init_stub_
- int
- _Xcond_init_stub_(c, t, a)
-@@ -90,7 +158,17 @@
- {
- return(0);
- }
-+#endif /* defined(linux) */
-
-+#if defined(linux)
-+#pragma weak pthread_cond_destroy = _Xcond_destroy_stub_
-+int
-+_Xcond_destroy_stub_(c)
-+ pthread_cond_t *c;
-+{
-+ return(0);
-+}
-+#else /* defined(linux) */
- #pragma weak cond_destroy = _Xcond_destroy_stub_
- int
- _Xcond_destroy_stub_(c)
-@@ -98,7 +176,18 @@
- {
- return(0);
- }
-+#endif /* defined(linux) */
-
-+#if defined(linux)
-+#pragma weak pthread_cond_wait = _Xcond_wait_stub_
-+int
-+_Xcond_wait_stub_(c,m)
-+ pthread_cond_t *c;
-+ pthread_mutex_t *m;
-+{
-+ return(0);
-+}
-+#else /* defined(linux) */
- #pragma weak cond_wait = _Xcond_wait_stub_
- int
- _Xcond_wait_stub_(c,m)
-@@ -107,7 +196,17 @@
- {
- return(0);
- }
-+#endif /* defined(linux) */
-
-+#if defined(linux)
-+#pragma weak pthread_cond_signal = _Xcond_signal_stub_
-+int
-+_Xcond_signal_stub_(c)
-+ pthread_cond_t *c;
-+{
-+ return(0);
-+}
-+#else /* defined(linux) */
- #pragma weak cond_signal = _Xcond_signal_stub_
- int
- _Xcond_signal_stub_(c)
-@@ -115,7 +214,17 @@
- {
- return(0);
- }
-+#endif /* defined(linux) */
-
-+#if defined(linux)
-+#pragma weak pthread_cond_broadcast = _Xcond_broadcast_stub_
-+int
-+_Xcond_broadcast_stub_(c)
-+ pthread_cond_t *c;
-+{
-+ return(0);
-+}
-+#else /* defined(linux) */
- #pragma weak cond_broadcast = _Xcond_broadcast_stub_
- int
- _Xcond_broadcast_stub_(c)
-@@ -123,3 +232,15 @@
- {
- return(0);
- }
-+#endif /* defined(linux) */
-+
-+#if defined(linux)
-+#pragma weak pthread_equal = _Xthr_equal_stub_
-+int
-+_Xthr_equal_stub_(t1, t2)
-+ pthread_t t1;
-+ pthread_t t2;
-+{
-+ return(1);
-+}
-+#endif /* defined(linux) */
--------------------------------------------------------------------------
diff --git a/linuxthreads/Versions b/linuxthreads/Versions
deleted file mode 100644
index 615a132e54..0000000000
--- a/linuxthreads/Versions
+++ /dev/null
@@ -1,188 +0,0 @@
-libc {
- GLIBC_2.0 {
- pthread_attr_destroy; pthread_attr_getdetachstate;
- pthread_attr_getinheritsched; pthread_attr_getschedparam;
- pthread_attr_getschedpolicy; pthread_attr_getscope; pthread_attr_init;
- pthread_attr_setdetachstate; pthread_attr_setinheritsched;
- pthread_attr_setschedparam; pthread_attr_setschedpolicy;
- pthread_attr_setscope; pthread_cond_broadcast; pthread_cond_destroy;
- pthread_cond_init; pthread_cond_signal; pthread_cond_wait;
- pthread_cond_timedwait;
- pthread_condattr_destroy; pthread_condattr_init; pthread_equal;
- pthread_exit; pthread_getschedparam; pthread_mutex_destroy;
- pthread_mutex_init; pthread_mutex_lock; pthread_mutex_unlock;
- pthread_self; pthread_setcancelstate; pthread_setcanceltype;
- pthread_setschedparam;
- }
- GLIBC_2.1 {
- pthread_attr_init;
- }
- GLIBC_2.3.2 {
- # Changed pthread_cond_t.
- pthread_cond_init; pthread_cond_destroy;
- pthread_cond_wait; pthread_cond_signal;
- pthread_cond_broadcast; pthread_cond_timedwait;
- }
- GLIBC_PRIVATE {
- # Internal libc interface to libpthread
- __libc_dl_error_tsd;
-
- __libc_pthread_init; __libc_current_sigrtmin_private;
- __libc_current_sigrtmax_private; __libc_allocate_rtsig_private;
-
- __libc_creat; __libc_poll; __libc_pselect; __libc_select;
- __libc_sigpause; __libc_sigsuspend; __libc_sigwait; __libc_sigwaitinfo;
- __libc_waitid; __libc___xpg_sigpause; __librt_enable_asynccancel;
- __librt_disable_asynccancel; __librt_multiple_threads;
-
- __libc_sigaction; __on_exit;
- }
-}
-
-libpthread {
- GLIBC_2.0 {
- # Hidden entry point (through macros).
- _pthread_cleanup_pop; _pthread_cleanup_pop_restore; _pthread_cleanup_push;
- _pthread_cleanup_push_defer;
-
- # Overwritten libc functions.
- accept; close; connect; fcntl; fork; fsync; longjmp; lseek; msync;
- nanosleep; open; pause; raise; read; recv; recvfrom; recvmsg; send;
- sendmsg; sendto; sigaction; siglongjmp; system; tcdrain; wait;
- waitpid; write;
- __close; __connect; __fcntl; __lseek; __open; __read; __send; __wait;
- __write;
- _IO_flockfile; _IO_ftrylockfile; _IO_funlockfile;
- vfork; __fork;
-
- # POSIX.1c extensions to libc.
- flockfile; funlockfile; ftrylockfile;
-
- # Non-standard POSIX1.x functions.
- pthread_kill_other_threads_np; pthread_mutexattr_getkind_np;
- pthread_mutexattr_setkind_np;
-
- # Real POSIX.1c functions.
- pthread_atfork; pthread_attr_destroy; pthread_attr_getdetachstate;
- pthread_attr_getinheritsched; pthread_attr_getschedparam;
- pthread_attr_getschedpolicy; pthread_attr_getscope; pthread_attr_init;
- pthread_attr_setdetachstate; pthread_attr_setinheritsched;
- pthread_attr_setschedparam; pthread_attr_setschedpolicy;
- pthread_attr_setscope; pthread_cancel; pthread_cond_broadcast;
- pthread_cond_destroy; pthread_cond_init; pthread_cond_signal;
- pthread_cond_timedwait; pthread_cond_wait; pthread_condattr_destroy;
- pthread_condattr_init; pthread_create; pthread_detach; pthread_equal;
- pthread_exit; pthread_getschedparam; pthread_getspecific; pthread_join;
- pthread_key_create; pthread_key_delete; pthread_kill;
- pthread_mutex_destroy; pthread_mutex_init; pthread_mutex_lock;
- pthread_mutex_trylock; pthread_mutex_unlock; pthread_mutexattr_destroy;
- pthread_mutexattr_init; pthread_once; pthread_self; pthread_setcancelstate;
- pthread_setcanceltype; pthread_setschedparam; pthread_setspecific;
- pthread_sigmask; pthread_testcancel;
-
- sem_destroy; sem_getvalue; sem_init; sem_post; sem_trywait; sem_wait;
- sigwait;
-
- # Protected names for functions used in other shared objects.
- __pthread_atfork; __pthread_getspecific;
- __pthread_key_create; __pthread_mutex_destroy; __pthread_mutex_init;
- __pthread_mutex_lock; __pthread_mutex_trylock; __pthread_mutex_unlock;
- __pthread_mutexattr_destroy; __pthread_mutexattr_init;
- __pthread_mutexattr_settype; __pthread_once; __pthread_setspecific;
-
- # The error functions.
- __errno_location; __h_errno_location;
-
- # Must be preemptible
- __sigaction;
- }
- GLIBC_2.1 {
- # Functions with changed interface.
- pthread_attr_init; pthread_create;
-
- # Unix98 extensions.
- pthread_rwlock_init; pthread_rwlock_destroy; pthread_rwlock_rdlock;
- pthread_rwlock_tryrdlock; pthread_rwlock_wrlock; 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_attr_getguardsize; pthread_attr_setguardsize;
- pthread_attr_getstackaddr; pthread_attr_setstackaddr;
- pthread_attr_getstacksize; pthread_attr_setstacksize;
-
- pthread_getconcurrency; pthread_setconcurrency;
-
- pthread_mutexattr_gettype; pthread_mutexattr_settype;
-
- sem_destroy; sem_getvalue; sem_init; sem_post; sem_trywait; sem_wait;
-
- # helper functions
- __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 {
- # For the cancelation wrappers.
- pread; __pread64; pread64; pwrite; __pwrite64; pwrite64; lseek64;
- open64; __open64;
-
- __res_state;
-
- # Names used internally.
- __pthread_rwlock_init; __pthread_rwlock_destroy; __pthread_rwlock_rdlock;
- __pthread_rwlock_tryrdlock; __pthread_rwlock_wrlock;
- __pthread_rwlock_trywrlock; __pthread_rwlock_unlock;
-
- # No really implemented.
- pthread_condattr_getpshared; pthread_condattr_setpshared;
- pthread_mutexattr_getpshared; pthread_mutexattr_setpshared;
-
- # New functions from IEEE Std. 1003.1-200x.
- sem_timedwait;
- pthread_attr_getstack; pthread_attr_setstack;
- pthread_spin_destroy; pthread_spin_init; pthread_spin_lock;
- pthread_spin_trylock; pthread_spin_unlock;
- pthread_getcpuclockid;
- pthread_barrier_destroy; pthread_barrier_init; pthread_barrier_wait;
- pthread_barrierattr_destroy; pthread_barrierattr_init;
- pthread_barrierattr_setpshared;
- pthread_mutex_timedlock;
- pthread_rwlock_timedrdlock; pthread_rwlock_timedwrlock;
-
- # Extensions.
- pthread_yield;
- }
- 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;
- }
-
- # Hey you!! Yes, YOU! Do not add new symbols here!
- # The linuxthreads libpthread ABI froze at GLIBC_2.3.2 and lacks
- # numerous additions that NPTL's libpthread has. We can't go adding
- # any new symbols here unless we support all the new symbols in NPTL,
- # and we don't want to do that. Linuxthreads is only alive for
- # compatibility with old binaries using old interfaces.
-
- GLIBC_PRIVATE {
- # Internal libc interface to libpthread
- __pthread_initialize;
- __pthread_kill_other_threads_np;
- }
-}
diff --git a/linuxthreads/alloca_cutoff.c b/linuxthreads/alloca_cutoff.c
deleted file mode 100644
index ca064b3bb6..0000000000
--- a/linuxthreads/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, 2003 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <alloca.h>
-#include <stdlib.h>
-#include <sys/param.h>
-#include "internals.h"
-#include <sysdep-cancel.h>
-
-int
-__libc_alloca_cutoff (size_t size)
-{
- if (! SINGLE_THREAD_P)
- {
- pthread_descr self = thread_self ();
- return size <= LIBC_THREAD_GETMEM (self, p_alloca_cutoff);
- }
-
- return size <= __MAX_ALLOCA_CUTOFF;
-}
diff --git a/linuxthreads/attr.c b/linuxthreads/attr.c
deleted file mode 100644
index 2adc7ccd7a..0000000000
--- a/linuxthreads/attr.c
+++ /dev/null
@@ -1,485 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* Handling of thread attributes */
-
-#include <errno.h>
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdio_ext.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/param.h>
-#include <sys/resource.h>
-#include "pthread.h"
-#include "internals.h"
-#include <shlib-compat.h>
-#include <ldsodefs.h>
-
-
-int __pthread_attr_init_2_1(pthread_attr_t *attr)
-{
- size_t ps = __getpagesize ();
-
- attr->__detachstate = PTHREAD_CREATE_JOINABLE;
- attr->__schedpolicy = SCHED_OTHER;
- attr->__schedparam.sched_priority = 0;
- attr->__inheritsched = PTHREAD_EXPLICIT_SCHED;
- attr->__scope = PTHREAD_SCOPE_SYSTEM;
-#ifdef NEED_SEPARATE_REGISTER_STACK
- attr->__guardsize = ps + ps;
-#else
- attr->__guardsize = ps;
-#endif
- attr->__stackaddr = NULL;
- attr->__stackaddr_set = 0;
- attr->__stacksize = STACK_SIZE - ps;
- 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)
-{
- attr->__detachstate = PTHREAD_CREATE_JOINABLE;
- attr->__schedpolicy = SCHED_OTHER;
- attr->__schedparam.sched_priority = 0;
- attr->__inheritsched = PTHREAD_EXPLICIT_SCHED;
- attr->__scope = PTHREAD_SCOPE_SYSTEM;
- return 0;
-}
-compat_symbol (libpthread, __pthread_attr_init_2_0, pthread_attr_init,
- GLIBC_2_0);
-#endif
-
-int __pthread_attr_destroy(pthread_attr_t *attr)
-{
- return 0;
-}
-strong_alias (__pthread_attr_destroy, pthread_attr_destroy);
-
-int __pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
-{
- if (detachstate < PTHREAD_CREATE_JOINABLE ||
- detachstate > PTHREAD_CREATE_DETACHED)
- return EINVAL;
- attr->__detachstate = detachstate;
- return 0;
-}
-strong_alias (__pthread_attr_setdetachstate, pthread_attr_setdetachstate);
-
-int __pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate)
-{
- *detachstate = attr->__detachstate;
- return 0;
-}
-strong_alias (__pthread_attr_getdetachstate, pthread_attr_getdetachstate);
-
-int __pthread_attr_setschedparam(pthread_attr_t *attr,
- const struct sched_param *param)
-{
- int max_prio = __sched_get_priority_max(attr->__schedpolicy);
- int min_prio = __sched_get_priority_min(attr->__schedpolicy);
-
- if (param->sched_priority < min_prio || param->sched_priority > max_prio)
- return EINVAL;
- memcpy (&attr->__schedparam, param, sizeof (struct sched_param));
- return 0;
-}
-strong_alias (__pthread_attr_setschedparam, pthread_attr_setschedparam);
-
-int __pthread_attr_getschedparam(const pthread_attr_t *attr,
- struct sched_param *param)
-{
- memcpy (param, &attr->__schedparam, sizeof (struct sched_param));
- return 0;
-}
-strong_alias (__pthread_attr_getschedparam, pthread_attr_getschedparam);
-
-int __pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy)
-{
- if (policy != SCHED_OTHER && policy != SCHED_FIFO && policy != SCHED_RR)
- return EINVAL;
- attr->__schedpolicy = policy;
- return 0;
-}
-strong_alias (__pthread_attr_setschedpolicy, pthread_attr_setschedpolicy);
-
-int __pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy)
-{
- *policy = attr->__schedpolicy;
- return 0;
-}
-strong_alias (__pthread_attr_getschedpolicy, pthread_attr_getschedpolicy);
-
-int __pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit)
-{
- if (inherit != PTHREAD_INHERIT_SCHED && inherit != PTHREAD_EXPLICIT_SCHED)
- return EINVAL;
- attr->__inheritsched = inherit;
- return 0;
-}
-strong_alias (__pthread_attr_setinheritsched, pthread_attr_setinheritsched);
-
-int __pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit)
-{
- *inherit = attr->__inheritsched;
- return 0;
-}
-strong_alias (__pthread_attr_getinheritsched, pthread_attr_getinheritsched);
-
-int __pthread_attr_setscope(pthread_attr_t *attr, int scope)
-{
- switch (scope) {
- case PTHREAD_SCOPE_SYSTEM:
- attr->__scope = scope;
- return 0;
- case PTHREAD_SCOPE_PROCESS:
- return ENOTSUP;
- default:
- return EINVAL;
- }
-}
-strong_alias (__pthread_attr_setscope, pthread_attr_setscope);
-
-int __pthread_attr_getscope(const pthread_attr_t *attr, int *scope)
-{
- *scope = attr->__scope;
- return 0;
-}
-strong_alias (__pthread_attr_getscope, pthread_attr_getscope);
-
-int __pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize)
-{
- /* The guard size must not be larger than the stack itself */
- if (guardsize >= attr->__stacksize) return EINVAL;
-
- attr->__guardsize = guardsize;
-
- return 0;
-}
-weak_alias (__pthread_attr_setguardsize, pthread_attr_setguardsize)
-
-int __pthread_attr_getguardsize(const pthread_attr_t *attr, size_t *guardsize)
-{
- *guardsize = attr->__guardsize;
- return 0;
-}
-weak_alias (__pthread_attr_getguardsize, pthread_attr_getguardsize)
-
-int __pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr)
-{
- attr->__stackaddr = stackaddr;
- attr->__stackaddr_set = 1;
- return 0;
-}
-weak_alias (__pthread_attr_setstackaddr, pthread_attr_setstackaddr)
-
-link_warning (pthread_attr_setstackaddr,
- "the use of `pthread_attr_setstackaddr' is deprecated, use `pthread_attr_setstack'")
-
-int __pthread_attr_getstackaddr(const pthread_attr_t *attr, void **stackaddr)
-{
- /* XXX This function has a stupid definition. The standard specifies
- no error value but what is if no stack address was set? We simply
- return the value we have in the member. */
- *stackaddr = attr->__stackaddr;
- return 0;
-}
-weak_alias (__pthread_attr_getstackaddr, pthread_attr_getstackaddr)
-
-link_warning (pthread_attr_getstackaddr,
- "the use of `pthread_attr_getstackaddr' is deprecated, use `pthread_attr_getstack'")
-
-
-int __pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize)
-{
-#ifdef FLOATING_STACKS
- /* We have to check against the maximum allowed stack size. This is no
- problem if the manager is already started and we determined it. If
- this hasn't happened, we have to find the limit outself. */
- if (__pthread_max_stacksize == 0)
- __pthread_init_max_stacksize ();
-
- if (stacksize > __pthread_max_stacksize)
- return EINVAL;
-#else
- /* We have a fixed size limit. */
- if (stacksize > STACK_SIZE)
- return EINVAL;
-#endif
-
- /* We don't accept value smaller than PTHREAD_STACK_MIN. */
- if (stacksize < PTHREAD_STACK_MIN)
- return EINVAL;
-
- attr->__stacksize = stacksize;
- return 0;
-}
-
-#if PTHREAD_STACK_MIN == 16384
-weak_alias (__pthread_attr_setstacksize, pthread_attr_setstacksize)
-#else
-versioned_symbol (libpthread, __pthread_attr_setstacksize,
- pthread_attr_setstacksize, GLIBC_2_3_3);
-
-# if SHLIB_COMPAT(libpthread, GLIBC_2_1, GLIBC_2_3_3)
-
-int __old_pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize)
-{
-# ifdef FLOATING_STACKS
- /* We have to check against the maximum allowed stack size. This is no
- problem if the manager is already started and we determined it. If
- this hasn't happened, we have to find the limit outself. */
- if (__pthread_max_stacksize == 0)
- __pthread_init_max_stacksize ();
-
- if (stacksize > __pthread_max_stacksize)
- return EINVAL;
-# else
- /* We have a fixed size limit. */
- if (stacksize > STACK_SIZE)
- return EINVAL;
-# endif
-
- /* We don't accept value smaller than old PTHREAD_STACK_MIN. */
- if (stacksize < 16384)
- return EINVAL;
-
- attr->__stacksize = stacksize;
- return 0;
-}
-compat_symbol (libpthread, __old_pthread_attr_setstacksize,
- pthread_attr_setstacksize, GLIBC_2_1);
-# endif
-#endif
-
-
-int __pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize)
-{
- *stacksize = attr->__stacksize;
- return 0;
-}
-weak_alias (__pthread_attr_getstacksize, pthread_attr_getstacksize)
-
-int __pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr,
- size_t stacksize)
-{
- int err;
-
- if ((((uintptr_t) stackaddr)
- & (__alignof__ (struct _pthread_descr_struct) - 1)) != 0)
- err = EINVAL;
- else
- err = __pthread_attr_setstacksize (attr, stacksize);
- if (err == 0)
- {
-#ifndef _STACK_GROWS_UP
- attr->__stackaddr = (char *) stackaddr + stacksize;
-#else
- attr->__stackaddr = stackaddr;
-#endif
- attr->__stackaddr_set = 1;
- }
-
- return err;
-}
-
-#if PTHREAD_STACK_MIN == 16384
-weak_alias (__pthread_attr_setstack, pthread_attr_setstack)
-#else
-versioned_symbol (libpthread, __pthread_attr_setstack, pthread_attr_setstack,
- GLIBC_2_3_3);
-# if SHLIB_COMPAT(libpthread, GLIBC_2_2, GLIBC_2_3_3)
-int __old_pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr,
- size_t stacksize)
-{
- int err;
-
- if ((((uintptr_t) stackaddr)
- & (__alignof__ (struct _pthread_descr_struct) - 1)) != 0)
- err = EINVAL;
- else
- err = __old_pthread_attr_setstacksize (attr, stacksize);
- if (err == 0)
- {
-# ifndef _STACK_GROWS_UP
- attr->__stackaddr = (char *) stackaddr + stacksize;
-# else
- attr->__stackaddr = stackaddr;
-# endif
- attr->__stackaddr_set = 1;
- }
-
- return err;
-}
-
-compat_symbol (libpthread, __old_pthread_attr_setstack, pthread_attr_setstack,
- GLIBC_2_2);
-
-# endif
-#endif
-
-int __pthread_attr_getstack (const pthread_attr_t *attr, void **stackaddr,
- size_t *stacksize)
-{
- /* XXX This function has a stupid definition. The standard specifies
- no error value but what is if no stack address was set? We simply
- return the value we have in the member. */
-#ifndef _STACK_GROWS_UP
- *stackaddr = (char *) attr->__stackaddr - attr->__stacksize;
-#else
- *stackaddr = attr->__stackaddr;
-#endif
- *stacksize = attr->__stacksize;
- return 0;
-}
-weak_alias (__pthread_attr_getstack, pthread_attr_getstack)
-
-int pthread_getattr_np (pthread_t thread, pthread_attr_t *attr)
-{
- pthread_handle handle = thread_handle (thread);
- pthread_descr descr;
- int ret = 0;
-
- if (handle == NULL)
- return ENOENT;
-
- descr = handle->h_descr;
-
- attr->__detachstate = (descr->p_detached
- ? PTHREAD_CREATE_DETACHED
- : PTHREAD_CREATE_JOINABLE);
-
- attr->__schedpolicy = __sched_getscheduler (descr->p_pid);
- if (attr->__schedpolicy == -1)
- return errno;
-
- if (__sched_getparam (descr->p_pid,
- (struct sched_param *) &attr->__schedparam) != 0)
- return errno;
-
- attr->__inheritsched = descr->p_inheritsched;
- attr->__scope = PTHREAD_SCOPE_SYSTEM;
-
-#ifdef _STACK_GROWS_DOWN
-# ifdef USE_TLS
- attr->__stacksize = descr->p_stackaddr - (char *)descr->p_guardaddr
- - descr->p_guardsize;
-# else
- attr->__stacksize = (char *)(descr + 1) - (char *)descr->p_guardaddr
- - descr->p_guardsize;
-# endif
-#else
-# ifdef USE_TLS
- attr->__stacksize = (char *)descr->p_guardaddr - descr->p_stackaddr;
-# else
- attr->__stacksize = (char *)descr->p_guardaddr - (char *)descr;
-# endif
-#endif
- attr->__guardsize = descr->p_guardsize;
- attr->__stackaddr_set = descr->p_userstack;
-#ifdef NEED_SEPARATE_REGISTER_STACK
- if (descr->p_userstack == 0)
- attr->__stacksize *= 2;
- /* XXX This is awkward. The guard pages are in the middle of the
- two stacks. We must count the guard size in the stack size since
- otherwise the range of the stack area cannot be computed. */
- attr->__stacksize += attr->__guardsize;
-#endif
-#ifdef USE_TLS
- attr->__stackaddr = descr->p_stackaddr;
-#else
-# ifndef _STACK_GROWS_UP
- attr->__stackaddr = (char *)(descr + 1);
-# else
- attr->__stackaddr = (char *)descr;
-# endif
-#endif
-
-#ifdef USE_TLS
- if (attr->__stackaddr == NULL)
-#else
- if (descr == &__pthread_initial_thread)
-#endif
- {
- /* 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", "rc");
- 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 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;
- uintptr_t last_to = 0;
-
- 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. */
- attr->__stacksize = rl.rlim_cur;
-#ifdef _STACK_GROWS_UP
- /* Don't check to enforce a limit on the __stacksize */
- attr->__stackaddr = (void *) from;
-#else
- attr->__stackaddr = (void *) to;
-
- /* The limit might be too high. */
- if ((size_t) attr->__stacksize
- > (size_t) attr->__stackaddr - last_to)
- attr->__stacksize = (size_t) attr->__stackaddr - last_to;
-#endif
-
- /* We succeed and no need to look further. */
- ret = 0;
- break;
- }
- last_to = to;
- }
-
- fclose (fp);
- free (line);
- }
- }
-
- return 0;
-
-}
diff --git a/linuxthreads/barrier.c b/linuxthreads/barrier.c
deleted file mode 100644
index 37d997cfc1..0000000000
--- a/linuxthreads/barrier.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/* POSIX barrier implementation for LinuxThreads.
- Copyright (C) 2000, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Kaz Kylheku <kaz@ashi.footprints.net>, 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include "pthread.h"
-#include "internals.h"
-#include "spinlock.h"
-#include "queue.h"
-#include "restart.h"
-
-int
-pthread_barrier_wait(pthread_barrier_t *barrier)
-{
- pthread_descr self = thread_self();
- pthread_descr temp_wake_queue, th;
- int result = 0;
-
- __pthread_lock(&barrier->__ba_lock, self);
-
- /* If the required number of threads have achieved rendezvous... */
- if (barrier->__ba_present >= barrier->__ba_required - 1)
- {
- /* ... then this last caller shall be the serial thread */
- result = PTHREAD_BARRIER_SERIAL_THREAD;
- /* Copy and clear wait queue and reset barrier. */
- temp_wake_queue = barrier->__ba_waiting;
- barrier->__ba_waiting = NULL;
- barrier->__ba_present = 0;
- }
- else
- {
- result = 0;
- barrier->__ba_present++;
- enqueue(&barrier->__ba_waiting, self);
- }
-
- __pthread_unlock(&barrier->__ba_lock);
-
- if (result == 0)
- {
- /* Non-serial threads have to suspend */
- suspend(self);
- /* We don't bother dealing with cancellation because the POSIX
- spec for barriers doesn't mention that pthread_barrier_wait
- is a cancellation point. */
- }
- else
- {
- /* Serial thread wakes up all others. */
- while ((th = dequeue(&temp_wake_queue)) != NULL)
- restart(th);
- }
-
- return result;
-}
-
-int
-pthread_barrier_init(pthread_barrier_t *barrier,
- const pthread_barrierattr_t *attr,
- unsigned int count)
-{
- if (count == 0)
- return EINVAL;
-
- __pthread_init_lock(&barrier->__ba_lock);
- barrier->__ba_required = count;
- barrier->__ba_present = 0;
- barrier->__ba_waiting = NULL;
- return 0;
-}
-
-int
-pthread_barrier_destroy(pthread_barrier_t *barrier)
-{
- if (barrier->__ba_waiting != NULL) return EBUSY;
- return 0;
-}
-
-int
-pthread_barrierattr_init(pthread_barrierattr_t *attr)
-{
- attr->__pshared = PTHREAD_PROCESS_PRIVATE;
- return 0;
-}
-
-int
-pthread_barrierattr_destroy(pthread_barrierattr_t *attr)
-{
- return 0;
-}
-
-int
-__pthread_barrierattr_getpshared(const pthread_barrierattr_t *attr,
- int *pshared)
-{
- *pshared = PTHREAD_PROCESS_PRIVATE;
- return 0;
-}
-
-int
-pthread_barrierattr_setpshared(pthread_barrierattr_t *attr, int pshared)
-{
- if (pshared != PTHREAD_PROCESS_PRIVATE && pshared != PTHREAD_PROCESS_SHARED)
- return EINVAL;
-
- /* For now it is not possible to shared a conditional variable. */
- if (pshared != PTHREAD_PROCESS_PRIVATE)
- return ENOSYS;
-
- return 0;
-}
diff --git a/linuxthreads/bug-sleep.c b/linuxthreads/bug-sleep.c
deleted file mode 100644
index f29a6b73c0..0000000000
--- a/linuxthreads/bug-sleep.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* PR libc/4005 */
-#include <pthread.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <time.h>
-
-void *
-run_thread (void *a)
-{
- while (1)
- {
- sleep (10);
- }
- return 0;
-}
-
-int
-main (void)
-{
- pthread_t thr;
- void *result;
- alarm (4);
- printf ("Starting thread.\n");
- pthread_create (&thr, 0, run_thread, 0);
- sleep (2);
- printf ("Canceling thread.\n");
- pthread_cancel (thr);
- pthread_join (thr, &result);
- if (result == PTHREAD_CANCELED)
- printf ("Thread canceled.\n");
- else
- printf ("Thread exited.\n");
- return 0;
-}
diff --git a/linuxthreads/cancel.c b/linuxthreads/cancel.c
deleted file mode 100644
index 2844210a87..0000000000
--- a/linuxthreads/cancel.c
+++ /dev/null
@@ -1,235 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* Thread cancellation */
-
-#include <errno.h>
-#include <libc-internal.h>
-#include "pthread.h"
-#include "internals.h"
-#include "spinlock.h"
-#include "restart.h"
-
-#ifdef _STACK_GROWS_DOWN
-# define FRAME_LEFT(frame, other) ((char *) frame >= (char *) other)
-#elif _STACK_GROWS_UP
-# define FRAME_LEFT(frame, other) ((char *) frame <= (char *) other)
-#else
-# error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP"
-#endif
-
-
-int __pthread_setcancelstate(int state, int * oldstate)
-{
- pthread_descr self = thread_self();
- if (state < PTHREAD_CANCEL_ENABLE || state > PTHREAD_CANCEL_DISABLE)
- return EINVAL;
- if (oldstate != NULL) *oldstate = THREAD_GETMEM(self, p_cancelstate);
- THREAD_SETMEM(self, p_cancelstate, state);
- if (THREAD_GETMEM(self, p_canceled) &&
- THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE &&
- THREAD_GETMEM(self, p_canceltype) == PTHREAD_CANCEL_ASYNCHRONOUS)
- __pthread_do_exit(PTHREAD_CANCELED, CURRENT_STACK_FRAME);
- return 0;
-}
-strong_alias (__pthread_setcancelstate, pthread_setcancelstate);
-
-int __pthread_setcanceltype(int type, int * oldtype)
-{
- pthread_descr self = thread_self();
- if (type < PTHREAD_CANCEL_DEFERRED || type > PTHREAD_CANCEL_ASYNCHRONOUS)
- return EINVAL;
- if (oldtype != NULL) *oldtype = THREAD_GETMEM(self, p_canceltype);
- THREAD_SETMEM(self, p_canceltype, type);
- if (THREAD_GETMEM(self, p_canceled) &&
- THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE &&
- THREAD_GETMEM(self, p_canceltype) == PTHREAD_CANCEL_ASYNCHRONOUS)
- __pthread_do_exit(PTHREAD_CANCELED, CURRENT_STACK_FRAME);
- return 0;
-}
-strong_alias (__pthread_setcanceltype, pthread_setcanceltype);
-
-
-/* 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)
-{
- pthread_descr self = thread_self();
- int oldtype = THREAD_GETMEM(self, p_canceltype);
- THREAD_SETMEM(self, p_canceltype, PTHREAD_CANCEL_ASYNCHRONOUS);
- if (__builtin_expect (THREAD_GETMEM(self, p_canceled), 0) &&
- THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE)
- __pthread_do_exit(PTHREAD_CANCELED, CURRENT_STACK_FRAME);
- return oldtype;
-}
-
-void
-internal_function attribute_hidden
-__pthread_disable_asynccancel (int oldtype)
-{
- pthread_descr self = thread_self();
- THREAD_SETMEM(self, p_canceltype, oldtype);
-}
-
-
-int pthread_cancel(pthread_t thread)
-{
- pthread_handle handle = thread_handle(thread);
- int pid;
- int dorestart = 0;
- pthread_descr th;
- pthread_extricate_if *pextricate;
- int already_canceled;
-
- __pthread_lock(&handle->h_lock, NULL);
- if (invalid_handle(handle, thread)) {
- __pthread_unlock(&handle->h_lock);
- return ESRCH;
- }
-
- th = handle->h_descr;
-
- already_canceled = th->p_canceled;
- th->p_canceled = 1;
-
- if (th->p_cancelstate == PTHREAD_CANCEL_DISABLE || already_canceled) {
- __pthread_unlock(&handle->h_lock);
- return 0;
- }
-
- pextricate = th->p_extricate;
- pid = th->p_pid;
-
- /* If the thread has registered an extrication interface, then
- invoke the interface. If it returns 1, then we succeeded in
- dequeuing the thread from whatever waiting object it was enqueued
- with. In that case, it is our responsibility to wake it up.
- And also to set the p_woken_by_cancel flag so the woken thread
- can tell that it was woken by cancellation. */
-
- if (pextricate != NULL) {
- dorestart = pextricate->pu_extricate_func(pextricate->pu_object, th);
- th->p_woken_by_cancel = dorestart;
- }
-
- __pthread_unlock(&handle->h_lock);
-
- /* If the thread has suspended or is about to, then we unblock it by
- issuing a restart, instead of a cancel signal. Otherwise we send
- the cancel signal to unblock the thread from a cancellation point,
- or to initiate asynchronous cancellation. The restart is needed so
- we have proper accounting of restarts; suspend decrements the thread's
- resume count, and restart() increments it. This also means that suspend's
- handling of the cancel signal is obsolete. */
-
- if (dorestart)
- restart(th);
- else
- kill(pid, __pthread_sig_cancel);
-
- return 0;
-}
-
-void pthread_testcancel(void)
-{
- pthread_descr self = thread_self();
- if (THREAD_GETMEM(self, p_canceled)
- && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE)
- __pthread_do_exit(PTHREAD_CANCELED, CURRENT_STACK_FRAME);
-}
-
-void _pthread_cleanup_push(struct _pthread_cleanup_buffer * buffer,
- void (*routine)(void *), void * arg)
-{
- pthread_descr self = thread_self();
- buffer->__routine = routine;
- buffer->__arg = arg;
- buffer->__prev = THREAD_GETMEM(self, p_cleanup);
- if (buffer->__prev != NULL && FRAME_LEFT (buffer, buffer->__prev))
- buffer->__prev = NULL;
- THREAD_SETMEM(self, p_cleanup, buffer);
-}
-
-void _pthread_cleanup_pop(struct _pthread_cleanup_buffer * buffer,
- int execute)
-{
- pthread_descr self = thread_self();
- if (execute) buffer->__routine(buffer->__arg);
- THREAD_SETMEM(self, p_cleanup, buffer->__prev);
-}
-
-void _pthread_cleanup_push_defer(struct _pthread_cleanup_buffer * buffer,
- void (*routine)(void *), void * arg)
-{
- pthread_descr self = thread_self();
- buffer->__routine = routine;
- buffer->__arg = arg;
- buffer->__canceltype = THREAD_GETMEM(self, p_canceltype);
- buffer->__prev = THREAD_GETMEM(self, p_cleanup);
- if (buffer->__prev != NULL && FRAME_LEFT (buffer, buffer->__prev))
- buffer->__prev = NULL;
- THREAD_SETMEM(self, p_canceltype, PTHREAD_CANCEL_DEFERRED);
- THREAD_SETMEM(self, p_cleanup, buffer);
-}
-
-void _pthread_cleanup_pop_restore(struct _pthread_cleanup_buffer * buffer,
- int execute)
-{
- pthread_descr self = thread_self();
- if (execute) buffer->__routine(buffer->__arg);
- THREAD_SETMEM(self, p_cleanup, buffer->__prev);
- THREAD_SETMEM(self, p_canceltype, buffer->__canceltype);
- if (THREAD_GETMEM(self, p_canceled) &&
- THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE &&
- THREAD_GETMEM(self, p_canceltype) == PTHREAD_CANCEL_ASYNCHRONOUS)
- __pthread_do_exit(PTHREAD_CANCELED, CURRENT_STACK_FRAME);
-}
-
-void __pthread_perform_cleanup(char *currentframe)
-{
- pthread_descr self = thread_self();
- struct _pthread_cleanup_buffer *c = THREAD_GETMEM(self, p_cleanup);
- struct _pthread_cleanup_buffer *last;
-
- if (c != NULL)
- while (FRAME_LEFT (currentframe, c))
- {
- last = c;
- c = c->__prev;
-
- if (c == NULL || FRAME_LEFT (last, c))
- {
- c = NULL;
- break;
- }
- }
-
- while (c != NULL)
- {
- c->__routine(c->__arg);
-
- last = c;
- c = c->__prev;
-
- if (FRAME_LEFT (last, c))
- break;
- }
-
- /* And the TSD which needs special help. */
- THREAD_SETMEM (self, p_cancelstate, PTHREAD_CANCEL_DISABLE);
- __libc_thread_freeres ();
-}
diff --git a/linuxthreads/condvar.c b/linuxthreads/condvar.c
deleted file mode 100644
index 6ab95b88ae..0000000000
--- a/linuxthreads/condvar.c
+++ /dev/null
@@ -1,341 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* and Pavel Krauz (krauz@fsid.cvut.cz). */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* Condition variables */
-
-#include <errno.h>
-#include <sched.h>
-#include <stddef.h>
-#include <sys/time.h>
-#include "pthread.h"
-#include "internals.h"
-#include "spinlock.h"
-#include "queue.h"
-#include "restart.h"
-#include <shlib-compat.h>
-
-int __pthread_cond_init(pthread_cond_t *cond,
- const pthread_condattr_t *cond_attr)
-{
- __pthread_init_lock(&cond->__c_lock);
- cond->__c_waiting = NULL;
- return 0;
-}
-versioned_symbol (libpthread, __pthread_cond_init, pthread_cond_init,
- GLIBC_2_3_2);
-#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_3_2)
-strong_alias (__pthread_cond_init, __old_pthread_cond_init)
-compat_symbol (libpthread, __old_pthread_cond_init, pthread_cond_init,
- GLIBC_2_0);
-#endif
-
-int __pthread_cond_destroy(pthread_cond_t *cond)
-{
- if (cond->__c_waiting != NULL) return EBUSY;
- return 0;
-}
-versioned_symbol (libpthread, __pthread_cond_destroy, pthread_cond_destroy,
- GLIBC_2_3_2);
-#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_3_2)
-strong_alias (__pthread_cond_destroy, __old_pthread_cond_destroy)
-compat_symbol (libpthread, __old_pthread_cond_destroy, pthread_cond_destroy,
- GLIBC_2_0);
-#endif
-
-/* Function called by pthread_cancel to remove the thread from
- waiting on a condition variable queue. */
-
-static int cond_extricate_func(void *obj, pthread_descr th)
-{
- volatile pthread_descr self = thread_self();
- pthread_cond_t *cond = obj;
- int did_remove = 0;
-
- __pthread_lock(&cond->__c_lock, self);
- did_remove = remove_from_queue(&cond->__c_waiting, th);
- __pthread_unlock(&cond->__c_lock);
-
- return did_remove;
-}
-
-int __pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
-{
- volatile pthread_descr self = thread_self();
- pthread_extricate_if extr;
- int already_canceled = 0;
- int spurious_wakeup_count;
-
- /* Check whether the mutex is locked and owned by this thread. */
- if (mutex->__m_kind != PTHREAD_MUTEX_TIMED_NP
- && mutex->__m_kind != PTHREAD_MUTEX_ADAPTIVE_NP
- && mutex->__m_owner != self)
- return EINVAL;
-
- /* Set up extrication interface */
- extr.pu_object = cond;
- extr.pu_extricate_func = cond_extricate_func;
-
- /* Register extrication interface */
- THREAD_SETMEM(self, p_condvar_avail, 0);
- __pthread_set_own_extricate_if(self, &extr);
-
- /* Atomically enqueue thread for waiting, but only if it is not
- canceled. If the thread is canceled, then it will fall through the
- suspend call below, and then call pthread_exit without
- having to worry about whether it is still on the condition variable queue.
- This depends on pthread_cancel setting p_canceled before calling the
- extricate function. */
-
- __pthread_lock(&cond->__c_lock, self);
- if (!(THREAD_GETMEM(self, p_canceled)
- && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE))
- enqueue(&cond->__c_waiting, self);
- else
- already_canceled = 1;
- __pthread_unlock(&cond->__c_lock);
-
- if (already_canceled) {
- __pthread_set_own_extricate_if(self, 0);
- __pthread_do_exit(PTHREAD_CANCELED, CURRENT_STACK_FRAME);
- }
-
- pthread_mutex_unlock(mutex);
-
- spurious_wakeup_count = 0;
- while (1)
- {
- suspend(self);
- if (THREAD_GETMEM(self, p_condvar_avail) == 0
- && (THREAD_GETMEM(self, p_woken_by_cancel) == 0
- || THREAD_GETMEM(self, p_cancelstate) != PTHREAD_CANCEL_ENABLE))
- {
- /* Count resumes that don't belong to us. */
- spurious_wakeup_count++;
- continue;
- }
- break;
- }
-
- __pthread_set_own_extricate_if(self, 0);
-
- /* Check for cancellation again, to provide correct cancellation
- point behavior */
-
- if (THREAD_GETMEM(self, p_woken_by_cancel)
- && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) {
- THREAD_SETMEM(self, p_woken_by_cancel, 0);
- pthread_mutex_lock(mutex);
- __pthread_do_exit(PTHREAD_CANCELED, CURRENT_STACK_FRAME);
- }
-
- /* Put back any resumes we caught that don't belong to us. */
- while (spurious_wakeup_count--)
- restart(self);
-
- pthread_mutex_lock(mutex);
- return 0;
-}
-versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait,
- GLIBC_2_3_2);
-#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_3_2)
-strong_alias (__pthread_cond_wait, __old_pthread_cond_wait)
-compat_symbol (libpthread, __old_pthread_cond_wait, pthread_cond_wait,
- GLIBC_2_0);
-#endif
-
-static int
-pthread_cond_timedwait_relative(pthread_cond_t *cond,
- pthread_mutex_t *mutex,
- const struct timespec * abstime)
-{
- volatile pthread_descr self = thread_self();
- int already_canceled = 0;
- pthread_extricate_if extr;
- int spurious_wakeup_count;
-
- /* Check whether the mutex is locked and owned by this thread. */
- if (mutex->__m_kind != PTHREAD_MUTEX_TIMED_NP
- && mutex->__m_kind != PTHREAD_MUTEX_ADAPTIVE_NP
- && mutex->__m_owner != self)
- return EINVAL;
-
- /* Set up extrication interface */
- extr.pu_object = cond;
- extr.pu_extricate_func = cond_extricate_func;
-
- /* Register extrication interface */
- THREAD_SETMEM(self, p_condvar_avail, 0);
- __pthread_set_own_extricate_if(self, &extr);
-
- /* Enqueue to wait on the condition and check for cancellation. */
- __pthread_lock(&cond->__c_lock, self);
- if (!(THREAD_GETMEM(self, p_canceled)
- && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE))
- enqueue(&cond->__c_waiting, self);
- else
- already_canceled = 1;
- __pthread_unlock(&cond->__c_lock);
-
- if (already_canceled) {
- __pthread_set_own_extricate_if(self, 0);
- __pthread_do_exit(PTHREAD_CANCELED, CURRENT_STACK_FRAME);
- }
-
- pthread_mutex_unlock(mutex);
-
- spurious_wakeup_count = 0;
- while (1)
- {
- if (!timedsuspend(self, abstime)) {
- int was_on_queue;
-
- /* __pthread_lock will queue back any spurious restarts that
- may happen to it. */
-
- __pthread_lock(&cond->__c_lock, self);
- was_on_queue = remove_from_queue(&cond->__c_waiting, self);
- __pthread_unlock(&cond->__c_lock);
-
- if (was_on_queue) {
- __pthread_set_own_extricate_if(self, 0);
- pthread_mutex_lock(mutex);
- return ETIMEDOUT;
- }
-
- /* Eat the outstanding restart() from the signaller */
- suspend(self);
- }
-
- if (THREAD_GETMEM(self, p_condvar_avail) == 0
- && (THREAD_GETMEM(self, p_woken_by_cancel) == 0
- || THREAD_GETMEM(self, p_cancelstate) != PTHREAD_CANCEL_ENABLE))
- {
- /* Count resumes that don't belong to us. */
- spurious_wakeup_count++;
- continue;
- }
- break;
- }
-
- __pthread_set_own_extricate_if(self, 0);
-
- /* The remaining logic is the same as in other cancellable waits,
- such as pthread_join sem_wait or pthread_cond wait. */
-
- if (THREAD_GETMEM(self, p_woken_by_cancel)
- && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) {
- THREAD_SETMEM(self, p_woken_by_cancel, 0);
- pthread_mutex_lock(mutex);
- __pthread_do_exit(PTHREAD_CANCELED, CURRENT_STACK_FRAME);
- }
-
- /* Put back any resumes we caught that don't belong to us. */
- while (spurious_wakeup_count--)
- restart(self);
-
- pthread_mutex_lock(mutex);
- return 0;
-}
-
-int __pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
- const struct timespec * abstime)
-{
- /* Indirect call through pointer! */
- return pthread_cond_timedwait_relative(cond, mutex, abstime);
-}
-versioned_symbol (libpthread, __pthread_cond_timedwait, pthread_cond_timedwait,
- GLIBC_2_3_2);
-#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_3_2)
-strong_alias (__pthread_cond_timedwait, __old_pthread_cond_timedwait)
-compat_symbol (libpthread, __old_pthread_cond_timedwait,
- pthread_cond_timedwait, GLIBC_2_0);
-#endif
-
-int __pthread_cond_signal(pthread_cond_t *cond)
-{
- pthread_descr th;
-
- __pthread_lock(&cond->__c_lock, NULL);
- th = dequeue(&cond->__c_waiting);
- __pthread_unlock(&cond->__c_lock);
- if (th != NULL) {
- th->p_condvar_avail = 1;
- WRITE_MEMORY_BARRIER();
- restart(th);
- }
- return 0;
-}
-versioned_symbol (libpthread, __pthread_cond_signal, pthread_cond_signal,
- GLIBC_2_3_2);
-#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_3_2)
-strong_alias (__pthread_cond_signal, __old_pthread_cond_signal)
-compat_symbol (libpthread, __old_pthread_cond_signal, pthread_cond_signal,
- GLIBC_2_0);
-#endif
-
-int __pthread_cond_broadcast(pthread_cond_t *cond)
-{
- pthread_descr tosignal, th;
-
- __pthread_lock(&cond->__c_lock, NULL);
- /* Copy the current state of the waiting queue and empty it */
- tosignal = cond->__c_waiting;
- cond->__c_waiting = NULL;
- __pthread_unlock(&cond->__c_lock);
- /* Now signal each process in the queue */
- while ((th = dequeue(&tosignal)) != NULL) {
- th->p_condvar_avail = 1;
- WRITE_MEMORY_BARRIER();
- restart(th);
- }
- return 0;
-}
-versioned_symbol (libpthread, __pthread_cond_broadcast, pthread_cond_broadcast,
- GLIBC_2_3_2);
-#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_3_2)
-strong_alias (__pthread_cond_broadcast, __old_pthread_cond_broadcast)
-compat_symbol (libpthread, __old_pthread_cond_broadcast,
- pthread_cond_broadcast, GLIBC_2_0);
-#endif
-
-int __pthread_condattr_init(pthread_condattr_t *attr)
-{
- return 0;
-}
-strong_alias (__pthread_condattr_init, pthread_condattr_init)
-
-int __pthread_condattr_destroy(pthread_condattr_t *attr)
-{
- return 0;
-}
-strong_alias (__pthread_condattr_destroy, pthread_condattr_destroy)
-
-int pthread_condattr_getpshared (const pthread_condattr_t *attr, int *pshared)
-{
- *pshared = PTHREAD_PROCESS_PRIVATE;
- return 0;
-}
-
-int pthread_condattr_setpshared (pthread_condattr_t *attr, int pshared)
-{
- if (pshared != PTHREAD_PROCESS_PRIVATE && pshared != PTHREAD_PROCESS_SHARED)
- return EINVAL;
-
- /* For now it is not possible to shared a conditional variable. */
- if (pshared != PTHREAD_PROCESS_PRIVATE)
- return ENOSYS;
-
- return 0;
-}
diff --git a/linuxthreads/configure b/linuxthreads/configure
deleted file mode 100755
index 2624f9ec5a..0000000000
--- a/linuxthreads/configure
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is generated from configure.in by Autoconf. DO NOT EDIT!
-
-# LinuxThreads fragment for GNU C library configure mechanism.
-# This is a shell script fragment sourced by the main configure script.
-
-for other in $add_ons; do
- test $other = nptl || continue
- if test $add_ons_automatic = yes; then
- echo "$as_me:$LINENO: result: $libc_add_on disabled because $other add-on is also in use" >&5
-echo "${ECHO_T}$libc_add_on disabled because $other add-on is also in use" >&6
- libc_add_on=
- else
- { { echo "$as_me:$LINENO: error: cannot use both $libc_add_on and $other add-ons in one build" >&5
-echo "$as_me: error: cannot use both $libc_add_on and $other add-ons in one build" >&2;}
- { (exit 1); exit 1; }; }
- fi
-done
diff --git a/linuxthreads/configure.in b/linuxthreads/configure.in
deleted file mode 100644
index 3f9904a411..0000000000
--- a/linuxthreads/configure.in
+++ /dev/null
@@ -1,14 +0,0 @@
-GLIBC_PROVIDES dnl See top-level configure.in.
-
-# LinuxThreads fragment for GNU C library configure mechanism.
-# This is a shell script fragment sourced by the main configure script.
-
-for other in $add_ons; do
- test $other = nptl || continue
- if test $add_ons_automatic = yes; then
- AC_MSG_RESULT($libc_add_on disabled because $other add-on is also in use)
- libc_add_on=
- else
- AC_MSG_ERROR(cannot use both $libc_add_on and $other add-ons in one build)
- fi
-done
diff --git a/linuxthreads/descr.h b/linuxthreads/descr.h
deleted file mode 100644
index 2b1e49a0ba..0000000000
--- a/linuxthreads/descr.h
+++ /dev/null
@@ -1,267 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-#ifndef _DESCR_H
-#define _DESCR_H 1
-
-#define __need_res_state
-#include <resolv.h>
-#include <sched.h>
-#include <setjmp.h>
-#include <signal.h>
-#include <stdint.h>
-#include <sys/types.h>
-#include <hp-timing.h>
-#include <tls.h>
-
-/* Fast thread-specific data internal to libc. */
-enum __libc_tsd_key_t { _LIBC_TSD_KEY_MALLOC = 0,
- _LIBC_TSD_KEY_DL_ERROR,
- _LIBC_TSD_KEY_RPC_VARS,
- _LIBC_TSD_KEY_LOCALE,
- _LIBC_TSD_KEY_CTYPE_B,
- _LIBC_TSD_KEY_CTYPE_TOLOWER,
- _LIBC_TSD_KEY_CTYPE_TOUPPER,
- _LIBC_TSD_KEY_N };
-
-/* The type of thread descriptors */
-typedef struct _pthread_descr_struct *pthread_descr;
-
-
-/* Some more includes. */
-#include <pt-machine.h>
-#include <linuxthreads_db/thread_dbP.h>
-
-
-/* Arguments passed to thread creation routine */
-struct pthread_start_args {
- void *(*start_routine)(void *); /* function to run */
- void *arg; /* its argument */
- sigset_t mask; /* initial signal mask for thread */
- int schedpolicy; /* initial scheduling policy (if any) */
- struct sched_param schedparam; /* initial scheduling parameters (if any) */
-};
-
-
-/* Callback interface for removing the thread from waiting on an
- object if it is cancelled while waiting or about to wait.
- This hold a pointer to the object, and a pointer to a function
- which ``extricates'' the thread from its enqueued state.
- The function takes two arguments: pointer to the wait object,
- and a pointer to the thread. It returns 1 if an extrication
- actually occured, and hence the thread must also be signalled.
- It returns 0 if the thread had already been extricated. */
-typedef struct _pthread_extricate_struct {
- void *pu_object;
- int (*pu_extricate_func)(void *, pthread_descr);
-} pthread_extricate_if;
-
-
-/* Atomic counter made possible by compare_and_swap */
-struct pthread_atomic {
- long p_count;
- int p_spinlock;
-};
-
-
-/* Context info for read write locks. The pthread_rwlock_info structure
- is information about a lock that has been read-locked by the thread
- in whose list this structure appears. The pthread_rwlock_context
- is embedded in the thread context and contains a pointer to the
- head of the list of lock info structures, as well as a count of
- read locks that are untracked, because no info structure could be
- allocated for them. */
-struct _pthread_rwlock_t;
-typedef struct _pthread_rwlock_info {
- struct _pthread_rwlock_info *pr_next;
- struct _pthread_rwlock_t *pr_lock;
- int pr_lock_count;
-} pthread_readlock_info;
-
-
-/* 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)
-
-
-union dtv;
-
-struct _pthread_descr_struct
-{
-#if !defined USE_TLS || !TLS_DTV_AT_TP
- /* This overlaps tcbhead_t (see tls.h), as used for TLS without threads. */
- union
- {
- struct
- {
- void *tcb; /* Pointer to the TCB. This is not always
- the address of this thread descriptor. */
- union dtv *dtvp;
- pthread_descr self; /* Pointer to this structure */
- int multiple_threads;
-# ifdef NEED_DL_SYSINFO
- uintptr_t sysinfo;
-# endif
- } data;
- void *__padding[16];
- } p_header;
-# define p_multiple_threads p_header.data.multiple_threads
-#elif TLS_MULTIPLE_THREADS_IN_TCB
- int p_multiple_threads;
-#endif
-
- pthread_descr p_nextlive, p_prevlive;
- /* Double chaining of active threads */
- pthread_descr p_nextwaiting; /* Next element in the queue holding the thr */
- pthread_descr p_nextlock; /* can be on a queue and waiting on a lock */
- pthread_t p_tid; /* Thread identifier */
- int p_pid; /* PID of Unix process */
- int p_priority; /* Thread priority (== 0 if not realtime) */
- struct _pthread_fastlock * p_lock; /* Spinlock for synchronized accesses */
- int p_signal; /* last signal received */
- sigjmp_buf * p_signal_jmp; /* where to siglongjmp on a signal or NULL */
- sigjmp_buf * p_cancel_jmp; /* where to siglongjmp on a cancel or NULL */
- char p_terminated; /* true if terminated e.g. by pthread_exit */
- char p_detached; /* true if detached */
- char p_exited; /* true if the assoc. process terminated */
- void * p_retval; /* placeholder for return value */
- int p_retcode; /* placeholder for return code */
- pthread_descr p_joining; /* thread joining on that thread or NULL */
- struct _pthread_cleanup_buffer * p_cleanup; /* cleanup functions */
- char p_cancelstate; /* cancellation state */
- char p_canceltype; /* cancellation type (deferred/async) */
- char p_canceled; /* cancellation request pending */
- char * p_in_sighandler; /* stack address of sighandler, or NULL */
- char p_sigwaiting; /* true if a sigwait() is in progress */
- struct pthread_start_args p_start_args; /* arguments for thread creation */
- void ** p_specific[PTHREAD_KEY_1STLEVEL_SIZE]; /* thread-specific data */
-#if !(USE_TLS && HAVE___THREAD)
- void * p_libc_specific[_LIBC_TSD_KEY_N]; /* thread-specific data for libc */
- int * p_errnop; /* pointer to used errno variable */
- int p_errno; /* error returned by last system call */
- int * p_h_errnop; /* pointer to used h_errno variable */
- int p_h_errno; /* error returned by last netdb function */
- struct __res_state *p_resp; /* Pointer to resolver state */
-#endif
- struct __res_state p_res; /* per-thread resolver state */
- int p_userstack; /* nonzero if the user provided the stack */
- void *p_guardaddr; /* address of guard area or NULL */
- size_t p_guardsize; /* size of guard area */
- int p_nr; /* Index of descriptor in __pthread_handles */
- int p_report_events; /* Nonzero if events must be reported. */
- td_eventbuf_t p_eventbuf; /* Data for event. */
- struct pthread_atomic p_resume_count; /* number of times restart() was
- called on thread */
- char p_woken_by_cancel; /* cancellation performed wakeup */
- char p_condvar_avail; /* flag if conditional variable became avail */
- char p_sem_avail; /* flag if semaphore became available */
- pthread_extricate_if *p_extricate; /* See above */
- pthread_readlock_info *p_readlock_list; /* List of readlock info structs */
- pthread_readlock_info *p_readlock_free; /* Free list of structs */
- int p_untracked_readlock_count; /* Readlocks not tracked by list */
- int p_inheritsched; /* copied from the thread attribute */
-#if HP_TIMING_AVAIL
- hp_timing_t p_cpuclock_offset; /* Initial CPU clock for thread. */
-#endif
-#ifdef USE_TLS
- char *p_stackaddr; /* Stack address. */
-#endif
- size_t p_alloca_cutoff; /* Maximum size which should be allocated
- using alloca() instead of malloc(). */
- /* New elements must be added at the end. */
-} __attribute__ ((aligned(32))); /* We need to align the structure so that
- doubles are aligned properly. This is 8
- bytes on MIPS and 16 bytes on MIPS64.
- 32 bytes might give better cache
- utilization. */
-
-
-
-/* Limit between the stack of the initial thread (above) and the
- stacks of other threads (below). Aligned on a STACK_SIZE boundary.
- Initially 0, meaning that the current thread is (by definition)
- the initial thread. */
-
-extern char *__pthread_initial_thread_bos;
-
-/* Descriptor of the initial thread */
-
-extern struct _pthread_descr_struct __pthread_initial_thread;
-
-/* Limits of the thread manager stack. */
-
-extern char *__pthread_manager_thread_bos;
-extern char *__pthread_manager_thread_tos;
-
-/* Descriptor of the manager thread */
-
-extern struct _pthread_descr_struct __pthread_manager_thread;
-extern pthread_descr __pthread_manager_threadp attribute_hidden;
-
-/* Indicate whether at least one thread has a user-defined stack (if 1),
- or all threads have stacks supplied by LinuxThreads (if 0). */
-
-extern int __pthread_nonstandard_stacks;
-
-/* The max size of the thread stack segments. If the default
- THREAD_SELF implementation is used, this must be a power of two and
- a multiple of PAGE_SIZE. */
-#ifndef STACK_SIZE
-#define STACK_SIZE (2 * 1024 * 1024)
-#endif
-
-/* Get some notion of the current stack. Need not be exactly the top
- of the stack, just something somewhere in the current frame. */
-#ifndef CURRENT_STACK_FRAME
-#define CURRENT_STACK_FRAME ({ char __csf; &__csf; })
-#endif
-
-/* Recover thread descriptor for the current thread */
-
-extern pthread_descr __pthread_find_self (void) __attribute__ ((pure));
-
-static inline pthread_descr thread_self (void) __attribute__ ((pure));
-static inline pthread_descr thread_self (void)
-{
-#ifdef THREAD_SELF
- return THREAD_SELF;
-#else
- char *sp = CURRENT_STACK_FRAME;
- if (sp >= __pthread_initial_thread_bos)
- return &__pthread_initial_thread;
- else if (sp >= __pthread_manager_thread_bos
- && sp < __pthread_manager_thread_tos)
- return &__pthread_manager_thread;
- else if (__pthread_nonstandard_stacks)
- return __pthread_find_self();
- else
-#ifdef _STACK_GROWS_DOWN
- return (pthread_descr)(((unsigned long)sp | (STACK_SIZE-1))+1) - 1;
-#else
- return (pthread_descr)((unsigned long)sp &~ (STACK_SIZE-1));
-#endif
-#endif
-}
-
-#endif /* descr.h */
diff --git a/linuxthreads/ecmutex.c b/linuxthreads/ecmutex.c
deleted file mode 100644
index ce54ddf331..0000000000
--- a/linuxthreads/ecmutex.c
+++ /dev/null
@@ -1,157 +0,0 @@
-/* Test of the error checking mutex and incidently also barriers. */
-
-#include <errno.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-
-static pthread_mutex_t locks[] =
-{
- PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP,
- PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP,
- PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP,
- PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP,
- PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
-};
-#define nlocks ((int) (sizeof (locks) / sizeof (locks[0])))
-
-static pthread_barrier_t barrier;
-#define SYNC pthread_barrier_wait (&barrier)
-
-#define NTHREADS nlocks
-
-#define ROUNDS 20
-
-
-static void *
-worker (void *arg)
-{
- /* We are locking the and unlocked the locks and check the errors.
- Since we are using the error-checking variant the implementation
- should report them. */
- int nr = (long int) arg;
- int i;
- void *result = NULL;
- int retval;
-
- for (i = 0; i < ROUNDS; ++i)
- {
- /* Skip the rounds which would make other == own. */
- if (i % nlocks == 0)
- continue;
-
- /* Get the "own" mutex. */
- if (pthread_mutex_trylock (&locks[nr]) != 0)
- {
- printf ("thread %d failed getting own mutex\n", nr);
- result = (void *) 1;
- }
-
- /* Try locking "own" mutex again. */
- retval = pthread_mutex_lock (&locks[nr]);
- if (retval != EDEADLK)
- {
- printf ("thread %d failed getting own mutex\n", nr);
- result = (void *) 1;
- }
-
- /* Try to get a different semaphore. */
- SYNC;
- retval = pthread_mutex_trylock (&locks[(nr + i) % nlocks]);
- if (retval != EBUSY)
- {
- printf ("thread %d didn't deadlock on getting %d's lock\n",
- nr, (nr + i) % nlocks);
- result = (void *) 1;
- }
-
- /* Try unlocking other's lock. */
- retval = pthread_mutex_unlock (&locks[(nr + i) % nlocks]);
- if (retval != EPERM)
- {
- printf ("thread %d managed releasing mutex %d\n",
- nr, (nr + i) % nlocks);
- result = (void *) 1;
- }
-
- /* All lock one mutex now. */
- SYNC;
- retval = pthread_mutex_lock (&locks[i % nlocks]);
- if (nr == (i % nlocks))
- {
- if (retval != EDEADLK)
- {
- printf ("thread %d didn't deadlock on getting %d's lock\n",
- nr, (nr + i) % nlocks);
- result = (void *) 1;
- }
- if (pthread_mutex_unlock (&locks[i % nlocks]) != 0)
- {
- printf ("thread %d failed releasing own mutex\n", nr);
- result = (void *) 1;
- }
- }
- else
- {
- if (retval != 0)
- {
- printf ("thread %d failed acquiring mutex %d\n",
- nr, i % nlocks);
- result = (void *) 1;
- }
- else if (pthread_mutex_unlock (&locks[i % nlocks]) != 0)
- {
- printf ("thread %d failed releasing mutex %d\n",
- nr, i % nlocks);
- result = (void *) 1;
- }
- }
-
- /* Unlock the own lock. */
- SYNC;
- if (nr != (i % nlocks) && pthread_mutex_unlock (&locks[nr]) != 0)
- {
- printf ("thread %d failed releasing own mutex\n", nr);
- result = (void *) 1;
- }
-
- /* Try unlocking again. */
- retval = pthread_mutex_unlock (&locks[nr]);
- if (retval == 0)
- {
- printf ("thread %d managed releasing own mutex twice\n", nr);
- result = (void *) 1;
- }
- }
-
- return result;
-}
-
-
-#define TEST_FUNCTION do_test ()
-static int
-do_test (void)
-{
- pthread_t threads[NTHREADS];
- int i;
- void *res;
- int result = 0;
-
- pthread_barrier_init (&barrier, NULL, NTHREADS);
-
- for (i = 0; i < NTHREADS; ++i)
- if (pthread_create (&threads[i], NULL, worker, (void *) (long int) i) != 0)
- {
- printf ("failed to create thread %d: %m\n", i);
- exit (1);
- }
-
- for (i = 0; i < NTHREADS; ++i)
- if (pthread_join (threads[i], &res) != 0 || res != NULL)
- result = 1;
-
- return result;
-}
-
-#include "../test-skeleton.c"
diff --git a/linuxthreads/errno.c b/linuxthreads/errno.c
deleted file mode 100644
index 5c0e8767a1..0000000000
--- a/linuxthreads/errno.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* Define the location of errno for the remainder of the C library */
-
-#include <errno.h>
-#include <netdb.h>
-#include <resolv.h>
-#include <tls.h>
-#include "pthread.h"
-#include "internals.h"
-
-#if !USE_TLS || !HAVE___THREAD
-/* The definition in libc is sufficient if we use TLS. */
-int *
-__errno_location (void)
-{
- pthread_descr self = thread_self();
- return THREAD_GETMEM (self, p_errnop);
-}
-
-int *
-__h_errno_location (void)
-{
- pthread_descr self = thread_self();
- return THREAD_GETMEM (self, p_h_errnop);
-}
-
-/* Return thread specific resolver state. */
-struct __res_state *
-__res_state (void)
-{
- pthread_descr self = thread_self();
- return THREAD_GETMEM (self, p_resp);
-}
-#endif
diff --git a/linuxthreads/events.c b/linuxthreads/events.c
deleted file mode 100644
index b4ca3846e8..0000000000
--- a/linuxthreads/events.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Event functions used while debugging.
- Copyright (C) 1999, 2000 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* The functions contained here do nothing, they just return. */
-
-#include "internals.h"
-
-void
-__linuxthreads_create_event (void)
-{
-}
-
-void
-__linuxthreads_death_event (void)
-{
-}
-
-void
-__linuxthreads_reap_event (void)
-{
-}
diff --git a/linuxthreads/forward.c b/linuxthreads/forward.c
deleted file mode 100644
index b2a36d7d60..0000000000
--- a/linuxthreads/forward.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <dlfcn.h>
-#include "internals.h"
-#include <stdlib.h>
-
-#include <shlib-compat.h>
-
-
-/* Pointers to the libc functions. */
-struct pthread_functions __libc_pthread_functions attribute_hidden;
-
-
-# define FORWARD2(name, rettype, decl, params, defaction) \
-rettype \
-name decl \
-{ \
- if (__libc_pthread_functions.ptr_##name == NULL) \
- defaction; \
- \
- return __libc_pthread_functions.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)
-
-
-FORWARD (__pthread_cond_broadcast, (pthread_cond_t *cond), (cond), 0)
-#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3_2)
-strong_alias (__pthread_cond_broadcast, __pthread_cond_broadcast_2_0)
-compat_symbol (libc, __pthread_cond_broadcast_2_0, pthread_cond_broadcast,
- GLIBC_2_0);
-#endif
-versioned_symbol (libc, __pthread_cond_broadcast, pthread_cond_broadcast,
- GLIBC_2_3_2);
-
-FORWARD (__pthread_cond_destroy, (pthread_cond_t *cond), (cond), 0)
-#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3_2)
-strong_alias (__pthread_cond_destroy, __pthread_cond_destroy_2_0)
-compat_symbol (libc, __pthread_cond_destroy_2_0, pthread_cond_destroy,
- GLIBC_2_0);
-#endif
-versioned_symbol (libc, __pthread_cond_destroy, pthread_cond_destroy,
- GLIBC_2_3_2);
-
-FORWARD (__pthread_cond_init,
- (pthread_cond_t *cond, const pthread_condattr_t *cond_attr),
- (cond, cond_attr), 0)
-#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3_2)
-strong_alias (__pthread_cond_init, __pthread_cond_init_2_0)
-compat_symbol (libc, __pthread_cond_init_2_0, pthread_cond_init, GLIBC_2_0);
-#endif
-versioned_symbol (libc, __pthread_cond_init, pthread_cond_init, GLIBC_2_3_2);
-
-FORWARD (__pthread_cond_signal, (pthread_cond_t *cond), (cond), 0)
-#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3_2)
-strong_alias (__pthread_cond_signal, __pthread_cond_signal_2_0)
-compat_symbol (libc, __pthread_cond_signal_2_0, pthread_cond_signal,
- GLIBC_2_0);
-#endif
-versioned_symbol (libc, __pthread_cond_signal, pthread_cond_signal,
- GLIBC_2_3_2);
-
-FORWARD (__pthread_cond_wait, (pthread_cond_t *cond, pthread_mutex_t *mutex),
- (cond, mutex), 0)
-#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3_2)
-strong_alias (__pthread_cond_wait, __pthread_cond_wait_2_0)
-compat_symbol (libc, __pthread_cond_wait_2_0, pthread_cond_wait, GLIBC_2_0);
-#endif
-versioned_symbol (libc, __pthread_cond_wait, pthread_cond_wait, GLIBC_2_3_2);
-
-FORWARD (__pthread_cond_timedwait,
- (pthread_cond_t *cond, pthread_mutex_t *mutex,
- const struct timespec *abstime), (cond, mutex, abstime), 0)
-#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3_2)
-strong_alias (__pthread_cond_timedwait, __pthread_cond_timedwait_2_0)
-compat_symbol (libc, __pthread_cond_timedwait_2_0, pthread_cond_timedwait, GLIBC_2_0);
-#endif
-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)
-
-
-/* Use an alias to avoid warning, as pthread_exit is declared noreturn. */
-FORWARD2 (__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)
-
-FORWARD (pthread_setcanceltype, (int type, int *oldtype), (type, oldtype), 0)
-
-FORWARD2 (_pthread_cleanup_push, void, (struct _pthread_cleanup_buffer * buffer, void (*routine)(void *), void * arg), (buffer, routine, arg), return)
-
-FORWARD2 (_pthread_cleanup_pop, void, (struct _pthread_cleanup_buffer * buffer, int execute), (buffer, execute), return)
diff --git a/linuxthreads/internals.h b/linuxthreads/internals.h
deleted file mode 100644
index 605021766c..0000000000
--- a/linuxthreads/internals.h
+++ /dev/null
@@ -1,550 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-#ifndef _INTERNALS_H
-#define _INTERNALS_H 1
-
-/* Internal data structures */
-
-/* Includes */
-
-#include <limits.h>
-#include <signal.h>
-#include <stdbool.h>
-#include <unistd.h>
-#include <stackinfo.h>
-#include <sigcontextinfo.h>
-
-#include <tls.h>
-#include "descr.h"
-
-#include "semaphore.h"
-#include <pthread-functions.h>
-
-#ifndef THREAD_GETMEM
-# define THREAD_GETMEM(descr, member) descr->member
-#endif
-#ifndef THREAD_GETMEM_NC
-# define THREAD_GETMEM_NC(descr, member) descr->member
-#endif
-#ifndef THREAD_SETMEM
-# define THREAD_SETMEM(descr, member, value) descr->member = (value)
-#endif
-#ifndef THREAD_SETMEM_NC
-# define THREAD_SETMEM_NC(descr, member, value) descr->member = (value)
-#endif
-
-#if !defined NOT_IN_libc && defined FLOATING_STACKS
-# define LIBC_THREAD_GETMEM(descr, member) THREAD_GETMEM (descr, member)
-# define LIBC_THREAD_SETMEM(descr, member, value) \
- THREAD_SETMEM (descr, member, value)
-#else
-# define LIBC_THREAD_GETMEM(descr, member) descr->member
-# define LIBC_THREAD_SETMEM(descr, member, value) descr->member = (value)
-#endif
-
-typedef void (*destr_function)(void *);
-
-struct pthread_key_struct {
- int in_use; /* already allocated? */
- destr_function destr; /* destruction routine */
-};
-
-
-#define PTHREAD_START_ARGS_INITIALIZER(fct) \
- { (void *(*) (void *)) fct, NULL, {{0, }}, 0, { 0 } }
-
-
-/* The type of thread handles. */
-
-typedef struct pthread_handle_struct * pthread_handle;
-
-struct pthread_handle_struct {
- struct _pthread_fastlock h_lock; /* Fast lock for sychronized access */
- pthread_descr h_descr; /* Thread descriptor or NULL if invalid */
- char * h_bottom; /* Lowest address in the stack thread */
-};
-
-/* The type of messages sent to the thread manager thread */
-
-struct pthread_request {
- pthread_descr req_thread; /* Thread doing the request */
- enum { /* Request kind */
- REQ_CREATE, REQ_FREE, REQ_PROCESS_EXIT, REQ_MAIN_THREAD_EXIT,
- REQ_POST, REQ_DEBUG, REQ_KICK, REQ_FOR_EACH_THREAD
- } req_kind;
- union { /* Arguments for request */
- struct { /* For REQ_CREATE: */
- const pthread_attr_t * attr; /* thread attributes */
- void * (*fn)(void *); /* start function */
- void * arg; /* argument to start function */
- sigset_t mask; /* signal mask */
- } create;
- struct { /* For REQ_FREE: */
- pthread_t thread_id; /* identifier of thread to free */
- } free;
- struct { /* For REQ_PROCESS_EXIT: */
- int code; /* exit status */
- } exit;
- void * post; /* For REQ_POST: the semaphore */
- struct { /* For REQ_FOR_EACH_THREAD: callback */
- void (*fn)(void *, pthread_descr);
- void *arg;
- } for_each;
- } req_args;
-};
-
-
-
-typedef void (*arch_sighandler_t) (int, SIGCONTEXT);
-union sighandler
-{
- arch_sighandler_t old;
- void (*rt) (int, struct siginfo *, struct ucontext *);
-};
-extern union sighandler __sighandler[NSIG];
-
-
-/* Signals used for suspend/restart and for cancellation notification. */
-
-extern int __pthread_sig_restart;
-extern int __pthread_sig_cancel;
-
-/* Signal used for interfacing with gdb */
-
-extern int __pthread_sig_debug;
-
-/* Global array of thread handles, used for validating a thread id
- and retrieving the corresponding thread descriptor. Also used for
- mapping the available stack segments. */
-
-extern struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX];
-
-/* Descriptor of the main thread */
-
-extern pthread_descr __pthread_main_thread;
-
-/* File descriptor for sending requests to the thread manager.
- Initially -1, meaning that __pthread_initialize_manager must be called. */
-
-extern int __pthread_manager_request;
-
-/* Other end of the pipe for sending requests to the thread manager. */
-
-extern int __pthread_manager_reader;
-
-#ifdef FLOATING_STACKS
-/* Maximum stack size. */
-extern size_t __pthread_max_stacksize;
-#endif
-
-/* Pending request for a process-wide exit */
-
-extern int __pthread_exit_requested, __pthread_exit_code;
-
-/* Set to 1 by gdb if we're debugging */
-
-extern volatile int __pthread_threads_debug;
-
-/* Globally enabled events. */
-extern volatile td_thr_events_t __pthread_threads_events;
-
-/* Pointer to descriptor of thread with last event. */
-extern volatile pthread_descr __pthread_last_event;
-
-/* Flag which tells whether we are executing on SMP kernel. */
-extern int __pthread_smp_kernel;
-
-/* Return the handle corresponding to a thread id */
-
-static inline pthread_handle thread_handle(pthread_t id)
-{
- return &__pthread_handles[id % PTHREAD_THREADS_MAX];
-}
-
-/* Validate a thread handle. Must have acquired h->h_spinlock before. */
-
-static inline int invalid_handle(pthread_handle h, pthread_t id)
-{
- return h->h_descr == NULL || h->h_descr->p_tid != id || h->h_descr->p_terminated;
-}
-
-static inline int nonexisting_handle(pthread_handle h, pthread_t id)
-{
- return h->h_descr == NULL || h->h_descr->p_tid != id;
-}
-
-/* Fill in defaults left unspecified by pt-machine.h. */
-
-/* We round up a value with page size. */
-#ifndef page_roundup
-#define page_roundup(v,p) ((((size_t) (v)) + (p) - 1) & ~((p) - 1))
-#endif
-
-/* The page size we can get from the system. This should likely not be
- changed by the machine file but, you never know. */
-#ifndef PAGE_SIZE
-#define PAGE_SIZE (sysconf (_SC_PAGE_SIZE))
-#endif
-
-/* The initial size of the thread stack. Must be a multiple of PAGE_SIZE. */
-#ifndef INITIAL_STACK_SIZE
-#define INITIAL_STACK_SIZE (4 * PAGE_SIZE)
-#endif
-
-/* Size of the thread manager stack. The "- 32" avoids wasting space
- with some malloc() implementations. */
-#ifndef THREAD_MANAGER_STACK_SIZE
-#define THREAD_MANAGER_STACK_SIZE (2 * PAGE_SIZE - 32)
-#endif
-
-/* The base of the "array" of thread stacks. The array will grow down from
- here. Defaults to the calculated bottom of the initial application
- stack. */
-#ifndef THREAD_STACK_START_ADDRESS
-#define THREAD_STACK_START_ADDRESS __pthread_initial_thread_bos
-#endif
-
-/* If MEMORY_BARRIER isn't defined in pt-machine.h, assume the
- architecture doesn't need a memory barrier instruction (e.g. Intel
- x86). Still we need the compiler to respect the barrier and emit
- all outstanding operations which modify memory. Some architectures
- distinguish between full, read and write barriers. */
-
-#ifndef MEMORY_BARRIER
-#define MEMORY_BARRIER() asm ("" : : : "memory")
-#endif
-#ifndef READ_MEMORY_BARRIER
-#define READ_MEMORY_BARRIER() MEMORY_BARRIER()
-#endif
-#ifndef WRITE_MEMORY_BARRIER
-#define WRITE_MEMORY_BARRIER() MEMORY_BARRIER()
-#endif
-
-/* Max number of times we must spin on a spinlock calling sched_yield().
- After MAX_SPIN_COUNT iterations, we put the calling thread to sleep. */
-
-#ifndef MAX_SPIN_COUNT
-#define MAX_SPIN_COUNT 50
-#endif
-
-/* Max number of times the spinlock in the adaptive mutex implementation
- spins actively on SMP systems. */
-
-#ifndef MAX_ADAPTIVE_SPIN_COUNT
-#define MAX_ADAPTIVE_SPIN_COUNT 100
-#endif
-
-/* Duration of sleep (in nanoseconds) when we can't acquire a spinlock
- after MAX_SPIN_COUNT iterations of sched_yield().
- With the 2.0 and 2.1 kernels, this MUST BE > 2ms.
- (Otherwise the kernel does busy-waiting for realtime threads,
- giving other threads no chance to run.) */
-
-#ifndef SPIN_SLEEP_DURATION
-#define SPIN_SLEEP_DURATION 2000001
-#endif
-
-/* Defined and used in libc.so. */
-extern int __libc_multiple_threads attribute_hidden;
-extern int __librt_multiple_threads;
-
-/* Debugging */
-
-#ifdef DEBUG
-#include <assert.h>
-#define ASSERT assert
-#define MSG __pthread_message
-#else
-#define ASSERT(x)
-#define MSG(msg,arg...)
-#endif
-
-/* Internal global functions */
-
-extern void __pthread_do_exit (void *retval, char *currentframe)
- __attribute__ ((__noreturn__));
-extern void __pthread_destroy_specifics (void);
-extern void __pthread_perform_cleanup (char *currentframe);
-extern void __pthread_init_max_stacksize (void);
-extern int __pthread_initialize_manager (void);
-extern void __pthread_message (const char * fmt, ...);
-extern int __pthread_manager (void *reqfd);
-extern int __pthread_manager_event (void *reqfd);
-extern void __pthread_manager_sighandler (int sig);
-extern void __pthread_reset_main_thread (void);
-extern void __pthread_once_fork_prepare (void);
-extern void __pthread_once_fork_parent (void);
-extern void __pthread_once_fork_child (void);
-extern void __flockfilelist (void);
-extern void __funlockfilelist (void);
-extern void __fresetlockfiles (void);
-extern void __pthread_manager_adjust_prio (int thread_prio);
-extern void __pthread_initialize_minimal (void);
-
-extern int __pthread_attr_setguardsize (pthread_attr_t *__attr,
- size_t __guardsize);
-extern int __pthread_attr_getguardsize (const pthread_attr_t *__attr,
- size_t *__guardsize);
-extern int __pthread_attr_setstackaddr (pthread_attr_t *__attr,
- void *__stackaddr);
-extern int __pthread_attr_getstackaddr (const pthread_attr_t *__attr,
- void **__stackaddr);
-extern int __pthread_attr_setstacksize (pthread_attr_t *__attr,
- size_t __stacksize);
-extern int __pthread_attr_getstacksize (const pthread_attr_t *__attr,
- size_t *__stacksize);
-extern int __pthread_attr_setstack (pthread_attr_t *__attr, void *__stackaddr,
- size_t __stacksize);
-extern int __pthread_attr_getstack (const pthread_attr_t *__attr, void **__stackaddr,
- size_t *__stacksize);
-extern int __pthread_attr_destroy (pthread_attr_t *attr);
-extern int __pthread_attr_setdetachstate (pthread_attr_t *attr,
- int detachstate);
-extern int __pthread_attr_getdetachstate (const pthread_attr_t *attr,
- int *detachstate);
-extern int __pthread_attr_setschedparam (pthread_attr_t *attr,
- const struct sched_param *param);
-extern int __pthread_attr_getschedparam (const pthread_attr_t *attr,
- struct sched_param *param);
-extern int __pthread_attr_setschedpolicy (pthread_attr_t *attr, int policy);
-extern int __pthread_attr_getschedpolicy (const pthread_attr_t *attr,
- int *policy);
-extern int __pthread_attr_setinheritsched (pthread_attr_t *attr, int inherit);
-extern int __pthread_attr_getinheritsched (const pthread_attr_t *attr,
- int *inherit);
-extern int __pthread_attr_setscope (pthread_attr_t *attr, int scope);
-extern int __pthread_attr_getscope (const pthread_attr_t *attr, int *scope);
-
-extern int __pthread_getconcurrency (void);
-extern int __pthread_setconcurrency (int __level);
-extern int __pthread_mutex_timedlock (pthread_mutex_t *__mutex,
- const struct timespec *__abstime);
-extern int __pthread_mutexattr_getpshared (const pthread_mutexattr_t *__attr,
- int *__pshared);
-extern int __pthread_mutexattr_setpshared (pthread_mutexattr_t *__attr,
- int __pshared);
-extern int __pthread_mutexattr_gettype (const pthread_mutexattr_t *__attr,
- int *__kind);
-extern void __pthread_kill_other_threads_np (void);
-extern int __pthread_mutex_init (pthread_mutex_t *__mutex,
- __const pthread_mutexattr_t *__mutex_attr);
-extern int __pthread_mutex_destroy (pthread_mutex_t *__mutex);
-extern int __pthread_mutex_lock (pthread_mutex_t *__mutex);
-extern int __pthread_mutex_trylock (pthread_mutex_t *__mutex);
-extern int __pthread_mutex_unlock (pthread_mutex_t *__mutex);
-#if defined NOT_IN_libc && defined IS_IN_libpthread
-hidden_proto (__pthread_mutex_init)
-hidden_proto (__pthread_mutex_destroy)
-hidden_proto (__pthread_mutex_lock)
-hidden_proto (__pthread_mutex_trylock)
-hidden_proto (__pthread_mutex_unlock)
-#endif
-extern int __pthread_cond_init (pthread_cond_t *cond,
- const pthread_condattr_t *cond_attr);
-extern int __pthread_cond_destroy (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_cond_signal (pthread_cond_t *cond);
-extern int __pthread_cond_broadcast (pthread_cond_t *cond);
-extern int __pthread_condattr_init (pthread_condattr_t *attr);
-extern int __pthread_condattr_destroy (pthread_condattr_t *attr);
-extern pthread_t __pthread_self (void);
-extern pthread_descr __pthread_thread_self (void);
-extern pthread_descr __pthread_self_stack (void) attribute_hidden;
-extern int __pthread_equal (pthread_t thread1, pthread_t thread2);
-extern void __pthread_exit (void *retval);
-extern int __pthread_getschedparam (pthread_t thread, int *policy,
- struct sched_param *param);
-extern int __pthread_setschedparam (pthread_t thread, int policy,
- const struct sched_param *param);
-extern int __pthread_setcancelstate (int state, int * oldstate);
-extern int __pthread_setcanceltype (int type, int * oldtype);
-
-extern void __pthread_restart_old(pthread_descr th);
-extern void __pthread_suspend_old(pthread_descr self);
-extern int __pthread_timedsuspend_old(pthread_descr self, const struct timespec *abs);
-
-extern void __pthread_restart_new(pthread_descr th);
-extern void __pthread_suspend_new(pthread_descr self);
-extern int __pthread_timedsuspend_new(pthread_descr self, const struct timespec *abs);
-
-extern void __pthread_wait_for_restart_signal(pthread_descr self);
-
-extern void __pthread_sigsuspend (const sigset_t *mask) attribute_hidden;
-
-extern int __pthread_yield (void);
-
-extern int __pthread_rwlock_timedrdlock (pthread_rwlock_t *__restrict __rwlock,
- __const struct timespec *__restrict
- __abstime);
-extern int __pthread_rwlock_timedwrlock (pthread_rwlock_t *__restrict __rwlock,
- __const struct timespec *__restrict
- __abstime);
-extern int __pthread_rwlockattr_destroy (pthread_rwlockattr_t *__attr);
-
-extern int __pthread_barrierattr_getpshared (__const pthread_barrierattr_t *
- __restrict __attr,
- int *__restrict __pshared);
-
-extern int __pthread_spin_lock (pthread_spinlock_t *__lock);
-extern int __pthread_spin_trylock (pthread_spinlock_t *__lock);
-extern int __pthread_spin_unlock (pthread_spinlock_t *__lock);
-extern int __pthread_spin_init (pthread_spinlock_t *__lock, int __pshared);
-extern int __pthread_spin_destroy (pthread_spinlock_t *__lock);
-
-/* Global pointers to old or new suspend functions */
-
-extern void (*__pthread_restart)(pthread_descr);
-extern void (*__pthread_suspend)(pthread_descr);
-extern int (*__pthread_timedsuspend)(pthread_descr, const struct timespec *);
-
-/* Prototypes for the function without cancelation support when the
- normal version has it. */
-extern int __libc_close (int fd);
-extern int __libc_nanosleep (const struct timespec *requested_time,
- struct timespec *remaining);
-/* Prototypes for some of the new semaphore functions. */
-extern int __new_sem_post (sem_t * sem);
-extern int __new_sem_init (sem_t *__sem, int __pshared, unsigned int __value);
-extern int __new_sem_wait (sem_t *__sem);
-extern int __new_sem_trywait (sem_t *__sem);
-extern int __new_sem_getvalue (sem_t *__restrict __sem, int *__restrict __sval);
-extern int __new_sem_destroy (sem_t *__sem);
-
-/* Prototypes for compatibility functions. */
-extern int __pthread_attr_init_2_1 (pthread_attr_t *__attr);
-extern int __pthread_attr_init_2_0 (pthread_attr_t *__attr);
-extern int __pthread_create_2_1 (pthread_t *__restrict __threadp,
- const pthread_attr_t *__attr,
- void *(*__start_routine) (void *),
- void *__restrict __arg);
-extern int __pthread_create_2_0 (pthread_t *__restrict thread,
- const pthread_attr_t *__attr,
- void *(*__start_routine) (void *),
- void *__restrict arg);
-
-/* The functions called the signal events. */
-extern void __linuxthreads_create_event (void);
-extern void __linuxthreads_death_event (void);
-extern void __linuxthreads_reap_event (void);
-
-/* This function is called to initialize the pthread library. */
-extern void __pthread_initialize (void);
-
-/* TSD. */
-extern int __pthread_internal_tsd_set (int key, const void * pointer);
-extern void * __pthread_internal_tsd_get (int key);
-extern void ** __attribute__ ((__const__))
- __pthread_internal_tsd_address (int key);
-
-/* Sighandler wrappers. */
-extern void __pthread_sighandler(int signo, SIGCONTEXT ctx);
-extern void __pthread_sighandler_rt(int signo, struct siginfo *si,
- struct ucontext *uc);
-extern void __pthread_null_sighandler(int sig);
-extern int __pthread_sigaction (int sig, const struct sigaction *act,
- struct sigaction *oact);
-extern int __pthread_sigwait (const sigset_t *set, int *sig);
-extern int __pthread_raise (int sig);
-
-/* Cancellation. */
-extern int __pthread_enable_asynccancel (void) attribute_hidden;
-extern void __pthread_disable_asynccancel (int oldtype)
- internal_function attribute_hidden;
-
-/* 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 libc.so and are exported. */
-extern int __librt_enable_asynccancel (void);
-extern void __librt_disable_asynccancel (int oldtype) internal_function;
-
-extern void __pthread_cleanup_upto (__jmp_buf target,
- char *targetframe) attribute_hidden;
-extern pid_t __pthread_fork (struct fork_block *b) attribute_hidden;
-
-#if !defined NOT_IN_libc
-# define LIBC_CANCEL_ASYNC() \
- __libc_enable_asynccancel ()
-# 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 defined IS_IN_libpthread
-# define LIBC_CANCEL_ASYNC() \
- __pthread_enable_asynccancel ()
-# define LIBC_CANCEL_RESET(oldtype) \
- __pthread_disable_asynccancel (oldtype)
-# define LIBC_CANCEL_HANDLED() \
- __asm (".globl " __SYMBOL_PREFIX "__pthread_enable_asynccancel"); \
- __asm (".globl " __SYMBOL_PREFIX "__pthread_disable_asynccancel")
-#elif defined IS_IN_librt
-# define LIBC_CANCEL_ASYNC() \
- __librt_enable_asynccancel ()
-# define LIBC_CANCEL_RESET(oldtype) \
- __librt_disable_asynccancel (oldtype)
-# 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
-
-extern int * __libc_pthread_init (const struct pthread_functions *functions);
-
-#if !defined NOT_IN_libc && !defined FLOATING_STACKS
-# ifdef SHARED
-# define thread_self() \
- (*__libc_pthread_functions.ptr_pthread_thread_self) ()
-# else
-weak_extern (__pthread_thread_self)
-# define thread_self() __pthread_thread_self ()
-# endif
-#endif
-
-#ifndef USE_TLS
-# define __manager_thread (&__pthread_manager_thread)
-#else
-# define __manager_thread __pthread_manager_threadp
-#endif
-
-extern inline __attribute__((always_inline)) pthread_descr
-check_thread_self (void)
-{
- pthread_descr self = thread_self ();
-#if defined THREAD_SELF && defined INIT_THREAD_SELF
- if (self == __manager_thread)
- {
- /* A new thread might get a cancel signal before it is fully
- initialized, so that the thread register might still point to the
- manager thread. Double check that this is really the manager
- thread. */
- self = __pthread_self_stack();
- if (self != __manager_thread)
- /* Oops, thread_self() isn't working yet.. */
- INIT_THREAD_SELF(self, self->p_nr);
- }
-#endif
- return self;
-}
-
-#endif /* internals.h */
diff --git a/linuxthreads/join.c b/linuxthreads/join.c
deleted file mode 100644
index 148f222319..0000000000
--- a/linuxthreads/join.c
+++ /dev/null
@@ -1,220 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* Thread termination and joining */
-
-#include <errno.h>
-#include <sched.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include "pthread.h"
-#include "internals.h"
-#include "spinlock.h"
-#include "restart.h"
-#include <not-cancel.h>
-
-void __pthread_exit(void * retval)
-{
- __pthread_do_exit (retval, CURRENT_STACK_FRAME);
-}
-strong_alias (__pthread_exit, pthread_exit);
-
-void __pthread_do_exit(void *retval, char *currentframe)
-{
- pthread_descr self = thread_self();
- pthread_descr joining;
- struct pthread_request request;
-
- /* Reset the cancellation flag to avoid looping if the cleanup handlers
- contain cancellation points */
- THREAD_SETMEM(self, p_canceled, 0);
- /* Call cleanup functions and destroy the thread-specific data */
- __pthread_perform_cleanup(currentframe);
- __pthread_destroy_specifics();
- /* Store return value */
- __pthread_lock(THREAD_GETMEM(self, p_lock), self);
- THREAD_SETMEM(self, p_retval, retval);
- /* See whether we have to signal the death. */
- if (THREAD_GETMEM(self, p_report_events))
- {
- /* See whether TD_DEATH is in any of the mask. */
- int idx = __td_eventword (TD_DEATH);
- uint32_t mask = __td_eventmask (TD_DEATH);
-
- if ((mask & (__pthread_threads_events.event_bits[idx]
- | THREAD_GETMEM_NC(self,
- p_eventbuf.eventmask.event_bits[idx])))
- != 0)
- {
- /* Yep, we have to signal the death. */
- THREAD_SETMEM(self, p_eventbuf.eventnum, TD_DEATH);
- THREAD_SETMEM(self, p_eventbuf.eventdata, self);
- __pthread_last_event = self;
-
- /* Now call the function to signal the event. */
- __linuxthreads_death_event();
- }
- }
- /* Say that we've terminated */
- THREAD_SETMEM(self, p_terminated, 1);
- /* See if someone is joining on us */
- joining = THREAD_GETMEM(self, p_joining);
- __pthread_unlock(THREAD_GETMEM(self, p_lock));
- /* Restart joining thread if any */
- if (joining != NULL) restart(joining);
- /* If this is the initial thread, block until all threads have terminated.
- If another thread calls exit, we'll be terminated from our signal
- handler. */
- if (self == __pthread_main_thread && __pthread_manager_request >= 0) {
- request.req_thread = self;
- request.req_kind = REQ_MAIN_THREAD_EXIT;
- TEMP_FAILURE_RETRY(write_not_cancel(__pthread_manager_request,
- (char *)&request, sizeof(request)));
- suspend(self);
- /* Main thread flushes stdio streams and runs atexit functions.
- It also calls a handler within LinuxThreads which sends a process exit
- request to the thread manager. */
- exit(0);
- }
- /* Threads other than the main one terminate without flushing stdio streams
- or running atexit functions. */
- _exit(0);
-}
-
-/* Function called by pthread_cancel to remove the thread from
- waiting on a condition variable queue. */
-
-static int join_extricate_func(void *obj, pthread_descr th)
-{
- volatile pthread_descr self = thread_self();
- pthread_handle handle = obj;
- pthread_descr jo;
- int did_remove = 0;
-
- __pthread_lock(&handle->h_lock, self);
- jo = handle->h_descr;
- did_remove = jo->p_joining != NULL;
- jo->p_joining = NULL;
- __pthread_unlock(&handle->h_lock);
-
- return did_remove;
-}
-
-int pthread_join(pthread_t thread_id, void ** thread_return)
-{
- volatile pthread_descr self = thread_self();
- struct pthread_request request;
- pthread_handle handle = thread_handle(thread_id);
- pthread_descr th;
- pthread_extricate_if extr;
- int already_canceled = 0;
-
- /* Set up extrication interface */
- extr.pu_object = handle;
- extr.pu_extricate_func = join_extricate_func;
-
- __pthread_lock(&handle->h_lock, self);
- if (nonexisting_handle(handle, thread_id)) {
- __pthread_unlock(&handle->h_lock);
- return ESRCH;
- }
- th = handle->h_descr;
- if (th == self) {
- __pthread_unlock(&handle->h_lock);
- return EDEADLK;
- }
- /* If detached or already joined, error */
- if (th->p_detached || th->p_joining != NULL) {
- __pthread_unlock(&handle->h_lock);
- return EINVAL;
- }
- /* If not terminated yet, suspend ourselves. */
- if (! th->p_terminated) {
- /* Register extrication interface */
- __pthread_set_own_extricate_if(self, &extr);
- if (!(THREAD_GETMEM(self, p_canceled)
- && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE))
- th->p_joining = self;
- else
- already_canceled = 1;
- __pthread_unlock(&handle->h_lock);
-
- if (already_canceled) {
- __pthread_set_own_extricate_if(self, 0);
- __pthread_do_exit(PTHREAD_CANCELED, CURRENT_STACK_FRAME);
- }
-
- suspend(self);
- /* Deregister extrication interface */
- __pthread_set_own_extricate_if(self, 0);
-
- /* This is a cancellation point */
- if (THREAD_GETMEM(self, p_woken_by_cancel)
- && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) {
- THREAD_SETMEM(self, p_woken_by_cancel, 0);
- __pthread_do_exit(PTHREAD_CANCELED, CURRENT_STACK_FRAME);
- }
- __pthread_lock(&handle->h_lock, self);
- }
- /* Get return value */
- if (thread_return != NULL) *thread_return = th->p_retval;
- __pthread_unlock(&handle->h_lock);
- /* Send notification to thread manager */
- if (__pthread_manager_request >= 0) {
- request.req_thread = self;
- request.req_kind = REQ_FREE;
- request.req_args.free.thread_id = thread_id;
- TEMP_FAILURE_RETRY(write_not_cancel(__pthread_manager_request,
- (char *) &request, sizeof(request)));
- }
- return 0;
-}
-
-int pthread_detach(pthread_t thread_id)
-{
- int terminated;
- struct pthread_request request;
- pthread_handle handle = thread_handle(thread_id);
- pthread_descr th;
-
- __pthread_lock(&handle->h_lock, NULL);
- if (nonexisting_handle(handle, thread_id)) {
- __pthread_unlock(&handle->h_lock);
- return ESRCH;
- }
- th = handle->h_descr;
- /* If already detached, error */
- if (th->p_detached) {
- __pthread_unlock(&handle->h_lock);
- return EINVAL;
- }
- /* If already joining, don't do anything. */
- if (th->p_joining != NULL) {
- __pthread_unlock(&handle->h_lock);
- return 0;
- }
- /* Mark as detached */
- th->p_detached = 1;
- terminated = th->p_terminated;
- __pthread_unlock(&handle->h_lock);
- /* If already terminated, notify thread manager to reclaim resources */
- if (terminated && __pthread_manager_request >= 0) {
- request.req_thread = thread_self();
- request.req_kind = REQ_FREE;
- request.req_args.free.thread_id = thread_id;
- TEMP_FAILURE_RETRY(write_not_cancel(__pthread_manager_request,
- (char *) &request, sizeof(request)));
- }
- return 0;
-}
diff --git a/linuxthreads/joinrace.c b/linuxthreads/joinrace.c
deleted file mode 100644
index 8e1064c984..0000000000
--- a/linuxthreads/joinrace.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Test case by Permaine Cheung <pcheung@cygnus.com>. */
-
-#include <errno.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-static void *
-sub1 (void *arg)
-{
- /* Nothing. */
- return NULL;
-}
-
-int
-main (void)
-{
- int istatus;
- int policy;
- int cnt;
- pthread_t thread1;
- struct sched_param spresult1, sp1;
-
- for (cnt = 0; cnt < 100; ++cnt)
- {
- printf ("Round %d\n", cnt);
-
- pthread_create (&thread1, NULL, &sub1, NULL);
- pthread_join (thread1, NULL);
-
- istatus = pthread_getschedparam (thread1, &policy, &spresult1);
- if (istatus != ESRCH)
- {
- printf ("pthread_getschedparam returns: %d\n", istatus);
- return 1;
- }
-
- sp1.sched_priority = 0;
- istatus = pthread_setschedparam (thread1, SCHED_OTHER, &sp1);
- if (istatus != ESRCH)
- {
- printf ("pthread_setschedparam returns: %d\n", istatus);
- return 2;
- }
- }
-
- return 0;
-}
diff --git a/linuxthreads/libc-cancellation.c b/linuxthreads/libc-cancellation.c
deleted file mode 100644
index c28920feb3..0000000000
--- a/linuxthreads/libc-cancellation.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Copyright (C) 2002 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <errno.h>
-#include <rpc/rpc.h>
-#include "pthread.h"
-#include "internals.h"
-#include "spinlock.h"
-#include "restart.h"
-#include <bits/libc-lock.h>
-
-#if !defined NOT_IN_libc
-
-# ifndef SHARED
-weak_extern (__pthread_do_exit)
-# endif
-
-int __libc_multiple_threads attribute_hidden __attribute__((nocommon));
-strong_alias (__libc_multiple_threads, __librt_multiple_threads);
-
-/* 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
-__libc_enable_asynccancel (void)
-{
- pthread_descr self = thread_self();
- int oldtype = LIBC_THREAD_GETMEM(self, p_canceltype);
- LIBC_THREAD_SETMEM(self, p_canceltype, PTHREAD_CANCEL_ASYNCHRONOUS);
- if (__builtin_expect (LIBC_THREAD_GETMEM(self, p_canceled), 0) &&
- LIBC_THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE)
- __libc_maybe_call2 (pthread_do_exit,
- (PTHREAD_CANCELED, CURRENT_STACK_FRAME), 0);
- return oldtype;
-}
-strong_alias (__libc_enable_asynccancel, __librt_enable_asynccancel)
-
-void
-internal_function attribute_hidden
-__libc_disable_asynccancel (int oldtype)
-{
- pthread_descr self = thread_self();
- LIBC_THREAD_SETMEM(self, p_canceltype, oldtype);
-}
-strong_alias (__libc_disable_asynccancel, __librt_disable_asynccancel)
-
-#endif
diff --git a/linuxthreads/libc-tls-loc.c b/linuxthreads/libc-tls-loc.c
deleted file mode 100644
index a0a4b1b07d..0000000000
--- a/linuxthreads/libc-tls-loc.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Special definitions for libc's own exposed thread-specific variables.
- Copyright (C) 2002 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <tls.h>
-
-#if USE___THREAD
-# include <errno.h>
-# include <netdb.h>
-# include <resolv.h>
-
-/* These functions have identical definitions in libc. But the versioned
- dependencies in executables bind them to libpthread.so definitions,
- so we must have some here. */
-
-int *
-__errno_location (void)
-{
- return &errno;
-}
-
-int *
-__h_errno_location (void)
-{
- return &h_errno;
-}
-
-struct __res_state *
-__res_state (void)
-{
- return __resp;
-}
-
-#endif
diff --git a/linuxthreads/libc-tsd.c b/linuxthreads/libc-tsd.c
deleted file mode 100644
index 353ffb380a..0000000000
--- a/linuxthreads/libc-tsd.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Special hack used to build link-time libc.so object for linking libpthread.
- Copyright (C) 2002, 2004 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <tls.h>
-#include <resolv.h>
-
-#if ! USE___THREAD
-
-/* Special hack used to build link-time libc.so object for linking libpthread.
- See Makefile comments near libc_pic_lite.os rule for what this is for. */
-
-# undef _res
-
-int _errno;
-int _h_errno;
-struct __res_state _res;
-
-#endif
-
-int
-__res_maybe_init (res_state resp, int preinit)
-{
- return -1;
-}
-libc_hidden_def (__res_maybe_init)
diff --git a/linuxthreads/libc_pthread_init.c b/linuxthreads/libc_pthread_init.c
deleted file mode 100644
index 99213a2ff0..0000000000
--- a/linuxthreads/libc_pthread_init.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Copyright (C) 2002 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <locale.h>
-#include <stdlib.h>
-#include <string.h>
-#include <tls.h>
-#include "internals.h"
-#include <sysdep-cancel.h>
-
-int *
-__libc_pthread_init (functions)
- const struct pthread_functions *functions;
-{
-#ifdef SHARED
- /* We copy the content of the variable pointed to by the FUNCTIONS
- parameter to one in libc.so since this means access to the array
- can be done with one memory access instead of two. */
- memcpy (&__libc_pthread_functions, functions,
- sizeof (__libc_pthread_functions));
-#endif
-
-#if !(USE_TLS && HAVE___THREAD)
- /* Initialize thread-locale current locale to point to the global one.
- With __thread support, the variable's initializer takes care of this. */
- __uselocale (LC_GLOBAL_LOCALE);
-#endif
-
- return &__libc_multiple_threads;
-}
diff --git a/linuxthreads/linuxthreads.texi b/linuxthreads/linuxthreads.texi
deleted file mode 100644
index 795fb70977..0000000000
--- a/linuxthreads/linuxthreads.texi
+++ /dev/null
@@ -1,1627 +0,0 @@
-@node POSIX Threads
-@c @node POSIX Threads, , Top, Top
-@chapter POSIX Threads
-@c %MENU% The standard threads library
-
-@c This chapter needs more work bigtime. -zw
-
-This chapter describes the pthreads (POSIX threads) library. This
-library provides support functions for multithreaded programs: thread
-primitives, synchronization objects, and so forth. It also implements
-POSIX 1003.1b semaphores (not to be confused with System V semaphores).
-
-The threads operations (@samp{pthread_*}) do not use @var{errno}.
-Instead they return an error code directly. The semaphore operations do
-use @var{errno}.
-
-@menu
-* Basic Thread Operations:: Creating, terminating, and waiting for threads.
-* Thread Attributes:: Tuning thread scheduling.
-* Cancellation:: Stopping a thread before it's done.
-* Cleanup Handlers:: Deallocating resources when a thread is
- canceled.
-* Mutexes:: One way to synchronize threads.
-* Condition Variables:: Another way.
-* POSIX Semaphores:: And a third way.
-* Thread-Specific Data:: Variables with different values in
- different threads.
-* Threads and Signal Handling:: Why you should avoid mixing the two, and
- how to do it if you must.
-* Threads and Fork:: Interactions between threads and the
- @code{fork} function.
-* Streams and Fork:: Interactions between stdio streams and
- @code{fork}.
-* Miscellaneous Thread Functions:: A grab bag of utility routines.
-@end menu
-
-@node Basic Thread Operations
-@section Basic Thread Operations
-
-These functions are the thread equivalents of @code{fork}, @code{exit},
-and @code{wait}.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_create (pthread_t * @var{thread}, pthread_attr_t * @var{attr}, void * (*@var{start_routine})(void *), void * @var{arg})
-@code{pthread_create} creates a new thread of control that executes
-concurrently with the calling thread. The new thread calls the
-function @var{start_routine}, passing it @var{arg} as first argument. The
-new thread terminates either explicitly, by calling @code{pthread_exit},
-or implicitly, by returning from the @var{start_routine} function. The
-latter case is equivalent to calling @code{pthread_exit} with the result
-returned by @var{start_routine} as exit code.
-
-The @var{attr} argument specifies thread attributes to be applied to the
-new thread. @xref{Thread Attributes}, for details. The @var{attr}
-argument can also be @code{NULL}, in which case default attributes are
-used: the created thread is joinable (not detached) and has an ordinary
-(not realtime) scheduling policy.
-
-On success, the identifier of the newly created thread is stored in the
-location pointed by the @var{thread} argument, and a 0 is returned. On
-error, a non-zero error code is returned.
-
-This function may return the following errors:
-@table @code
-@item EAGAIN
-Not enough system resources to create a process for the new thread,
-or more than @code{PTHREAD_THREADS_MAX} threads are already active.
-@end table
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun void pthread_exit (void *@var{retval})
-@code{pthread_exit} terminates the execution of the calling thread. All
-cleanup handlers (@pxref{Cleanup Handlers}) that have been set for the
-calling thread with @code{pthread_cleanup_push} are executed in reverse
-order (the most recently pushed handler is executed first). Finalization
-functions for thread-specific data are then called for all keys that
-have non-@code{NULL} values associated with them in the calling thread
-(@pxref{Thread-Specific Data}). Finally, execution of the calling
-thread is stopped.
-
-The @var{retval} argument is the return value of the thread. It can be
-retrieved from another thread using @code{pthread_join}.
-
-The @code{pthread_exit} function never returns.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_cancel (pthread_t @var{thread})
-
-@code{pthread_cancel} sends a cancellation request to the thread denoted
-by the @var{thread} argument. If there is no such thread,
-@code{pthread_cancel} fails and returns @code{ESRCH}. Otherwise it
-returns 0. @xref{Cancellation}, for details.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_join (pthread_t @var{th}, void **thread_@var{return})
-@code{pthread_join} suspends the execution of the calling thread until
-the thread identified by @var{th} terminates, either by calling
-@code{pthread_exit} or by being canceled.
-
-If @var{thread_return} is not @code{NULL}, the return value of @var{th}
-is stored in the location pointed to by @var{thread_return}. The return
-value of @var{th} is either the argument it gave to @code{pthread_exit},
-or @code{PTHREAD_CANCELED} if @var{th} was canceled.
-
-The joined thread @code{th} must be in the joinable state: it must not
-have been detached using @code{pthread_detach} or the
-@code{PTHREAD_CREATE_DETACHED} attribute to @code{pthread_create}.
-
-When a joinable thread terminates, its memory resources (thread
-descriptor and stack) are not deallocated until another thread performs
-@code{pthread_join} on it. Therefore, @code{pthread_join} must be called
-once for each joinable thread created to avoid memory leaks.
-
-At most one thread can wait for the termination of a given
-thread. Calling @code{pthread_join} on a thread @var{th} on which
-another thread is already waiting for termination returns an error.
-
-@code{pthread_join} is a cancellation point. If a thread is canceled
-while suspended in @code{pthread_join}, the thread execution resumes
-immediately and the cancellation is executed without waiting for the
-@var{th} thread to terminate. If cancellation occurs during
-@code{pthread_join}, the @var{th} thread remains not joined.
-
-On success, the return value of @var{th} is stored in the location
-pointed to by @var{thread_return}, and 0 is returned. On error, one of
-the following values is returned:
-@table @code
-@item ESRCH
-No thread could be found corresponding to that specified by @var{th}.
-@item EINVAL
-The @var{th} thread has been detached, or another thread is already
-waiting on termination of @var{th}.
-@item EDEADLK
-The @var{th} argument refers to the calling thread.
-@end table
-@end deftypefun
-
-@node Thread Attributes
-@section Thread Attributes
-
-@comment pthread.h
-@comment POSIX
-
-Threads have a number of attributes that may be set at creation time.
-This is done by filling a thread attribute object @var{attr} of type
-@code{pthread_attr_t}, then passing it as second argument to
-@code{pthread_create}. Passing @code{NULL} is equivalent to passing a
-thread attribute object with all attributes set to their default values.
-
-Attribute objects are consulted only when creating a new thread. The
-same attribute object can be used for creating several threads.
-Modifying an attribute object after a call to @code{pthread_create} does
-not change the attributes of the thread previously created.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_attr_init (pthread_attr_t *@var{attr})
-@code{pthread_attr_init} initializes the thread attribute object
-@var{attr} and fills it with default values for the attributes. (The
-default values are listed below for each attribute.)
-
-Each attribute @var{attrname} (see below for a list of all attributes)
-can be individually set using the function
-@code{pthread_attr_set@var{attrname}} and retrieved using the function
-@code{pthread_attr_get@var{attrname}}.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_attr_destroy (pthread_attr_t *@var{attr})
-@code{pthread_attr_destroy} destroys the attribute object pointed to by
-@var{attr} releasing any resources associated with it. @var{attr} is
-left in an undefined state, and you must not use it again in a call to
-any pthreads function until it has been reinitialized.
-@end deftypefun
-
-@findex pthread_attr_setdetachstate
-@findex pthread_attr_setguardsize
-@findex pthread_attr_setinheritsched
-@findex pthread_attr_setschedparam
-@findex pthread_attr_setschedpolicy
-@findex pthread_attr_setscope
-@findex pthread_attr_setstack
-@findex pthread_attr_setstackaddr
-@findex pthread_attr_setstacksize
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_attr_setattr (pthread_attr_t *@var{obj}, int @var{value})
-Set attribute @var{attr} to @var{value} in the attribute object pointed
-to by @var{obj}. See below for a list of possible attributes and the
-values they can take.
-
-On success, these functions return 0. If @var{value} is not meaningful
-for the @var{attr} being modified, they will return the error code
-@code{EINVAL}. Some of the functions have other failure modes; see
-below.
-@end deftypefun
-
-@findex pthread_attr_getdetachstate
-@findex pthread_attr_getguardsize
-@findex pthread_attr_getinheritsched
-@findex pthread_attr_getschedparam
-@findex pthread_attr_getschedpolicy
-@findex pthread_attr_getscope
-@findex pthread_attr_getstack
-@findex pthread_attr_getstackaddr
-@findex pthread_attr_getstacksize
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_attr_getattr (const pthread_attr_t *@var{obj}, int *@var{value})
-Store the current setting of @var{attr} in @var{obj} into the variable
-pointed to by @var{value}.
-
-These functions always return 0.
-@end deftypefun
-
-The following thread attributes are supported:
-@table @samp
-@item detachstate
-Choose whether the thread is created in the joinable state (value
-@code{PTHREAD_CREATE_JOINABLE}) or in the detached state
-(@code{PTHREAD_CREATE_DETACHED}). The default is
-@code{PTHREAD_CREATE_JOINABLE}.
-
-In the joinable state, another thread can synchronize on the thread
-termination and recover its termination code using @code{pthread_join},
-but some of the thread resources are kept allocated after the thread
-terminates, and reclaimed only when another thread performs
-@code{pthread_join} on that thread.
-
-In the detached state, the thread resources are immediately freed when
-it terminates, but @code{pthread_join} cannot be used to synchronize on
-the thread termination.
-
-A thread created in the joinable state can later be put in the detached
-thread using @code{pthread_detach}.
-
-@item schedpolicy
-Select the scheduling policy for the thread: one of @code{SCHED_OTHER}
-(regular, non-realtime scheduling), @code{SCHED_RR} (realtime,
-round-robin) or @code{SCHED_FIFO} (realtime, first-in first-out).
-The default is @code{SCHED_OTHER}.
-@c Not doc'd in our manual: FIXME.
-@c See @code{sched_setpolicy} for more information on scheduling policies.
-
-The realtime scheduling policies @code{SCHED_RR} and @code{SCHED_FIFO}
-are available only to processes with superuser privileges.
-@code{pthread_attr_setschedparam} will fail and return @code{ENOTSUP} if
-you try to set a realtime policy when you are unprivileged.
-
-The scheduling policy of a thread can be changed after creation with
-@code{pthread_setschedparam}.
-
-@item schedparam
-Change the scheduling parameter (the scheduling priority)
-for the thread. The default is 0.
-
-This attribute is not significant if the scheduling policy is
-@code{SCHED_OTHER}; it only matters for the realtime policies
-@code{SCHED_RR} and @code{SCHED_FIFO}.
-
-The scheduling priority of a thread can be changed after creation with
-@code{pthread_setschedparam}.
-
-@item inheritsched
-Choose whether the scheduling policy and scheduling parameter for the
-newly created thread are determined by the values of the
-@var{schedpolicy} and @var{schedparam} attributes (value
-@code{PTHREAD_EXPLICIT_SCHED}) or are inherited from the parent thread
-(value @code{PTHREAD_INHERIT_SCHED}). The default is
-@code{PTHREAD_EXPLICIT_SCHED}.
-
-@item scope
-Choose the scheduling contention scope for the created thread. The
-default is @code{PTHREAD_SCOPE_SYSTEM}, meaning that the threads contend
-for CPU time with all processes running on the machine. In particular,
-thread priorities are interpreted relative to the priorities of all
-other processes on the machine. The other possibility,
-@code{PTHREAD_SCOPE_PROCESS}, means that scheduling contention occurs
-only between the threads of the running process: thread priorities are
-interpreted relative to the priorities of the other threads of the
-process, regardless of the priorities of other processes.
-
-@code{PTHREAD_SCOPE_PROCESS} is not supported in LinuxThreads. If you
-try to set the scope to this value, @code{pthread_attr_setscope} will
-fail and return @code{ENOTSUP}.
-
-@item stackaddr
-Provide an address for an application managed stack. The size of the
-stack must be at least @code{PTHREAD_STACK_MIN}.
-
-@item stacksize
-Change the size of the stack created for the thread. The value defines
-the minimum stack size, in bytes.
-
-If the value exceeds the system's maximum stack size, or is smaller
-than @code{PTHREAD_STACK_MIN}, @code{pthread_attr_setstacksize} will
-fail and return @code{EINVAL}.
-
-@item stack
-Provide both the address and size of an application managed stack to
-use for the new thread. The base of the memory area is @var{stackaddr}
-with the size of the memory area, @var{stacksize}, measured in bytes.
-
-If the value of @var{stacksize} is less than @code{PTHREAD_STACK_MIN},
-or greater than the system's maximum stack size, or if the value of
-@var{stackaddr} lacks the proper alignment, @code{pthread_attr_setstack}
-will fail and return @code{EINVAL}.
-
-@item guardsize
-Change the minimum size in bytes of the guard area for the thread's
-stack. The default size is a single page. If this value is set, it
-will be rounded up to the nearest page size. If the value is set to 0,
-a guard area will not be created for this thread. The space allocated
-for the guard area is used to catch stack overflow. Therefore, when
-allocating large structures on the stack, a larger guard area may be
-required to catch a stack overflow.
-
-If the caller is managing their own stacks (if the @code{stackaddr}
-attribute has been set), then the @code{guardsize} attribute is ignored.
-
-If the value exceeds the @code{stacksize}, @code{pthread_atrr_setguardsize}
-will fail and return @code{EINVAL}.
-@end table
-
-@node Cancellation
-@section Cancellation
-
-Cancellation is the mechanism by which a thread can terminate the
-execution of another thread. More precisely, a thread can send a
-cancellation request to another thread. Depending on its settings, the
-target thread can then either ignore the request, honor it immediately,
-or defer it till it reaches a cancellation point. When threads are
-first created by @code{pthread_create}, they always defer cancellation
-requests.
-
-When a thread eventually honors a cancellation request, it behaves as if
-@code{pthread_exit(PTHREAD_CANCELED)} was called. All cleanup handlers
-are executed in reverse order, finalization functions for
-thread-specific data are called, and finally the thread stops executing.
-If the canceled thread was joinable, the return value
-@code{PTHREAD_CANCELED} is provided to whichever thread calls
-@var{pthread_join} on it. See @code{pthread_exit} for more information.
-
-Cancellation points are the points where the thread checks for pending
-cancellation requests and performs them. The POSIX threads functions
-@code{pthread_join}, @code{pthread_cond_wait},
-@code{pthread_cond_timedwait}, @code{pthread_testcancel},
-@code{sem_wait}, and @code{sigwait} are cancellation points. In
-addition, these system calls are cancellation points:
-
-@multitable @columnfractions .33 .33 .33
-@item @t{accept} @tab @t{open} @tab @t{sendmsg}
-@item @t{close} @tab @t{pause} @tab @t{sendto}
-@item @t{connect} @tab @t{read} @tab @t{system}
-@item @t{fcntl} @tab @t{recv} @tab @t{tcdrain}
-@item @t{fsync} @tab @t{recvfrom} @tab @t{wait}
-@item @t{lseek} @tab @t{recvmsg} @tab @t{waitpid}
-@item @t{msync} @tab @t{send} @tab @t{write}
-@item @t{nanosleep}
-@end multitable
-
-@noindent
-All library functions that call these functions (such as
-@code{printf}) are also cancellation points.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_setcancelstate (int @var{state}, int *@var{oldstate})
-@code{pthread_setcancelstate} changes the cancellation state for the
-calling thread -- that is, whether cancellation requests are ignored or
-not. The @var{state} argument is the new cancellation state: either
-@code{PTHREAD_CANCEL_ENABLE} to enable cancellation, or
-@code{PTHREAD_CANCEL_DISABLE} to disable cancellation (cancellation
-requests are ignored).
-
-If @var{oldstate} is not @code{NULL}, the previous cancellation state is
-stored in the location pointed to by @var{oldstate}, and can thus be
-restored later by another call to @code{pthread_setcancelstate}.
-
-If the @var{state} argument is not @code{PTHREAD_CANCEL_ENABLE} or
-@code{PTHREAD_CANCEL_DISABLE}, @code{pthread_setcancelstate} fails and
-returns @code{EINVAL}. Otherwise it returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_setcanceltype (int @var{type}, int *@var{oldtype})
-@code{pthread_setcanceltype} changes the type of responses to
-cancellation requests for the calling thread: asynchronous (immediate)
-or deferred. The @var{type} argument is the new cancellation type:
-either @code{PTHREAD_CANCEL_ASYNCHRONOUS} to cancel the calling thread
-as soon as the cancellation request is received, or
-@code{PTHREAD_CANCEL_DEFERRED} to keep the cancellation request pending
-until the next cancellation point. If @var{oldtype} is not @code{NULL},
-the previous cancellation state is stored in the location pointed to by
-@var{oldtype}, and can thus be restored later by another call to
-@code{pthread_setcanceltype}.
-
-If the @var{type} argument is not @code{PTHREAD_CANCEL_DEFERRED} or
-@code{PTHREAD_CANCEL_ASYNCHRONOUS}, @code{pthread_setcanceltype} fails
-and returns @code{EINVAL}. Otherwise it returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun void pthread_testcancel (@var{void})
-@code{pthread_testcancel} does nothing except testing for pending
-cancellation and executing it. Its purpose is to introduce explicit
-checks for cancellation in long sequences of code that do not call
-cancellation point functions otherwise.
-@end deftypefun
-
-@node Cleanup Handlers
-@section Cleanup Handlers
-
-Cleanup handlers are functions that get called when a thread terminates,
-either by calling @code{pthread_exit} or because of
-cancellation. Cleanup handlers are installed and removed following a
-stack-like discipline.
-
-The purpose of cleanup handlers is to free the resources that a thread
-may hold at the time it terminates. In particular, if a thread exits or
-is canceled while it owns a locked mutex, the mutex will remain locked
-forever and prevent other threads from executing normally. The best way
-to avoid this is, just before locking the mutex, to install a cleanup
-handler whose effect is to unlock the mutex. Cleanup handlers can be
-used similarly to free blocks allocated with @code{malloc} or close file
-descriptors on thread termination.
-
-Here is how to lock a mutex @var{mut} in such a way that it will be
-unlocked if the thread is canceled while @var{mut} is locked:
-
-@smallexample
-pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
-pthread_mutex_lock(&mut);
-/* do some work */
-pthread_mutex_unlock(&mut);
-pthread_cleanup_pop(0);
-@end smallexample
-
-Equivalently, the last two lines can be replaced by
-
-@smallexample
-pthread_cleanup_pop(1);
-@end smallexample
-
-Notice that the code above is safe only in deferred cancellation mode
-(see @code{pthread_setcanceltype}). In asynchronous cancellation mode, a
-cancellation can occur between @code{pthread_cleanup_push} and
-@code{pthread_mutex_lock}, or between @code{pthread_mutex_unlock} and
-@code{pthread_cleanup_pop}, resulting in both cases in the thread trying
-to unlock a mutex not locked by the current thread. This is the main
-reason why asynchronous cancellation is difficult to use.
-
-If the code above must also work in asynchronous cancellation mode,
-then it must switch to deferred mode for locking and unlocking the
-mutex:
-
-@smallexample
-pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
-pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
-pthread_mutex_lock(&mut);
-/* do some work */
-pthread_cleanup_pop(1);
-pthread_setcanceltype(oldtype, NULL);
-@end smallexample
-
-The code above can be rewritten in a more compact and efficient way,
-using the non-portable functions @code{pthread_cleanup_push_defer_np}
-and @code{pthread_cleanup_pop_restore_np}:
-
-@smallexample
-pthread_cleanup_push_defer_np(pthread_mutex_unlock, (void *) &mut);
-pthread_mutex_lock(&mut);
-/* do some work */
-pthread_cleanup_pop_restore_np(1);
-@end smallexample
-
-@comment pthread.h
-@comment POSIX
-@deftypefun void pthread_cleanup_push (void (*@var{routine}) (void *), void *@var{arg})
-
-@code{pthread_cleanup_push} installs the @var{routine} function with
-argument @var{arg} as a cleanup handler. From this point on to the
-matching @code{pthread_cleanup_pop}, the function @var{routine} will be
-called with arguments @var{arg} when the thread terminates, either
-through @code{pthread_exit} or by cancellation. If several cleanup
-handlers are active at that point, they are called in LIFO order: the
-most recently installed handler is called first.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun void pthread_cleanup_pop (int @var{execute})
-@code{pthread_cleanup_pop} removes the most recently installed cleanup
-handler. If the @var{execute} argument is not 0, it also executes the
-handler, by calling the @var{routine} function with arguments
-@var{arg}. If the @var{execute} argument is 0, the handler is only
-removed but not executed.
-@end deftypefun
-
-Matching pairs of @code{pthread_cleanup_push} and
-@code{pthread_cleanup_pop} must occur in the same function, at the same
-level of block nesting. Actually, @code{pthread_cleanup_push} and
-@code{pthread_cleanup_pop} are macros, and the expansion of
-@code{pthread_cleanup_push} introduces an open brace @code{@{} with the
-matching closing brace @code{@}} being introduced by the expansion of the
-matching @code{pthread_cleanup_pop}.
-
-@comment pthread.h
-@comment GNU
-@deftypefun void pthread_cleanup_push_defer_np (void (*@var{routine}) (void *), void *@var{arg})
-@code{pthread_cleanup_push_defer_np} is a non-portable extension that
-combines @code{pthread_cleanup_push} and @code{pthread_setcanceltype}.
-It pushes a cleanup handler just as @code{pthread_cleanup_push} does,
-but also saves the current cancellation type and sets it to deferred
-cancellation. This ensures that the cleanup mechanism is effective even
-if the thread was initially in asynchronous cancellation mode.
-@end deftypefun
-
-@comment pthread.h
-@comment GNU
-@deftypefun void pthread_cleanup_pop_restore_np (int @var{execute})
-@code{pthread_cleanup_pop_restore_np} pops a cleanup handler introduced
-by @code{pthread_cleanup_push_defer_np}, and restores the cancellation
-type to its value at the time @code{pthread_cleanup_push_defer_np} was
-called.
-@end deftypefun
-
-@code{pthread_cleanup_push_defer_np} and
-@code{pthread_cleanup_pop_restore_np} must occur in matching pairs, at
-the same level of block nesting.
-
-The sequence
-
-@smallexample
-pthread_cleanup_push_defer_np(routine, arg);
-...
-pthread_cleanup_pop_restore_np(execute);
-@end smallexample
-
-@noindent
-is functionally equivalent to (but more compact and efficient than)
-
-@smallexample
-@{
- int oldtype;
- pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
- pthread_cleanup_push(routine, arg);
- ...
- pthread_cleanup_pop(execute);
- pthread_setcanceltype(oldtype, NULL);
-@}
-@end smallexample
-
-
-@node Mutexes
-@section Mutexes
-
-A mutex is a MUTual EXclusion device, and is useful for protecting
-shared data structures from concurrent modifications, and implementing
-critical sections and monitors.
-
-A mutex has two possible states: unlocked (not owned by any thread),
-and locked (owned by one thread). A mutex can never be owned by two
-different threads simultaneously. A thread attempting to lock a mutex
-that is already locked by another thread is suspended until the owning
-thread unlocks the mutex first.
-
-None of the mutex functions is a cancellation point, not even
-@code{pthread_mutex_lock}, in spite of the fact that it can suspend a
-thread for arbitrary durations. This way, the status of mutexes at
-cancellation points is predictable, allowing cancellation handlers to
-unlock precisely those mutexes that need to be unlocked before the
-thread stops executing. Consequently, threads using deferred
-cancellation should never hold a mutex for extended periods of time.
-
-It is not safe to call mutex functions from a signal handler. In
-particular, calling @code{pthread_mutex_lock} or
-@code{pthread_mutex_unlock} from a signal handler may deadlock the
-calling thread.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutex_init (pthread_mutex_t *@var{mutex}, const pthread_mutexattr_t *@var{mutexattr})
-
-@code{pthread_mutex_init} initializes the mutex object pointed to by
-@var{mutex} according to the mutex attributes specified in @var{mutexattr}.
-If @var{mutexattr} is @code{NULL}, default attributes are used instead.
-
-The LinuxThreads implementation supports only one mutex attribute,
-the @var{mutex type}, which is either ``fast'', ``recursive'', or
-``error checking''. The type of a mutex determines whether
-it can be locked again by a thread that already owns it.
-The default type is ``fast''.
-
-Variables of type @code{pthread_mutex_t} can also be initialized
-statically, using the constants @code{PTHREAD_MUTEX_INITIALIZER} (for
-timed mutexes), @code{PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP} (for
-recursive mutexes), @code{PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP}
-(for fast mutexes(, and @code{PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP}
-(for error checking mutexes).
-
-@code{pthread_mutex_init} always returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutex_lock (pthread_mutex_t *mutex))
-@code{pthread_mutex_lock} locks the given mutex. If the mutex is
-currently unlocked, it becomes locked and owned by the calling thread,
-and @code{pthread_mutex_lock} returns immediately. If the mutex is
-already locked by another thread, @code{pthread_mutex_lock} suspends the
-calling thread until the mutex is unlocked.
-
-If the mutex is already locked by the calling thread, the behavior of
-@code{pthread_mutex_lock} depends on the type of the mutex. If the mutex
-is of the ``fast'' type, the calling thread is suspended. It will
-remain suspended forever, because no other thread can unlock the mutex.
-If the mutex is of the ``error checking'' type, @code{pthread_mutex_lock}
-returns immediately with the error code @code{EDEADLK}. If the mutex is
-of the ``recursive'' type, @code{pthread_mutex_lock} succeeds and
-returns immediately, recording the number of times the calling thread
-has locked the mutex. An equal number of @code{pthread_mutex_unlock}
-operations must be performed before the mutex returns to the unlocked
-state.
-@c This doesn't discuss PTHREAD_MUTEX_TIMED_NP mutex attributes. FIXME
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutex_trylock (pthread_mutex_t *@var{mutex})
-@code{pthread_mutex_trylock} behaves identically to
-@code{pthread_mutex_lock}, except that it does not block the calling
-thread if the mutex is already locked by another thread (or by the
-calling thread in the case of a ``fast'' mutex). Instead,
-@code{pthread_mutex_trylock} returns immediately with the error code
-@code{EBUSY}.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutex_timedlock (pthread_mutex_t *@var{mutex}, const struct timespec *@var{abstime})
-The @code{pthread_mutex_timedlock} is similar to the
-@code{pthread_mutex_lock} function but instead of blocking for in
-indefinite time if the mutex is locked by another thread, it returns
-when the time specified in @var{abstime} is reached.
-
-This function can only be used on standard (``timed'') and ``error
-checking'' mutexes. It behaves just like @code{pthread_mutex_lock} for
-all other types.
-
-If the mutex is successfully locked, the function returns zero. If the
-time specified in @var{abstime} is reached without the mutex being locked,
-@code{ETIMEDOUT} is returned.
-
-This function was introduced in the POSIX.1d revision of the POSIX standard.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutex_unlock (pthread_mutex_t *@var{mutex})
-@code{pthread_mutex_unlock} unlocks the given mutex. The mutex is
-assumed to be locked and owned by the calling thread on entrance to
-@code{pthread_mutex_unlock}. If the mutex is of the ``fast'' type,
-@code{pthread_mutex_unlock} always returns it to the unlocked state. If
-it is of the ``recursive'' type, it decrements the locking count of the
-mutex (number of @code{pthread_mutex_lock} operations performed on it by
-the calling thread), and only when this count reaches zero is the mutex
-actually unlocked.
-
-On ``error checking'' mutexes, @code{pthread_mutex_unlock} actually
-checks at run-time that the mutex is locked on entrance, and that it was
-locked by the same thread that is now calling
-@code{pthread_mutex_unlock}. If these conditions are not met,
-@code{pthread_mutex_unlock} returns @code{EPERM}, and the mutex remains
-unchanged. ``Fast'' and ``recursive'' mutexes perform no such checks,
-thus allowing a locked mutex to be unlocked by a thread other than its
-owner. This is non-portable behavior and must not be relied upon.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutex_destroy (pthread_mutex_t *@var{mutex})
-@code{pthread_mutex_destroy} destroys a mutex object, freeing the
-resources it might hold. The mutex must be unlocked on entrance. In the
-LinuxThreads implementation, no resources are associated with mutex
-objects, thus @code{pthread_mutex_destroy} actually does nothing except
-checking that the mutex is unlocked.
-
-If the mutex is locked by some thread, @code{pthread_mutex_destroy}
-returns @code{EBUSY}. Otherwise it returns 0.
-@end deftypefun
-
-If any of the above functions (except @code{pthread_mutex_init})
-is applied to an uninitialized mutex, they will simply return
-@code{EINVAL} and do nothing.
-
-A shared global variable @var{x} can be protected by a mutex as follows:
-
-@smallexample
-int x;
-pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
-@end smallexample
-
-All accesses and modifications to @var{x} should be bracketed by calls to
-@code{pthread_mutex_lock} and @code{pthread_mutex_unlock} as follows:
-
-@smallexample
-pthread_mutex_lock(&mut);
-/* operate on x */
-pthread_mutex_unlock(&mut);
-@end smallexample
-
-Mutex attributes can be specified at mutex creation time, by passing a
-mutex attribute object as second argument to @code{pthread_mutex_init}.
-Passing @code{NULL} is equivalent to passing a mutex attribute object
-with all attributes set to their default values.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutexattr_init (pthread_mutexattr_t *@var{attr})
-@code{pthread_mutexattr_init} initializes the mutex attribute object
-@var{attr} and fills it with default values for the attributes.
-
-This function always returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutexattr_destroy (pthread_mutexattr_t *@var{attr})
-@code{pthread_mutexattr_destroy} destroys a mutex attribute object,
-which must not be reused until it is
-reinitialized. @code{pthread_mutexattr_destroy} does nothing in the
-LinuxThreads implementation.
-
-This function always returns 0.
-@end deftypefun
-
-LinuxThreads supports only one mutex attribute: the mutex type, which is
-either @code{PTHREAD_MUTEX_ADAPTIVE_NP} for ``fast'' mutexes,
-@code{PTHREAD_MUTEX_RECURSIVE_NP} for ``recursive'' mutexes,
-@code{PTHREAD_MUTEX_TIMED_NP} for ``timed'' mutexes, or
-@code{PTHREAD_MUTEX_ERRORCHECK_NP} for ``error checking'' mutexes. As
-the @code{NP} suffix indicates, this is a non-portable extension to the
-POSIX standard and should not be employed in portable programs.
-
-The mutex type determines what happens if a thread attempts to lock a
-mutex it already owns with @code{pthread_mutex_lock}. If the mutex is of
-the ``fast'' type, @code{pthread_mutex_lock} simply suspends the calling
-thread forever. If the mutex is of the ``error checking'' type,
-@code{pthread_mutex_lock} returns immediately with the error code
-@code{EDEADLK}. If the mutex is of the ``recursive'' type, the call to
-@code{pthread_mutex_lock} returns immediately with a success return
-code. The number of times the thread owning the mutex has locked it is
-recorded in the mutex. The owning thread must call
-@code{pthread_mutex_unlock} the same number of times before the mutex
-returns to the unlocked state.
-
-The default mutex type is ``timed'', that is, @code{PTHREAD_MUTEX_TIMED_NP}.
-@c This doesn't describe how a ``timed'' mutex behaves. FIXME
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutexattr_settype (pthread_mutexattr_t *@var{attr}, int @var{type})
-@code{pthread_mutexattr_settype} sets the mutex type attribute in
-@var{attr} to the value specified by @var{type}.
-
-If @var{type} is not @code{PTHREAD_MUTEX_ADAPTIVE_NP},
-@code{PTHREAD_MUTEX_RECURSIVE_NP}, @code{PTHREAD_MUTEX_TIMED_NP}, or
-@code{PTHREAD_MUTEX_ERRORCHECK_NP}, this function will return
-@code{EINVAL} and leave @var{attr} unchanged.
-
-The standard Unix98 identifiers @code{PTHREAD_MUTEX_DEFAULT},
-@code{PTHREAD_MUTEX_NORMAL}, @code{PTHREAD_MUTEX_RECURSIVE},
-and @code{PTHREAD_MUTEX_ERRORCHECK} are also permitted.
-
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_mutexattr_gettype (const pthread_mutexattr_t *@var{attr}, int *@var{type})
-@code{pthread_mutexattr_gettype} retrieves the current value of the
-mutex type attribute in @var{attr} and stores it in the location pointed
-to by @var{type}.
-
-This function always returns 0.
-@end deftypefun
-
-@node Condition Variables
-@section Condition Variables
-
-A condition (short for ``condition variable'') is a synchronization
-device that allows threads to suspend execution until some predicate on
-shared data is satisfied. The basic operations on conditions are: signal
-the condition (when the predicate becomes true), and wait for the
-condition, suspending the thread execution until another thread signals
-the condition.
-
-A condition variable must always be associated with a mutex, to avoid
-the race condition where a thread prepares to wait on a condition
-variable and another thread signals the condition just before the first
-thread actually waits on it.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_cond_init (pthread_cond_t *@var{cond}, pthread_condattr_t *cond_@var{attr})
-
-@code{pthread_cond_init} initializes the condition variable @var{cond},
-using the condition attributes specified in @var{cond_attr}, or default
-attributes if @var{cond_attr} is @code{NULL}. The LinuxThreads
-implementation supports no attributes for conditions, hence the
-@var{cond_attr} parameter is actually ignored.
-
-Variables of type @code{pthread_cond_t} can also be initialized
-statically, using the constant @code{PTHREAD_COND_INITIALIZER}.
-
-This function always returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_cond_signal (pthread_cond_t *@var{cond})
-@code{pthread_cond_signal} restarts one of the threads that are waiting
-on the condition variable @var{cond}. If no threads are waiting on
-@var{cond}, nothing happens. If several threads are waiting on
-@var{cond}, exactly one is restarted, but it is not specified which.
-
-This function always returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_cond_broadcast (pthread_cond_t *@var{cond})
-@code{pthread_cond_broadcast} restarts all the threads that are waiting
-on the condition variable @var{cond}. Nothing happens if no threads are
-waiting on @var{cond}.
-
-This function always returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_cond_wait (pthread_cond_t *@var{cond}, pthread_mutex_t *@var{mutex})
-@code{pthread_cond_wait} atomically unlocks the @var{mutex} (as per
-@code{pthread_unlock_mutex}) and waits for the condition variable
-@var{cond} to be signaled. The thread execution is suspended and does
-not consume any CPU time until the condition variable is signaled. The
-@var{mutex} must be locked by the calling thread on entrance to
-@code{pthread_cond_wait}. Before returning to the calling thread,
-@code{pthread_cond_wait} re-acquires @var{mutex} (as per
-@code{pthread_lock_mutex}).
-
-Unlocking the mutex and suspending on the condition variable is done
-atomically. Thus, if all threads always acquire the mutex before
-signaling the condition, this guarantees that the condition cannot be
-signaled (and thus ignored) between the time a thread locks the mutex
-and the time it waits on the condition variable.
-
-This function always returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_cond_timedwait (pthread_cond_t *@var{cond}, pthread_mutex_t *@var{mutex}, const struct timespec *@var{abstime})
-@code{pthread_cond_timedwait} atomically unlocks @var{mutex} and waits
-on @var{cond}, as @code{pthread_cond_wait} does, but it also bounds the
-duration of the wait. If @var{cond} has not been signaled before time
-@var{abstime}, the mutex @var{mutex} is re-acquired and
-@code{pthread_cond_timedwait} returns the error code @code{ETIMEDOUT}.
-The wait can also be interrupted by a signal; in that case
-@code{pthread_cond_timedwait} returns @code{EINTR}.
-
-The @var{abstime} parameter specifies an absolute time, with the same
-origin as @code{time} and @code{gettimeofday}: an @var{abstime} of 0
-corresponds to 00:00:00 GMT, January 1, 1970.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_cond_destroy (pthread_cond_t *@var{cond})
-@code{pthread_cond_destroy} destroys the condition variable @var{cond},
-freeing the resources it might hold. If any threads are waiting on the
-condition variable, @code{pthread_cond_destroy} leaves @var{cond}
-untouched and returns @code{EBUSY}. Otherwise it returns 0, and
-@var{cond} must not be used again until it is reinitialized.
-
-In the LinuxThreads implementation, no resources are associated with
-condition variables, so @code{pthread_cond_destroy} actually does
-nothing.
-@end deftypefun
-
-@code{pthread_cond_wait} and @code{pthread_cond_timedwait} are
-cancellation points. If a thread is canceled while suspended in one of
-these functions, the thread immediately resumes execution, relocks the
-mutex specified by @var{mutex}, and finally executes the cancellation.
-Consequently, cleanup handlers are assured that @var{mutex} is locked
-when they are called.
-
-It is not safe to call the condition variable functions from a signal
-handler. In particular, calling @code{pthread_cond_signal} or
-@code{pthread_cond_broadcast} from a signal handler may deadlock the
-calling thread.
-
-Consider two shared variables @var{x} and @var{y}, protected by the
-mutex @var{mut}, and a condition variable @var{cond} that is to be
-signaled whenever @var{x} becomes greater than @var{y}.
-
-@smallexample
-int x,y;
-pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
-pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
-@end smallexample
-
-Waiting until @var{x} is greater than @var{y} is performed as follows:
-
-@smallexample
-pthread_mutex_lock(&mut);
-while (x <= y) @{
- pthread_cond_wait(&cond, &mut);
-@}
-/* operate on x and y */
-pthread_mutex_unlock(&mut);
-@end smallexample
-
-Modifications on @var{x} and @var{y} that may cause @var{x} to become greater than
-@var{y} should signal the condition if needed:
-
-@smallexample
-pthread_mutex_lock(&mut);
-/* modify x and y */
-if (x > y) pthread_cond_broadcast(&cond);
-pthread_mutex_unlock(&mut);
-@end smallexample
-
-If it can be proved that at most one waiting thread needs to be waken
-up (for instance, if there are only two threads communicating through
-@var{x} and @var{y}), @code{pthread_cond_signal} can be used as a slightly more
-efficient alternative to @code{pthread_cond_broadcast}. In doubt, use
-@code{pthread_cond_broadcast}.
-
-To wait for @var{x} to becomes greater than @var{y} with a timeout of 5
-seconds, do:
-
-@smallexample
-struct timeval now;
-struct timespec timeout;
-int retcode;
-
-pthread_mutex_lock(&mut);
-gettimeofday(&now);
-timeout.tv_sec = now.tv_sec + 5;
-timeout.tv_nsec = now.tv_usec * 1000;
-retcode = 0;
-while (x <= y && retcode != ETIMEDOUT) @{
- retcode = pthread_cond_timedwait(&cond, &mut, &timeout);
-@}
-if (retcode == ETIMEDOUT) @{
- /* timeout occurred */
-@} else @{
- /* operate on x and y */
-@}
-pthread_mutex_unlock(&mut);
-@end smallexample
-
-Condition attributes can be specified at condition creation time, by
-passing a condition attribute object as second argument to
-@code{pthread_cond_init}. Passing @code{NULL} is equivalent to passing
-a condition attribute object with all attributes set to their default
-values.
-
-The LinuxThreads implementation supports no attributes for
-conditions. The functions on condition attributes are included only for
-compliance with the POSIX standard.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_condattr_init (pthread_condattr_t *@var{attr})
-@deftypefunx int pthread_condattr_destroy (pthread_condattr_t *@var{attr})
-@code{pthread_condattr_init} initializes the condition attribute object
-@var{attr} and fills it with default values for the attributes.
-@code{pthread_condattr_destroy} destroys the condition attribute object
-@var{attr}.
-
-Both functions do nothing in the LinuxThreads implementation.
-
-@code{pthread_condattr_init} and @code{pthread_condattr_destroy} always
-return 0.
-@end deftypefun
-
-@node POSIX Semaphores
-@section POSIX Semaphores
-
-@vindex SEM_VALUE_MAX
-Semaphores are counters for resources shared between threads. The
-basic operations on semaphores are: increment the counter atomically,
-and wait until the counter is non-null and decrement it atomically.
-
-Semaphores have a maximum value past which they cannot be incremented.
-The macro @code{SEM_VALUE_MAX} is defined to be this maximum value. In
-the GNU C library, @code{SEM_VALUE_MAX} is equal to @code{INT_MAX}
-(@pxref{Range of Type}), but it may be much smaller on other systems.
-
-The pthreads library implements POSIX 1003.1b semaphores. These should
-not be confused with System V semaphores (@code{ipc}, @code{semctl} and
-@code{semop}).
-@c !!! SysV IPC is not doc'd at all in our manual
-
-All the semaphore functions and macros are defined in @file{semaphore.h}.
-
-@comment semaphore.h
-@comment POSIX
-@deftypefun int sem_init (sem_t *@var{sem}, int @var{pshared}, unsigned int @var{value})
-@code{sem_init} initializes the semaphore object pointed to by
-@var{sem}. The count associated with the semaphore is set initially to
-@var{value}. The @var{pshared} argument indicates whether the semaphore
-is local to the current process (@var{pshared} is zero) or is to be
-shared between several processes (@var{pshared} is not zero).
-
-On success @code{sem_init} returns 0. On failure it returns -1 and sets
-@var{errno} to one of the following values:
-
-@table @code
-@item EINVAL
-@var{value} exceeds the maximal counter value @code{SEM_VALUE_MAX}
-
-@item ENOSYS
-@var{pshared} is not zero. LinuxThreads currently does not support
-process-shared semaphores. (This will eventually change.)
-@end table
-@end deftypefun
-
-@comment semaphore.h
-@comment POSIX
-@deftypefun int sem_destroy (sem_t * @var{sem})
-@code{sem_destroy} destroys a semaphore object, freeing the resources it
-might hold. If any threads are waiting on the semaphore when
-@code{sem_destroy} is called, it fails and sets @var{errno} to
-@code{EBUSY}.
-
-In the LinuxThreads implementation, no resources are associated with
-semaphore objects, thus @code{sem_destroy} actually does nothing except
-checking that no thread is waiting on the semaphore. This will change
-when process-shared semaphores are implemented.
-@end deftypefun
-
-@comment semaphore.h
-@comment POSIX
-@deftypefun int sem_wait (sem_t * @var{sem})
-@code{sem_wait} suspends the calling thread until the semaphore pointed
-to by @var{sem} has non-zero count. It then atomically decreases the
-semaphore count.
-
-@code{sem_wait} is a cancellation point. It always returns 0.
-@end deftypefun
-
-@comment semaphore.h
-@comment POSIX
-@deftypefun int sem_trywait (sem_t * @var{sem})
-@code{sem_trywait} is a non-blocking variant of @code{sem_wait}. If the
-semaphore pointed to by @var{sem} has non-zero count, the count is
-atomically decreased and @code{sem_trywait} immediately returns 0. If
-the semaphore count is zero, @code{sem_trywait} immediately returns -1
-and sets errno to @code{EAGAIN}.
-@end deftypefun
-
-@comment semaphore.h
-@comment POSIX
-@deftypefun int sem_post (sem_t * @var{sem})
-@code{sem_post} atomically increases the count of the semaphore pointed to
-by @var{sem}. This function never blocks.
-
-@c !!! This para appears not to agree with the code.
-On processors supporting atomic compare-and-swap (Intel 486, Pentium and
-later, Alpha, PowerPC, MIPS II, Motorola 68k, Ultrasparc), the
-@code{sem_post} function is can safely be called from signal handlers.
-This is the only thread synchronization function provided by POSIX
-threads that is async-signal safe. On the Intel 386 and earlier Sparc
-chips, the current LinuxThreads implementation of @code{sem_post} is not
-async-signal safe, because the hardware does not support the required
-atomic operations.
-
-@code{sem_post} always succeeds and returns 0, unless the semaphore
-count would exceed @code{SEM_VALUE_MAX} after being incremented. In
-that case @code{sem_post} returns -1 and sets @var{errno} to
-@code{EINVAL}. The semaphore count is left unchanged.
-@end deftypefun
-
-@comment semaphore.h
-@comment POSIX
-@deftypefun int sem_getvalue (sem_t * @var{sem}, int * @var{sval})
-@code{sem_getvalue} stores in the location pointed to by @var{sval} the
-current count of the semaphore @var{sem}. It always returns 0.
-@end deftypefun
-
-@node Thread-Specific Data
-@section Thread-Specific Data
-
-Programs often need global or static variables that have different
-values in different threads. Since threads share one memory space, this
-cannot be achieved with regular variables. Thread-specific data is the
-POSIX threads answer to this need.
-
-Each thread possesses a private memory block, the thread-specific data
-area, or TSD area for short. This area is indexed by TSD keys. The TSD
-area associates values of type @code{void *} to TSD keys. TSD keys are
-common to all threads, but the value associated with a given TSD key can
-be different in each thread.
-
-For concreteness, the TSD areas can be viewed as arrays of @code{void *}
-pointers, TSD keys as integer indices into these arrays, and the value
-of a TSD key as the value of the corresponding array element in the
-calling thread.
-
-When a thread is created, its TSD area initially associates @code{NULL}
-with all keys.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_key_create (pthread_key_t *@var{key}, void (*destr_function) (void *))
-@code{pthread_key_create} allocates a new TSD key. The key is stored in
-the location pointed to by @var{key}. There is a limit of
-@code{PTHREAD_KEYS_MAX} on the number of keys allocated at a given
-time. The value initially associated with the returned key is
-@code{NULL} in all currently executing threads.
-
-The @var{destr_function} argument, if not @code{NULL}, specifies a
-destructor function associated with the key. When a thread terminates
-via @code{pthread_exit} or by cancellation, @var{destr_function} is
-called on the value associated with the key in that thread. The
-@var{destr_function} is not called if a key is deleted with
-@code{pthread_key_delete} or a value is changed with
-@code{pthread_setspecific}. The order in which destructor functions are
-called at thread termination time is unspecified.
-
-Before the destructor function is called, the @code{NULL} value is
-associated with the key in the current thread. A destructor function
-might, however, re-associate non-@code{NULL} values to that key or some
-other key. To deal with this, if after all the destructors have been
-called for all non-@code{NULL} values, there are still some
-non-@code{NULL} values with associated destructors, then the process is
-repeated. The LinuxThreads implementation stops the process after
-@code{PTHREAD_DESTRUCTOR_ITERATIONS} iterations, even if some
-non-@code{NULL} values with associated descriptors remain. Other
-implementations may loop indefinitely.
-
-@code{pthread_key_create} returns 0 unless @code{PTHREAD_KEYS_MAX} keys
-have already been allocated, in which case it fails and returns
-@code{EAGAIN}.
-@end deftypefun
-
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_key_delete (pthread_key_t @var{key})
-@code{pthread_key_delete} deallocates a TSD key. It does not check
-whether non-@code{NULL} values are associated with that key in the
-currently executing threads, nor call the destructor function associated
-with the key.
-
-If there is no such key @var{key}, it returns @code{EINVAL}. Otherwise
-it returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_setspecific (pthread_key_t @var{key}, const void *@var{pointer})
-@code{pthread_setspecific} changes the value associated with @var{key}
-in the calling thread, storing the given @var{pointer} instead.
-
-If there is no such key @var{key}, it returns @code{EINVAL}. Otherwise
-it returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun {void *} pthread_getspecific (pthread_key_t @var{key})
-@code{pthread_getspecific} returns the value currently associated with
-@var{key} in the calling thread.
-
-If there is no such key @var{key}, it returns @code{NULL}.
-@end deftypefun
-
-The following code fragment allocates a thread-specific array of 100
-characters, with automatic reclaimation at thread exit:
-
-@smallexample
-/* Key for the thread-specific buffer */
-static pthread_key_t buffer_key;
-
-/* Once-only initialisation of the key */
-static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT;
-
-/* Allocate the thread-specific buffer */
-void buffer_alloc(void)
-@{
- pthread_once(&buffer_key_once, buffer_key_alloc);
- pthread_setspecific(buffer_key, malloc(100));
-@}
-
-/* Return the thread-specific buffer */
-char * get_buffer(void)
-@{
- return (char *) pthread_getspecific(buffer_key);
-@}
-
-/* Allocate the key */
-static void buffer_key_alloc()
-@{
- pthread_key_create(&buffer_key, buffer_destroy);
-@}
-
-/* Free the thread-specific buffer */
-static void buffer_destroy(void * buf)
-@{
- free(buf);
-@}
-@end smallexample
-
-@node Threads and Signal Handling
-@section Threads and Signal Handling
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_sigmask (int @var{how}, const sigset_t *@var{newmask}, sigset_t *@var{oldmask})
-@code{pthread_sigmask} changes the signal mask for the calling thread as
-described by the @var{how} and @var{newmask} arguments. If @var{oldmask}
-is not @code{NULL}, the previous signal mask is stored in the location
-pointed to by @var{oldmask}.
-
-The meaning of the @var{how} and @var{newmask} arguments is the same as
-for @code{sigprocmask}. If @var{how} is @code{SIG_SETMASK}, the signal
-mask is set to @var{newmask}. If @var{how} is @code{SIG_BLOCK}, the
-signals specified to @var{newmask} are added to the current signal mask.
-If @var{how} is @code{SIG_UNBLOCK}, the signals specified to
-@var{newmask} are removed from the current signal mask.
-
-Recall that signal masks are set on a per-thread basis, but signal
-actions and signal handlers, as set with @code{sigaction}, are shared
-between all threads.
-
-The @code{pthread_sigmask} function returns 0 on success, and one of the
-following error codes on error:
-@table @code
-@item EINVAL
-@var{how} is not one of @code{SIG_SETMASK}, @code{SIG_BLOCK}, or @code{SIG_UNBLOCK}
-
-@item EFAULT
-@var{newmask} or @var{oldmask} point to invalid addresses
-@end table
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_kill (pthread_t @var{thread}, int @var{signo})
-@code{pthread_kill} sends signal number @var{signo} to the thread
-@var{thread}. The signal is delivered and handled as described in
-@ref{Signal Handling}.
-
-@code{pthread_kill} returns 0 on success, one of the following error codes
-on error:
-@table @code
-@item EINVAL
-@var{signo} is not a valid signal number
-
-@item ESRCH
-The thread @var{thread} does not exist (e.g. it has already terminated)
-@end table
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int sigwait (const sigset_t *@var{set}, int *@var{sig})
-@code{sigwait} suspends the calling thread until one of the signals in
-@var{set} is delivered to the calling thread. It then stores the number
-of the signal received in the location pointed to by @var{sig} and
-returns. The signals in @var{set} must be blocked and not ignored on
-entrance to @code{sigwait}. If the delivered signal has a signal handler
-function attached, that function is @emph{not} called.
-
-@code{sigwait} is a cancellation point. It always returns 0.
-@end deftypefun
-
-For @code{sigwait} to work reliably, the signals being waited for must be
-blocked in all threads, not only in the calling thread, since
-otherwise the POSIX semantics for signal delivery do not guarantee
-that it's the thread doing the @code{sigwait} that will receive the signal.
-The best way to achieve this is block those signals before any threads
-are created, and never unblock them in the program other than by
-calling @code{sigwait}.
-
-Signal handling in LinuxThreads departs significantly from the POSIX
-standard. According to the standard, ``asynchronous'' (external) signals
-are addressed to the whole process (the collection of all threads),
-which then delivers them to one particular thread. The thread that
-actually receives the signal is any thread that does not currently block
-the signal.
-
-In LinuxThreads, each thread is actually a kernel process with its own
-PID, so external signals are always directed to one particular thread.
-If, for instance, another thread is blocked in @code{sigwait} on that
-signal, it will not be restarted.
-
-The LinuxThreads implementation of @code{sigwait} installs dummy signal
-handlers for the signals in @var{set} for the duration of the
-wait. Since signal handlers are shared between all threads, other
-threads must not attach their own signal handlers to these signals, or
-alternatively they should all block these signals (which is recommended
-anyway).
-
-@node Threads and Fork
-@section Threads and Fork
-
-It's not intuitively obvious what should happen when a multi-threaded POSIX
-process calls @code{fork}. Not only are the semantics tricky, but you may
-need to write code that does the right thing at fork time even if that code
-doesn't use the @code{fork} function. Moreover, you need to be aware of
-interaction between @code{fork} and some library features like
-@code{pthread_once} and stdio streams.
-
-When @code{fork} is called by one of the threads of a process, it creates a new
-process which is copy of the calling process. Effectively, in addition to
-copying certain system objects, the function takes a snapshot of the memory
-areas of the parent process, and creates identical areas in the child.
-To make matters more complicated, with threads it's possible for two or more
-threads to concurrently call fork to create two or more child processes.
-
-The child process has a copy of the address space of the parent, but it does
-not inherit any of its threads. Execution of the child process is carried out
-by a new thread which returns from @code{fork} function with a return value of
-zero; it is the only thread in the child process. Because threads are not
-inherited across fork, issues arise. At the time of the call to @code{fork},
-threads in the parent process other than the one calling @code{fork} may have
-been executing critical regions of code. As a result, the child process may
-get a copy of objects that are not in a well-defined state. This potential
-problem affects all components of the program.
-
-Any program component which will continue being used in a child process must
-correctly handle its state during @code{fork}. For this purpose, the POSIX
-interface provides the special function @code{pthread_atfork} for installing
-pointers to handler functions which are called from within @code{fork}.
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_atfork (void (*@var{prepare})(void), void (*@var{parent})(void), void (*@var{child})(void))
-
-@code{pthread_atfork} registers handler functions to be called just
-before and just after a new process is created with @code{fork}. The
-@var{prepare} handler will be called from the parent process, just
-before the new process is created. The @var{parent} handler will be
-called from the parent process, just before @code{fork} returns. The
-@var{child} handler will be called from the child process, just before
-@code{fork} returns.
-
-@code{pthread_atfork} returns 0 on success and a non-zero error code on
-error.
-
-One or more of the three handlers @var{prepare}, @var{parent} and
-@var{child} can be given as @code{NULL}, meaning that no handler needs
-to be called at the corresponding point.
-
-@code{pthread_atfork} can be called several times to install several
-sets of handlers. At @code{fork} time, the @var{prepare} handlers are
-called in LIFO order (last added with @code{pthread_atfork}, first
-called before @code{fork}), while the @var{parent} and @var{child}
-handlers are called in FIFO order (first added, first called).
-
-If there is insufficient memory available to register the handlers,
-@code{pthread_atfork} fails and returns @code{ENOMEM}. Otherwise it
-returns 0.
-
-The functions @code{fork} and @code{pthread_atfork} must not be regarded as
-reentrant from the context of the handlers. That is to say, if a
-@code{pthread_atfork} handler invoked from within @code{fork} calls
-@code{pthread_atfork} or @code{fork}, the behavior is undefined.
-
-Registering a triplet of handlers is an atomic operation with respect to fork.
-If new handlers are registered at about the same time as a fork occurs, either
-all three handlers will be called, or none of them will be called.
-
-The handlers are inherited by the child process, and there is no
-way to remove them, short of using @code{exec} to load a new
-pocess image.
-
-@end deftypefun
-
-To understand the purpose of @code{pthread_atfork}, recall that
-@code{fork} duplicates the whole memory space, including mutexes in
-their current locking state, but only the calling thread: other threads
-are not running in the child process. The mutexes are not usable after
-the @code{fork} and must be initialized with @code{pthread_mutex_init}
-in the child process. This is a limitation of the current
-implementation and might or might not be present in future versions.
-
-To avoid this, install handlers with @code{pthread_atfork} as follows: have the
-@var{prepare} handler lock the mutexes (in locking order), and the
-@var{parent} handler unlock the mutexes. The @var{child} handler should reset
-the mutexes using @code{pthread_mutex_init}, as well as any other
-synchronization objects such as condition variables.
-
-Locking the global mutexes before the fork ensures that all other threads are
-locked out of the critical regions of code protected by those mutexes. Thus
-when @code{fork} takes a snapshot of the parent's address space, that snapshot
-will copy valid, stable data. Resetting the synchronization objects in the
-child process will ensure they are properly cleansed of any artifacts from the
-threading subsystem of the parent process. For example, a mutex may inherit
-a wait queue of threads waiting for the lock; this wait queue makes no sense
-in the child process. Initializing the mutex takes care of this.
-
-@node Streams and Fork
-@section Streams and Fork
-
-The GNU standard I/O library has an internal mutex which guards the internal
-linked list of all standard C FILE objects. This mutex is properly taken care
-of during @code{fork} so that the child receives an intact copy of the list.
-This allows the @code{fopen} function, and related stream-creating functions,
-to work correctly in the child process, since these functions need to insert
-into the list.
-
-However, the individual stream locks are not completely taken care of. Thus
-unless the multithreaded application takes special precautions in its use of
-@code{fork}, the child process might not be able to safely use the streams that
-it inherited from the parent. In general, for any given open stream in the
-parent that is to be used by the child process, the application must ensure
-that that stream is not in use by another thread when @code{fork} is called.
-Otherwise an inconsistent copy of the stream object be produced. An easy way to
-ensure this is to use @code{flockfile} to lock the stream prior to calling
-@code{fork} and then unlock it with @code{funlockfile} inside the parent
-process, provided that the parent's threads properly honor these locks.
-Nothing special needs to be done in the child process, since the library
-internally resets all stream locks.
-
-Note that the stream locks are not shared between the parent and child.
-For example, even if you ensure that, say, the stream @code{stdout} is properly
-treated and can be safely used in the child, the stream locks do not provide
-an exclusion mechanism between the parent and child. If both processes write
-to @code{stdout}, strangely interleaved output may result regardless of
-the explicit use of @code{flockfile} or implicit locks.
-
-Also note that these provisions are a GNU extension; other systems might not
-provide any way for streams to be used in the child of a multithreaded process.
-POSIX requires that such a child process confines itself to calling only
-asynchronous safe functions, which excludes much of the library, including
-standard I/O.
-
-@node Miscellaneous Thread Functions
-@section Miscellaneous Thread Functions
-
-@comment pthread.h
-@comment POSIX
-@deftypefun {pthread_t} pthread_self (@var{void})
-@code{pthread_self} returns the thread identifier for the calling thread.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_equal (pthread_t thread1, pthread_t thread2)
-@code{pthread_equal} determines if two thread identifiers refer to the same
-thread.
-
-A non-zero value is returned if @var{thread1} and @var{thread2} refer to
-the same thread. Otherwise, 0 is returned.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_detach (pthread_t @var{th})
-@code{pthread_detach} puts the thread @var{th} in the detached
-state. This guarantees that the memory resources consumed by @var{th}
-will be freed immediately when @var{th} terminates. However, this
-prevents other threads from synchronizing on the termination of @var{th}
-using @code{pthread_join}.
-
-A thread can be created initially in the detached state, using the
-@code{detachstate} attribute to @code{pthread_create}. In contrast,
-@code{pthread_detach} applies to threads created in the joinable state,
-and which need to be put in the detached state later.
-
-After @code{pthread_detach} completes, subsequent attempts to perform
-@code{pthread_join} on @var{th} will fail. If another thread is already
-joining the thread @var{th} at the time @code{pthread_detach} is called,
-@code{pthread_detach} does nothing and leaves @var{th} in the joinable
-state.
-
-On success, 0 is returned. On error, one of the following codes is
-returned:
-@table @code
-@item ESRCH
-No thread could be found corresponding to that specified by @var{th}
-@item EINVAL
-The thread @var{th} is already in the detached state
-@end table
-@end deftypefun
-
-@comment pthread.h
-@comment GNU
-@deftypefun void pthread_kill_other_threads_np (@var{void})
-@code{pthread_kill_other_threads_np} is a non-portable LinuxThreads extension.
-It causes all threads in the program to terminate immediately, except
-the calling thread which proceeds normally. It is intended to be
-called just before a thread calls one of the @code{exec} functions,
-e.g. @code{execve}.
-
-Termination of the other threads is not performed through
-@code{pthread_cancel} and completely bypasses the cancellation
-mechanism. Hence, the current settings for cancellation state and
-cancellation type are ignored, and the cleanup handlers are not
-executed in the terminated threads.
-
-According to POSIX 1003.1c, a successful @code{exec*} in one of the
-threads should automatically terminate all other threads in the program.
-This behavior is not yet implemented in LinuxThreads. Calling
-@code{pthread_kill_other_threads_np} before @code{exec*} achieves much
-of the same behavior, except that if @code{exec*} ultimately fails, then
-all other threads are already killed.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_once (pthread_once_t *once_@var{control}, void (*@var{init_routine}) (void))
-
-The purpose of @code{pthread_once} is to ensure that a piece of
-initialization code is executed at most once. The @var{once_control}
-argument points to a static or extern variable statically initialized
-to @code{PTHREAD_ONCE_INIT}.
-
-The first time @code{pthread_once} is called with a given
-@var{once_control} argument, it calls @var{init_routine} with no
-argument and changes the value of the @var{once_control} variable to
-record that initialization has been performed. Subsequent calls to
-@code{pthread_once} with the same @code{once_control} argument do
-nothing.
-
-If a thread is cancelled while executing @var{init_routine}
-the state of the @var{once_control} variable is reset so that
-a future call to @code{pthread_once} will call the routine again.
-
-If the process forks while one or more threads are executing
-@code{pthread_once} initialization routines, the states of their respective
-@var{once_control} variables will appear to be reset in the child process so
-that if the child calls @code{pthread_once}, the routines will be executed.
-
-@code{pthread_once} always returns 0.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_setschedparam (pthread_t target_@var{thread}, int @var{policy}, const struct sched_param *@var{param})
-
-@code{pthread_setschedparam} sets the scheduling parameters for the
-thread @var{target_thread} as indicated by @var{policy} and
-@var{param}. @var{policy} can be either @code{SCHED_OTHER} (regular,
-non-realtime scheduling), @code{SCHED_RR} (realtime, round-robin) or
-@code{SCHED_FIFO} (realtime, first-in first-out). @var{param} specifies
-the scheduling priority for the two realtime policies. See
-@code{sched_setpolicy} for more information on scheduling policies.
-
-The realtime scheduling policies @code{SCHED_RR} and @code{SCHED_FIFO}
-are available only to processes with superuser privileges.
-
-On success, @code{pthread_setschedparam} returns 0. On error it returns
-one of the following codes:
-@table @code
-@item EINVAL
-@var{policy} is not one of @code{SCHED_OTHER}, @code{SCHED_RR},
-@code{SCHED_FIFO}, or the priority value specified by @var{param} is not
-valid for the specified policy
-
-@item EPERM
-Realtime scheduling was requested but the calling process does not have
-sufficient privileges.
-
-@item ESRCH
-The @var{target_thread} is invalid or has already terminated
-
-@item EFAULT
-@var{param} points outside the process memory space
-@end table
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_getschedparam (pthread_t target_@var{thread}, int *@var{policy}, struct sched_param *@var{param})
-
-@code{pthread_getschedparam} retrieves the scheduling policy and
-scheduling parameters for the thread @var{target_thread} and stores them
-in the locations pointed to by @var{policy} and @var{param},
-respectively.
-
-@code{pthread_getschedparam} returns 0 on success, or one of the
-following error codes on failure:
-@table @code
-@item ESRCH
-The @var{target_thread} is invalid or has already terminated.
-
-@item EFAULT
-@var{policy} or @var{param} point outside the process memory space.
-
-@end table
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_setconcurrency (int @var{level})
-@code{pthread_setconcurrency} is unused in LinuxThreads due to the lack
-of a mapping of user threads to kernel threads. It exists for source
-compatibility. It does store the value @var{level} so that it can be
-returned by a subsequent call to @code{pthread_getconcurrency}. It takes
-no other action however.
-@end deftypefun
-
-@comment pthread.h
-@comment POSIX
-@deftypefun int pthread_getconcurrency ()
-@code{pthread_getconcurrency} is unused in LinuxThreads due to the lack
-of a mapping of user threads to kernel threads. It exists for source
-compatibility. However, it will return the value that was set by the
-last call to @code{pthread_setconcurrency}.
-@end deftypefun
diff --git a/linuxthreads/lockfile.c b/linuxthreads/lockfile.c
deleted file mode 100644
index 6d683b4235..0000000000
--- a/linuxthreads/lockfile.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/* lockfile - Handle locking and unlocking of stream.
- Copyright (C) 1996, 1998, 2000 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <bits/libc-lock.h>
-#include <stdio.h>
-#include <pthread.h>
-#include "internals.h"
-#include "../libio/libioP.h"
-
-void
-__flockfile (FILE *stream)
-{
- __pthread_mutex_lock (stream->_lock);
-}
-#undef _IO_flockfile
-strong_alias (__flockfile, _IO_flockfile)
-weak_alias (__flockfile, flockfile);
-
-
-void
-__funlockfile (FILE *stream)
-{
- __pthread_mutex_unlock (stream->_lock);
-}
-#undef _IO_funlockfile
-strong_alias (__funlockfile, _IO_funlockfile)
-weak_alias (__funlockfile, funlockfile);
-
-
-int
-__ftrylockfile (FILE *stream)
-{
- return __pthread_mutex_trylock (stream->_lock);
-}
-strong_alias (__ftrylockfile, _IO_ftrylockfile)
-weak_alias (__ftrylockfile, ftrylockfile);
-
-void
-__flockfilelist(void)
-{
- _IO_list_lock();
-}
-
-void
-__funlockfilelist(void)
-{
- _IO_list_unlock();
-}
-
-void
-__fresetlockfiles (void)
-{
- _IO_ITER i;
-
- pthread_mutexattr_t attr;
-
- __pthread_mutexattr_init (&attr);
- __pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE_NP);
-
- for (i = _IO_iter_begin(); i != _IO_iter_end(); i = _IO_iter_next(i))
- {
- _IO_lock_t *_lock = _IO_iter_file(i)->_lock;
- if (_lock)
- __pthread_mutex_init (_lock, &attr);
- }
-
- __pthread_mutexattr_destroy (&attr);
-
- _IO_list_resetlock();
-}
diff --git a/linuxthreads/man/Makefile b/linuxthreads/man/Makefile
deleted file mode 100644
index d82e893566..0000000000
--- a/linuxthreads/man/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-SOURCES= pthread_cleanup_push.man \
- pthread_kill_other_threads_np.man pthread_mutexattr_setkind_np.man
-
-MANPAGES=$(SOURCES:.man=.3thr)
-
-PREPRO=perl troffprepro
-
-MANDIR=/usr/man/man3
-
-all: $(MANPAGES)
-
-.SUFFIXES: .man .3thr
-
-.man.3thr:
- $(PREPRO) $*.man $*.3thr
-
-$(MANPAGES): troffprepro
-
-clean:
- rm -f *.3thr
- rm -f *~
-
-install:
- install *.3thr $(MANDIR)
- @echo "*** Remember to run /usr/sbin/makewhatis `dirname $(MANDIR)` at some point"
diff --git a/linuxthreads/man/pthread_atfork.man b/linuxthreads/man/pthread_atfork.man
deleted file mode 100644
index b682bed3ac..0000000000
--- a/linuxthreads/man/pthread_atfork.man
+++ /dev/null
@@ -1,53 +0,0 @@
-.TH PTHREAD_ATFORK 3 LinuxThreads
-
-.SH NAME
-pthread_atfork \- register handlers to be called at fork(2) time
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));
-
-.SH DESCRIPTION
-
-!pthread_atfork! registers handler functions to be called just before
-and just after a new process is created with !fork!(2). The |prepare|
-handler will be called from the parent process, just before the new
-process is created. The |parent| handler will be called from the parent
-process, just before !fork!(2) returns. The |child| handler will be
-called from the child process, just before !fork!(2) returns.
-
-One or several of the three handlers |prepare|, |parent| and |child|
-can be given as !NULL!, meaning that no handler needs to be called at
-the corresponding point.
-
-!pthread_atfork! can be called several times to install several sets
-of handlers. At !fork!(2) time, the |prepare| handlers are called in
-LIFO order (last added with !pthread_atfork!, first called before !fork!),
-while the |parent| and |child| handlers are called in FIFO order
-(first added, first called).
-
-To understand the purpose of !pthread_atfork!, recall that !fork!(2)
-duplicates the whole memory space, including mutexes in their current
-locking state, but only the calling thread: other threads are not
-running in the child process. The mutexes are not usable after the
-!fork! and must be initialized with |pthread_mutex_init| in the child
-process. This is a limitation of the current implementation and might
-or might not be present in future versions.
-
-.SH "RETURN VALUE"
-
-!pthread_atfork! returns 0 on success and a non-zero error code on error.
-
-.SH ERRORS
-.TP
-!ENOMEM!
-insufficient memory available to register the handlers.
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!fork!(2),
-!pthread_mutex_lock!(3),
-!pthread_mutex_unlock!(3).
diff --git a/linuxthreads/man/pthread_attr_init.man b/linuxthreads/man/pthread_attr_init.man
deleted file mode 100644
index bd5a169242..0000000000
--- a/linuxthreads/man/pthread_attr_init.man
+++ /dev/null
@@ -1,221 +0,0 @@
-.TH PTHREAD_ATTR_INIT 3 LinuxThreads
-
-.XREF pthread_attr_destroy
-.XREF pthread_attr_setdetachstate
-.XREF pthread_attr_getdetachstate
-.XREF pthread_attr_setschedparam
-.XREF pthread_attr_getschedparam
-.XREF pthread_attr_setschedpolicy
-.XREF pthread_attr_getschedpolicy
-.XREF pthread_attr_setinheritsched
-.XREF pthread_attr_getinheritsched
-.XREF pthread_attr_setscope
-.XREF pthread_attr_getscope
-
-.SH NAME
-pthread_attr_init, pthread_attr_destroy, pthread_attr_setdetachstate, pthread_attr_getdetachstate, pthread_attr_setschedparam, pthread_attr_getschedparam, pthread_attr_setschedpolicy, pthread_attr_getschedpolicy, pthread_attr_setinheritsched, pthread_attr_getinheritsched, pthread_attr_setscope, pthread_attr_getscope \- thread creation attributes
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-int pthread_attr_init(pthread_attr_t *attr);
-
-int pthread_attr_destroy(pthread_attr_t *attr);
-
-int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
-
-int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
-
-int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
-
-int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);
-
-int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
-
-int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);
-
-int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit);
-
-int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit);
-
-int pthread_attr_setscope(pthread_attr_t *attr, int scope);
-
-int pthread_attr_getscope(const pthread_attr_t *attr, int *scope);
-
-.SH DESCRIPTION
-
-Setting attributes for threads is achieved by filling a
-thread attribute object |attr| of type !pthread_attr_t!, then passing it as
-second argument to !pthread_create!(3). Passing !NULL! is equivalent to
-passing a thread attribute object with all attributes set to their
-default values.
-
-!pthread_attr_init! initializes the thread attribute object |attr| and
-fills it with default values for the attributes. (The default values
-are listed below for each attribute.)
-
-Each attribute |attrname| (see below for a list of all attributes) can
-be individually set using the function !pthread_attr_set!|attrname|
-and retrieved using the function !pthread_attr_get!|attrname|.
-
-!pthread_attr_destroy! destroys a thread attribute object, which
-must not be reused until it is reinitialized. !pthread_attr_destroy!
-does nothing in the LinuxThreads implementation.
-
-Attribute objects are consulted only when creating a new thread. The
-same attribute object can be used for creating several
-threads. Modifying an attribute object after a call to
-!pthread_create! does not change the attributes of the thread
-previously created.
-
-The following thread attributes are supported:
-
-.SS detachstate
-
-Control whether the thread is created in the joinable state (value
-!PTHREAD_CREATE_JOINABLE!) or in the detached state
-(!PTHREAD_CREATE_DETACHED!).
-
-Default value: !PTHREAD_CREATE_JOINABLE!.
-
-In the joinable state, another thread can synchronize on the thread
-termination and recover its termination code using !pthread_join!(3),
-but some of the thread resources are kept allocated after the thread
-terminates, and reclaimed only when another thread performs
-!pthread_join!(3) on that thread.
-
-In the detached state, the thread resources are immediately freed when
-it terminates, but !pthread_join!(3) cannot be used to synchronize on
-the thread termination.
-
-A thread created in the joinable state can later be put in the
-detached thread using !pthread_detach!(3).
-
-.SS schedpolicy
-
-Select the scheduling policy for the thread: one of
-!SCHED_OTHER! (regular, non-realtime scheduling),
-!SCHED_RR! (realtime, round-robin) or
-!SCHED_FIFO! (realtime, first-in first-out). See
-!sched_setpolicy!(2) for more information on scheduling policies.
-
-Default value: !SCHED_OTHER!.
-
-The realtime scheduling policies !SCHED_RR! and !SCHED_FIFO! are
-available only to processes with superuser privileges.
-
-The scheduling policy of a thread can be changed after creation with
-!pthread_setschedparam!(3).
-
-.SS schedparam
-
-Contain the scheduling parameters (essentially, the scheduling
-priority) for the thread. See !sched_setparam!(2) for more information
-on scheduling parameters.
-
-Default value: priority is 0.
-
-This attribute is not significant if the scheduling policy is !SCHED_OTHER!;
-it only matters for the realtime policies !SCHED_RR! and !SCHED_FIFO!.
-
-The scheduling priority of a thread can be changed after creation with
-!pthread_setschedparam!(3).
-
-.SS inheritsched
-
-Indicate whether the scheduling policy and scheduling parameters for
-the newly created thread are determined by the values of the
-|schedpolicy| and |schedparam| attributes (value
-!PTHREAD_EXPLICIT_SCHED!) or are inherited from the parent thread
-(value !PTHREAD_INHERIT_SCHED!).
-
-Default value: !PTHREAD_EXPLICIT_SCHED!.
-
-.SS scope
-
-Define the scheduling contention scope for the created thread. The
-only value supported in the LinuxThreads implementation is
-!PTHREAD_SCOPE_SYSTEM!, meaning that the threads contend for CPU time
-with all processes running on the machine. In particular, thread
-priorities are interpreted relative to the priorities of all other
-processes on the machine. The other value specified by the standard,
-!PTHREAD_SCOPE_PROCESS!, means that scheduling contention occurs only
-between the threads of the running process: thread priorities are
-interpreted relative to the priorities of the other threads of the
-process, regardless of the priorities of other processes.
-!PTHREAD_SCOPE_PROCESS! is not supported in LinuxThreads.
-
-Default value: !PTHREAD_SCOPE_SYSTEM!.
-
-.SH "RETURN VALUE"
-
-All functions return 0 on success and a non-zero error code on error.
-On success, the !pthread_attr_get!|attrname| functions also store the
-current value of the attribute |attrname| in the location pointed to
-by their second argument.
-
-.SH ERRORS
-
-The !pthread_attr_setdetachstate! function returns the following error
-codes on error:
-.RS
-.TP
-!EINVAL!
-the specified |detachstate| is not one of !PTHREAD_CREATE_JOINABLE! or
-!PTHREAD_CREATE_DETACHED!.
-.RE
-
-The !pthread_attr_setschedparam! function returns the following error
-codes on error:
-.RS
-.TP
-!EINVAL!
-the priority specified in |param| is outside the range of allowed
-priorities for the scheduling policy currently in |attr|
-(1 to 99 for !SCHED_FIFO! and !SCHED_RR!; 0 for !SCHED_OTHER!).
-.RE
-
-The !pthread_attr_setschedpolicy! function returns the following error
-codes on error:
-.RS
-.TP
-!EINVAL!
-the specified |policy| is not one of !SCHED_OTHER!, !SCHED_FIFO!, or
-!SCHED_RR!.
-
-.TP
-!ENOTSUP!
-|policy| is !SCHED_FIFO! or !SCHED_RR!, and the effective user of the
-calling process is not super-user.
-.RE
-
-The !pthread_attr_setinheritsched! function returns the following error
-codes on error:
-.RS
-.TP
-!EINVAL!
-the specified |inherit| is not one of !PTHREAD_INHERIT_SCHED! or
-!PTHREAD_EXPLICIT_SCHED!.
-.RE
-
-The !pthread_attr_setscope! function returns the following error
-codes on error:
-.RS
-.TP
-!EINVAL!
-the specified |scope| is not one of !PTHREAD_SCOPE_SYSTEM! or
-!PTHREAD_SCOPE_PROCESS!.
-
-.TP
-!ENOTSUP!
-the specified |scope| is !PTHREAD_SCOPE_PROCESS! (not supported).
-.RE
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!pthread_create!(3),
-!pthread_join!(3),
-!pthread_detach!(3),
-!pthread_setschedparam!(3).
diff --git a/linuxthreads/man/pthread_cancel.man b/linuxthreads/man/pthread_cancel.man
deleted file mode 100644
index 202d5c9b26..0000000000
--- a/linuxthreads/man/pthread_cancel.man
+++ /dev/null
@@ -1,155 +0,0 @@
-.TH PTHREAD_CANCEL 3 LinuxThreads
-
-.XREF pthread_setcancelstate
-.XREF pthread_setcanceltype
-.XREF pthread_testcancel
-
-.SH NAME
-pthread_cancel, pthread_setcancelstate, pthread_setcanceltype, pthread_testcancel \- thread cancellation
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-int pthread_cancel(pthread_t thread);
-
-int pthread_setcancelstate(int state, int *oldstate);
-
-int pthread_setcanceltype(int type, int *oldtype);
-
-void pthread_testcancel(void);
-
-.SH DESCRIPTION
-
-Cancellation is the mechanism by which a thread can terminate the
-execution of another thread. More precisely, a thread can send a
-cancellation request to another thread. Depending on its settings, the
-target thread can then either ignore the request, honor it
-immediately, or defer it till it reaches a cancellation point.
-
-When a thread eventually honors a cancellation request, it performs as
-if !pthread_exit(PTHREAD_CANCELED)! has been called at that point:
-all cleanup handlers are executed in reverse order, finalization
-functions for thread-specific data are called, and finally the thread
-stops executing with the return value !PTHREAD_CANCELED!. See
-!pthread_exit!(3) for more information.
-
-!pthread_cancel! sends a cancellation request to the thread denoted
-by the |thread| argument.
-
-!pthread_setcancelstate! changes the cancellation state for the
-calling thread -- that is, whether cancellation requests are ignored
-or not. The |state| argument is the new cancellation state: either
-!PTHREAD_CANCEL_ENABLE! to enable cancellation, or
-!PTHREAD_CANCEL_DISABLE! to disable cancellation (cancellation
-requests are ignored). If |oldstate| is not !NULL!, the previous
-cancellation state is stored in the location pointed to by |oldstate|,
-and can thus be restored later by another call to
-!pthread_setcancelstate!.
-
-!pthread_setcanceltype! changes the type of responses to cancellation
-requests for the calling thread: asynchronous (immediate) or deferred.
-The |type| argument is the new cancellation type: either
-!PTHREAD_CANCEL_ASYNCHRONOUS! to cancel the calling thread as soon as
-the cancellation request is received, or !PTHREAD_CANCEL_DEFERRED! to
-keep the cancellation request pending until the next cancellation
-point. If |oldtype| is not !NULL!, the previous
-cancellation state is stored in the location pointed to by |oldtype|,
-and can thus be restored later by another call to
-!pthread_setcanceltype!.
-
-Threads are always created by !pthread_create!(3) with cancellation
-enabled and deferred. That is, the initial cancellation state is
-!PTHREAD_CANCEL_ENABLE! and the initial type is
-!PTHREAD_CANCEL_DEFERRED!.
-
-Cancellation points are those points in the program execution where a
-test for pending cancellation requests is performed and cancellation
-is executed if positive. The following POSIX threads functions
-are cancellation points:
-
-!pthread_join!(3)
-.br
-!pthread_cond_wait!(3)
-.br
-!pthread_cond_timedwait!(3)
-.br
-!pthread_testcancel!(3)
-.br
-!sem_wait!(3)
-.br
-!sigwait!(3)
-
-All other POSIX threads functions are guaranteed not to be
-cancellation points. That is, they never perform cancellation in
-deferred cancellation mode.
-
-!pthread_testcancel! does nothing except testing for pending
-cancellation and executing it. Its purpose is to introduce explicit
-checks for cancellation in long sequences of code that do not call
-cancellation point functions otherwise.
-
-.SH "RETURN VALUE"
-
-!pthread_cancel!, !pthread_setcancelstate! and
-!pthread_setcanceltype! return 0 on success and a non-zero error code
-on error.
-
-.SH ERRORS
-!pthread_cancel! returns the following error code on error:
-.RS
-.TP
-!ESRCH!
-no thread could be found corresponding to that specified by the |thread| ID.
-.RE
-
-!pthread_setcancelstate! returns the following error code on error:
-.RS
-.TP
-!EINVAL!
-the |state| argument is not !PTHREAD_CANCEL_ENABLE! nor
-!PTHREAD_CANCEL_DISABLE!
-.RE
-
-!pthread_setcanceltype! returns the following error code on error:
-.RS
-.TP
-!EINVAL!
-the |type| argument is not !PTHREAD_CANCEL_DEFERRED! nor
-!PTHREAD_CANCEL_ASYNCHRONOUS!
-.RE
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!pthread_exit!(3),
-!pthread_cleanup_push!(3),
-!pthread_cleanup_pop!(3).
-
-.SH BUGS
-
-POSIX specifies that a number of system calls (basically, all
-system calls that may block, such as !read!(2), !write!(2), !wait!(2),
-etc.) and library functions that may call these system calls (e.g.
-!fprintf!(3)) are cancellation points. LinuxThreads is not yet
-integrated enough with the C library to implement this, and thus none
-of the C library functions is a cancellation point.
-
-For system calls at least, there is a workaround. Cancellation
-requests are transmitted to the target thread by sending it a
-signal. That signal will interrupt all blocking system calls, causing
-them to return immediately with the !EINTR! error. So, checking for
-cancellation during a !read! system call, for instance, can be
-achieved as follows:
-
-.RS
-.ft 3
-.nf
-.sp
-pthread_testcancel();
-retcode = read(fd, buffer, length);
-pthread_testcancel();
-.ft
-.LP
-.RE
-.fi
diff --git a/linuxthreads/man/pthread_cleanup_push.man b/linuxthreads/man/pthread_cleanup_push.man
deleted file mode 100644
index 345d2635dc..0000000000
--- a/linuxthreads/man/pthread_cleanup_push.man
+++ /dev/null
@@ -1,194 +0,0 @@
-.TH PTHREAD_CLEANUP 3 LinuxThreads
-
-.XREF pthread_cleanup_pop
-.XREF pthread_cleanup_push_defer_np
-.XREF pthread_cleanup_pop_restore_np
-
-.SH NAME
-pthread_cleanup_push, pthread_cleanup_pop, pthread_cleanup_push_defer_np, pthread_cleanup_pop_restore_np \- install and remove cleanup handlers
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-void pthread_cleanup_push(void (*routine) (void *), void *arg);
-
-void pthread_cleanup_pop(int execute);
-
-void pthread_cleanup_push_defer_np(void (*routine) (void *), void *arg);
-
-void pthread_cleanup_pop_restore_np(int execute);
-
-.SH DESCRIPTION
-
-Cleanup handlers are functions that get called when a thread
-terminates, either by calling !pthread_exit!(3p) or because of
-cancellation. Cleanup handlers are installed and removed following a
-stack-like discipline.
-
-The purpose of cleanup handlers is to free the resources that a thread
-may hold at the time it terminates. In particular, if a thread
-exits or is cancelled while it owns a locked mutex, the mutex will
-remain locked forever and prevent other threads from executing
-normally. The best way to avoid this is, just before locking the
-mutex, to install a cleanup handler whose effect is to unlock the
-mutex. Cleanup handlers can be used similarly to free blocks allocated
-with !malloc!(3) or close file descriptors on thread termination.
-
-!pthread_cleanup_push! installs the |routine| function with argument
-|arg| as a cleanup handler. From this point on to the matching
-!pthread_cleanup_pop!, the function |routine| will be called with
-arguments |arg| when the thread terminates, either through !pthread_exit!(3p)
-or by cancellation. If several cleanup handlers are active at that
-point, they are called in LIFO order: the most recently installed
-handler is called first.
-
-!pthread_cleanup_pop! removes the most recently installed cleanup
-handler. If the |execute| argument is not 0, it also executes the
-handler, by calling the |routine| function with arguments |arg|. If
-the |execute| argument is 0, the handler is only removed but not
-executed.
-
-Matching pairs of !pthread_cleanup_push! and !pthread_cleanup_pop!
-must occur in the same function, at the same level of block nesting.
-Actually, !pthread_cleanup_push! and !pthread_cleanup_pop! are macros,
-and the expansion of !pthread_cleanup_push! introduces an open brace !{!
-with the matching closing brace !}! being introduced by the expansion
-of the matching !pthread_cleanup_pop!.
-
-!pthread_cleanup_push_defer_np! is a non-portable extension that
-combines !pthread_cleanup_push! and !pthread_setcanceltype!(3p).
-It pushes a cleanup handler just as !pthread_cleanup_push! does, but
-also saves the current cancellation type and sets it to deferred
-cancellation. This ensures that the cleanup mechanism is effective
-even if the thread was initially in asynchronous cancellation mode.
-
-!pthread_cleanup_pop_restore_np! pops a cleanup handler introduced by
-!pthread_cleanup_push_defer_np!, and restores the cancellation type to
-its value at the time !pthread_cleanup_push_defer_np! was called.
-
-!pthread_cleanup_push_defer_np! and !pthread_cleanup_pop_restore_np!
-must occur in matching pairs, at the same level of block nesting.
-
-The following sequence
-
-.RS
-.ft 3
-.nf
-.sp
-pthread_cleanup_push_defer_np(routine, arg);
-...
-pthread_cleanup_pop_defer_np(execute);
-.ft
-.LP
-.RE
-.fi
-
-is functionally equivalent to (but more compact and more efficient than)
-
-.RS
-.ft 3
-.nf
-.sp
-{ int oldtype;
- pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
- pthread_cleanup_push(routine, arg);
- ...
- pthread_cleanup_pop(execute);
- pthread_setcanceltype(oldtype, NULL);
-}
-.ft
-.LP
-.RE
-.fi
-
-.SH "RETURN VALUE"
-
-None.
-
-.SH ERRORS
-
-None.
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!pthread_exit!(3p),
-!pthread_cancel!(3p),
-!pthread_setcanceltype!(3p).
-
-.SH EXAMPLE
-
-Here is how to lock a mutex |mut| in such a way that it will be
-unlocked if the thread is canceled while |mut| is locked:
-
-.RS
-.ft 3
-.nf
-.sp
-pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
-pthread_mutex_lock(&mut);
-/* do some work */
-pthread_mutex_unlock(&mut);
-pthread_cleanup_pop(0);
-.ft
-.LP
-.RE
-.fi
-
-Equivalently, the last two lines can be replaced by
-
-.RS
-.ft 3
-.nf
-.sp
-pthread_cleanup_pop(1);
-.ft
-.LP
-.RE
-.fi
-
-Notice that the code above is safe only in deferred cancellation mode
-(see !pthread_setcanceltype!(3p)). In asynchronous cancellation mode,
-a cancellation can occur between !pthread_cleanup_push! and
-!pthread_mutex_lock!, or between !pthread_mutex_unlock! and
-!pthread_cleanup_pop!, resulting in both cases in the thread trying to
-unlock a mutex not locked by the current thread. This is the main
-reason why asynchronous cancellation is difficult to use.
-
-If the code above must also work in asynchronous cancellation mode,
-then it must switch to deferred mode for locking and unlocking the
-mutex:
-
-.RS
-.ft 3
-.nf
-.sp
-pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
-pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
-pthread_mutex_lock(&mut);
-/* do some work */
-pthread_cleanup_pop(1);
-pthread_setcanceltype(oldtype, NULL);
-.ft
-.LP
-.RE
-.fi
-
-The code above can be rewritten in a more compact and more
-efficient way, using the non-portable functions
-!pthread_cleanup_push_defer_np! and !pthread_cleanup_pop_restore_np!:
-
-.RS
-.ft 3
-.nf
-.sp
-pthread_cleanup_push_restore_np(pthread_mutex_unlock, (void *) &mut);
-pthread_mutex_lock(&mut);
-/* do some work */
-pthread_cleanup_pop_restore_np(1);
-.ft
-.LP
-.RE
-.fi
-
diff --git a/linuxthreads/man/pthread_cond_init.man b/linuxthreads/man/pthread_cond_init.man
deleted file mode 100644
index 4913062fd2..0000000000
--- a/linuxthreads/man/pthread_cond_init.man
+++ /dev/null
@@ -1,234 +0,0 @@
-.TH PTHREAD_COND 3 LinuxThreads
-
-.XREF pthread_cond_signal
-.XREF pthread_cond_broadcast
-.XREF pthread_cond_wait
-.XREF pthread_cond_timedwait
-.XREF pthread_cond_destroy
-
-.SH NAME
-pthread_cond_init, pthread_cond_destroy, pthread_cond_signal, pthread_cond_broadcast, pthread_cond_wait, pthread_cond_timedwait \- operations on conditions
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
-
-int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
-
-int pthread_cond_signal(pthread_cond_t *cond);
-
-int pthread_cond_broadcast(pthread_cond_t *cond);
-
-int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
-
-int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);
-
-int pthread_cond_destroy(pthread_cond_t *cond);
-
-.SH DESCRIPTION
-
-A condition (short for ``condition variable'') is a synchronization
-device that allows threads to suspend execution and relinquish the
-processors until some predicate on shared data is satisfied. The basic
-operations on conditions are: signal the condition (when the
-predicate becomes true), and wait for the condition, suspending the
-thread execution until another thread signals the condition.
-
-A condition variable must always be associated with a mutex, to avoid
-the race condition where a thread prepares to wait on a condition
-variable and another thread signals the condition just before the
-first thread actually waits on it.
-
-!pthread_cond_init! initializes the condition variable |cond|, using the
-condition attributes specified in |cond_attr|, or default attributes
-if |cond_attr| is !NULL!. The LinuxThreads implementation supports no
-attributes for conditions, hence the |cond_attr| parameter is actually
-ignored.
-
-Variables of type !pthread_cond_t! can also be initialized
-statically, using the constant !PTHREAD_COND_INITIALIZER!.
-
-!pthread_cond_signal! restarts one of the threads that are waiting on
-the condition variable |cond|. If no threads are waiting on |cond|,
-nothing happens. If several threads are waiting on |cond|, exactly one
-is restarted, but it is not specified which.
-
-!pthread_cond_broadcast! restarts all the threads that are waiting on
-the condition variable |cond|. Nothing happens if no threads are
-waiting on |cond|.
-
-!pthread_cond_wait! atomically unlocks the |mutex| (as per
-!pthread_unlock_mutex!) and waits for the condition variable |cond| to
-be signaled. The thread execution is suspended and does not consume
-any CPU time until the condition variable is signaled. The |mutex|
-must be locked by the calling thread on entrance to
-!pthread_cond_wait!. Before returning to the calling thread,
-!pthread_cond_wait! re-acquires |mutex| (as per !pthread_lock_mutex!).
-
-Unlocking the mutex and suspending on the condition variable is done
-atomically. Thus, if all threads always acquire the mutex before
-signaling the condition, this guarantees that the condition cannot be
-signaled (and thus ignored) between the time a thread locks the mutex
-and the time it waits on the condition variable.
-
-!pthread_cond_timedwait! atomically unlocks |mutex| and waits on
-|cond|, as !pthread_cond_wait! does, but it also bounds the duration
-of the wait. If |cond| has not been signaled within the amount of time
-specified by |abstime|, the mutex |mutex| is re-acquired and
-!pthread_cond_timedwait! returns the error !ETIMEDOUT!.
-The |abstime| parameter specifies an absolute time, with the same
-origin as !time!(2) and !gettimeofday!(2): an |abstime| of 0
-corresponds to 00:00:00 GMT, January 1, 1970.
-
-!pthread_cond_destroy! destroys a condition variable, freeing the
-resources it might hold. No threads must be waiting on the condition
-variable on entrance to !pthread_cond_destroy!. In the LinuxThreads
-implementation, no resources are associated with condition variables,
-thus !pthread_cond_destroy! actually does nothing except checking that
-the condition has no waiting threads.
-
-.SH CANCELLATION
-
-!pthread_cond_wait! and !pthread_cond_timedwait! are cancellation
-points. If a thread is cancelled while suspended in one of these
-functions, the thread immediately resumes execution, then locks again
-the |mutex| argument to !pthread_cond_wait! and
-!pthread_cond_timedwait!, and finally executes the cancellation.
-Consequently, cleanup handlers are assured that |mutex| is locked when
-they are called.
-
-.SH "ASYNC-SIGNAL SAFETY"
-
-The condition functions are not async-signal safe, and should not be
-called from a signal handler. In particular, calling
-!pthread_cond_signal! or !pthread_cond_broadcast! from a signal
-handler may deadlock the calling thread.
-
-.SH "RETURN VALUE"
-
-All condition variable functions return 0 on success and a non-zero
-error code on error.
-
-.SH ERRORS
-
-!pthread_cond_init!, !pthread_cond_signal!, !pthread_cond_broadcast!,
-and !pthread_cond_wait! never return an error code.
-
-The !pthread_cond_timedwait! function returns the following error codes
-on error:
-.RS
-.TP
-!ETIMEDOUT!
-the condition variable was not signaled until the timeout specified by
-|abstime|
-
-.TP
-!EINTR!
-!pthread_cond_timedwait! was interrupted by a signal
-.RE
-
-The !pthread_cond_destroy! function returns the following error code
-on error:
-.RS
-.TP
-!EBUSY!
-some threads are currently waiting on |cond|.
-.RE
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!pthread_condattr_init!(3),
-!pthread_mutex_lock!(3),
-!pthread_mutex_unlock!(3),
-!gettimeofday!(2),
-!nanosleep!(2).
-
-.SH EXAMPLE
-
-Consider two shared variables |x| and |y|, protected by the mutex |mut|,
-and a condition variable |cond| that is to be signaled whenever |x|
-becomes greater than |y|.
-
-.RS
-.ft 3
-.nf
-.sp
-int x,y;
-pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
-pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
-.ft
-.LP
-.RE
-.fi
-
-Waiting until |x| is greater than |y| is performed as follows:
-
-.RS
-.ft 3
-.nf
-.sp
-pthread_mutex_lock(&mut);
-while (x <= y) {
- pthread_cond_wait(&cond, &mut);
-}
-/* operate on x and y */
-pthread_mutex_unlock(&mut);
-.ft
-.LP
-.RE
-.fi
-
-Modifications on |x| and |y| that may cause |x| to become greater than
-|y| should signal the condition if needed:
-
-.RS
-.ft 3
-.nf
-.sp
-pthread_mutex_lock(&mut);
-/* modify x and y */
-if (x > y) pthread_cond_broadcast(&cond);
-pthread_mutex_unlock(&mut);
-.ft
-.LP
-.RE
-.fi
-
-If it can be proved that at most one waiting thread needs to be waken
-up (for instance, if there are only two threads communicating through
-|x| and |y|), !pthread_cond_signal! can be used as a slightly more
-efficient alternative to !pthread_cond_broadcast!. In doubt, use
-!pthread_cond_broadcast!.
-
-To wait for |x| to becomes greater than |y| with a timeout of 5
-seconds, do:
-
-.RS
-.ft 3
-.nf
-.sp
-struct timeval now;
-struct timespec timeout;
-int retcode;
-
-pthread_mutex_lock(&mut);
-gettimeofday(&now);
-timeout.tv_sec = now.tv_sec + 5;
-timeout.tv_nsec = now.tv_usec * 1000;
-retcode = 0;
-while (x <= y && retcode != ETIMEDOUT) {
- retcode = pthread_cond_timedwait(&cond, &mut, &timeout);
-}
-if (retcode == ETIMEDOUT) {
- /* timeout occurred */
-} else {
- /* operate on x and y */
-}
-pthread_mutex_unlock(&mut);
-.ft
-.LP
-.RE
-.fi
diff --git a/linuxthreads/man/pthread_condattr_init.man b/linuxthreads/man/pthread_condattr_init.man
deleted file mode 100644
index f491cbedbe..0000000000
--- a/linuxthreads/man/pthread_condattr_init.man
+++ /dev/null
@@ -1,39 +0,0 @@
-.TH PTHREAD_CONDATTR 3 LinuxThreads
-
-.XREF pthread_condattr_destroy
-
-.SH NAME
-pthread_condattr_init, pthread_condattr_destroy \- condition creation attributes
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-int pthread_condattr_init(pthread_condattr_t *attr);
-
-int pthread_condattr_destroy(pthread_condattr_t *attr);
-
-.SH DESCRIPTION
-
-Condition attributes can be specified at condition creation time, by passing a
-condition attribute object as second argument to !pthread_cond_init!(3).
-Passing !NULL! is equivalent to passing a condition attribute object with
-all attributes set to their default values.
-
-The LinuxThreads implementation supports no attributes for
-conditions. The functions on condition attributes are included only
-for compliance with the POSIX standard.
-
-!pthread_condattr_init! initializes the condition attribute object
-|attr| and fills it with default values for the attributes.
-!pthread_condattr_destroy! destroys a condition attribute object,
-which must not be reused until it is reinitialized. Both functions do
-nothing in the LinuxThreads implementation.
-
-.SH "RETURN VALUE"
-!pthread_condattr_init! and !pthread_condattr_destroy! always return 0.
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!pthread_cond_init!(3).
diff --git a/linuxthreads/man/pthread_create.man b/linuxthreads/man/pthread_create.man
deleted file mode 100644
index a94004767a..0000000000
--- a/linuxthreads/man/pthread_create.man
+++ /dev/null
@@ -1,46 +0,0 @@
-.TH PTHREAD_CREATE 3 LinuxThreads
-
-.SH NAME
-pthread_create \- create a new thread
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg);
-
-.SH DESCRIPTION
-!pthread_create! creates a new thread of control that executes
-concurrently with the calling thread. The new thread applies the
-function |start_routine| passing it |arg| as first argument. The new
-thread terminates either explicitly, by calling !pthread_exit!(3),
-or implicitly, by returning from the |start_routine| function. The
-latter case is equivalent to calling !pthread_exit!(3) with the result
-returned by |start_routine| as exit code.
-
-The |attr| argument specifies thread attributes to be applied to the
-new thread. See !pthread_attr_init!(3) for a complete list of thread
-attributes. The |attr| argument can also be !NULL!, in which case
-default attributes are used: the created thread is joinable (not
-detached) and has default (non real-time) scheduling policy.
-
-.SH "RETURN VALUE"
-On success, the identifier of the newly created thread is stored in
-the location pointed by the |thread| argument, and a 0 is returned. On
-error, a non-zero error code is returned.
-
-.SH ERRORS
-.TP
-!EAGAIN!
-not enough system resources to create a process for the new thread.
-.TP
-!EAGAIN!
-more than !PTHREAD_THREADS_MAX! threads are already active.
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!pthread_exit!(3),
-!pthread_join!(3),
-!pthread_detach!(3),
-!pthread_attr_init!(3).
diff --git a/linuxthreads/man/pthread_detach.man b/linuxthreads/man/pthread_detach.man
deleted file mode 100644
index 7b43f45faa..0000000000
--- a/linuxthreads/man/pthread_detach.man
+++ /dev/null
@@ -1,44 +0,0 @@
-.TH PTHREAD_DETACH 3 LinuxThreads
-
-.SH NAME
-pthread_detach \- put a running thread in the detached state
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-int pthread_detach(pthread_t th);
-
-.SH DESCRIPTION
-!pthread_detach! put the thread |th| in the detached state. This
-guarantees that the memory resources consumed by |th| will be freed
-immediately when |th| terminates. However, this prevents other threads
-from synchronizing on the termination of |th| using !pthread_join!.
-
-A thread can be created initially in the detached state, using the
-!detachstate! attribute to !pthread_create!(3). In contrast,
-!pthread_detach! applies to threads created in the joinable state, and
-which need to be put in the detached state later.
-
-After !pthread_detach! completes, subsequent attempts to perform
-!pthread_join! on |th| will fail. If another thread is already joining
-the thread |th| at the time !pthread_detach! is called,
-!pthread_detach! does nothing and leaves |th| in the joinable state.
-
-.SH "RETURN VALUE"
-On success, 0 is returned. On error, a non-zero error code is returned.
-
-.SH ERRORS
-.TP
-!ESRCH!
-No thread could be found corresponding to that specified by |th|
-.TP
-!EINVAL!
-the thread |th| is already in the detached state
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!pthread_create!(3),
-!pthread_join!(3),
-!pthread_attr_setdetachstate!(3). \ No newline at end of file
diff --git a/linuxthreads/man/pthread_equal.man b/linuxthreads/man/pthread_equal.man
deleted file mode 100644
index 1a0396515a..0000000000
--- a/linuxthreads/man/pthread_equal.man
+++ /dev/null
@@ -1,23 +0,0 @@
-.TH PTHREAD_EQUAL 3 LinuxThreads
-
-.SH NAME
-pthread_equal \- compare two thread identifiers
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-int pthread_equal(pthread_t thread1, pthread_t thread2);
-
-.SH DESCRIPTION
-!pthread_equal! determines if two thread identifiers refer to the same
-thread.
-
-.SH "RETURN VALUE"
-A non-zero value is returned if |thread1| and |thread2| refer to the
-same thread. Otherwise, 0 is returned.
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!pthread_self!(3).
diff --git a/linuxthreads/man/pthread_exit.man b/linuxthreads/man/pthread_exit.man
deleted file mode 100644
index 54751e9d05..0000000000
--- a/linuxthreads/man/pthread_exit.man
+++ /dev/null
@@ -1,32 +0,0 @@
-.TH PTHREAD_EXIT 3 LinuxThreads
-
-.SH NAME
-pthread_exit \- terminate the calling thread
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-void pthread_exit(void *retval);
-
-.SH DESCRIPTION
-!pthread_exit! terminates the execution of the calling thread.
-All cleanup handlers that have been set for the calling thread with
-!pthread_cleanup_push!(3) are executed in reverse order (the most
-recently pushed handler is executed first). Finalization functions for
-thread-specific data are then called for all keys that have non-!NULL!
-values associated with them in the calling thread (see
-!pthread_key_create!(3)). Finally, execution of the calling thread is
-stopped.
-
-The |retval| argument is the return value of the thread. It can be
-consulted from another thread using !pthread_join!(3).
-
-.SH "RETURN VALUE"
-The !pthread_exit! function never returns.
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!pthread_create!(3),
-!pthread_join!(3).
diff --git a/linuxthreads/man/pthread_join.man b/linuxthreads/man/pthread_join.man
deleted file mode 100644
index d587093841..0000000000
--- a/linuxthreads/man/pthread_join.man
+++ /dev/null
@@ -1,70 +0,0 @@
-.TH PTHREAD_JOIN 3 LinuxThreads
-
-.SH NAME
-pthread_join \- wait for termination of another thread
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-int pthread_join(pthread_t th, void **thread_return);
-
-.SH DESCRIPTION
-!pthread_join! suspends the execution of the calling thread until the
-thread identified by |th| terminates, either by calling !pthread_exit!(3)
-or by being cancelled.
-
-If |thread_return| is not !NULL!, the return value of |th| is stored
-in the location pointed to by |thread_return|. The return value of
-|th| is either the argument it gave to !pthread_exit!(3), or
-!PTHREAD_CANCELED! if |th| was cancelled.
-
-The joined thread !th! must be in the joinable state: it must not have
-been detached using !pthread_detach!(3) or the
-!PTHREAD_CREATE_DETACHED! attribute to !pthread_create!(3).
-
-When a joinable thread terminates, its memory resources (thread
-descriptor and stack) are not deallocated until another thread
-performs !pthread_join! on it. Therefore, !pthread_join! must be
-called once for each joinable thread created to avoid memory leaks.
-
-At most one thread can wait for the termination of a given
-thread. Calling !pthread_join! on a thread |th| on which another
-thread is already waiting for termination returns an error.
-
-.SH CANCELLATION
-
-!pthread_join! is a cancellation point. If a thread is canceled while
-suspended in !pthread_join!, the thread execution resumes immediately
-and the cancellation is executed without waiting for the |th| thread
-to terminate. If cancellation occurs during !pthread_join!, the |th|
-thread remains not joined.
-
-.SH "RETURN VALUE"
-On success, the return value of |th| is stored in the location pointed
-to by |thread_return|, and 0 is returned. On error, a non-zero error
-code is returned.
-
-.SH ERRORS
-.TP
-!ESRCH!
-No thread could be found corresponding to that specified by |th|.
-.TP
-!EINVAL!
-The |th| thread has been detached.
-.TP
-!EINVAL!
-Another thread is already waiting on termination of |th|.
-.TP
-!EDEADLK!
-The |th| argument refers to the calling thread.
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!pthread_exit!(3),
-!pthread_detach!(3),
-!pthread_create!(3),
-!pthread_attr_setdetachstate!(3),
-!pthread_cleanup_push!(3),
-!pthread_key_create!(3).
diff --git a/linuxthreads/man/pthread_key_create.man b/linuxthreads/man/pthread_key_create.man
deleted file mode 100644
index 6823e304c9..0000000000
--- a/linuxthreads/man/pthread_key_create.man
+++ /dev/null
@@ -1,151 +0,0 @@
-.TH PTHREAD_SPECIFIC 3 LinuxThreads
-
-.SH NAME
-pthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific \- management of thread-specific data
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *));
-
-int pthread_key_delete(pthread_key_t key);
-
-int pthread_setspecific(pthread_key_t key, const void *pointer);
-
-void * pthread_getspecific(pthread_key_t key);
-
-.SH DESCRIPTION
-
-Programs often need global or static variables that have different
-values in different threads. Since threads share one memory space,
-this cannot be achieved with regular variables. Thread-specific data
-is the POSIX threads answer to this need.
-
-Each thread possesses a private memory block, the thread-specific data
-area, or TSD area for short. This area is indexed by TSD keys. The TSD
-area associates values of type !void *! to TSD keys. TSD keys are
-common to all threads, but the value associated with a given TSD key
-can be different in each thread.
-
-For concreteness, the TSD areas can be viewed as arrays of !void *!
-pointers, TSD keys as integer indices into these arrays, and the value
-of a TSD key as the value of the corresponding array element in the
-calling thread.
-
-When a thread is created, its TSD area initially associates !NULL!
-with all keys.
-
-!pthread_key_create! allocates a new TSD key. The key is stored in the
-location pointed to by |key|. There is a limit of !PTHREAD_KEYS_MAX!
-on the number of keys allocated at a given time. The value initially
-associated with the returned key is !NULL! in all currently executing
-threads.
-
-The |destr_function| argument, if not !NULL!, specifies a destructor
-function associated with the key. When a thread terminates via
-!pthread_exit! or by cancellation, |destr_function| is called with
-arguments the value associated with the key in that thread. The
-|destr_function| is not called if that value is !NULL!. The order in
-which destructor functions are called at thread termination time is
-unspecified.
-
-Before the destructor function is called, the !NULL! value is
-associated with the key in the current thread. A destructor function
-might, however, re-associate non-!NULL! values to that key or some
-other key. To deal with this, if after all the destructors have been
-called for all non-!NULL! values, there are still some non-!NULL!
-values with associated destructors, then the process is repeated. The
-LinuxThreads implementation stops the process after
-!PTHREAD_DESTRUCTOR_ITERATIONS! iterations, even if some non-!NULL!
-values with associated descriptors remain. Other implementations may
-loop indefinitely.
-
-!pthread_key_delete! deallocates a TSD key. It does not check whether
-non-!NULL! values are associated with that key in the currently
-executing threads, nor call the destructor function associated with
-the key.
-
-!pthread_setspecific! changes the value associated with |key| in the
-calling thread, storing the given |pointer| instead.
-
-!pthread_getspecific! returns the value currently associated with
-|key| in the calling thread.
-
-.SH "RETURN VALUE"
-
-!pthread_key_create!, !pthread_key_delete!, and !pthread_setspecific!
-return 0 on success and a non-zero error code on failure. If
-successful, !pthread_key_create! stores the newly allocated key in the
-location pointed to by its |key| argument.
-
-!pthread_getspecific! returns the value associated with |key| on
-success, and !NULL! on error.
-
-.SH ERRORS
-!pthread_key_create! returns the following error code on error:
-.RS
-.TP
-!EAGAIN!
-!PTHREAD_KEYS_MAX! keys are already allocated
-.RE
-
-!pthread_key_delete! and !pthread_setspecific! return the following
-error code on error:
-.RS
-.TP
-!EINVAL!
-|key| is not a valid, allocated TSD key
-.RE
-
-!pthread_getspecific! returns !NULL! if |key| is not a valid,
-allocated TSD key.
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-pthread_create(3), pthread_exit(3), pthread_testcancel(3).
-
-.SH EXAMPLE
-
-The following code fragment allocates a thread-specific array of 100
-characters, with automatic reclaimation at thread exit:
-
-.RS
-.ft 3
-.nf
-.sp
-/* Key for the thread-specific buffer */
-static pthread_key_t buffer_key;
-
-/* Once-only initialisation of the key */
-static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT;
-
-/* Allocate the thread-specific buffer */
-void buffer_alloc(void)
-{
- pthread_once(&buffer_key_once, buffer_key_alloc);
- pthread_setspecific(buffer_key, malloc(100));
-}
-
-/* Return the thread-specific buffer */
-char * get_buffer(void)
-{
- return (char *) pthread_getspecific(buffer_key);
-}
-
-/* Allocate the key */
-static void buffer_key_alloc()
-{
- pthread_key_create(&buffer_key, buffer_destroy);
-}
-
-/* Free the thread-specific buffer */
-static void buffer_destroy(void * buf)
-{
- free(buf);
-}
-.ft
-.LP
-.RE
-.fi
diff --git a/linuxthreads/man/pthread_kill_other_threads_np.man b/linuxthreads/man/pthread_kill_other_threads_np.man
deleted file mode 100644
index 63d8342a7c..0000000000
--- a/linuxthreads/man/pthread_kill_other_threads_np.man
+++ /dev/null
@@ -1,40 +0,0 @@
-.TH PTHREAD_KILL_OTHER_THREADS_NP 3 LinuxThreads
-
-.SH NAME
-pthread_kill_other_threads_np \- terminate all threads in program except calling thread
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-void pthread_kill_other_threads_np(void);
-
-.SH DESCRIPTION
-!pthread_kill_other_threads_np! is a non-portable LinuxThreads extension.
-It causes all threads in the program to terminate immediately, except
-the calling thread which proceeds normally. It is intended to be
-called just before a thread calls one of the !exec! functions,
-e.g. !execve!(2).
-
-Termination of the other threads is not performed through
-!pthread_cancel!(3p) and completely bypasses the cancellation
-mechanism. Hence, the current settings for cancellation state and
-cancellation type are ignored, and the cleanup handlers are not
-executed in the terminated threads.
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!execve!(2),
-!pthread_setcancelstate!(3p),
-!pthread_setcanceltype!(3p),
-!pthread_cancel!(3p).
-
-.SH BUGS
-
-According to POSIX 1003.1c, a successful !exec*! in one of the threads
-should terminate automatically all other threads in the program.
-This behavior is not yet implemented in LinuxThreads.
-Calling !pthread_kill_other_threads_np! before !exec*! achieves much
-of the same behavior, except that if !exec*! ultimately fails, then
-all other threads are already killed.
diff --git a/linuxthreads/man/pthread_mutex_init.man b/linuxthreads/man/pthread_mutex_init.man
deleted file mode 100644
index 643b007aec..0000000000
--- a/linuxthreads/man/pthread_mutex_init.man
+++ /dev/null
@@ -1,213 +0,0 @@
-.TH PTHREAD_MUTEX 3 LinuxThreads
-
-.XREF pthread_mutex_lock
-.XREF pthread_mutex_unlock
-.XREF pthread_mutex_trylock
-.XREF pthread_mutex_destroy
-
-.SH NAME
-pthread_mutex_init, pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_unlock, pthread_mutex_destroy \- operations on mutexes
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER;
-
-pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
-
-pthread_mutex_t errchkmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
-
-int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
-
-int pthread_mutex_lock(pthread_mutex_t *mutex);
-
-int pthread_mutex_trylock(pthread_mutex_t *mutex);
-
-int pthread_mutex_unlock(pthread_mutex_t *mutex);
-
-int pthread_mutex_destroy(pthread_mutex_t *mutex);
-
-.SH DESCRIPTION
-A mutex is a MUTual EXclusion device, and is useful for protecting
-shared data structures from concurrent modifications, and implementing
-critical sections and monitors.
-
-A mutex has two possible states: unlocked (not owned by any thread),
-and locked (owned by one thread). A mutex can never be owned by two
-different threads simultaneously. A thread attempting to lock a mutex
-that is already locked by another thread is suspended until the owning
-thread unlocks the mutex first.
-
-!pthread_mutex_init! initializes the mutex object pointed to by
-|mutex| according to the mutex attributes specified in |mutexattr|.
-If |mutexattr| is !NULL!, default attributes are used instead.
-
-The LinuxThreads implementation supports only one mutex attributes,
-the |mutex kind|, which is either ``fast'', ``recursive'', or
-``error checking''. The kind of a mutex determines whether
-it can be locked again by a thread that already owns it.
-The default kind is ``fast''. See !pthread_mutexattr_init!(3) for more
-information on mutex attributes.
-
-Variables of type !pthread_mutex_t! can also be initialized
-statically, using the constants !PTHREAD_MUTEX_INITIALIZER! (for fast
-mutexes), !PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP! (for recursive
-mutexes), and !PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP! (for error checking
-mutexes).
-
-!pthread_mutex_lock! locks the given mutex. If the mutex is currently
-unlocked, it becomes locked and owned by the calling thread, and
-!pthread_mutex_lock! returns immediately. If the mutex is already
-locked by another thread, !pthread_mutex_lock! suspends the calling
-thread until the mutex is unlocked.
-
-If the mutex is already locked by the calling thread, the behavior of
-!pthread_mutex_lock! depends on the kind of the mutex. If the mutex is
-of the ``fast'' kind, the calling thread is suspended until the mutex
-is unlocked, thus effectively causing the calling thread to
-deadlock. If the mutex is of the ``error checking'' kind,
-!pthread_mutex_lock! returns immediately with the error code !EDEADLK!.
-If the mutex is of the ``recursive'' kind, !pthread_mutex_lock!
-succeeds and returns immediately, recording the number of times the
-calling thread has locked the mutex. An equal number of
-!pthread_mutex_unlock! operations must be performed before the mutex
-returns to the unlocked state.
-
-!pthread_mutex_trylock! behaves identically to !pthread_mutex_lock!,
-except that it does not block the calling thread if the mutex is
-already locked by another thread (or by the calling thread in the case
-of a ``fast'' mutex). Instead, !pthread_mutex_trylock! returns
-immediately with the error code !EBUSY!.
-
-!pthread_mutex_unlock! unlocks the given mutex. The mutex is assumed
-to be locked and owned by the calling thread on entrance to
-!pthread_mutex_unlock!. If the mutex is of the ``fast'' kind,
-!pthread_mutex_unlock! always returns it to the unlocked state. If it
-is of the ``recursive'' kind, it decrements the locking count of the
-mutex (number of !pthread_mutex_lock! operations performed on it by
-the calling thread), and only when this count reaches zero is the
-mutex actually unlocked.
-
-On ``error checking'' mutexes, !pthread_mutex_unlock! actually checks
-at run-time that the mutex is locked on entrance, and that it was
-locked by the same thread that is now calling !pthread_mutex_unlock!.
-If these conditions are not met, an error code is returned and the
-mutex remains unchanged. ``Fast'' and ``recursive'' mutexes perform
-no such checks, thus allowing a locked mutex to be unlocked by a
-thread other than its owner. This is non-portable behavior and must
-not be relied upon.
-
-!pthread_mutex_destroy! destroys a mutex object, freeing the resources
-it might hold. The mutex must be unlocked on entrance. In the
-LinuxThreads implementation, no resources are associated with mutex
-objects, thus !pthread_mutex_destroy! actually does nothing except
-checking that the mutex is unlocked.
-
-.SH CANCELLATION
-
-None of the mutex functions is a cancellation point, not even
-!pthread_mutex_lock!, in spite of the fact that it can suspend a
-thread for arbitrary durations. This way, the status of mutexes at
-cancellation points is predictable, allowing cancellation handlers to
-unlock precisely those mutexes that need to be unlocked before the
-thread stops executing. Consequently, threads using deferred
-cancellation should never hold a mutex for extended periods of time.
-
-.SH "ASYNC-SIGNAL SAFETY"
-
-The mutex functions are not async-signal safe. What this means is that
-they should not be called from a signal handler. In particular,
-calling !pthread_mutex_lock! or !pthread_mutex_unlock! from a signal
-handler may deadlock the calling thread.
-
-.SH "RETURN VALUE"
-
-!pthread_mutex_init! always returns 0. The other mutex functions
-return 0 on success and a non-zero error code on error.
-
-.SH ERRORS
-
-The !pthread_mutex_lock! function returns the following error code
-on error:
-.RS
-.TP
-!EINVAL!
-the mutex has not been properly initialized.
-
-.TP
-!EDEADLK!
-the mutex is already locked by the calling thread
-(``error checking'' mutexes only).
-.RE
-
-The !pthread_mutex_trylock! function returns the following error codes
-on error:
-.RS
-.TP
-!EBUSY!
-the mutex could not be acquired because it was currently locked.
-
-.TP
-!EINVAL!
-the mutex has not been properly initialized.
-.RE
-
-The !pthread_mutex_unlock! function returns the following error code
-on error:
-.RS
-.TP
-!EINVAL!
-the mutex has not been properly initialized.
-
-.TP
-!EPERM!
-the calling thread does not own the mutex (``error checking'' mutexes only).
-.RE
-
-The !pthread_mutex_destroy! function returns the following error code
-on error:
-.RS
-.TP
-!EBUSY!
-the mutex is currently locked.
-.RE
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!pthread_mutexattr_init!(3),
-!pthread_mutexattr_setkind_np!(3),
-!pthread_cancel!(3).
-
-.SH EXAMPLE
-
-A shared global variable |x| can be protected by a mutex as follows:
-
-.RS
-.ft 3
-.nf
-.sp
-int x;
-pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
-.ft
-.LP
-.RE
-.fi
-
-All accesses and modifications to |x| should be bracketed by calls to
-!pthread_mutex_lock! and !pthread_mutex_unlock! as follows:
-
-.RS
-.ft 3
-.nf
-.sp
-pthread_mutex_lock(&mut);
-/* operate on x */
-pthread_mutex_unlock(&mut);
-.ft
-.LP
-.RE
-.fi
-
-
diff --git a/linuxthreads/man/pthread_mutexattr_init.man b/linuxthreads/man/pthread_mutexattr_init.man
deleted file mode 100644
index b838948904..0000000000
--- a/linuxthreads/man/pthread_mutexattr_init.man
+++ /dev/null
@@ -1,84 +0,0 @@
-.TH PTHREAD_MUTEXATTR 3 LinuxThreads
-
-.XREF pthread_mutexattr_destroy
-.XREF pthread_mutexattr_settype
-.XREF pthread_mutexattr_gettype
-
-.SH NAME
-pthread_mutexattr_init, pthread_mutexattr_destroy, pthread_mutexattr_settype, pthread_mutexattr_gettype \- mutex creation attributes
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-int pthread_mutexattr_init(pthread_mutexattr_t *attr);
-
-int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
-
-int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int kind);
-
-int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *kind);
-
-.SH DESCRIPTION
-
-Mutex attributes can be specified at mutex creation time, by passing a
-mutex attribute object as second argument to !pthread_mutex_init!(3).
-Passing !NULL! is equivalent to passing a mutex attribute object with
-all attributes set to their default values.
-
-!pthread_mutexattr_init! initializes the mutex attribute object |attr|
-and fills it with default values for the attributes.
-
-!pthread_mutexattr_destroy! destroys a mutex attribute object, which
-must not be reused until it is reinitialized. !pthread_mutexattr_destroy!
-does nothing in the LinuxThreads implementation.
-
-LinuxThreads supports only one mutex attribute: the mutex kind, which
-is either !PTHREAD_MUTEX_FAST_NP! for ``fast'' mutexes,
-!PTHREAD_MUTEX_RECURSIVE_NP! for ``recursive'' mutexes,
-or !PTHREAD_MUTEX_ERRORCHECK_NP! for ``error checking'' mutexes.
-As the !NP! suffix indicates, this is a non-portable extension to the
-POSIX standard and should not be employed in portable programs.
-
-The mutex kind determines what happens if a thread attempts to lock a
-mutex it already owns with !pthread_mutex_lock!(3). If the mutex is of
-the ``fast'' kind, !pthread_mutex_lock!(3) simply suspends the calling
-thread forever. If the mutex is of the ``error checking'' kind,
-!pthread_mutex_lock!(3) returns immediately with the error code
-!EDEADLK!. If the mutex is of the ``recursive'' kind, the call to
-!pthread_mutex_lock!(3) returns immediately with a success return
-code. The number of times the thread owning the mutex has locked it is
-recorded in the mutex. The owning thread must call
-!pthread_mutex_unlock!(3) the same number of times before the mutex
-returns to the unlocked state.
-
-The default mutex kind is ``fast'', that is, !PTHREAD_MUTEX_FAST_NP!.
-
-!pthread_mutexattr_settype! sets the mutex kind attribute in |attr|
-to the value specified by |kind|.
-
-!pthread_mutexattr_gettype! retrieves the current value of the
-mutex kind attribute in |attr| and stores it in the location pointed
-to by |kind|.
-
-.SH "RETURN VALUE"
-!pthread_mutexattr_init!, !pthread_mutexattr_destroy! and
-!pthread_mutexattr_gettype! always return 0.
-
-!pthread_mutexattr_settype! returns 0 on success and a non-zero
-error code on error.
-
-.SH ERRORS
-
-On error, !pthread_mutexattr_settype! returns the following error code:
-.TP
-!EINVAL!
-|kind| is neither !PTHREAD_MUTEX_FAST_NP! nor !PTHREAD_MUTEX_RECURSIVE_NP!
-nor !PTHREAD_MUTEX_ERRORCHECK_NP!
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!pthread_mutex_init!(3),
-!pthread_mutex_lock!(3),
-!pthread_mutex_unlock!(3).
diff --git a/linuxthreads/man/pthread_mutexattr_setkind_np.man b/linuxthreads/man/pthread_mutexattr_setkind_np.man
deleted file mode 100644
index 4e20b1e083..0000000000
--- a/linuxthreads/man/pthread_mutexattr_setkind_np.man
+++ /dev/null
@@ -1,39 +0,0 @@
-.TH PTHREAD_MUTEXATTR_SETKIND_NP 3 LinuxThreads
-
-.XREF pthread_mutexattr_getkind_np
-
-.SH NAME
-pthread_mutexattr_setkind_np, pthread_mutexattr_getkind_np \- deprecated mutex creation attributes
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind);
-
-int pthread_mutexattr_getkind_np(const pthread_mutexattr_t *attr, int *kind);
-
-.SH DESCRIPTION
-
-These functions are deprecated, use !pthread_mutexattr_settype!(3p)
-and !pthread_mutexattr_gettype!(3p) instead.
-
-.SH "RETURN VALUE"
-!pthread_mutexattr_getkind_np! always returns 0.
-
-!pthread_mutexattr_setkind_np! returns 0 on success and a non-zero
-error code on error.
-
-.SH ERRORS
-
-On error, !pthread_mutexattr_setkind_np! returns the following error code:
-.TP
-!EINVAL!
-|kind| is neither !PTHREAD_MUTEX_FAST_NP! nor !PTHREAD_MUTEX_RECURSIVE_NP!
-nor !PTHREAD_MUTEX_ERRORCHECK_NP!
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!pthread_mutexattr_settype!(3p),
-!pthread_mutexattr_gettype!(3p).
diff --git a/linuxthreads/man/pthread_once.man b/linuxthreads/man/pthread_once.man
deleted file mode 100644
index e9d117b656..0000000000
--- a/linuxthreads/man/pthread_once.man
+++ /dev/null
@@ -1,34 +0,0 @@
-.TH PTHREAD_ONCE 3 LinuxThreads
-
-.SH NAME
-pthread_once \- once-only initialization
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-pthread_once_t once_control = PTHREAD_ONCE_INIT;
-
-int pthread_once(pthread_once_t *once_control, void (*init_routine) (void));
-
-.SH DESCRIPTION
-
-The purpose of !pthread_once! is to ensure that a piece of
-initialization code is executed at most once. The |once_control|
-argument points to a static or extern variable statically initialized
-to !PTHREAD_ONCE_INIT!.
-
-The first time !pthread_once! is called with a given |once_control|
-argument, it calls |init_routine| with no argument and changes the
-value of the |once_control| variable to record that initialization has
-been performed. Subsequent calls to !pthread_once! with the same
-!once_control! argument do nothing.
-
-.SH "RETURN VALUE"
-!pthread_once! always returns 0.
-
-.SH ERRORS
-None.
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
diff --git a/linuxthreads/man/pthread_self.man b/linuxthreads/man/pthread_self.man
deleted file mode 100644
index 3aa4a0021e..0000000000
--- a/linuxthreads/man/pthread_self.man
+++ /dev/null
@@ -1,23 +0,0 @@
-.TH PTHREAD_SELF 3 LinuxThreads
-
-.SH NAME
-pthread_self \- return identifier of current thread
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-pthread_t pthread_self(void);
-
-.SH DESCRIPTION
-!pthread_self! return the thread identifier for the calling thread.
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!pthread_equal!(3),
-!pthread_join!(3),
-!pthread_detach!(3),
-!pthread_setschedparam!(3),
-!pthread_getschedparam!(3).
-
diff --git a/linuxthreads/man/pthread_setschedparam.man b/linuxthreads/man/pthread_setschedparam.man
deleted file mode 100644
index 3992927837..0000000000
--- a/linuxthreads/man/pthread_setschedparam.man
+++ /dev/null
@@ -1,79 +0,0 @@
-.TH PTHREAD_SETSCHEDPARAM 3 LinuxThreads
-
-.XREF pthread_getschedparam
-
-.SH NAME
-pthread_setschedparam, pthread_getschedparam \- control thread scheduling parameters
-
-.SH SYNOPSIS
-#include <pthread.h>
-
-int pthread_setschedparam(pthread_t target_thread, int policy, const struct sched_param *param);
-
-int pthread_getschedparam(pthread_t target_thread, int *policy, struct sched_param *param);
-
-.SH DESCRIPTION
-
-!pthread_setschedparam! sets the scheduling parameters for the thread
-|target_thread| as indicated by |policy| and |param|. |policy| can be
-either !SCHED_OTHER! (regular, non-realtime scheduling), !SCHED_RR!
-(realtime, round-robin) or !SCHED_FIFO! (realtime, first-in
-first-out). |param| specifies the scheduling priority for the two
-realtime policies. See !sched_setpolicy!(2) for more information on
-scheduling policies.
-
-The realtime scheduling policies !SCHED_RR! and !SCHED_FIFO! are
-available only to processes with superuser privileges.
-
-!pthread_getschedparam! retrieves the scheduling policy and scheduling
-parameters for the thread |target_thread| and store them in the
-locations pointed to by |policy| and |param|, respectively.
-
-.SH "RETURN VALUE"
-!pthread_setschedparam! and !pthread_getschedparam! return 0 on
-success and a non-zero error code on error.
-
-.SH ERRORS
-On error, !pthread_setschedparam! returns the following error codes:
-.RS
-.TP
-!EINVAL!
-|policy| is not one of !SCHED_OTHER!, !SCHED_RR!, !SCHED_FIFO!
-
-.TP
-!EINVAL!
-the priority value specified by |param| is not valid for the specified policy
-
-.TP
-!EPERM!
-the calling process does not have superuser permissions
-
-.TP
-!ESRCH!
-the |target_thread| is invalid or has already terminated
-
-.TP
-!EFAULT!
-|param| points outside the process memory space
-.RE
-
-On error, !pthread_getschedparam! returns the following error codes:
-.RS
-.TP
-!ESRCH!
-the |target_thread| is invalid or has already terminated
-
-.TP
-!EFAULT!
-|policy| or |param| point outside the process memory space
-.RE
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!sched_setscheduler!(2),
-!sched_getscheduler!(2),
-!sched_getparam!(2),
-!pthread_attr_setschedpolicy!(3),
-!pthread_attr_setschedparam!(3).
diff --git a/linuxthreads/man/pthread_sigmask.man b/linuxthreads/man/pthread_sigmask.man
deleted file mode 100644
index 784161da2b..0000000000
--- a/linuxthreads/man/pthread_sigmask.man
+++ /dev/null
@@ -1,123 +0,0 @@
-.TH PTHREAD_SIGNAL 3 LinuxThreads
-
-.XREF pthread_kill
-.XREF sigwait
-
-.SH NAME
-pthread_sigmask, pthread_kill, sigwait \- handling of signals in threads
-
-.SH SYNOPSIS
-#include <pthread.h>
-.br
-#include <signal.h>
-
-int pthread_sigmask(int how, const sigset_t *newmask, sigset_t *oldmask);
-
-int pthread_kill(pthread_t thread, int signo);
-
-int sigwait(const sigset_t *set, int *sig);
-
-.SH DESCRIPTION
-
-!pthread_sigmask! changes the signal mask for the calling thread as
-described by the |how| and |newmask| arguments. If |oldmask| is not
-!NULL!, the previous signal mask is stored in the location pointed to
-by |oldmask|.
-
-The meaning of the |how| and |newmask| arguments is the same as for
-!sigprocmask!(2). If |how| is !SIG_SETMASK!, the signal mask is set to
-|newmask|. If |how| is !SIG_BLOCK!, the signals specified to |newmask|
-are added to the current signal mask. If |how| is !SIG_UNBLOCK!, the
-signals specified to |newmask| are removed from the current signal
-mask.
-
-Recall that signal masks are set on a per-thread basis, but signal
-actions and signal handlers, as set with !sigaction!(2), are shared
-between all threads.
-
-!pthread_kill! send signal number |signo| to the thread
-|thread|. The signal is delivered and handled as described in
-!kill!(2).
-
-!sigwait! suspends the calling thread until one of the signals
-in |set| is delivered to the calling thread. It then stores the number
-of the signal received in the location pointed to by |sig| and
-returns. The signals in |set| must be blocked and not ignored on
-entrance to !sigwait!. If the delivered signal has a signal handler
-function attached, that function is |not| called.
-
-.SH CANCELLATION
-
-!sigwait! is a cancellation point.
-
-.SH "RETURN VALUE"
-
-On success, 0 is returned. On failure, a non-zero error code is returned.
-
-.SH ERRORS
-
-The !pthread_sigmask! function returns the following error codes
-on error:
-.RS
-.TP
-!EINVAL!
-|how| is not one of !SIG_SETMASK!, !SIG_BLOCK!, or !SIG_UNBLOCK!
-
-.TP
-!EFAULT!
-|newmask| or |oldmask| point to invalid addresses
-.RE
-
-The !pthread_kill! function returns the following error codes
-on error:
-.RS
-.TP
-!EINVAL!
-|signo| is not a valid signal number
-
-.TP
-!ESRCH!
-the thread |thread| does not exist (e.g. it has already terminated)
-.RE
-
-The !sigwait! function never returns an error.
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!sigprocmask!(2),
-!kill!(2),
-!sigaction!(2),
-!sigsuspend!(2).
-
-.SH NOTES
-
-For !sigwait! to work reliably, the signals being waited for must be
-blocked in all threads, not only in the calling thread, since
-otherwise the POSIX semantics for signal delivery do not guarantee
-that it's the thread doing the !sigwait! that will receive the signal.
-The best way to achieve this is block those signals before any threads
-are created, and never unblock them in the program other than by
-calling !sigwait!.
-
-.SH BUGS
-
-Signal handling in LinuxThreads departs significantly from the POSIX
-standard. According to the standard, ``asynchronous'' (external)
-signals are addressed to the whole process (the collection of all
-threads), which then delivers them to one particular thread. The
-thread that actually receives the signal is any thread that does
-not currently block the signal.
-
-In LinuxThreads, each thread is actually a kernel process with its own
-PID, so external signals are always directed to one particular thread.
-If, for instance, another thread is blocked in !sigwait! on that
-signal, it will not be restarted.
-
-The LinuxThreads implementation of !sigwait! installs dummy signal
-handlers for the signals in |set| for the duration of the wait. Since
-signal handlers are shared between all threads, other threads must not
-attach their own signal handlers to these signals, or alternatively
-they should all block these signals (which is recommended anyway --
-see the Notes section).
diff --git a/linuxthreads/man/sem_init.man b/linuxthreads/man/sem_init.man
deleted file mode 100644
index e3a1a63e36..0000000000
--- a/linuxthreads/man/sem_init.man
+++ /dev/null
@@ -1,132 +0,0 @@
-.TH SEMAPHORES 3 LinuxThreads
-
-.XREF sem_wait
-.XREF sem_trywait
-.XREF sem_post
-.XREF sem_getvalue
-.XREF sem_destroy
-
-.SH NAME
-sem_init, sem_wait, sem_trywait, sem_post, sem_getvalue, sem_destroy \- operations on semaphores
-
-.SH SYNOPSIS
-#include <semaphore.h>
-
-int sem_init(sem_t *sem, int pshared, unsigned int value);
-
-int sem_wait(sem_t * sem);
-
-int sem_trywait(sem_t * sem);
-
-int sem_post(sem_t * sem);
-
-int sem_getvalue(sem_t * sem, int * sval);
-
-int sem_destroy(sem_t * sem);
-
-.SH DESCRIPTION
-This manual page documents POSIX 1003.1b semaphores, not to be
-confused with SystemV semaphores as described in !ipc!(5), !semctl!(2)
-and !semop!(2).
-
-Semaphores are counters for resources shared between threads. The
-basic operations on semaphores are: increment the counter atomically,
-and wait until the counter is non-null and decrement it atomically.
-
-!sem_init! initializes the semaphore object pointed to by |sem|. The
-count associated with the semaphore is set initially to |value|. The
-|pshared| argument indicates whether the semaphore is local to the
-current process (|pshared| is zero) or is to be shared between several
-processes (|pshared| is not zero). LinuxThreads currently does not
-support process-shared semaphores, thus !sem_init! always returns with
-error !ENOSYS! if |pshared| is not zero.
-
-!sem_wait! suspends the calling thread until the semaphore pointed to
-by |sem| has non-zero count. It then atomically decreases the
-semaphore count.
-
-!sem_trywait! is a non-blocking variant of !sem_wait!. If the
-semaphore pointed to by |sem| has non-zero count, the count is
-atomically decreased and !sem_trywait! immediately returns 0.
-If the semaphore count is zero, !sem_trywait! immediately returns with
-error !EAGAIN!.
-
-!sem_post! atomically increases the count of the semaphore pointed to
-by |sem|. This function never blocks and can safely be used in
-asynchronous signal handlers.
-
-!sem_getvalue! stores in the location pointed to by |sval| the current
-count of the semaphore |sem|.
-
-!sem_destroy! destroys a semaphore object, freeing the resources it
-might hold. No threads should be waiting on the semaphore at the time
-!sem_destroy! is called. In the LinuxThreads implementation, no
-resources are associated with semaphore objects, thus !sem_destroy!
-actually does nothing except checking that no thread is waiting on the
-semaphore.
-
-.SH CANCELLATION
-
-!sem_wait! is a cancellation point.
-
-.SH "ASYNC-SIGNAL SAFETY"
-
-On processors supporting atomic compare-and-swap (Intel 486, Pentium
-and later, Alpha, PowerPC, MIPS II, Motorola 68k), the !sem_post!
-function is async-signal safe and can therefore be
-called from signal handlers. This is the only thread synchronization
-function provided by POSIX threads that is async-signal safe.
-
-On the Intel 386 and the Sparc, the current LinuxThreads
-implementation of !sem_post! is not async-signal safe by lack of the
-required atomic operations.
-
-.SH "RETURN VALUE"
-
-The !sem_wait! and !sem_getvalue! functions always return 0.
-All other semaphore functions return 0 on success and -1 on error, in
-addition to writing an error code in !errno!.
-
-.SH ERRORS
-
-The !sem_init! function sets !errno! to the following codes on error:
-.RS
-.TP
-!EINVAL!
-|value| exceeds the maximal counter value !SEM_VALUE_MAX!
-.TP
-!ENOSYS!
-|pshared| is not zero
-.RE
-
-The !sem_trywait! function sets !errno! to the following error code on error:
-.RS
-.TP
-!EAGAIN!
-the semaphore count is currently 0
-.RE
-
-The !sem_post! function sets !errno! to the following error code on error:
-.RS
-.TP
-!ERANGE!
-after incrementation, the semaphore value would exceed !SEM_VALUE_MAX!
-(the semaphore count is left unchanged in this case)
-.RE
-
-The !sem_destroy! function sets !errno! to the following error code on error:
-.RS
-.TP
-!EBUSY!
-some threads are currently blocked waiting on the semaphore.
-.RE
-
-.SH AUTHOR
-Xavier Leroy <Xavier.Leroy@inria.fr>
-
-.SH "SEE ALSO"
-!pthread_mutex_init!(3),
-!pthread_cond_init!(3),
-!pthread_cancel!(3),
-!ipc!(5).
-
diff --git a/linuxthreads/man/troffprepro b/linuxthreads/man/troffprepro
deleted file mode 100755
index ba564fefbe..0000000000
--- a/linuxthreads/man/troffprepro
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/usr/local/bin/perl
-
-$insynopsis = 0;
-
-open(INPUT, $ARGV[0]) || die("cannot open $ARGV[0]");
-open(OUTPUT, "> $ARGV[1]") || die("cannot create $ARGV[1]");
-
-select(OUTPUT);
-
-line:
-while(<INPUT>) {
- if (/^\.XREF (.*)$/) {
- $xref = $1;
- $_ = $ARGV[1];
- m/^.*\.(([1-8]).*)$/;
- $suffix = $1;
- $extension = $2;
- open(XREF, "> $xref.$suffix");
- print XREF ".so man$extension/$ARGV[1]\n";
- close(XREF);
- next line;
- }
- if (/^\.SH/) {
- $insynopsis = /SYNOPSIS/;
- print $_;
- next;
- }
- if ($insynopsis) {
- if (/^#/) {
- print ".B ", $_;
- }
- elsif (/^[a-z]/) {
- chop;
-# if (m/^([a-zA-Z][a-zA-Z0-9_]*\s+[a-zA-Z][a-zA-Z0-9_]*)\(/) {
-# print ".B \"", $1, "\"\n";
-# $_ = '(' . $';
-# }
-# s/([a-zA-Z][a-zA-Z0-9_]*)(\s*[,()=])/" \1 "\2/g;
- s/([ *])([a-zA-Z][a-zA-Z0-9_]*)(\s*[,)=])/\1" \2 "\3/g;
- print ".BI \"", $_, "\"\n";
- }
- else {
- print $_;
- }
- next;
- }
- chop;
- s/!([^!]+)!\|([^|]+)\|([^\s]*)\s*/\n.BI "\1" "\2\3"\n/g;
- s/([!|])([^!|]+)\1([^\s]*)\s*/do subst($1,$2,$3)/eg;
- s/^\n+//;
- s/\n+$//;
- s/\n\n+/\n/g;
- print $_, "\n";
-}
-
-close(INPUT);
-close(OUTPUT);
-
-sub subst {
- local ($a, $b, $c) = @_;
- if ($c) {
- "\n" . ($a eq "!" ? ".BR " : ".IR ") . "\"$b\" $c\n"
- } else {
- "\n" . ($a eq "!" ? ".B " : ".I ") . "\"$b\"\n"
- }
-}
-
-
diff --git a/linuxthreads/manager.c b/linuxthreads/manager.c
deleted file mode 100644
index f21a6def6f..0000000000
--- a/linuxthreads/manager.c
+++ /dev/null
@@ -1,1112 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* The "thread manager" thread: manages creation and termination of threads */
-
-#include <assert.h>
-#include <errno.h>
-#include <sched.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/poll.h> /* for poll */
-#include <sys/mman.h> /* for mmap */
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/wait.h> /* for waitpid macros */
-#include <locale.h> /* for __uselocale */
-#include <resolv.h> /* for __resp */
-
-#include <ldsodefs.h>
-#include "pthread.h"
-#include "internals.h"
-#include "spinlock.h"
-#include "restart.h"
-#include "semaphore.h"
-#include <not-cancel.h>
-
-/* For debugging purposes put the maximum number of threads in a variable. */
-const int __linuxthreads_pthread_threads_max = PTHREAD_THREADS_MAX;
-
-#ifndef THREAD_SELF
-/* Indicate whether at least one thread has a user-defined stack (if 1),
- or if all threads have stacks supplied by LinuxThreads (if 0). */
-int __pthread_nonstandard_stacks;
-#endif
-
-/* Number of active entries in __pthread_handles (used by gdb) */
-volatile int __pthread_handles_num = 2;
-
-/* Whether to use debugger additional actions for thread creation
- (set to 1 by gdb) */
-volatile int __pthread_threads_debug;
-
-/* Globally enabled events. */
-volatile td_thr_events_t __pthread_threads_events;
-
-/* Pointer to thread descriptor with last event. */
-volatile pthread_descr __pthread_last_event;
-
-static pthread_descr manager_thread;
-
-/* Mapping from stack segment to thread descriptor. */
-/* Stack segment numbers are also indices into the __pthread_handles array. */
-/* Stack segment number 0 is reserved for the initial thread. */
-
-#if FLOATING_STACKS
-# define thread_segment(seq) NULL
-#else
-static inline pthread_descr thread_segment(int seg)
-{
-# ifdef _STACK_GROWS_UP
- return (pthread_descr)(THREAD_STACK_START_ADDRESS + (seg - 1) * STACK_SIZE)
- + 1;
-# else
- return (pthread_descr)(THREAD_STACK_START_ADDRESS - (seg - 1) * STACK_SIZE)
- - 1;
-# endif
-}
-#endif
-
-/* Flag set in signal handler to record child termination */
-
-static volatile int terminated_children;
-
-/* Flag set when the initial thread is blocked on pthread_exit waiting
- for all other threads to terminate */
-
-static int main_thread_exiting;
-
-/* Counter used to generate unique thread identifier.
- Thread identifier is pthread_threads_counter + segment. */
-
-static pthread_t pthread_threads_counter;
-
-/* Forward declarations */
-
-static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
- void * (*start_routine)(void *), void *arg,
- sigset_t *mask, int father_pid,
- int report_events,
- td_thr_events_t *event_maskp);
-static void pthread_handle_free(pthread_t th_id);
-static void pthread_handle_exit(pthread_descr issuing_thread, int exitcode)
- __attribute__ ((noreturn));
-static void pthread_reap_children(void);
-static void pthread_kill_all_threads(int sig, int main_thread_also);
-static void pthread_for_each_thread(void *arg,
- void (*fn)(void *, pthread_descr));
-
-/* The server thread managing requests for thread creation and termination */
-
-int
-__attribute__ ((noreturn))
-__pthread_manager(void *arg)
-{
- pthread_descr self = manager_thread = arg;
- int reqfd = __pthread_manager_reader;
- struct pollfd ufd;
- sigset_t manager_mask;
- int n;
- struct pthread_request request;
-
- /* If we have special thread_self processing, initialize it. */
-#ifdef INIT_THREAD_SELF
- INIT_THREAD_SELF(self, 1);
-#endif
-#if !(USE_TLS && HAVE___THREAD)
- /* Set the error variable. */
- self->p_errnop = &self->p_errno;
- self->p_h_errnop = &self->p_h_errno;
-#endif
- /* Block all signals except __pthread_sig_cancel and SIGTRAP */
- sigfillset(&manager_mask);
- sigdelset(&manager_mask, __pthread_sig_cancel); /* for thread termination */
- sigdelset(&manager_mask, SIGTRAP); /* for debugging purposes */
- if (__pthread_threads_debug && __pthread_sig_debug > 0)
- sigdelset(&manager_mask, __pthread_sig_debug);
- sigprocmask(SIG_SETMASK, &manager_mask, NULL);
- /* Raise our priority to match that of main thread */
- __pthread_manager_adjust_prio(__pthread_main_thread->p_priority);
- /* Synchronize debugging of the thread manager */
- n = TEMP_FAILURE_RETRY(read_not_cancel(reqfd, (char *)&request,
- sizeof(request)));
- ASSERT(n == sizeof(request) && request.req_kind == REQ_DEBUG);
- ufd.fd = reqfd;
- ufd.events = POLLIN;
- /* Enter server loop */
- while(1) {
- n = __poll(&ufd, 1, 2000);
-
- /* Check for termination of the main thread */
- if (getppid() == 1) {
- pthread_kill_all_threads(SIGKILL, 0);
- _exit(0);
- }
- /* Check for dead children */
- if (terminated_children) {
- terminated_children = 0;
- pthread_reap_children();
- }
- /* Read and execute request */
- if (n == 1 && (ufd.revents & POLLIN)) {
- n = TEMP_FAILURE_RETRY(read_not_cancel(reqfd, (char *)&request,
- sizeof(request)));
-#ifdef DEBUG
- if (n < 0) {
- char d[64];
- write(STDERR_FILENO, d, snprintf(d, sizeof(d), "*** read err %m\n"));
- } else if (n != sizeof(request)) {
- write(STDERR_FILENO, "*** short read in manager\n", 26);
- }
-#endif
-
- switch(request.req_kind) {
- case REQ_CREATE:
- request.req_thread->p_retcode =
- pthread_handle_create((pthread_t *) &request.req_thread->p_retval,
- request.req_args.create.attr,
- request.req_args.create.fn,
- request.req_args.create.arg,
- &request.req_args.create.mask,
- request.req_thread->p_pid,
- request.req_thread->p_report_events,
- &request.req_thread->p_eventbuf.eventmask);
- restart(request.req_thread);
- break;
- case REQ_FREE:
- pthread_handle_free(request.req_args.free.thread_id);
- break;
- case REQ_PROCESS_EXIT:
- pthread_handle_exit(request.req_thread,
- request.req_args.exit.code);
- /* NOTREACHED */
- break;
- case REQ_MAIN_THREAD_EXIT:
- main_thread_exiting = 1;
- /* Reap children in case all other threads died and the signal handler
- went off before we set main_thread_exiting to 1, and therefore did
- not do REQ_KICK. */
- pthread_reap_children();
-
- if (__pthread_main_thread->p_nextlive == __pthread_main_thread) {
- restart(__pthread_main_thread);
- /* The main thread will now call exit() which will trigger an
- __on_exit handler, which in turn will send REQ_PROCESS_EXIT
- to the thread manager. In case you are wondering how the
- manager terminates from its loop here. */
- }
- break;
- case REQ_POST:
- __new_sem_post(request.req_args.post);
- break;
- case REQ_DEBUG:
- /* Make gdb aware of new thread and gdb will restart the
- new thread when it is ready to handle the new thread. */
- if (__pthread_threads_debug && __pthread_sig_debug > 0)
- raise(__pthread_sig_debug);
- break;
- case REQ_KICK:
- /* This is just a prod to get the manager to reap some
- threads right away, avoiding a potential delay at shutdown. */
- break;
- case REQ_FOR_EACH_THREAD:
- pthread_for_each_thread(request.req_args.for_each.arg,
- request.req_args.for_each.fn);
- restart(request.req_thread);
- break;
- }
- }
- }
-}
-
-int __pthread_manager_event(void *arg)
-{
- pthread_descr self = arg;
- /* If we have special thread_self processing, initialize it. */
-#ifdef INIT_THREAD_SELF
- INIT_THREAD_SELF(self, 1);
-#endif
-
- /* Get the lock the manager will free once all is correctly set up. */
- __pthread_lock (THREAD_GETMEM(self, p_lock), NULL);
- /* Free it immediately. */
- __pthread_unlock (THREAD_GETMEM(self, p_lock));
-
- return __pthread_manager(arg);
-}
-
-/* Process creation */
-
-static int
-__attribute__ ((noreturn))
-pthread_start_thread(void *arg)
-{
- pthread_descr self = (pthread_descr) arg;
- struct pthread_request request;
- void * outcome;
-#if HP_TIMING_AVAIL
- hp_timing_t tmpclock;
-#endif
- /* Initialize special thread_self processing, if any. */
-#ifdef INIT_THREAD_SELF
- INIT_THREAD_SELF(self, self->p_nr);
-#endif
-#if HP_TIMING_AVAIL
- HP_TIMING_NOW (tmpclock);
- THREAD_SETMEM (self, p_cpuclock_offset, tmpclock);
-#endif
- /* Make sure our pid field is initialized, just in case we get there
- before our father has initialized it. */
- THREAD_SETMEM(self, p_pid, __getpid());
- /* Initial signal mask is that of the creating thread. (Otherwise,
- we'd just inherit the mask of the thread manager.) */
- sigprocmask(SIG_SETMASK, &self->p_start_args.mask, NULL);
- /* Set the scheduling policy and priority for the new thread, if needed */
- if (THREAD_GETMEM(self, p_start_args.schedpolicy) >= 0)
- /* Explicit scheduling attributes were provided: apply them */
- __sched_setscheduler(THREAD_GETMEM(self, p_pid),
- THREAD_GETMEM(self, p_start_args.schedpolicy),
- &self->p_start_args.schedparam);
- else if (manager_thread->p_priority > 0)
- /* Default scheduling required, but thread manager runs in realtime
- scheduling: switch new thread to SCHED_OTHER policy */
- {
- struct sched_param default_params;
- default_params.sched_priority = 0;
- __sched_setscheduler(THREAD_GETMEM(self, p_pid),
- SCHED_OTHER, &default_params);
- }
-#if !(USE_TLS && HAVE___THREAD)
- /* Initialize thread-locale current locale to point to the global one.
- With __thread support, the variable's initializer takes care of this. */
- __uselocale (LC_GLOBAL_LOCALE);
-#else
- /* Initialize __resp. */
- __resp = &self->p_res;
-#endif
- /* Make gdb aware of new thread */
- if (__pthread_threads_debug && __pthread_sig_debug > 0) {
- request.req_thread = self;
- request.req_kind = REQ_DEBUG;
- TEMP_FAILURE_RETRY(write_not_cancel(__pthread_manager_request,
- (char *) &request, sizeof(request)));
- suspend(self);
- }
- /* Run the thread code */
- outcome = self->p_start_args.start_routine(THREAD_GETMEM(self,
- p_start_args.arg));
- /* Exit with the given return value */
- __pthread_do_exit(outcome, CURRENT_STACK_FRAME);
-}
-
-static int
-__attribute__ ((noreturn))
-pthread_start_thread_event(void *arg)
-{
- pthread_descr self = (pthread_descr) arg;
-
-#ifdef INIT_THREAD_SELF
- INIT_THREAD_SELF(self, self->p_nr);
-#endif
- /* Make sure our pid field is initialized, just in case we get there
- before our father has initialized it. */
- THREAD_SETMEM(self, p_pid, __getpid());
- /* Get the lock the manager will free once all is correctly set up. */
- __pthread_lock (THREAD_GETMEM(self, p_lock), NULL);
- /* Free it immediately. */
- __pthread_unlock (THREAD_GETMEM(self, p_lock));
-
- /* Continue with the real function. */
- pthread_start_thread (arg);
-}
-
-#if defined USE_TLS && !FLOATING_STACKS
-# error "TLS can only work with floating stacks"
-#endif
-
-static int pthread_allocate_stack(const pthread_attr_t *attr,
- pthread_descr default_new_thread,
- int pagesize,
- char ** out_new_thread,
- char ** out_new_thread_bottom,
- char ** out_guardaddr,
- size_t * out_guardsize,
- size_t * out_stacksize)
-{
- pthread_descr new_thread;
- char * new_thread_bottom;
- char * guardaddr;
- size_t stacksize, guardsize;
-
-#ifdef USE_TLS
- /* TLS cannot work with fixed thread descriptor addresses. */
- assert (default_new_thread == NULL);
-#endif
-
- if (attr != NULL && attr->__stackaddr_set)
- {
-#ifdef _STACK_GROWS_UP
- /* The user provided a stack. */
-# ifdef USE_TLS
- /* This value is not needed. */
- new_thread = (pthread_descr) attr->__stackaddr;
- new_thread_bottom = (char *) new_thread;
-# else
- new_thread = (pthread_descr) attr->__stackaddr;
- new_thread_bottom = (char *) (new_thread + 1);
-# endif
- guardaddr = attr->__stackaddr + attr->__stacksize;
- guardsize = 0;
-#else
- /* The user provided a stack. For now we interpret the supplied
- address as 1 + the highest addr. in the stack segment. If a
- separate register stack is needed, we place it at the low end
- of the segment, relying on the associated stacksize to
- determine the low end of the segment. This differs from many
- (but not all) other pthreads implementations. The intent is
- that on machines with a single stack growing toward higher
- addresses, stackaddr would be the lowest address in the stack
- segment, so that it is consistently close to the initial sp
- value. */
-# ifdef USE_TLS
- new_thread = (pthread_descr) attr->__stackaddr;
-# else
- new_thread =
- (pthread_descr) ((long)(attr->__stackaddr) & -sizeof(void *)) - 1;
-# endif
- new_thread_bottom = (char *) attr->__stackaddr - attr->__stacksize;
- guardaddr = new_thread_bottom;
- guardsize = 0;
-#endif
-#ifndef THREAD_SELF
- __pthread_nonstandard_stacks = 1;
-#endif
-#ifndef USE_TLS
- /* Clear the thread data structure. */
- memset (new_thread, '\0', sizeof (*new_thread));
-#endif
- stacksize = attr->__stacksize;
- }
- else
- {
-#ifdef NEED_SEPARATE_REGISTER_STACK
- const size_t granularity = 2 * pagesize;
- /* Try to make stacksize/2 a multiple of pagesize */
-#else
- const size_t granularity = pagesize;
-#endif
- void *map_addr;
-
- /* Allocate space for stack and thread descriptor at default address */
-#if FLOATING_STACKS
- if (attr != NULL)
- {
- guardsize = page_roundup (attr->__guardsize, granularity);
- stacksize = __pthread_max_stacksize - guardsize;
- stacksize = MIN (stacksize,
- page_roundup (attr->__stacksize, granularity));
- }
- else
- {
- guardsize = granularity;
- stacksize = __pthread_max_stacksize - guardsize;
- }
-
- map_addr = mmap(NULL, stacksize + guardsize,
- PROT_READ | PROT_WRITE | PROT_EXEC,
- MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
- if (map_addr == MAP_FAILED)
- /* No more memory available. */
- return -1;
-
-# ifdef NEED_SEPARATE_REGISTER_STACK
- guardaddr = map_addr + stacksize / 2;
- if (guardsize > 0)
- mprotect (guardaddr, guardsize, PROT_NONE);
-
- new_thread_bottom = (char *) map_addr;
-# ifdef USE_TLS
- new_thread = ((pthread_descr) (new_thread_bottom + stacksize
- + guardsize));
-# else
- new_thread = ((pthread_descr) (new_thread_bottom + stacksize
- + guardsize)) - 1;
-# endif
-# elif _STACK_GROWS_DOWN
- guardaddr = map_addr;
- if (guardsize > 0)
- mprotect (guardaddr, guardsize, PROT_NONE);
-
- new_thread_bottom = (char *) map_addr + guardsize;
-# ifdef USE_TLS
- new_thread = ((pthread_descr) (new_thread_bottom + stacksize));
-# else
- new_thread = ((pthread_descr) (new_thread_bottom + stacksize)) - 1;
-# endif
-# elif _STACK_GROWS_UP
- guardaddr = map_addr + stacksize;
- if (guardsize > 0)
- mprotect (guardaddr, guardsize, PROT_NONE);
-
- new_thread = (pthread_descr) map_addr;
-# ifdef USE_TLS
- new_thread_bottom = (char *) new_thread;
-# else
- new_thread_bottom = (char *) (new_thread + 1);
-# endif
-# else
-# error You must define a stack direction
-# endif /* Stack direction */
-#else /* !FLOATING_STACKS */
- void *res_addr;
-
- if (attr != NULL)
- {
- guardsize = page_roundup (attr->__guardsize, granularity);
- stacksize = STACK_SIZE - guardsize;
- stacksize = MIN (stacksize,
- page_roundup (attr->__stacksize, granularity));
- }
- else
- {
- guardsize = granularity;
- stacksize = STACK_SIZE - granularity;
- }
-
-# ifdef NEED_SEPARATE_REGISTER_STACK
- new_thread = default_new_thread;
- new_thread_bottom = (char *) (new_thread + 1) - stacksize - guardsize;
- /* Includes guard area, unlike the normal case. Use the bottom
- end of the segment as backing store for the register stack.
- Needed on IA64. In this case, we also map the entire stack at
- once. According to David Mosberger, that's cheaper. It also
- avoids the risk of intermittent failures due to other mappings
- in the same region. The cost is that we might be able to map
- slightly fewer stacks. */
-
- /* First the main stack: */
- map_addr = (caddr_t)((char *)(new_thread + 1) - stacksize / 2);
- res_addr = mmap(map_addr, stacksize / 2,
- PROT_READ | PROT_WRITE | PROT_EXEC,
- MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
- if (res_addr != map_addr)
- {
- /* Bad luck, this segment is already mapped. */
- if (res_addr != MAP_FAILED)
- munmap(res_addr, stacksize / 2);
- return -1;
- }
- /* Then the register stack: */
- map_addr = (caddr_t)new_thread_bottom;
- res_addr = mmap(map_addr, stacksize/2,
- PROT_READ | PROT_WRITE | PROT_EXEC,
- MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
- if (res_addr != map_addr)
- {
- if (res_addr != MAP_FAILED)
- munmap(res_addr, stacksize / 2);
- munmap((caddr_t)((char *)(new_thread + 1) - stacksize/2),
- stacksize/2);
- return -1;
- }
-
- guardaddr = new_thread_bottom + stacksize/2;
- /* We leave the guard area in the middle unmapped. */
-# else /* !NEED_SEPARATE_REGISTER_STACK */
-# ifdef _STACK_GROWS_DOWN
- new_thread = default_new_thread;
- new_thread_bottom = (char *) (new_thread + 1) - stacksize;
- map_addr = new_thread_bottom - guardsize;
- res_addr = mmap(map_addr, stacksize + guardsize,
- PROT_READ | PROT_WRITE | PROT_EXEC,
- MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
- if (res_addr != map_addr)
- {
- /* Bad luck, this segment is already mapped. */
- if (res_addr != MAP_FAILED)
- munmap (res_addr, stacksize + guardsize);
- return -1;
- }
-
- /* We manage to get a stack. Protect the guard area pages if
- necessary. */
- guardaddr = map_addr;
- if (guardsize > 0)
- mprotect (guardaddr, guardsize, PROT_NONE);
-# else
- /* The thread description goes at the bottom of this area, and
- * the stack starts directly above it.
- */
- new_thread = (pthread_descr)((unsigned long)default_new_thread &~ (STACK_SIZE - 1));
- map_addr = mmap(new_thread, stacksize + guardsize,
- PROT_READ | PROT_WRITE | PROT_EXEC,
- MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
- if (map_addr == MAP_FAILED)
- return -1;
-
- new_thread_bottom = map_addr + sizeof(*new_thread);
- guardaddr = map_addr + stacksize;
- if (guardsize > 0)
- mprotect (guardaddr, guardsize, PROT_NONE);
-
-# endif /* stack direction */
-# endif /* !NEED_SEPARATE_REGISTER_STACK */
-#endif /* !FLOATING_STACKS */
- }
- *out_new_thread = (char *) new_thread;
- *out_new_thread_bottom = new_thread_bottom;
- *out_guardaddr = guardaddr;
- *out_guardsize = guardsize;
-#ifdef NEED_SEPARATE_REGISTER_STACK
- *out_stacksize = stacksize / 2;
-#else
- *out_stacksize = stacksize;
-#endif
- return 0;
-}
-
-static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
- void * (*start_routine)(void *), void *arg,
- sigset_t * mask, int father_pid,
- int report_events,
- td_thr_events_t *event_maskp)
-{
- size_t sseg;
- int pid;
- pthread_descr new_thread;
- char *stack_addr;
- char * new_thread_bottom;
- pthread_t new_thread_id;
- char *guardaddr = NULL;
- size_t guardsize = 0, stksize = 0;
- int pagesize = __getpagesize();
- int saved_errno = 0;
-
-#ifdef USE_TLS
- new_thread = _dl_allocate_tls (NULL);
- if (new_thread == NULL)
- return EAGAIN;
-# if TLS_DTV_AT_TP
- /* pthread_descr is below TP. */
- new_thread = (pthread_descr) ((char *) new_thread - TLS_PRE_TCB_SIZE);
-# endif
-#else
- /* Prevent warnings. */
- new_thread = NULL;
-#endif
-
- /* First check whether we have to change the policy and if yes, whether
- we can do this. Normally this should be done by examining the
- return value of the __sched_setscheduler call in pthread_start_thread
- but this is hard to implement. FIXME */
- if (attr != NULL && attr->__schedpolicy != SCHED_OTHER && geteuid () != 0)
- return EPERM;
- /* Find a free segment for the thread, and allocate a stack if needed */
- for (sseg = 2; ; sseg++)
- {
- if (sseg >= PTHREAD_THREADS_MAX)
- {
-#ifdef USE_TLS
-# if TLS_DTV_AT_TP
- new_thread = (pthread_descr) ((char *) new_thread + TLS_PRE_TCB_SIZE);
-# endif
- _dl_deallocate_tls (new_thread, true);
-#endif
- return EAGAIN;
- }
- if (__pthread_handles[sseg].h_descr != NULL)
- continue;
- if (pthread_allocate_stack(attr, thread_segment(sseg),
- pagesize, &stack_addr, &new_thread_bottom,
- &guardaddr, &guardsize, &stksize) == 0)
- {
-#ifdef USE_TLS
- new_thread->p_stackaddr = stack_addr;
-#else
- new_thread = (pthread_descr) stack_addr;
-#endif
- break;
- }
- }
- __pthread_handles_num++;
- /* Allocate new thread identifier */
- pthread_threads_counter += PTHREAD_THREADS_MAX;
- new_thread_id = sseg + pthread_threads_counter;
- /* Initialize the thread descriptor. Elements which have to be
- initialized to zero already have this value. */
-#if !defined USE_TLS || !TLS_DTV_AT_TP
- new_thread->p_header.data.tcb = new_thread;
- new_thread->p_header.data.self = new_thread;
-#endif
-#if TLS_MULTIPLE_THREADS_IN_TCB || !defined USE_TLS || !TLS_DTV_AT_TP
- new_thread->p_multiple_threads = 1;
-#endif
- new_thread->p_tid = new_thread_id;
- new_thread->p_lock = &(__pthread_handles[sseg].h_lock);
- new_thread->p_cancelstate = PTHREAD_CANCEL_ENABLE;
- new_thread->p_canceltype = PTHREAD_CANCEL_DEFERRED;
-#if !(USE_TLS && HAVE___THREAD)
- new_thread->p_errnop = &new_thread->p_errno;
- new_thread->p_h_errnop = &new_thread->p_h_errno;
- new_thread->p_resp = &new_thread->p_res;
-#endif
- new_thread->p_guardaddr = guardaddr;
- new_thread->p_guardsize = guardsize;
- new_thread->p_nr = sseg;
- new_thread->p_inheritsched = attr ? attr->__inheritsched : 0;
- new_thread->p_alloca_cutoff = stksize / 4 > __MAX_ALLOCA_CUTOFF
- ? __MAX_ALLOCA_CUTOFF : stksize / 4;
- /* Initialize the thread handle */
- __pthread_init_lock(&__pthread_handles[sseg].h_lock);
- __pthread_handles[sseg].h_descr = new_thread;
- __pthread_handles[sseg].h_bottom = new_thread_bottom;
- /* Determine scheduling parameters for the thread */
- new_thread->p_start_args.schedpolicy = -1;
- if (attr != NULL) {
- new_thread->p_detached = attr->__detachstate;
- new_thread->p_userstack = attr->__stackaddr_set;
-
- switch(attr->__inheritsched) {
- case PTHREAD_EXPLICIT_SCHED:
- new_thread->p_start_args.schedpolicy = attr->__schedpolicy;
- memcpy (&new_thread->p_start_args.schedparam, &attr->__schedparam,
- sizeof (struct sched_param));
- break;
- case PTHREAD_INHERIT_SCHED:
- new_thread->p_start_args.schedpolicy = __sched_getscheduler(father_pid);
- __sched_getparam(father_pid, &new_thread->p_start_args.schedparam);
- break;
- }
- new_thread->p_priority =
- new_thread->p_start_args.schedparam.sched_priority;
- }
- /* Finish setting up arguments to pthread_start_thread */
- new_thread->p_start_args.start_routine = start_routine;
- new_thread->p_start_args.arg = arg;
- new_thread->p_start_args.mask = *mask;
- /* Make the new thread ID available already now. If any of the later
- functions fail we return an error value and the caller must not use
- the stored thread ID. */
- *thread = new_thread_id;
- /* Raise priority of thread manager if needed */
- __pthread_manager_adjust_prio(new_thread->p_priority);
- /* Do the cloning. We have to use two different functions depending
- on whether we are debugging or not. */
- pid = 0; /* Note that the thread never can have PID zero. */
- if (report_events)
- {
- /* See whether the TD_CREATE event bit is set in any of the
- masks. */
- int idx = __td_eventword (TD_CREATE);
- uint32_t mask = __td_eventmask (TD_CREATE);
-
- if ((mask & (__pthread_threads_events.event_bits[idx]
- | event_maskp->event_bits[idx])) != 0)
- {
- /* Lock the mutex the child will use now so that it will stop. */
- __pthread_lock(new_thread->p_lock, NULL);
-
- /* We have to report this event. */
-#ifdef NEED_SEPARATE_REGISTER_STACK
- /* Perhaps this version should be used on all platforms. But
- this requires that __clone2 be uniformly supported
- everywhere.
-
- And there is some argument for changing the __clone2
- interface to pass sp and bsp instead, making it more IA64
- specific, but allowing stacks to grow outward from each
- other, to get less paging and fewer mmaps. */
- pid = __clone2(pthread_start_thread_event,
- (void **)new_thread_bottom,
- (char *)stack_addr - new_thread_bottom,
- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
- __pthread_sig_cancel, new_thread);
-#elif _STACK_GROWS_UP
- pid = __clone(pthread_start_thread_event, (void *) new_thread_bottom,
- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
- __pthread_sig_cancel, new_thread);
-#else
- pid = __clone(pthread_start_thread_event, stack_addr,
- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
- __pthread_sig_cancel, new_thread);
-#endif
- saved_errno = errno;
- if (pid != -1)
- {
- /* 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. */
- new_thread->p_eventbuf.eventdata = new_thread;
- new_thread->p_eventbuf.eventnum = TD_CREATE;
- __pthread_last_event = new_thread;
-
- /* We have to set the PID here since the callback function
- in the debug library will need it and we cannot guarantee
- the child got scheduled before the debugger. */
- new_thread->p_pid = pid;
-
- /* Now call the function which signals the event. */
- __linuxthreads_create_event ();
-
- /* Now restart the thread. */
- __pthread_unlock(new_thread->p_lock);
- }
- }
- }
- if (pid == 0)
- {
-#ifdef NEED_SEPARATE_REGISTER_STACK
- pid = __clone2(pthread_start_thread,
- (void **)new_thread_bottom,
- (char *)stack_addr - new_thread_bottom,
- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
- __pthread_sig_cancel, new_thread);
-#elif _STACK_GROWS_UP
- pid = __clone(pthread_start_thread, (void *) new_thread_bottom,
- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
- __pthread_sig_cancel, new_thread);
-#else
- pid = __clone(pthread_start_thread, stack_addr,
- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
- __pthread_sig_cancel, new_thread);
-#endif /* !NEED_SEPARATE_REGISTER_STACK */
- saved_errno = errno;
- }
- /* Check if cloning succeeded */
- if (pid == -1) {
- /* Free the stack if we allocated it */
- if (attr == NULL || !attr->__stackaddr_set)
- {
-#ifdef NEED_SEPARATE_REGISTER_STACK
- size_t stacksize = ((char *)(new_thread->p_guardaddr)
- - new_thread_bottom);
- munmap((caddr_t)new_thread_bottom,
- 2 * stacksize + new_thread->p_guardsize);
-#elif _STACK_GROWS_UP
-# ifdef USE_TLS
- size_t stacksize = guardaddr - stack_addr;
- munmap(stack_addr, stacksize + guardsize);
-# else
- size_t stacksize = guardaddr - (char *)new_thread;
- munmap(new_thread, stacksize + guardsize);
-# endif
-#else
-# ifdef USE_TLS
- size_t stacksize = stack_addr - new_thread_bottom;
-# else
- size_t stacksize = (char *)(new_thread+1) - new_thread_bottom;
-# endif
- munmap(new_thread_bottom - guardsize, guardsize + stacksize);
-#endif
- }
-#ifdef USE_TLS
-# if TLS_DTV_AT_TP
- new_thread = (pthread_descr) ((char *) new_thread + TLS_PRE_TCB_SIZE);
-# endif
- _dl_deallocate_tls (new_thread, true);
-#endif
- __pthread_handles[sseg].h_descr = NULL;
- __pthread_handles[sseg].h_bottom = NULL;
- __pthread_handles_num--;
- return saved_errno;
- }
- /* Insert new thread in doubly linked list of active threads */
- new_thread->p_prevlive = __pthread_main_thread;
- new_thread->p_nextlive = __pthread_main_thread->p_nextlive;
- __pthread_main_thread->p_nextlive->p_prevlive = new_thread;
- __pthread_main_thread->p_nextlive = new_thread;
- /* Set pid field of the new thread, in case we get there before the
- child starts. */
- new_thread->p_pid = pid;
- return 0;
-}
-
-
-/* Try to free the resources of a thread when requested by pthread_join
- or pthread_detach on a terminated thread. */
-
-static void pthread_free(pthread_descr th)
-{
- pthread_handle handle;
- pthread_readlock_info *iter, *next;
-
- ASSERT(th->p_exited);
- /* Make the handle invalid */
- handle = thread_handle(th->p_tid);
- __pthread_lock(&handle->h_lock, NULL);
- handle->h_descr = NULL;
- handle->h_bottom = (char *)(-1L);
- __pthread_unlock(&handle->h_lock);
-#ifdef FREE_THREAD
- FREE_THREAD(th, th->p_nr);
-#endif
- /* One fewer threads in __pthread_handles */
- __pthread_handles_num--;
-
- /* Destroy read lock list, and list of free read lock structures.
- If the former is not empty, it means the thread exited while
- holding read locks! */
-
- for (iter = th->p_readlock_list; iter != NULL; iter = next)
- {
- next = iter->pr_next;
- free(iter);
- }
-
- for (iter = th->p_readlock_free; iter != NULL; iter = next)
- {
- next = iter->pr_next;
- free(iter);
- }
-
- /* If initial thread, nothing to free */
- if (!th->p_userstack)
- {
- size_t guardsize = th->p_guardsize;
- /* Free the stack and thread descriptor area */
- char *guardaddr = th->p_guardaddr;
-#ifdef _STACK_GROWS_UP
-# ifdef USE_TLS
- size_t stacksize = guardaddr - th->p_stackaddr;
-# else
- size_t stacksize = guardaddr - (char *)th;
-# endif
- guardaddr = (char *)th;
-#else
- /* Guardaddr is always set, even if guardsize is 0. This allows
- us to compute everything else. */
-# ifdef USE_TLS
- size_t stacksize = th->p_stackaddr - guardaddr - guardsize;
-# else
- size_t stacksize = (char *)(th+1) - guardaddr - guardsize;
-# endif
-# ifdef NEED_SEPARATE_REGISTER_STACK
- /* Take account of the register stack, which is below guardaddr. */
- guardaddr -= stacksize;
- stacksize *= 2;
-# endif
-#endif
- /* Unmap the stack. */
- munmap(guardaddr, stacksize + guardsize);
-
- }
-
-#ifdef USE_TLS
-# if TLS_DTV_AT_TP
- th = (pthread_descr) ((char *) th + TLS_PRE_TCB_SIZE);
-# endif
- _dl_deallocate_tls (th, true);
-#endif
-}
-
-/* Handle threads that have exited */
-
-static void pthread_exited(pid_t pid)
-{
- pthread_descr th;
- int detached;
- /* Find thread with that pid */
- for (th = __pthread_main_thread->p_nextlive;
- th != __pthread_main_thread;
- th = th->p_nextlive) {
- if (th->p_pid == pid) {
- /* Remove thread from list of active threads */
- th->p_nextlive->p_prevlive = th->p_prevlive;
- th->p_prevlive->p_nextlive = th->p_nextlive;
- /* Mark thread as exited, and if detached, free its resources */
- __pthread_lock(th->p_lock, NULL);
- th->p_exited = 1;
- /* If we have to signal this event do it now. */
- if (th->p_report_events)
- {
- /* See whether TD_REAP is in any of the mask. */
- int idx = __td_eventword (TD_REAP);
- uint32_t mask = __td_eventmask (TD_REAP);
-
- if ((mask & (__pthread_threads_events.event_bits[idx]
- | th->p_eventbuf.eventmask.event_bits[idx])) != 0)
- {
- /* Yep, we have to signal the reapage. */
- th->p_eventbuf.eventnum = TD_REAP;
- th->p_eventbuf.eventdata = th;
- __pthread_last_event = th;
-
- /* Now call the function to signal the event. */
- __linuxthreads_reap_event();
- }
- }
- detached = th->p_detached;
- __pthread_unlock(th->p_lock);
- if (detached)
- pthread_free(th);
- break;
- }
- }
- /* If all threads have exited and the main thread is pending on a
- pthread_exit, wake up the main thread and terminate ourselves. */
- if (main_thread_exiting &&
- __pthread_main_thread->p_nextlive == __pthread_main_thread) {
- restart(__pthread_main_thread);
- /* Same logic as REQ_MAIN_THREAD_EXIT. */
- }
-}
-
-static void pthread_reap_children(void)
-{
- pid_t pid;
- int status;
-
- while ((pid = waitpid_not_cancel(-1, &status, WNOHANG | __WCLONE)) > 0) {
- pthread_exited(pid);
- if (WIFSIGNALED(status)) {
- /* If a thread died due to a signal, send the same signal to
- all other threads, including the main thread. */
- pthread_kill_all_threads(WTERMSIG(status), 1);
- _exit(0);
- }
- }
-}
-
-/* Try to free the resources of a thread when requested by pthread_join
- or pthread_detach on a terminated thread. */
-
-static void pthread_handle_free(pthread_t th_id)
-{
- pthread_handle handle = thread_handle(th_id);
- pthread_descr th;
-
- __pthread_lock(&handle->h_lock, NULL);
- if (nonexisting_handle(handle, th_id)) {
- /* pthread_reap_children has deallocated the thread already,
- nothing needs to be done */
- __pthread_unlock(&handle->h_lock);
- return;
- }
- th = handle->h_descr;
- if (th->p_exited) {
- __pthread_unlock(&handle->h_lock);
- pthread_free(th);
- } else {
- /* The Unix process of the thread is still running.
- Mark the thread as detached so that the thread manager will
- deallocate its resources when the Unix process exits. */
- th->p_detached = 1;
- __pthread_unlock(&handle->h_lock);
- }
-}
-
-/* Send a signal to all running threads */
-
-static void pthread_kill_all_threads(int sig, int main_thread_also)
-{
- pthread_descr th;
- for (th = __pthread_main_thread->p_nextlive;
- th != __pthread_main_thread;
- th = th->p_nextlive) {
- kill(th->p_pid, sig);
- }
- if (main_thread_also) {
- kill(__pthread_main_thread->p_pid, sig);
- }
-}
-
-static void pthread_for_each_thread(void *arg,
- void (*fn)(void *, pthread_descr))
-{
- pthread_descr th;
-
- for (th = __pthread_main_thread->p_nextlive;
- th != __pthread_main_thread;
- th = th->p_nextlive) {
- fn(arg, th);
- }
-
- fn(arg, __pthread_main_thread);
-}
-
-/* Process-wide exit() */
-
-static void pthread_handle_exit(pthread_descr issuing_thread, int exitcode)
-{
- pthread_descr th;
- __pthread_exit_requested = 1;
- __pthread_exit_code = exitcode;
- /* A forced asynchronous cancellation follows. Make sure we won't
- get stuck later in the main thread with a system lock being held
- by one of the cancelled threads. Ideally one would use the same
- code as in pthread_atfork(), but we can't distinguish system and
- user handlers there. */
- __flockfilelist();
- /* Send the CANCEL signal to all running threads, including the main
- thread, but excluding the thread from which the exit request originated
- (that thread must complete the exit, e.g. calling atexit functions
- and flushing stdio buffers). */
- for (th = issuing_thread->p_nextlive;
- th != issuing_thread;
- th = th->p_nextlive) {
- kill(th->p_pid, __pthread_sig_cancel);
- }
- /* Now, wait for all these threads, so that they don't become zombies
- and their times are properly added to the thread manager's times. */
- for (th = issuing_thread->p_nextlive;
- th != issuing_thread;
- th = th->p_nextlive) {
- waitpid(th->p_pid, NULL, __WCLONE);
- }
- __fresetlockfiles();
- restart(issuing_thread);
- _exit(0);
-}
-
-/* Handler for __pthread_sig_cancel in thread manager thread */
-
-void __pthread_manager_sighandler(int sig)
-{
- int kick_manager = terminated_children == 0 && main_thread_exiting;
- terminated_children = 1;
-
- /* If the main thread is terminating, kick the thread manager loop
- each time some threads terminate. This eliminates a two second
- shutdown delay caused by the thread manager sleeping in the
- call to __poll(). Instead, the thread manager is kicked into
- action, reaps the outstanding threads and resumes the main thread
- so that it can complete the shutdown. */
-
- if (kick_manager) {
- struct pthread_request request;
- request.req_thread = 0;
- request.req_kind = REQ_KICK;
- TEMP_FAILURE_RETRY(write_not_cancel(__pthread_manager_request,
- (char *) &request, sizeof(request)));
- }
-}
-
-/* Adjust priority of thread manager so that it always run at a priority
- higher than all threads */
-
-void __pthread_manager_adjust_prio(int thread_prio)
-{
- struct sched_param param;
-
- if (thread_prio <= manager_thread->p_priority) return;
- param.sched_priority =
- thread_prio < __sched_get_priority_max(SCHED_FIFO)
- ? thread_prio + 1 : thread_prio;
- __sched_setscheduler(manager_thread->p_pid, SCHED_FIFO, &param);
- manager_thread->p_priority = thread_prio;
-}
diff --git a/linuxthreads/mutex.c b/linuxthreads/mutex.c
deleted file mode 100644
index d5f7a335cc..0000000000
--- a/linuxthreads/mutex.c
+++ /dev/null
@@ -1,362 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* Mutexes */
-
-#include <bits/libc-lock.h>
-#include <errno.h>
-#include <sched.h>
-#include <stddef.h>
-#include <limits.h>
-#include "pthread.h"
-#include "internals.h"
-#include "spinlock.h"
-#include "queue.h"
-#include "restart.h"
-
-int __pthread_mutex_init(pthread_mutex_t * mutex,
- const pthread_mutexattr_t * mutex_attr)
-{
- __pthread_init_lock(&mutex->__m_lock);
- mutex->__m_kind =
- mutex_attr == NULL ? PTHREAD_MUTEX_TIMED_NP : mutex_attr->__mutexkind;
- mutex->__m_count = 0;
- mutex->__m_owner = NULL;
- return 0;
-}
-strong_alias (__pthread_mutex_init, pthread_mutex_init)
-hidden_def (__pthread_mutex_init)
-
-int __pthread_mutex_destroy(pthread_mutex_t * mutex)
-{
- switch (mutex->__m_kind) {
- case PTHREAD_MUTEX_ADAPTIVE_NP:
- case PTHREAD_MUTEX_RECURSIVE_NP:
- if ((mutex->__m_lock.__status & 1) != 0)
- return EBUSY;
- return 0;
- case PTHREAD_MUTEX_ERRORCHECK_NP:
- case PTHREAD_MUTEX_TIMED_NP:
- if (mutex->__m_lock.__status != 0)
- return EBUSY;
- return 0;
- default:
- return EINVAL;
- }
-}
-strong_alias (__pthread_mutex_destroy, pthread_mutex_destroy)
-hidden_def (__pthread_mutex_destroy)
-
-int __pthread_mutex_trylock(pthread_mutex_t * mutex)
-{
- pthread_descr self;
- int retcode;
-
- switch(mutex->__m_kind) {
- case PTHREAD_MUTEX_ADAPTIVE_NP:
- retcode = __pthread_trylock(&mutex->__m_lock);
- return retcode;
- case PTHREAD_MUTEX_RECURSIVE_NP:
- self = thread_self();
- if (mutex->__m_owner == self) {
- mutex->__m_count++;
- return 0;
- }
- retcode = __pthread_trylock(&mutex->__m_lock);
- if (retcode == 0) {
- mutex->__m_owner = self;
- mutex->__m_count = 0;
- }
- return retcode;
- case PTHREAD_MUTEX_ERRORCHECK_NP:
- retcode = __pthread_alt_trylock(&mutex->__m_lock);
- if (retcode == 0) {
- mutex->__m_owner = thread_self();
- }
- return retcode;
- case PTHREAD_MUTEX_TIMED_NP:
- retcode = __pthread_alt_trylock(&mutex->__m_lock);
- return retcode;
- default:
- return EINVAL;
- }
-}
-strong_alias (__pthread_mutex_trylock, pthread_mutex_trylock)
-hidden_def (__pthread_mutex_trylock)
-
-int __pthread_mutex_lock(pthread_mutex_t * mutex)
-{
- pthread_descr self;
-
- switch(mutex->__m_kind) {
- case PTHREAD_MUTEX_ADAPTIVE_NP:
- __pthread_lock(&mutex->__m_lock, NULL);
- return 0;
- case PTHREAD_MUTEX_RECURSIVE_NP:
- self = thread_self();
- if (mutex->__m_owner == self) {
- mutex->__m_count++;
- return 0;
- }
- __pthread_lock(&mutex->__m_lock, self);
- mutex->__m_owner = self;
- mutex->__m_count = 0;
- return 0;
- case PTHREAD_MUTEX_ERRORCHECK_NP:
- self = thread_self();
- if (mutex->__m_owner == self) return EDEADLK;
- __pthread_alt_lock(&mutex->__m_lock, self);
- mutex->__m_owner = self;
- return 0;
- case PTHREAD_MUTEX_TIMED_NP:
- __pthread_alt_lock(&mutex->__m_lock, NULL);
- return 0;
- default:
- return EINVAL;
- }
-}
-strong_alias (__pthread_mutex_lock, pthread_mutex_lock)
-hidden_def (__pthread_mutex_lock)
-
-int __pthread_mutex_timedlock (pthread_mutex_t *mutex,
- const struct timespec *abstime)
-{
- pthread_descr self;
- int res;
-
- if (__builtin_expect (abstime->tv_nsec, 0) < 0
- || __builtin_expect (abstime->tv_nsec, 0) >= 1000000000)
- return EINVAL;
-
- switch(mutex->__m_kind) {
- case PTHREAD_MUTEX_ADAPTIVE_NP:
- __pthread_lock(&mutex->__m_lock, NULL);
- return 0;
- case PTHREAD_MUTEX_RECURSIVE_NP:
- self = thread_self();
- if (mutex->__m_owner == self) {
- mutex->__m_count++;
- return 0;
- }
- __pthread_lock(&mutex->__m_lock, self);
- mutex->__m_owner = self;
- mutex->__m_count = 0;
- return 0;
- case PTHREAD_MUTEX_ERRORCHECK_NP:
- self = thread_self();
- if (mutex->__m_owner == self) return EDEADLK;
- res = __pthread_alt_timedlock(&mutex->__m_lock, self, abstime);
- if (res != 0)
- {
- mutex->__m_owner = self;
- return 0;
- }
- return ETIMEDOUT;
- case PTHREAD_MUTEX_TIMED_NP:
- /* Only this type supports timed out lock. */
- return (__pthread_alt_timedlock(&mutex->__m_lock, NULL, abstime)
- ? 0 : ETIMEDOUT);
- default:
- return EINVAL;
- }
-}
-strong_alias (__pthread_mutex_timedlock, pthread_mutex_timedlock)
-
-int __pthread_mutex_unlock(pthread_mutex_t * mutex)
-{
- switch (mutex->__m_kind) {
- case PTHREAD_MUTEX_ADAPTIVE_NP:
- __pthread_unlock(&mutex->__m_lock);
- return 0;
- case PTHREAD_MUTEX_RECURSIVE_NP:
- if (mutex->__m_owner != thread_self())
- return EPERM;
- if (mutex->__m_count > 0) {
- mutex->__m_count--;
- return 0;
- }
- mutex->__m_owner = NULL;
- __pthread_unlock(&mutex->__m_lock);
- return 0;
- case PTHREAD_MUTEX_ERRORCHECK_NP:
- if (mutex->__m_owner != thread_self() || mutex->__m_lock.__status == 0)
- return EPERM;
- mutex->__m_owner = NULL;
- __pthread_alt_unlock(&mutex->__m_lock);
- return 0;
- case PTHREAD_MUTEX_TIMED_NP:
- __pthread_alt_unlock(&mutex->__m_lock);
- return 0;
- default:
- return EINVAL;
- }
-}
-strong_alias (__pthread_mutex_unlock, pthread_mutex_unlock)
-hidden_def (__pthread_mutex_unlock)
-
-int __pthread_mutexattr_init(pthread_mutexattr_t *attr)
-{
- attr->__mutexkind = PTHREAD_MUTEX_TIMED_NP;
- return 0;
-}
-strong_alias (__pthread_mutexattr_init, pthread_mutexattr_init)
-
-int __pthread_mutexattr_destroy(pthread_mutexattr_t *attr)
-{
- return 0;
-}
-strong_alias (__pthread_mutexattr_destroy, pthread_mutexattr_destroy)
-
-int __pthread_mutexattr_settype(pthread_mutexattr_t *attr, int kind)
-{
- if (kind != PTHREAD_MUTEX_ADAPTIVE_NP
- && kind != PTHREAD_MUTEX_RECURSIVE_NP
- && kind != PTHREAD_MUTEX_ERRORCHECK_NP
- && kind != PTHREAD_MUTEX_TIMED_NP)
- return EINVAL;
- attr->__mutexkind = kind;
- return 0;
-}
-weak_alias (__pthread_mutexattr_settype, pthread_mutexattr_settype)
-strong_alias ( __pthread_mutexattr_settype, __pthread_mutexattr_setkind_np)
-weak_alias (__pthread_mutexattr_setkind_np, pthread_mutexattr_setkind_np)
-
-int __pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *kind)
-{
- *kind = attr->__mutexkind;
- return 0;
-}
-weak_alias (__pthread_mutexattr_gettype, pthread_mutexattr_gettype)
-strong_alias (__pthread_mutexattr_gettype, __pthread_mutexattr_getkind_np)
-weak_alias (__pthread_mutexattr_getkind_np, pthread_mutexattr_getkind_np)
-
-int __pthread_mutexattr_getpshared (const pthread_mutexattr_t *attr,
- int *pshared)
-{
- *pshared = PTHREAD_PROCESS_PRIVATE;
- return 0;
-}
-weak_alias (__pthread_mutexattr_getpshared, pthread_mutexattr_getpshared)
-
-int __pthread_mutexattr_setpshared (pthread_mutexattr_t *attr, int pshared)
-{
- if (pshared != PTHREAD_PROCESS_PRIVATE && pshared != PTHREAD_PROCESS_SHARED)
- return EINVAL;
-
- /* For now it is not possible to shared a conditional variable. */
- if (pshared != PTHREAD_PROCESS_PRIVATE)
- return ENOSYS;
-
- return 0;
-}
-weak_alias (__pthread_mutexattr_setpshared, pthread_mutexattr_setpshared)
-
-/* Once-only execution */
-
-static pthread_mutex_t once_masterlock = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t once_finished = PTHREAD_COND_INITIALIZER;
-static int fork_generation = 0; /* Child process increments this after fork. */
-
-enum { NEVER = 0, IN_PROGRESS = 1, DONE = 2 };
-
-/* If a thread is canceled while calling the init_routine out of
- pthread once, this handler will reset the once_control variable
- to the NEVER state. */
-
-static void pthread_once_cancelhandler(void *arg)
-{
- pthread_once_t *once_control = arg;
-
- pthread_mutex_lock(&once_masterlock);
- *once_control = NEVER;
- pthread_mutex_unlock(&once_masterlock);
- pthread_cond_broadcast(&once_finished);
-}
-
-int __pthread_once(pthread_once_t * once_control, void (*init_routine)(void))
-{
- /* flag for doing the condition broadcast outside of mutex */
- int state_changed;
-
- /* Test without locking first for speed */
- if (*once_control == DONE) {
- READ_MEMORY_BARRIER();
- return 0;
- }
- /* Lock and test again */
-
- state_changed = 0;
-
- pthread_mutex_lock(&once_masterlock);
-
- /* If this object was left in an IN_PROGRESS state in a parent
- process (indicated by stale generation field), reset it to NEVER. */
- if ((*once_control & 3) == IN_PROGRESS && (*once_control & ~3) != fork_generation)
- *once_control = NEVER;
-
- /* If init_routine is being called from another routine, wait until
- it completes. */
- while ((*once_control & 3) == IN_PROGRESS) {
- pthread_cond_wait(&once_finished, &once_masterlock);
- }
- /* Here *once_control is stable and either NEVER or DONE. */
- if (*once_control == NEVER) {
- *once_control = IN_PROGRESS | fork_generation;
- pthread_mutex_unlock(&once_masterlock);
- pthread_cleanup_push(pthread_once_cancelhandler, once_control);
- init_routine();
- pthread_cleanup_pop(0);
- pthread_mutex_lock(&once_masterlock);
- WRITE_MEMORY_BARRIER();
- *once_control = DONE;
- state_changed = 1;
- }
- pthread_mutex_unlock(&once_masterlock);
-
- if (state_changed)
- pthread_cond_broadcast(&once_finished);
-
- return 0;
-}
-strong_alias (__pthread_once, pthread_once)
-
-/*
- * Handle the state of the pthread_once mechanism across forks. The
- * once_masterlock is acquired in the parent process prior to a fork to ensure
- * that no thread is in the critical region protected by the lock. After the
- * fork, the lock is released. In the child, the lock and the condition
- * variable are simply reset. The child also increments its generation
- * counter which lets pthread_once calls detect stale IN_PROGRESS states
- * and reset them back to NEVER.
- */
-
-void __pthread_once_fork_prepare(void)
-{
- pthread_mutex_lock(&once_masterlock);
-}
-
-void __pthread_once_fork_parent(void)
-{
- pthread_mutex_unlock(&once_masterlock);
-}
-
-void __pthread_once_fork_child(void)
-{
- pthread_mutex_init(&once_masterlock, NULL);
- pthread_cond_init(&once_finished, NULL);
- if (fork_generation <= INT_MAX - 4)
- fork_generation += 4; /* leave least significant two bits zero */
- else
- fork_generation = 0;
-}
diff --git a/linuxthreads/old_pthread_atfork.c b/linuxthreads/old_pthread_atfork.c
deleted file mode 100644
index 768e6876c4..0000000000
--- a/linuxthreads/old_pthread_atfork.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#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/linuxthreads/oldsemaphore.c b/linuxthreads/oldsemaphore.c
deleted file mode 100644
index d35683b98b..0000000000
--- a/linuxthreads/oldsemaphore.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * This file contains the old semaphore code that we need to
- * preserve for glibc-2.0 backwards compatibility. Port to glibc 2.1
- * done by Cristian Gafton.
- */
-
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* Semaphores a la POSIX 1003.1b */
-#include <shlib-compat.h>
-#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
-
-#include <errno.h>
-#include "pthread.h"
-#include "internals.h"
-#include "spinlock.h"
-#include "restart.h"
-#include "queue.h"
-
-typedef struct {
- long int sem_status;
- int sem_spinlock;
-} old_sem_t;
-
-extern int __old_sem_init (old_sem_t *__sem, int __pshared, unsigned int __value);
-extern int __old_sem_wait (old_sem_t *__sem);
-extern int __old_sem_trywait (old_sem_t *__sem);
-extern int __old_sem_post (old_sem_t *__sem);
-extern int __old_sem_getvalue (old_sem_t *__sem, int *__sval);
-extern int __old_sem_destroy (old_sem_t *__sem);
-
-static inline int sem_compare_and_swap(old_sem_t *sem, long oldval, long newval)
-{
- return compare_and_swap(&sem->sem_status, oldval, newval, &sem->sem_spinlock);
-}
-
-/* The state of a semaphore is represented by a long int encoding
- either the semaphore count if >= 0 and no thread is waiting on it,
- or the head of the list of threads waiting for the semaphore.
- To distinguish the two cases, we encode the semaphore count N
- as 2N+1, so that it has the lowest bit set.
-
- A sequence of sem_wait operations on a semaphore initialized to N
- result in the following successive states:
- 2N+1, 2N-1, ..., 3, 1, &first_waiting_thread, &second_waiting_thread, ...
-*/
-
-static void sem_restart_list(pthread_descr waiting);
-
-int __old_sem_init(old_sem_t *sem, int pshared, unsigned int value)
-{
- if (value > SEM_VALUE_MAX) {
- errno = EINVAL;
- return -1;
- }
- if (pshared) {
- errno = ENOSYS;
- return -1;
- }
- sem->sem_spinlock = __LT_SPINLOCK_INIT;
- sem->sem_status = ((long)value << 1) + 1;
- return 0;
-}
-
-/* Function called by pthread_cancel to remove the thread from
- waiting inside __old_sem_wait. Here we simply unconditionally
- indicate that the thread is to be woken, by returning 1. */
-
-static int old_sem_extricate_func(void *obj, pthread_descr th)
-{
- return 1;
-}
-
-int __old_sem_wait(old_sem_t * sem)
-{
- long oldstatus, newstatus;
- volatile pthread_descr self = thread_self();
- pthread_descr * th;
- pthread_extricate_if extr;
-
- /* Set up extrication interface */
- extr.pu_object = 0;
- extr.pu_extricate_func = old_sem_extricate_func;
-
- while (1) {
- /* Register extrication interface */
- __pthread_set_own_extricate_if(self, &extr);
- do {
- oldstatus = sem->sem_status;
- if ((oldstatus & 1) && (oldstatus != 1))
- newstatus = oldstatus - 2;
- else {
- newstatus = (long) self;
- self->p_nextwaiting = (pthread_descr) oldstatus;
- }
- }
- while (! sem_compare_and_swap(sem, oldstatus, newstatus));
- if (newstatus & 1) {
- /* We got the semaphore. */
- __pthread_set_own_extricate_if(self, 0);
- self->p_nextwaiting = NULL;
- return 0;
- }
- /* Wait for sem_post or cancellation */
- suspend(self);
- __pthread_set_own_extricate_if(self, 0);
-
- /* This is a cancellation point */
- if (self->p_canceled && self->p_cancelstate == PTHREAD_CANCEL_ENABLE) {
- /* Remove ourselves from the waiting list if we're still on it */
- /* First check if we're at the head of the list. */
- do {
- oldstatus = sem->sem_status;
- if (oldstatus != (long) self) break;
- newstatus = (long) self->p_nextwaiting;
- }
- while (! sem_compare_and_swap(sem, oldstatus, newstatus));
- /* Now, check if we're somewhere in the list.
- There's a race condition with sem_post here, but it does not matter:
- the net result is that at the time pthread_exit is called,
- self is no longer reachable from sem->sem_status. */
- if (oldstatus != (long) self && (oldstatus & 1) == 0) {
- for (th = &(((pthread_descr) oldstatus)->p_nextwaiting);
- *th != NULL && *th != (pthread_descr) 1;
- th = &((*th)->p_nextwaiting)) {
- if (*th == self) {
- *th = self->p_nextwaiting;
- break;
- }
- }
- }
- __pthread_do_exit(PTHREAD_CANCELED, CURRENT_STACK_FRAME);
- }
- }
-}
-
-int __old_sem_trywait(old_sem_t * sem)
-{
- long oldstatus, newstatus;
-
- do {
- oldstatus = sem->sem_status;
- if ((oldstatus & 1) == 0 || (oldstatus == 1)) {
- errno = EAGAIN;
- return -1;
- }
- newstatus = oldstatus - 2;
- }
- while (! sem_compare_and_swap(sem, oldstatus, newstatus));
- return 0;
-}
-
-int __old_sem_post(old_sem_t * sem)
-{
- long oldstatus, newstatus;
-
- do {
- oldstatus = sem->sem_status;
- if ((oldstatus & 1) == 0)
- newstatus = 3;
- else {
- if (oldstatus >= SEM_VALUE_MAX) {
- /* Overflow */
- errno = ERANGE;
- return -1;
- }
- newstatus = oldstatus + 2;
- }
- }
- while (! sem_compare_and_swap(sem, oldstatus, newstatus));
- if ((oldstatus & 1) == 0)
- sem_restart_list((pthread_descr) oldstatus);
- return 0;
-}
-
-int __old_sem_getvalue(old_sem_t * sem, int * sval)
-{
- long status = sem->sem_status;
- if (status & 1)
- *sval = (int)((unsigned long) status >> 1);
- else
- *sval = 0;
- return 0;
-}
-
-int __old_sem_destroy(old_sem_t * sem)
-{
- if ((sem->sem_status & 1) == 0) {
- errno = EBUSY;
- return -1;
- }
- return 0;
-}
-
-/* Auxiliary function for restarting all threads on a waiting list,
- in priority order. */
-
-static void sem_restart_list(pthread_descr waiting)
-{
- pthread_descr th, towake, *p;
-
- /* Sort list of waiting threads by decreasing priority (insertion sort) */
- towake = NULL;
- while (waiting != (pthread_descr) 1) {
- th = waiting;
- waiting = waiting->p_nextwaiting;
- p = &towake;
- while (*p != NULL && th->p_priority < (*p)->p_priority)
- p = &((*p)->p_nextwaiting);
- th->p_nextwaiting = *p;
- *p = th;
- }
- /* Wake up threads in priority order */
- while (towake != NULL) {
- th = towake;
- towake = towake->p_nextwaiting;
- th->p_nextwaiting = NULL;
- restart(th);
- }
-}
-
-compat_symbol (libpthread, __old_sem_init, sem_init, GLIBC_2_0);
-compat_symbol (libpthread, __old_sem_wait, sem_wait, GLIBC_2_0);
-compat_symbol (libpthread, __old_sem_trywait, sem_trywait, GLIBC_2_0);
-compat_symbol (libpthread, __old_sem_post, sem_post, GLIBC_2_0);
-compat_symbol (libpthread, __old_sem_getvalue, sem_getvalue, GLIBC_2_0);
-compat_symbol (libpthread, __old_sem_destroy, sem_destroy, GLIBC_2_0);
-
-#endif
diff --git a/linuxthreads/pt-allocrtsig.c b/linuxthreads/pt-allocrtsig.c
deleted file mode 100644
index 3598dbb49f..0000000000
--- a/linuxthreads/pt-allocrtsig.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#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 cancelation signal. This
- signal is 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/linuxthreads/pt-machine.c b/linuxthreads/pt-machine.c
deleted file mode 100644
index 5cd477ce97..0000000000
--- a/linuxthreads/pt-machine.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* "Instantiation of machine-dependent pthreads inline functions.
- Copyright (C) 1998 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#define PT_EI
-
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
-
-#include <pt-machine.h>
diff --git a/linuxthreads/pt-system.c b/linuxthreads/pt-system.c
deleted file mode 100644
index c3ed676f51..0000000000
--- a/linuxthreads/pt-system.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Copyright (C) 2002, 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <errno.h>
-#include <stdlib.h>
-#include <sysdep-cancel.h>
-
-
-int
-system (const char *line)
-{
- return __libc_system (line);
-}
-
-/* __libc_system in libc.so handles cancellation. */
-LIBC_CANCEL_HANDLED ();
diff --git a/linuxthreads/ptcleanup.c b/linuxthreads/ptcleanup.c
deleted file mode 100644
index 9fde2555b1..0000000000
--- a/linuxthreads/ptcleanup.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1998, 2004 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* Redefine siglongjmp and longjmp so that they interact correctly
- with cleanup handlers */
-
-#include <setjmp.h>
-#include "pthread.h"
-#include "internals.h"
-
-void __pthread_cleanup_upto (__jmp_buf target, char *targetframe)
-{
- pthread_descr self = thread_self();
- struct _pthread_cleanup_buffer * c;
-
- for (c = THREAD_GETMEM(self, p_cleanup);
- c != NULL && _JMPBUF_UNWINDS(target, c);
- c = c->__prev)
- {
-#if _STACK_GROWS_DOWN
- if ((char *) c <= targetframe)
- {
- c = NULL;
- break;
- }
-#elif _STACK_GROWS_UP
- if ((char *) c >= targetframe)
- {
- c = NULL;
- break;
- }
-#else
-# error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP"
-#endif
- c->__routine(c->__arg);
- }
- THREAD_SETMEM(self, p_cleanup, c);
- if (THREAD_GETMEM(self, p_in_sighandler)
- && _JMPBUF_UNWINDS(target, THREAD_GETMEM(self, p_in_sighandler)))
- THREAD_SETMEM(self, p_in_sighandler, NULL);
-}
diff --git a/linuxthreads/ptclock_gettime.c b/linuxthreads/ptclock_gettime.c
deleted file mode 100644
index 755f83d101..0000000000
--- a/linuxthreads/ptclock_gettime.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/* Copyright (C) 2001, 2004 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <time.h>
-#include <libc-internal.h>
-#include "internals.h"
-#include "spinlock.h"
-
-
-#if HP_TIMING_AVAIL
-int
-__pthread_clock_gettime (clockid_t clock_id, hp_timing_t freq,
- struct timespec *tp)
-{
- hp_timing_t tsc, cpuclock_offset;
- pthread_descr self = thread_self ();
- pthread_t thread = ((unsigned int) clock_id) >> CLOCK_IDFIELD_SIZE;
- const unsigned int mask = ~0U >> CLOCK_IDFIELD_SIZE;
-
- if (thread == 0 || (THREAD_GETMEM (self, p_tid) & mask) == thread)
- cpuclock_offset = THREAD_GETMEM (self, p_cpuclock_offset);
- else
- {
- pthread_descr th;
- pthread_handle handle = thread_handle (thread);
- __pthread_lock (&handle->h_lock, NULL);
- th = handle->h_descr;
- if (th == NULL || (th->p_tid & mask) != thread || th->p_terminated)
- {
- __pthread_unlock (&handle->h_lock);
- __set_errno (EINVAL);
- return -1;
- }
- cpuclock_offset = th->p_cpuclock_offset;
- __pthread_unlock (&handle->h_lock);
- }
-
- /* Get the current counter. */
- HP_TIMING_NOW (tsc);
-
- /* Compute the offset since the start time of the process. */
- tsc -= 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/linuxthreads/ptclock_settime.c b/linuxthreads/ptclock_settime.c
deleted file mode 100644
index a4f218c771..0000000000
--- a/linuxthreads/ptclock_settime.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Copyright (C) 2001, 2004 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <time.h>
-#include <libc-internal.h>
-#include "internals.h"
-#include "spinlock.h"
-
-
-#if HP_TIMING_AVAIL
-int
-__pthread_clock_settime (clockid_t clock_id, hp_timing_t offset)
-{
- pthread_descr self = thread_self ();
- pthread_t thread = ((unsigned int) clock_id) >> CLOCK_IDFIELD_SIZE;
- const unsigned int mask = ~0U >> CLOCK_IDFIELD_SIZE;
-
- if (thread == 0 || (THREAD_GETMEM (self, p_tid) & mask) == thread)
- /* Our own clock. */
- THREAD_SETMEM (self, p_cpuclock_offset, offset);
- else
- {
- pthread_descr th;
- pthread_handle handle = thread_handle (thread);
- __pthread_lock (&handle->h_lock, NULL);
- th = handle->h_descr;
- if (th == NULL || (th->p_tid & mask) != thread || th->p_terminated)
- {
- __pthread_unlock (&handle->h_lock);
- __set_errno (EINVAL);
- return -1;
- }
- th->p_cpuclock_offset = offset;
- __pthread_unlock (&handle->h_lock);
- }
-
- return 0;
-}
-#endif
diff --git a/linuxthreads/ptfork.c b/linuxthreads/ptfork.c
deleted file mode 100644
index 9cdbb54361..0000000000
--- a/linuxthreads/ptfork.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* The "atfork" stuff */
-
-#include <errno.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include "pthread.h"
-#include "internals.h"
-#include <bits/libc-lock.h>
-#include "fork.h"
-
-extern int __libc_fork (void);
-
-pid_t __pthread_fork (struct fork_block *b)
-{
- pid_t pid;
- list_t *runp;
-
- __libc_lock_lock (b->lock);
-
- /* Run all the registered preparation handlers. In reverse order. */
- list_for_each_prev (runp, &b->prepare_list)
- {
- struct fork_handler *curp;
- curp = list_entry (runp, struct fork_handler, list);
- curp->handler ();
- }
-
- __pthread_once_fork_prepare();
- __flockfilelist();
-
- pid = ARCH_FORK ();
-
- if (pid == 0) {
- __pthread_reset_main_thread();
-
- __fresetlockfiles();
- __pthread_once_fork_child();
-
- /* Run the handlers registered for the child. */
- list_for_each (runp, &b->child_list)
- {
- struct fork_handler *curp;
- curp = list_entry (runp, struct fork_handler, list);
- curp->handler ();
- }
-
- __libc_lock_init (b->lock);
- } else {
- __funlockfilelist();
- __pthread_once_fork_parent();
-
- /* Run the handlers registered for the parent. */
- list_for_each (runp, &b->parent_list)
- {
- struct fork_handler *curp;
- curp = list_entry (runp, struct fork_handler, list);
- curp->handler ();
- }
-
- __libc_lock_unlock (b->lock);
- }
-
- return pid;
-}
-
-#ifdef SHARED
-pid_t __fork (void)
-{
- return __libc_fork ();
-}
-weak_alias (__fork, fork);
-
-pid_t __vfork(void)
-{
- return __libc_fork ();
-}
-weak_alias (__vfork, vfork);
-#endif
diff --git a/linuxthreads/pthandles.c b/linuxthreads/pthandles.c
deleted file mode 100644
index 4d2ac1940d..0000000000
--- a/linuxthreads/pthandles.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <ldsodefs.h>
-#include "pthread.h"
-#include "internals.h"
-
-/* Array of active threads. Entry 0 is reserved for the initial thread. */
-struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX];
diff --git a/linuxthreads/pthread.c b/linuxthreads/pthread.c
deleted file mode 100644
index 39863f2b54..0000000000
--- a/linuxthreads/pthread.c
+++ /dev/null
@@ -1,1408 +0,0 @@
-
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* Thread creation, initialization, and basic low-level routines */
-
-#include <errno.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/wait.h>
-#include <sys/resource.h>
-#include <sys/time.h>
-#include <shlib-compat.h>
-#include "pthread.h"
-#include "internals.h"
-#include "spinlock.h"
-#include "restart.h"
-#include "smp.h"
-#include <ldsodefs.h>
-#include <tls.h>
-#include <version.h>
-#include <not-cancel.h>
-
-/* Sanity check. */
-#if !defined __SIGRTMIN || (__SIGRTMAX - __SIGRTMIN) < 3
-# error "This must not happen"
-#endif
-
-#if !(USE_TLS && HAVE___THREAD)
-/* These variables are used by the setup code. */
-extern int _errno;
-extern int _h_errno;
-
-/* We need the global/static resolver state here. */
-# include <resolv.h>
-# undef _res
-
-extern struct __res_state _res;
-#endif
-
-#ifdef USE_TLS
-
-/* We need only a few variables. */
-#define manager_thread __pthread_manager_threadp
-pthread_descr __pthread_manager_threadp attribute_hidden;
-
-#else
-
-/* Descriptor of the initial thread */
-
-struct _pthread_descr_struct __pthread_initial_thread = {
- .p_header.data.self = &__pthread_initial_thread,
- .p_nextlive = &__pthread_initial_thread,
- .p_prevlive = &__pthread_initial_thread,
- .p_tid = PTHREAD_THREADS_MAX,
- .p_lock = &__pthread_handles[0].h_lock,
- .p_start_args = PTHREAD_START_ARGS_INITIALIZER(NULL),
-#if !(USE_TLS && HAVE___THREAD)
- .p_errnop = &_errno,
- .p_h_errnop = &_h_errno,
- .p_resp = &_res,
-#endif
- .p_userstack = 1,
- .p_resume_count = __ATOMIC_INITIALIZER,
- .p_alloca_cutoff = __MAX_ALLOCA_CUTOFF
-};
-
-/* Descriptor of the manager thread; none of this is used but the error
- variables, the p_pid and p_priority fields,
- and the address for identification. */
-
-#define manager_thread (&__pthread_manager_thread)
-struct _pthread_descr_struct __pthread_manager_thread = {
- .p_header.data.self = &__pthread_manager_thread,
- .p_header.data.multiple_threads = 1,
- .p_lock = &__pthread_handles[1].h_lock,
- .p_start_args = PTHREAD_START_ARGS_INITIALIZER(__pthread_manager),
-#if !(USE_TLS && HAVE___THREAD)
- .p_errnop = &__pthread_manager_thread.p_errno,
-#endif
- .p_nr = 1,
- .p_resume_count = __ATOMIC_INITIALIZER,
- .p_alloca_cutoff = PTHREAD_STACK_MIN / 4
-};
-#endif
-
-/* Pointer to the main thread (the father of the thread manager thread) */
-/* Originally, this is the initial thread, but this changes after fork() */
-
-#ifdef USE_TLS
-pthread_descr __pthread_main_thread;
-#else
-pthread_descr __pthread_main_thread = &__pthread_initial_thread;
-#endif
-
-/* Limit between the stack of the initial thread (above) and the
- stacks of other threads (below). Aligned on a STACK_SIZE boundary. */
-
-char *__pthread_initial_thread_bos;
-
-/* File descriptor for sending requests to the thread manager. */
-/* Initially -1, meaning that the thread manager is not running. */
-
-int __pthread_manager_request = -1;
-
-int __pthread_multiple_threads attribute_hidden;
-
-/* Other end of the pipe for sending requests to the thread manager. */
-
-int __pthread_manager_reader;
-
-/* Limits of the thread manager stack */
-
-char *__pthread_manager_thread_bos;
-char *__pthread_manager_thread_tos;
-
-/* For process-wide exit() */
-
-int __pthread_exit_requested;
-int __pthread_exit_code;
-
-/* Maximum stack size. */
-size_t __pthread_max_stacksize;
-
-/* Nozero if the machine has more than one processor. */
-int __pthread_smp_kernel;
-
-
-#if !__ASSUME_REALTIME_SIGNALS
-/* Pointers that select new or old suspend/resume functions
- based on availability of rt signals. */
-
-void (*__pthread_restart)(pthread_descr) = __pthread_restart_old;
-void (*__pthread_suspend)(pthread_descr) = __pthread_suspend_old;
-int (*__pthread_timedsuspend)(pthread_descr, const struct timespec *) = __pthread_timedsuspend_old;
-#endif /* __ASSUME_REALTIME_SIGNALS */
-
-/* Communicate relevant LinuxThreads constants to gdb */
-
-const int __pthread_threads_max = PTHREAD_THREADS_MAX;
-const int __pthread_sizeof_handle = sizeof(struct pthread_handle_struct);
-const int __pthread_offsetof_descr = offsetof(struct pthread_handle_struct,
- h_descr);
-const int __pthread_offsetof_pid = offsetof(struct _pthread_descr_struct,
- p_pid);
-const int __linuxthreads_pthread_sizeof_descr
- = sizeof(struct _pthread_descr_struct);
-
-const int __linuxthreads_initial_report_events;
-
-const char __linuxthreads_version[] = VERSION;
-
-/* Forward declarations */
-
-static void pthread_onexit_process(int retcode, void *arg);
-#ifndef HAVE_Z_NODELETE
-static void pthread_atexit_process(void *arg, int retcode);
-static void pthread_atexit_retcode(void *arg, int retcode);
-#endif
-static void pthread_handle_sigcancel(int sig);
-static void pthread_handle_sigrestart(int sig);
-static void pthread_handle_sigdebug(int sig);
-
-/* Signal numbers used for the communication.
- In these variables we keep track of the used variables. If the
- platform does not support any real-time signals we will define the
- values to some unreasonable value which will signal failing of all
- the functions below. */
-int __pthread_sig_restart = __SIGRTMIN;
-int __pthread_sig_cancel = __SIGRTMIN + 1;
-int __pthread_sig_debug = __SIGRTMIN + 2;
-
-extern int __libc_current_sigrtmin_private (void);
-
-#if !__ASSUME_REALTIME_SIGNALS
-static int rtsigs_initialized;
-
-static void
-init_rtsigs (void)
-{
- if (rtsigs_initialized)
- return;
-
- if (__libc_current_sigrtmin_private () == -1)
- {
- __pthread_sig_restart = SIGUSR1;
- __pthread_sig_cancel = SIGUSR2;
- __pthread_sig_debug = 0;
- }
- else
- {
- __pthread_restart = __pthread_restart_new;
- __pthread_suspend = __pthread_wait_for_restart_signal;
- __pthread_timedsuspend = __pthread_timedsuspend_new;
- }
-
- rtsigs_initialized = 1;
-}
-#endif
-
-
-/* Initialize the pthread library.
- Initialization is split in two functions:
- - a constructor function that blocks the __pthread_sig_restart signal
- (must do this very early, since the program could capture the signal
- mask with e.g. sigsetjmp before creating the first thread);
- - a regular function called from pthread_create when needed. */
-
-static void pthread_initialize(void) __attribute__((constructor));
-
-#ifndef HAVE_Z_NODELETE
-extern void *__dso_handle __attribute__ ((weak));
-#endif
-
-
-#if defined USE_TLS && !defined SHARED
-extern void __libc_setup_tls (size_t tcbsize, size_t tcbalign);
-#endif
-
-struct pthread_functions __pthread_functions =
- {
-#if !(USE_TLS && HAVE___THREAD)
- .ptr_pthread_internal_tsd_set = __pthread_internal_tsd_set,
- .ptr_pthread_internal_tsd_get = __pthread_internal_tsd_get,
- .ptr_pthread_internal_tsd_address = __pthread_internal_tsd_address,
-#endif
- .ptr_pthread_fork = __pthread_fork,
- .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,
- .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_trylock = __pthread_mutex_trylock,
- .ptr_pthread_mutex_unlock = __pthread_mutex_unlock,
- .ptr_pthread_self = __pthread_self,
- .ptr_pthread_setcancelstate = __pthread_setcancelstate,
- .ptr_pthread_setcanceltype = __pthread_setcanceltype,
- .ptr_pthread_do_exit = __pthread_do_exit,
- .ptr_pthread_thread_self = __pthread_thread_self,
- .ptr_pthread_cleanup_upto = __pthread_cleanup_upto,
- .ptr_pthread_sigaction = __pthread_sigaction,
- .ptr_pthread_sigwait = __pthread_sigwait,
- .ptr_pthread_raise = __pthread_raise,
- .ptr__pthread_cleanup_push = _pthread_cleanup_push,
- .ptr__pthread_cleanup_pop = _pthread_cleanup_pop
- };
-#ifdef SHARED
-# define ptr_pthread_functions &__pthread_functions
-#else
-# define ptr_pthread_functions NULL
-#endif
-
-static int *__libc_multiple_threads_ptr;
-
-/* Do some minimal initialization which has to be done during the
- startup of the C library. */
-void
-__pthread_initialize_minimal(void)
-{
-#ifdef USE_TLS
- pthread_descr self;
-
- /* First of all init __pthread_handles[0] and [1] if needed. */
-# if __LT_SPINLOCK_INIT != 0
- __pthread_handles[0].h_lock = __LOCK_INITIALIZER;
- __pthread_handles[1].h_lock = __LOCK_INITIALIZER;
-# endif
-# ifndef SHARED
- /* Unlike in the dynamically linked case the dynamic linker has not
- taken care of initializing the TLS data structures. */
- __libc_setup_tls (TLS_TCB_SIZE, TLS_TCB_ALIGN);
-# elif !USE___THREAD
- if (__builtin_expect (GL(dl_tls_dtv_slotinfo_list) == NULL, 0))
- {
- tcbhead_t *tcbp;
-
- /* There is no actual TLS being used, so the thread register
- was not initialized in the dynamic linker. */
-
- /* We need to install special hooks so that the malloc and memalign
- calls in _dl_tls_setup and _dl_allocate_tls won't cause full
- malloc initialization that will try to set up its thread state. */
-
- extern void __libc_malloc_pthread_startup (bool first_time);
- __libc_malloc_pthread_startup (true);
-
- if (__builtin_expect (_dl_tls_setup (), 0)
- || __builtin_expect ((tcbp = _dl_allocate_tls (NULL)) == NULL, 0))
- {
- static const char msg[] = "\
-cannot allocate TLS data structures for initial thread\n";
- TEMP_FAILURE_RETRY (write_not_cancel (STDERR_FILENO,
- msg, sizeof msg - 1));
- abort ();
- }
- const char *lossage = TLS_INIT_TP (tcbp, 0);
- if (__builtin_expect (lossage != NULL, 0))
- {
- static const char msg[] = "cannot set up thread-local storage: ";
- const char nl = '\n';
- TEMP_FAILURE_RETRY (write_not_cancel (STDERR_FILENO,
- msg, sizeof msg - 1));
- TEMP_FAILURE_RETRY (write_not_cancel (STDERR_FILENO,
- lossage, strlen (lossage)));
- TEMP_FAILURE_RETRY (write_not_cancel (STDERR_FILENO, &nl, 1));
- }
-
- /* Though it was allocated with libc's malloc, that was done without
- the user's __malloc_hook installed. A later realloc that uses
- the hooks might not work with that block from the plain malloc.
- So we record this block as unfreeable just as the dynamic linker
- does when it allocates the DTV before the libc malloc exists. */
- GL(dl_initial_dtv) = GET_DTV (tcbp);
-
- __libc_malloc_pthread_startup (false);
- }
-# endif
-
- self = THREAD_SELF;
-
- /* The memory for the thread descriptor was allocated elsewhere as
- part of the TLS allocation. We have to initialize the data
- structure by hand. This initialization must mirror the struct
- definition above. */
- self->p_nextlive = self->p_prevlive = self;
- self->p_tid = PTHREAD_THREADS_MAX;
- self->p_lock = &__pthread_handles[0].h_lock;
-# ifndef HAVE___THREAD
- self->p_errnop = &_errno;
- self->p_h_errnop = &_h_errno;
-# endif
- /* self->p_start_args need not be initialized, it's all zero. */
- self->p_userstack = 1;
-# if __LT_SPINLOCK_INIT != 0
- self->p_resume_count = (struct pthread_atomic) __ATOMIC_INITIALIZER;
-# endif
- self->p_alloca_cutoff = __MAX_ALLOCA_CUTOFF;
-
- /* Another variable which points to the thread descriptor. */
- __pthread_main_thread = self;
-
- /* And fill in the pointer the the thread __pthread_handles array. */
- __pthread_handles[0].h_descr = self;
-
-#else /* USE_TLS */
-
- /* First of all init __pthread_handles[0] and [1]. */
-# if __LT_SPINLOCK_INIT != 0
- __pthread_handles[0].h_lock = __LOCK_INITIALIZER;
- __pthread_handles[1].h_lock = __LOCK_INITIALIZER;
-# endif
- __pthread_handles[0].h_descr = &__pthread_initial_thread;
- __pthread_handles[1].h_descr = &__pthread_manager_thread;
-
- /* If we have special thread_self processing, initialize that for the
- main thread now. */
-# ifdef INIT_THREAD_SELF
- INIT_THREAD_SELF(&__pthread_initial_thread, 0);
-# endif
-#endif
-
-#if HP_TIMING_AVAIL
-# ifdef USE_TLS
- self->p_cpuclock_offset = GL(dl_cpuclock_offset);
-# else
- __pthread_initial_thread.p_cpuclock_offset = GL(dl_cpuclock_offset);
-# endif
-#endif
-
- __libc_multiple_threads_ptr = __libc_pthread_init (ptr_pthread_functions);
-}
-
-
-void
-__pthread_init_max_stacksize(void)
-{
- struct rlimit limit;
- size_t max_stack;
-
- getrlimit(RLIMIT_STACK, &limit);
-#ifdef FLOATING_STACKS
- if (limit.rlim_cur == RLIM_INFINITY)
- limit.rlim_cur = ARCH_STACK_MAX_SIZE;
-# ifdef NEED_SEPARATE_REGISTER_STACK
- max_stack = limit.rlim_cur / 2;
-# else
- max_stack = limit.rlim_cur;
-# endif
-#else
- /* Play with the stack size limit to make sure that no stack ever grows
- beyond STACK_SIZE minus one page (to act as a guard page). */
-# ifdef NEED_SEPARATE_REGISTER_STACK
- /* STACK_SIZE bytes hold both the main stack and register backing
- store. The rlimit value applies to each individually. */
- max_stack = STACK_SIZE/2 - __getpagesize ();
-# else
- max_stack = STACK_SIZE - __getpagesize();
-# endif
- if (limit.rlim_cur > max_stack) {
- limit.rlim_cur = max_stack;
- setrlimit(RLIMIT_STACK, &limit);
- }
-#endif
- __pthread_max_stacksize = max_stack;
- if (max_stack / 4 < __MAX_ALLOCA_CUTOFF)
- {
-#ifdef USE_TLS
- pthread_descr self = THREAD_SELF;
- self->p_alloca_cutoff = max_stack / 4;
-#else
- __pthread_initial_thread.p_alloca_cutoff = max_stack / 4;
-#endif
- }
-}
-
-#ifdef SHARED
-# if USE___THREAD
-/* 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));
-# else
-static void ** __attribute__ ((const))
-__libc_dl_error_tsd (void)
-{
- return &thread_self ()->p_libc_specific[_LIBC_TSD_KEY_DL_ERROR];
-}
-# endif
-#endif
-
-#ifdef USE_TLS
-static inline void __attribute__((always_inline))
-init_one_static_tls (pthread_descr descr, struct link_map *map)
-{
-# if TLS_TCB_AT_TP
- dtv_t *dtv = GET_DTV (descr);
- void *dest = (char *) descr - map->l_tls_offset;
-# elif TLS_DTV_AT_TP
- dtv_t *dtv = GET_DTV ((pthread_descr) ((char *) descr + TLS_PRE_TCB_SIZE));
- void *dest = (char *) descr + map->l_tls_offset + TLS_PRE_TCB_SIZE;
-# else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-# endif
-
- /* Fill in the DTV slot so that a later LD/GD access will find it. */
- dtv[map->l_tls_modid].pointer.val = dest;
- dtv[map->l_tls_modid].pointer.is_static = true;
-
- /* 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);
-}
-
-static void
-__pthread_init_static_tls (struct link_map *map)
-{
- size_t i;
-
- for (i = 0; i < PTHREAD_THREADS_MAX; ++i)
- if (__pthread_handles[i].h_descr != NULL && i != 1)
- {
- __pthread_lock (&__pthread_handles[i].h_lock, NULL);
- if (__pthread_handles[i].h_descr != NULL)
- init_one_static_tls (__pthread_handles[i].h_descr, map);
- __pthread_unlock (&__pthread_handles[i].h_lock);
- }
-}
-#endif
-
-static void pthread_initialize(void)
-{
- struct sigaction sa;
- sigset_t mask;
-
- /* If already done (e.g. by a constructor called earlier!), bail out */
- if (__pthread_initial_thread_bos != NULL) return;
-#ifdef TEST_FOR_COMPARE_AND_SWAP
- /* Test if compare-and-swap is available */
- __pthread_has_cas = compare_and_swap_is_available();
-#endif
-#ifdef FLOATING_STACKS
- /* We don't need to know the bottom of the stack. Give the pointer some
- value to signal that initialization happened. */
- __pthread_initial_thread_bos = (void *) -1l;
-#else
- /* Determine stack size limits . */
- __pthread_init_max_stacksize ();
-# ifdef _STACK_GROWS_UP
- /* The initial thread already has all the stack it needs */
- __pthread_initial_thread_bos = (char *)
- ((long)CURRENT_STACK_FRAME &~ (STACK_SIZE - 1));
-# else
- /* For the initial stack, reserve at least STACK_SIZE bytes of stack
- below the current stack address, and align that on a
- STACK_SIZE boundary. */
- __pthread_initial_thread_bos =
- (char *)(((long)CURRENT_STACK_FRAME - 2 * STACK_SIZE) & ~(STACK_SIZE - 1));
-# endif
-#endif
-#ifdef USE_TLS
- /* Update the descriptor for the initial thread. */
- THREAD_SETMEM (((pthread_descr) NULL), p_pid, __getpid());
-# ifndef HAVE___THREAD
- /* Likewise for the resolver state _res. */
- THREAD_SETMEM (((pthread_descr) NULL), p_resp, &_res);
-# endif
-#else
- /* Update the descriptor for the initial thread. */
- __pthread_initial_thread.p_pid = __getpid();
- /* Likewise for the resolver state _res. */
- __pthread_initial_thread.p_resp = &_res;
-#endif
-#if !__ASSUME_REALTIME_SIGNALS
- /* Initialize real-time signals. */
- init_rtsigs ();
-#endif
- /* Setup signal handlers for the initial thread.
- Since signal handlers are shared between threads, these settings
- will be inherited by all other threads. */
- sa.sa_handler = pthread_handle_sigrestart;
- sigemptyset(&sa.sa_mask);
- sa.sa_flags = 0;
- __libc_sigaction(__pthread_sig_restart, &sa, NULL);
- sa.sa_handler = pthread_handle_sigcancel;
- sigaddset(&sa.sa_mask, __pthread_sig_restart);
- // sa.sa_flags = 0;
- __libc_sigaction(__pthread_sig_cancel, &sa, NULL);
- if (__pthread_sig_debug > 0) {
- sa.sa_handler = pthread_handle_sigdebug;
- sigemptyset(&sa.sa_mask);
- // sa.sa_flags = 0;
- __libc_sigaction(__pthread_sig_debug, &sa, NULL);
- }
- /* Initially, block __pthread_sig_restart. Will be unblocked on demand. */
- sigemptyset(&mask);
- sigaddset(&mask, __pthread_sig_restart);
- sigprocmask(SIG_BLOCK, &mask, NULL);
- /* And unblock __pthread_sig_cancel if it has been blocked. */
- sigdelset(&mask, __pthread_sig_restart);
- sigaddset(&mask, __pthread_sig_cancel);
- sigprocmask(SIG_UNBLOCK, &mask, NULL);
- /* Register an exit function to kill all other threads. */
- /* Do it early so that user-registered atexit functions are called
- before pthread_*exit_process. */
-#ifndef HAVE_Z_NODELETE
- if (__builtin_expect (&__dso_handle != NULL, 1))
- __cxa_atexit ((void (*) (void *)) pthread_atexit_process, NULL,
- __dso_handle);
- else
-#endif
- __on_exit (pthread_onexit_process, NULL);
- /* How many processors. */
- __pthread_smp_kernel = is_smp_system ();
-
-#ifdef SHARED
- /* Transfer the old value from the dynamic linker's internal location. */
- *__libc_dl_error_tsd () = *(*GL(dl_error_catch_tsd)) ();
- GL(dl_error_catch_tsd) = &__libc_dl_error_tsd;
-
- /* 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.__m_count;
- GL(dl_load_lock).mutex.__m_count = 0;
- while (rtld_lock_count-- > 0)
- __pthread_mutex_lock (&GL(dl_load_lock).mutex);
-#endif
-
-#ifdef USE_TLS
- GL(dl_init_static_tls) = &__pthread_init_static_tls;
-#endif
-}
-
-void __pthread_initialize(void)
-{
- pthread_initialize();
-}
-
-int __pthread_initialize_manager(void)
-{
- int manager_pipe[2];
- int pid;
- struct pthread_request request;
- int report_events;
- pthread_descr mgr;
-#ifdef USE_TLS
- tcbhead_t *tcbp;
-#endif
-
- __pthread_multiple_threads = 1;
-#if TLS_MULTIPLE_THREADS_IN_TCB || !defined USE_TLS || !TLS_DTV_AT_TP
- __pthread_main_thread->p_multiple_threads = 1;
-#endif
- *__libc_multiple_threads_ptr = 1;
-
-#ifndef HAVE_Z_NODELETE
- if (__builtin_expect (&__dso_handle != NULL, 1))
- __cxa_atexit ((void (*) (void *)) pthread_atexit_retcode, NULL,
- __dso_handle);
-#endif
-
- if (__pthread_max_stacksize == 0)
- __pthread_init_max_stacksize ();
- /* If basic initialization not done yet (e.g. we're called from a
- constructor run before our constructor), do it now */
- if (__pthread_initial_thread_bos == NULL) pthread_initialize();
- /* Setup stack for thread manager */
- __pthread_manager_thread_bos = malloc(THREAD_MANAGER_STACK_SIZE);
- if (__pthread_manager_thread_bos == NULL) return -1;
- __pthread_manager_thread_tos =
- __pthread_manager_thread_bos + THREAD_MANAGER_STACK_SIZE;
- /* Setup pipe to communicate with thread manager */
- if (pipe(manager_pipe) == -1) {
- free(__pthread_manager_thread_bos);
- return -1;
- }
-
-#ifdef USE_TLS
- /* Allocate memory for the thread descriptor and the dtv. */
- tcbp = _dl_allocate_tls (NULL);
- if (tcbp == NULL) {
- free(__pthread_manager_thread_bos);
- close_not_cancel(manager_pipe[0]);
- close_not_cancel(manager_pipe[1]);
- return -1;
- }
-
-# if TLS_TCB_AT_TP
- mgr = (pthread_descr) tcbp;
-# elif TLS_DTV_AT_TP
- /* pthread_descr is located right below tcbhead_t which _dl_allocate_tls
- returns. */
- mgr = (pthread_descr) ((char *) tcbp - TLS_PRE_TCB_SIZE);
-# endif
- __pthread_handles[1].h_descr = manager_thread = mgr;
-
- /* Initialize the descriptor. */
-#if !defined USE_TLS || !TLS_DTV_AT_TP
- mgr->p_header.data.tcb = tcbp;
- mgr->p_header.data.self = mgr;
- mgr->p_header.data.multiple_threads = 1;
-#elif TLS_MULTIPLE_THREADS_IN_TCB
- mgr->p_multiple_threads = 1;
-#endif
- mgr->p_lock = &__pthread_handles[1].h_lock;
-# ifndef HAVE___THREAD
- mgr->p_errnop = &mgr->p_errno;
-# endif
- mgr->p_start_args = (struct pthread_start_args) PTHREAD_START_ARGS_INITIALIZER(__pthread_manager);
- mgr->p_nr = 1;
-# if __LT_SPINLOCK_INIT != 0
- self->p_resume_count = (struct pthread_atomic) __ATOMIC_INITIALIZER;
-# endif
- mgr->p_alloca_cutoff = PTHREAD_STACK_MIN / 4;
-#else
- mgr = &__pthread_manager_thread;
-#endif
-
- __pthread_manager_request = manager_pipe[1]; /* writing end */
- __pthread_manager_reader = manager_pipe[0]; /* reading end */
-
- /* Start the thread manager */
- pid = 0;
-#ifdef USE_TLS
- if (__linuxthreads_initial_report_events != 0)
- THREAD_SETMEM (((pthread_descr) NULL), p_report_events,
- __linuxthreads_initial_report_events);
- report_events = THREAD_GETMEM (((pthread_descr) NULL), p_report_events);
-#else
- if (__linuxthreads_initial_report_events != 0)
- __pthread_initial_thread.p_report_events
- = __linuxthreads_initial_report_events;
- report_events = __pthread_initial_thread.p_report_events;
-#endif
- if (__builtin_expect (report_events, 0))
- {
- /* It's a bit more complicated. We have to report the creation of
- the manager thread. */
- int idx = __td_eventword (TD_CREATE);
- uint32_t mask = __td_eventmask (TD_CREATE);
- uint32_t event_bits;
-
-#ifdef USE_TLS
- event_bits = THREAD_GETMEM_NC (((pthread_descr) NULL),
- p_eventbuf.eventmask.event_bits[idx]);
-#else
- event_bits = __pthread_initial_thread.p_eventbuf.eventmask.event_bits[idx];
-#endif
-
- if ((mask & (__pthread_threads_events.event_bits[idx] | event_bits))
- != 0)
- {
- __pthread_lock(mgr->p_lock, NULL);
-
-#ifdef NEED_SEPARATE_REGISTER_STACK
- pid = __clone2(__pthread_manager_event,
- (void **) __pthread_manager_thread_bos,
- THREAD_MANAGER_STACK_SIZE,
- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND,
- mgr);
-#elif _STACK_GROWS_UP
- pid = __clone(__pthread_manager_event,
- (void **) __pthread_manager_thread_bos,
- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND,
- mgr);
-#else
- pid = __clone(__pthread_manager_event,
- (void **) __pthread_manager_thread_tos,
- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND,
- mgr);
-#endif
-
- if (pid != -1)
- {
- /* 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. */
- mgr->p_eventbuf.eventdata = mgr;
- mgr->p_eventbuf.eventnum = TD_CREATE;
- __pthread_last_event = mgr;
- mgr->p_tid = 2* PTHREAD_THREADS_MAX + 1;
- mgr->p_pid = pid;
-
- /* Now call the function which signals the event. */
- __linuxthreads_create_event ();
- }
-
- /* Now restart the thread. */
- __pthread_unlock(mgr->p_lock);
- }
- }
-
- if (__builtin_expect (pid, 0) == 0)
- {
-#ifdef NEED_SEPARATE_REGISTER_STACK
- pid = __clone2(__pthread_manager, (void **) __pthread_manager_thread_bos,
- THREAD_MANAGER_STACK_SIZE,
- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, mgr);
-#elif _STACK_GROWS_UP
- pid = __clone(__pthread_manager, (void **) __pthread_manager_thread_bos,
- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, mgr);
-#else
- pid = __clone(__pthread_manager, (void **) __pthread_manager_thread_tos,
- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, mgr);
-#endif
- }
- if (__builtin_expect (pid, 0) == -1) {
-#ifdef USE_TLS
- _dl_deallocate_tls (tcbp, true);
-#endif
- free(__pthread_manager_thread_bos);
- close_not_cancel(manager_pipe[0]);
- close_not_cancel(manager_pipe[1]);
- return -1;
- }
- mgr->p_tid = 2* PTHREAD_THREADS_MAX + 1;
- mgr->p_pid = pid;
- /* Make gdb aware of new thread manager */
- if (__builtin_expect (__pthread_threads_debug, 0) && __pthread_sig_debug > 0)
- {
- raise(__pthread_sig_debug);
- /* We suspend ourself and gdb will wake us up when it is
- ready to handle us. */
- __pthread_wait_for_restart_signal(thread_self());
- }
- /* Synchronize debugging of the thread manager */
- request.req_kind = REQ_DEBUG;
- TEMP_FAILURE_RETRY(write_not_cancel(__pthread_manager_request,
- (char *) &request, sizeof(request)));
- return 0;
-}
-
-/* Thread creation */
-
-int __pthread_create_2_1(pthread_t *thread, const pthread_attr_t *attr,
- void * (*start_routine)(void *), void *arg)
-{
- pthread_descr self = thread_self();
- struct pthread_request request;
- int retval;
- if (__builtin_expect (__pthread_manager_request, 0) < 0) {
- if (__pthread_initialize_manager() < 0) return EAGAIN;
- }
- request.req_thread = self;
- request.req_kind = REQ_CREATE;
- request.req_args.create.attr = attr;
- request.req_args.create.fn = start_routine;
- request.req_args.create.arg = arg;
- sigprocmask(SIG_SETMASK, (const sigset_t *) NULL,
- &request.req_args.create.mask);
- TEMP_FAILURE_RETRY(write_not_cancel(__pthread_manager_request,
- (char *) &request, sizeof(request)));
- suspend(self);
- retval = THREAD_GETMEM(self, p_retcode);
- if (__builtin_expect (retval, 0) == 0)
- *thread = (pthread_t) THREAD_GETMEM(self, p_retval);
- 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 *thread, 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. */
- pthread_attr_t new_attr;
-
- if (attr != NULL)
- {
- size_t ps = __getpagesize ();
-
- memcpy (&new_attr, attr,
- (size_t) &(((pthread_attr_t*)NULL)->__guardsize));
- new_attr.__guardsize = ps;
- new_attr.__stackaddr_set = 0;
- new_attr.__stackaddr = NULL;
- new_attr.__stacksize = STACK_SIZE - ps;
- attr = &new_attr;
- }
- return __pthread_create_2_1 (thread, attr, start_routine, arg);
-}
-compat_symbol (libpthread, __pthread_create_2_0, pthread_create, GLIBC_2_0);
-#endif
-
-/* Simple operations on thread identifiers */
-
-pthread_descr __pthread_thread_self(void)
-{
- return thread_self();
-}
-
-pthread_t __pthread_self(void)
-{
- pthread_descr self = thread_self();
- return THREAD_GETMEM(self, p_tid);
-}
-strong_alias (__pthread_self, pthread_self);
-
-int __pthread_equal(pthread_t thread1, pthread_t thread2)
-{
- return thread1 == thread2;
-}
-strong_alias (__pthread_equal, pthread_equal);
-
-/* Helper function for thread_self in the case of user-provided stacks */
-
-#ifndef THREAD_SELF
-
-pthread_descr __pthread_find_self(void)
-{
- char * sp = CURRENT_STACK_FRAME;
- pthread_handle h;
-
- /* __pthread_handles[0] is the initial thread, __pthread_handles[1] is
- the manager threads handled specially in thread_self(), so start at 2 */
- h = __pthread_handles + 2;
-# ifdef _STACK_GROWS_UP
- while (! (sp >= (char *) h->h_descr && sp < h->h_descr->p_guardaddr)) h++;
-# else
- while (! (sp <= (char *) h->h_descr && sp >= h->h_bottom)) h++;
-# endif
- return h->h_descr;
-}
-
-#else
-
-pthread_descr __pthread_self_stack(void)
-{
- char *sp = CURRENT_STACK_FRAME;
- pthread_handle h;
-
- if (sp >= __pthread_manager_thread_bos && sp < __pthread_manager_thread_tos)
- return manager_thread;
- h = __pthread_handles + 2;
-# ifdef USE_TLS
-# ifdef _STACK_GROWS_UP
- while (h->h_descr == NULL
- || ! (sp >= h->h_descr->p_stackaddr && sp < h->h_descr->p_guardaddr))
- h++;
-# else
- while (h->h_descr == NULL
- || ! (sp <= (char *) h->h_descr->p_stackaddr && sp >= h->h_bottom))
- h++;
-# endif
-# else
-# ifdef _STACK_GROWS_UP
- while (! (sp >= (char *) h->h_descr && sp < h->h_descr->p_guardaddr))
- h++;
-# else
- while (! (sp <= (char *) h->h_descr && sp >= h->h_bottom))
- h++;
-# endif
-# endif
- return h->h_descr;
-}
-
-#endif
-
-/* Thread scheduling */
-
-int __pthread_setschedparam(pthread_t thread, int policy,
- const struct sched_param *param)
-{
- pthread_handle handle = thread_handle(thread);
- pthread_descr th;
-
- __pthread_lock(&handle->h_lock, NULL);
- if (__builtin_expect (invalid_handle(handle, thread), 0)) {
- __pthread_unlock(&handle->h_lock);
- return ESRCH;
- }
- th = handle->h_descr;
- if (__builtin_expect (__sched_setscheduler(th->p_pid, policy, param) == -1,
- 0)) {
- __pthread_unlock(&handle->h_lock);
- return errno;
- }
- th->p_priority = policy == SCHED_OTHER ? 0 : param->sched_priority;
- __pthread_unlock(&handle->h_lock);
- if (__pthread_manager_request >= 0)
- __pthread_manager_adjust_prio(th->p_priority);
- return 0;
-}
-strong_alias (__pthread_setschedparam, pthread_setschedparam);
-
-int __pthread_getschedparam(pthread_t thread, int *policy,
- struct sched_param *param)
-{
- pthread_handle handle = thread_handle(thread);
- int pid, pol;
-
- __pthread_lock(&handle->h_lock, NULL);
- if (__builtin_expect (invalid_handle(handle, thread), 0)) {
- __pthread_unlock(&handle->h_lock);
- return ESRCH;
- }
- pid = handle->h_descr->p_pid;
- __pthread_unlock(&handle->h_lock);
- pol = __sched_getscheduler(pid);
- if (__builtin_expect (pol, 0) == -1) return errno;
- if (__sched_getparam(pid, param) == -1) return errno;
- *policy = pol;
- return 0;
-}
-strong_alias (__pthread_getschedparam, pthread_getschedparam);
-
-int __pthread_yield (void)
-{
- /* For now this is equivalent with the POSIX call. */
- return sched_yield ();
-}
-weak_alias (__pthread_yield, pthread_yield)
-
-/* Process-wide exit() request */
-
-static void pthread_onexit_process(int retcode, void *arg)
-{
- if (__builtin_expect (__pthread_manager_request, 0) >= 0) {
- struct pthread_request request;
- pthread_descr self = thread_self();
-
- request.req_thread = self;
- request.req_kind = REQ_PROCESS_EXIT;
- request.req_args.exit.code = retcode;
- TEMP_FAILURE_RETRY(write_not_cancel(__pthread_manager_request,
- (char *) &request, sizeof(request)));
- suspend(self);
- /* Main thread should accumulate times for thread manager and its
- children, so that timings for main thread account for all threads. */
- if (self == __pthread_main_thread)
- {
-#ifdef USE_TLS
- waitpid(manager_thread->p_pid, NULL, __WCLONE);
-#else
- waitpid(__pthread_manager_thread.p_pid, NULL, __WCLONE);
-#endif
- /* Since all threads have been asynchronously terminated
- (possibly holding locks), free cannot be used any more.
- For mtrace, we'd like to print something though. */
- /* #ifdef USE_TLS
- tcbhead_t *tcbp = (tcbhead_t *) manager_thread;
- # if TLS_DTV_AT_TP
- tcbp = (tcbhead_t) ((char *) tcbp + TLS_PRE_TCB_SIZE);
- # endif
- _dl_deallocate_tls (tcbp, true);
- #endif
- free (__pthread_manager_thread_bos); */
- __pthread_manager_thread_bos = __pthread_manager_thread_tos = NULL;
- }
- }
-}
-
-#ifndef HAVE_Z_NODELETE
-static int __pthread_atexit_retcode;
-
-static void pthread_atexit_process(void *arg, int retcode)
-{
- pthread_onexit_process (retcode ?: __pthread_atexit_retcode, arg);
-}
-
-static void pthread_atexit_retcode(void *arg, int retcode)
-{
- __pthread_atexit_retcode = retcode;
-}
-#endif
-
-/* The handler for the RESTART signal just records the signal received
- in the thread descriptor, and optionally performs a siglongjmp
- (for pthread_cond_timedwait). */
-
-static void pthread_handle_sigrestart(int sig)
-{
- pthread_descr self = check_thread_self();
- THREAD_SETMEM(self, p_signal, sig);
- if (THREAD_GETMEM(self, p_signal_jmp) != NULL)
- siglongjmp(*THREAD_GETMEM(self, p_signal_jmp), 1);
-}
-
-/* The handler for the CANCEL signal checks for cancellation
- (in asynchronous mode), for process-wide exit and exec requests.
- For the thread manager thread, redirect the signal to
- __pthread_manager_sighandler. */
-
-static void pthread_handle_sigcancel(int sig)
-{
- pthread_descr self = check_thread_self();
- sigjmp_buf * jmpbuf;
-
- if (self == manager_thread)
- {
- __pthread_manager_sighandler(sig);
- return;
- }
- if (__builtin_expect (__pthread_exit_requested, 0)) {
- /* Main thread should accumulate times for thread manager and its
- children, so that timings for main thread account for all threads. */
- if (self == __pthread_main_thread) {
-#ifdef USE_TLS
- waitpid(manager_thread->p_pid, NULL, __WCLONE);
-#else
- waitpid(__pthread_manager_thread.p_pid, NULL, __WCLONE);
-#endif
- }
- _exit(__pthread_exit_code);
- }
- if (__builtin_expect (THREAD_GETMEM(self, p_canceled), 0)
- && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) {
- if (THREAD_GETMEM(self, p_canceltype) == PTHREAD_CANCEL_ASYNCHRONOUS)
- __pthread_do_exit(PTHREAD_CANCELED, CURRENT_STACK_FRAME);
- jmpbuf = THREAD_GETMEM(self, p_cancel_jmp);
- if (jmpbuf != NULL) {
- THREAD_SETMEM(self, p_cancel_jmp, NULL);
- siglongjmp(*jmpbuf, 1);
- }
- }
-}
-
-/* Handler for the DEBUG signal.
- The debugging strategy is as follows:
- On reception of a REQ_DEBUG request (sent by new threads created to
- the thread manager under debugging mode), the thread manager throws
- __pthread_sig_debug to itself. The debugger (if active) intercepts
- this signal, takes into account new threads and continue execution
- of the thread manager by propagating the signal because it doesn't
- know what it is specifically done for. In the current implementation,
- the thread manager simply discards it. */
-
-static void pthread_handle_sigdebug(int sig)
-{
- /* Nothing */
-}
-
-/* Reset the state of the thread machinery after a fork().
- Close the pipe used for requests and set the main thread to the forked
- thread.
- Notice that we can't free the stack segments, as the forked thread
- may hold pointers into them. */
-
-void __pthread_reset_main_thread(void)
-{
- pthread_descr self = thread_self();
-
- if (__pthread_manager_request != -1) {
- /* Free the thread manager stack */
- free(__pthread_manager_thread_bos);
- __pthread_manager_thread_bos = __pthread_manager_thread_tos = NULL;
- /* Close the two ends of the pipe */
- close_not_cancel(__pthread_manager_request);
- close_not_cancel(__pthread_manager_reader);
- __pthread_manager_request = __pthread_manager_reader = -1;
- }
-
- /* Update the pid of the main thread */
- THREAD_SETMEM(self, p_pid, __getpid());
- /* Make the forked thread the main thread */
- __pthread_main_thread = self;
- THREAD_SETMEM(self, p_nextlive, self);
- THREAD_SETMEM(self, p_prevlive, self);
-#if !(USE_TLS && HAVE___THREAD)
- /* Now this thread modifies the global variables. */
- THREAD_SETMEM(self, p_errnop, &_errno);
- THREAD_SETMEM(self, p_h_errnop, &_h_errno);
- THREAD_SETMEM(self, p_resp, &_res);
-#endif
-
-#ifndef FLOATING_STACKS
- /* This is to undo the setrlimit call in __pthread_init_max_stacksize.
- XXX This can be wrong if the user set the limit during the run. */
- {
- struct rlimit limit;
- if (getrlimit (RLIMIT_STACK, &limit) == 0
- && limit.rlim_cur != limit.rlim_max)
- {
- limit.rlim_cur = limit.rlim_max;
- setrlimit(RLIMIT_STACK, &limit);
- }
- }
-#endif
-}
-
-/* Process-wide exec() request */
-
-void __pthread_kill_other_threads_np(void)
-{
- struct sigaction sa;
- /* Terminate all other threads and thread manager */
- pthread_onexit_process(0, NULL);
- /* Make current thread the main thread in case the calling thread
- changes its mind, does not exec(), and creates new threads instead. */
- __pthread_reset_main_thread();
-
- /* Reset the signal handlers behaviour for the signals the
- implementation uses since this would be passed to the new
- process. */
- sigemptyset(&sa.sa_mask);
- sa.sa_flags = 0;
- sa.sa_handler = SIG_DFL;
- __libc_sigaction(__pthread_sig_restart, &sa, NULL);
- __libc_sigaction(__pthread_sig_cancel, &sa, NULL);
- if (__pthread_sig_debug > 0)
- __libc_sigaction(__pthread_sig_debug, &sa, NULL);
-}
-weak_alias (__pthread_kill_other_threads_np, pthread_kill_other_threads_np)
-
-/* Concurrency symbol level. */
-static int current_level;
-
-int __pthread_setconcurrency(int level)
-{
- /* We don't do anything unless we have found a useful interpretation. */
- current_level = level;
- return 0;
-}
-weak_alias (__pthread_setconcurrency, pthread_setconcurrency)
-
-int __pthread_getconcurrency(void)
-{
- return current_level;
-}
-weak_alias (__pthread_getconcurrency, pthread_getconcurrency)
-
-/* Primitives for controlling thread execution */
-
-void __pthread_wait_for_restart_signal(pthread_descr self)
-{
- sigset_t mask;
-
- sigprocmask(SIG_SETMASK, NULL, &mask); /* Get current signal mask */
- sigdelset(&mask, __pthread_sig_restart); /* Unblock the restart signal */
- THREAD_SETMEM(self, p_signal, 0);
- do {
- __pthread_sigsuspend(&mask); /* Wait for signal. Must not be a
- cancellation point. */
- } while (THREAD_GETMEM(self, p_signal) !=__pthread_sig_restart);
-
- READ_MEMORY_BARRIER(); /* See comment in __pthread_restart_new */
-}
-
-#if !__ASSUME_REALTIME_SIGNALS
-/* The _old variants are for 2.0 and early 2.1 kernels which don't have RT
- signals.
- On these kernels, we use SIGUSR1 and SIGUSR2 for restart and cancellation.
- Since the restart signal does not queue, we use an atomic counter to create
- queuing semantics. This is needed to resolve a rare race condition in
- pthread_cond_timedwait_relative. */
-
-void __pthread_restart_old(pthread_descr th)
-{
- if (atomic_increment(&th->p_resume_count) == -1)
- kill(th->p_pid, __pthread_sig_restart);
-}
-
-void __pthread_suspend_old(pthread_descr self)
-{
- if (atomic_decrement(&self->p_resume_count) <= 0)
- __pthread_wait_for_restart_signal(self);
-}
-
-int
-__pthread_timedsuspend_old(pthread_descr self, const struct timespec *abstime)
-{
- sigset_t unblock, initial_mask;
- int was_signalled = 0;
- sigjmp_buf jmpbuf;
-
- if (atomic_decrement(&self->p_resume_count) == 0) {
- /* Set up a longjmp handler for the restart signal, unblock
- the signal and sleep. */
-
- if (sigsetjmp(jmpbuf, 1) == 0) {
- THREAD_SETMEM(self, p_signal_jmp, &jmpbuf);
- THREAD_SETMEM(self, p_signal, 0);
- /* Unblock the restart signal */
- sigemptyset(&unblock);
- sigaddset(&unblock, __pthread_sig_restart);
- sigprocmask(SIG_UNBLOCK, &unblock, &initial_mask);
-
- while (1) {
- struct timeval now;
- struct timespec reltime;
-
- /* Compute a time offset relative to now. */
- __gettimeofday (&now, NULL);
- reltime.tv_nsec = abstime->tv_nsec - now.tv_usec * 1000;
- reltime.tv_sec = abstime->tv_sec - now.tv_sec;
- if (reltime.tv_nsec < 0) {
- reltime.tv_nsec += 1000000000;
- reltime.tv_sec -= 1;
- }
-
- /* Sleep for the required duration. If woken by a signal,
- resume waiting as required by Single Unix Specification. */
- if (reltime.tv_sec < 0 || __libc_nanosleep(&reltime, NULL) == 0)
- break;
- }
-
- /* Block the restart signal again */
- sigprocmask(SIG_SETMASK, &initial_mask, NULL);
- was_signalled = 0;
- } else {
- was_signalled = 1;
- }
- THREAD_SETMEM(self, p_signal_jmp, NULL);
- }
-
- /* Now was_signalled is true if we exited the above code
- due to the delivery of a restart signal. In that case,
- we know we have been dequeued and resumed and that the
- resume count is balanced. Otherwise, there are some
- cases to consider. First, try to bump up the resume count
- back to zero. If it goes to 1, it means restart() was
- invoked on this thread. The signal must be consumed
- and the count bumped down and everything is cool. We
- can return a 1 to the caller.
- Otherwise, no restart was delivered yet, so a potential
- race exists; we return a 0 to the caller which must deal
- with this race in an appropriate way; for example by
- atomically removing the thread from consideration for a
- wakeup---if such a thing fails, it means a restart is
- being delivered. */
-
- if (!was_signalled) {
- if (atomic_increment(&self->p_resume_count) != -1) {
- __pthread_wait_for_restart_signal(self);
- atomic_decrement(&self->p_resume_count); /* should be zero now! */
- /* woke spontaneously and consumed restart signal */
- return 1;
- }
- /* woke spontaneously but did not consume restart---caller must resolve */
- return 0;
- }
- /* woken due to restart signal */
- return 1;
-}
-#endif /* __ASSUME_REALTIME_SIGNALS */
-
-void __pthread_restart_new(pthread_descr th)
-{
- /* The barrier is proabably not needed, in which case it still documents
- our assumptions. The intent is to commit previous writes to shared
- memory so the woken thread will have a consistent view. Complementary
- read barriers are present to the suspend functions. */
- WRITE_MEMORY_BARRIER();
- kill(th->p_pid, __pthread_sig_restart);
-}
-
-/* There is no __pthread_suspend_new because it would just
- be a wasteful wrapper for __pthread_wait_for_restart_signal */
-
-int
-__pthread_timedsuspend_new(pthread_descr self, const struct timespec *abstime)
-{
- sigset_t unblock, initial_mask;
- int was_signalled = 0;
- sigjmp_buf jmpbuf;
-
- if (sigsetjmp(jmpbuf, 1) == 0) {
- THREAD_SETMEM(self, p_signal_jmp, &jmpbuf);
- THREAD_SETMEM(self, p_signal, 0);
- /* Unblock the restart signal */
- sigemptyset(&unblock);
- sigaddset(&unblock, __pthread_sig_restart);
- sigprocmask(SIG_UNBLOCK, &unblock, &initial_mask);
-
- while (1) {
- struct timeval now;
- struct timespec reltime;
-
- /* Compute a time offset relative to now. */
- __gettimeofday (&now, NULL);
- reltime.tv_nsec = abstime->tv_nsec - now.tv_usec * 1000;
- reltime.tv_sec = abstime->tv_sec - now.tv_sec;
- if (reltime.tv_nsec < 0) {
- reltime.tv_nsec += 1000000000;
- reltime.tv_sec -= 1;
- }
-
- /* Sleep for the required duration. If woken by a signal,
- resume waiting as required by Single Unix Specification. */
- if (reltime.tv_sec < 0 || __libc_nanosleep(&reltime, NULL) == 0)
- break;
- }
-
- /* Block the restart signal again */
- sigprocmask(SIG_SETMASK, &initial_mask, NULL);
- was_signalled = 0;
- } else {
- was_signalled = 1;
- }
- THREAD_SETMEM(self, p_signal_jmp, NULL);
-
- /* Now was_signalled is true if we exited the above code
- due to the delivery of a restart signal. In that case,
- everything is cool. We have been removed from whatever
- we were waiting on by the other thread, and consumed its signal.
-
- Otherwise we this thread woke up spontaneously, or due to a signal other
- than restart. This is an ambiguous case that must be resolved by
- the caller; the thread is still eligible for a restart wakeup
- so there is a race. */
-
- READ_MEMORY_BARRIER(); /* See comment in __pthread_restart_new */
- return was_signalled;
-}
-
-
-/* Debugging aid */
-
-#ifdef DEBUG
-#include <stdarg.h>
-
-void __pthread_message(const char * fmt, ...)
-{
- char buffer[1024];
- va_list args;
- sprintf(buffer, "%05d : ", __getpid());
- va_start(args, fmt);
- vsnprintf(buffer + 8, sizeof(buffer) - 8, fmt, args);
- va_end(args);
- TEMP_FAILURE_RETRY(write_not_cancel(2, buffer, strlen(buffer)));
-}
-
-#endif
diff --git a/linuxthreads/pthread_atfork.c b/linuxthreads/pthread_atfork.c
deleted file mode 100644
index 2464acb6b2..0000000000
--- a/linuxthreads/pthread_atfork.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "internals.h"
-#include <fork.h>
-
-/* This is defined by newer gcc version unique for each module. */
-extern void *__dso_handle __attribute__ ((__weak__));
-
-
-/* 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 (prepare, parent, child)
- 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/linuxthreads/pthread_setegid.c b/linuxthreads/pthread_setegid.c
deleted file mode 100644
index 9e16828fa5..0000000000
--- a/linuxthreads/pthread_setegid.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Copyright (C) 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <pthread.h>
-#include <unistd.h>
-
-
-int
-pthread_setegid_np (gid_t gid)
-{
- return setegid (gid);
-}
diff --git a/linuxthreads/pthread_seteuid.c b/linuxthreads/pthread_seteuid.c
deleted file mode 100644
index 9d29d81118..0000000000
--- a/linuxthreads/pthread_seteuid.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Copyright (C) 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <pthread.h>
-#include <unistd.h>
-
-
-int
-pthread_seteuid_np (uid_t uid)
-{
- return seteuid (uid);
-}
diff --git a/linuxthreads/pthread_setgid.c b/linuxthreads/pthread_setgid.c
deleted file mode 100644
index db37dd1465..0000000000
--- a/linuxthreads/pthread_setgid.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Copyright (C) 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <pthread.h>
-#include <unistd.h>
-
-
-int
-pthread_setgid_np (gid_t gid)
-{
- return setgid (gid);
-}
diff --git a/linuxthreads/pthread_setregid.c b/linuxthreads/pthread_setregid.c
deleted file mode 100644
index bd75154c50..0000000000
--- a/linuxthreads/pthread_setregid.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Copyright (C) 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <pthread.h>
-#include <unistd.h>
-
-
-int
-pthread_setregid_np (gid_t rgid, gid_t egid)
-{
- return setregid (rgid, egid);
-}
diff --git a/linuxthreads/pthread_setresgid.c b/linuxthreads/pthread_setresgid.c
deleted file mode 100644
index b5702804ee..0000000000
--- a/linuxthreads/pthread_setresgid.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Copyright (C) 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <pthread.h>
-#include <unistd.h>
-
-
-int
-pthread_setresgid_np (gid_t rgid, gid_t egid, gid_t sgid)
-{
- return setresgid (rgid, egid, sgid);
-}
diff --git a/linuxthreads/pthread_setresuid.c b/linuxthreads/pthread_setresuid.c
deleted file mode 100644
index ceb724deaf..0000000000
--- a/linuxthreads/pthread_setresuid.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Copyright (C) 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <pthread.h>
-#include <unistd.h>
-
-
-int
-pthread_setresuid_np (uid_t ruid, uid_t euid, uid_t suid)
-{
- return setresuid (ruid, euid, suid);
-}
diff --git a/linuxthreads/pthread_setreuid.c b/linuxthreads/pthread_setreuid.c
deleted file mode 100644
index ae8933ece5..0000000000
--- a/linuxthreads/pthread_setreuid.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Copyright (C) 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <pthread.h>
-#include <unistd.h>
-
-
-int
-pthread_setreuid_np (uid_t ruid, uid_t euid)
-{
- return setreuid (ruid, euid);
-}
diff --git a/linuxthreads/pthread_setuid.c b/linuxthreads/pthread_setuid.c
deleted file mode 100644
index f82ccc1a2f..0000000000
--- a/linuxthreads/pthread_setuid.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Copyright (C) 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <pthread.h>
-#include <unistd.h>
-
-
-int
-pthread_setuid_np (uid_t uid)
-{
- return setuid (uid);
-}
diff --git a/linuxthreads/queue.h b/linuxthreads/queue.h
deleted file mode 100644
index 28bd75531c..0000000000
--- a/linuxthreads/queue.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* Waiting queues */
-
-/* Waiting queues are represented by lists of thread descriptors
- linked through their p_nextwaiting field. The lists are kept
- sorted by decreasing priority, and then decreasing waiting time. */
-
-static inline void enqueue(pthread_descr * q, pthread_descr th)
-{
- int prio = th->p_priority;
- ASSERT(th->p_nextwaiting == NULL);
- for (; *q != NULL; q = &((*q)->p_nextwaiting)) {
- if (prio > (*q)->p_priority) {
- th->p_nextwaiting = *q;
- *q = th;
- return;
- }
- }
- *q = th;
-}
-
-static inline pthread_descr dequeue(pthread_descr * q)
-{
- pthread_descr th;
- th = *q;
- if (th != NULL) {
- *q = th->p_nextwaiting;
- th->p_nextwaiting = NULL;
- }
- return th;
-}
-
-static inline int remove_from_queue(pthread_descr * q, pthread_descr th)
-{
- for (; *q != NULL; q = &((*q)->p_nextwaiting)) {
- if (*q == th) {
- *q = th->p_nextwaiting;
- th->p_nextwaiting = NULL;
- return 1;
- }
- }
- return 0;
-}
-
-static inline int queue_is_empty(pthread_descr * q)
-{
- return *q == NULL;
-}
diff --git a/linuxthreads/restart.h b/linuxthreads/restart.h
deleted file mode 100644
index 24d9fab748..0000000000
--- a/linuxthreads/restart.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-#include <signal.h>
-#include <kernel-features.h>
-
-/* Primitives for controlling thread execution */
-
-static inline void restart(pthread_descr th)
-{
- /* See pthread.c */
-#if __ASSUME_REALTIME_SIGNALS
- __pthread_restart_new(th);
-#else
- __pthread_restart(th);
-#endif
-}
-
-static inline void suspend(pthread_descr self)
-{
- /* See pthread.c */
-#if __ASSUME_REALTIME_SIGNALS
- __pthread_wait_for_restart_signal(self);
-#else
- __pthread_suspend(self);
-#endif
-}
-
-static inline int timedsuspend(pthread_descr self,
- const struct timespec *abstime)
-{
- /* See pthread.c */
-#if __ASSUME_REALTIME_SIGNALS
- return __pthread_timedsuspend_new(self, abstime);
-#else
- return __pthread_timedsuspend(self, abstime);
-#endif
-}
diff --git a/linuxthreads/rwlock.c b/linuxthreads/rwlock.c
deleted file mode 100644
index f565f18706..0000000000
--- a/linuxthreads/rwlock.c
+++ /dev/null
@@ -1,658 +0,0 @@
-/* Read-write lock implementation.
- Copyright (C) 1998, 2000 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Xavier Leroy <Xavier.Leroy@inria.fr>
- and Ulrich Drepper <drepper@cygnus.com>, 1998.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <bits/libc-lock.h>
-#include <errno.h>
-#include <pthread.h>
-#include <stdlib.h>
-#include "internals.h"
-#include "queue.h"
-#include "spinlock.h"
-#include "restart.h"
-
-/* Function called by pthread_cancel to remove the thread from
- waiting inside pthread_rwlock_timedrdlock or pthread_rwlock_timedwrlock. */
-
-static int rwlock_rd_extricate_func(void *obj, pthread_descr th)
-{
- pthread_rwlock_t *rwlock = obj;
- int did_remove = 0;
-
- __pthread_lock(&rwlock->__rw_lock, NULL);
- did_remove = remove_from_queue(&rwlock->__rw_read_waiting, th);
- __pthread_unlock(&rwlock->__rw_lock);
-
- return did_remove;
-}
-
-static int rwlock_wr_extricate_func(void *obj, pthread_descr th)
-{
- pthread_rwlock_t *rwlock = obj;
- int did_remove = 0;
-
- __pthread_lock(&rwlock->__rw_lock, NULL);
- did_remove = remove_from_queue(&rwlock->__rw_write_waiting, th);
- __pthread_unlock(&rwlock->__rw_lock);
-
- return did_remove;
-}
-
-/*
- * Check whether the calling thread already owns one or more read locks on the
- * specified lock. If so, return a pointer to the read lock info structure
- * corresponding to that lock.
- */
-
-static pthread_readlock_info *
-rwlock_is_in_list(pthread_descr self, pthread_rwlock_t *rwlock)
-{
- pthread_readlock_info *info;
-
- for (info = THREAD_GETMEM (self, p_readlock_list); info != NULL;
- info = info->pr_next)
- {
- if (info->pr_lock == rwlock)
- return info;
- }
-
- return NULL;
-}
-
-/*
- * Add a new lock to the thread's list of locks for which it has a read lock.
- * A new info node must be allocated for this, which is taken from the thread's
- * free list, or by calling malloc. If malloc fails, a null pointer is
- * returned. Otherwise the lock info structure is initialized and pushed
- * onto the thread's list.
- */
-
-static pthread_readlock_info *
-rwlock_add_to_list(pthread_descr self, pthread_rwlock_t *rwlock)
-{
- pthread_readlock_info *info = THREAD_GETMEM (self, p_readlock_free);
-
- if (info != NULL)
- THREAD_SETMEM (self, p_readlock_free, info->pr_next);
- else
- info = malloc(sizeof *info);
-
- if (info == NULL)
- return NULL;
-
- info->pr_lock_count = 1;
- info->pr_lock = rwlock;
- info->pr_next = THREAD_GETMEM (self, p_readlock_list);
- THREAD_SETMEM (self, p_readlock_list, info);
-
- return info;
-}
-
-/*
- * If the thread owns a read lock over the given pthread_rwlock_t,
- * and this read lock is tracked in the thread's lock list,
- * this function returns a pointer to the info node in that list.
- * It also decrements the lock count within that node, and if
- * it reaches zero, it removes the node from the list.
- * If nothing is found, it returns a null pointer.
- */
-
-static pthread_readlock_info *
-rwlock_remove_from_list(pthread_descr self, pthread_rwlock_t *rwlock)
-{
- pthread_readlock_info **pinfo;
-
- for (pinfo = &self->p_readlock_list; *pinfo != NULL; pinfo = &(*pinfo)->pr_next)
- {
- if ((*pinfo)->pr_lock == rwlock)
- {
- pthread_readlock_info *info = *pinfo;
- if (--info->pr_lock_count == 0)
- *pinfo = info->pr_next;
- return info;
- }
- }
-
- return NULL;
-}
-
-/*
- * This function checks whether the conditions are right to place a read lock.
- * It returns 1 if so, otherwise zero. The rwlock's internal lock must be
- * locked upon entry.
- */
-
-static int
-rwlock_can_rdlock(pthread_rwlock_t *rwlock, int have_lock_already)
-{
- /* Can't readlock; it is write locked. */
- if (rwlock->__rw_writer != NULL)
- return 0;
-
- /* Lock prefers readers; get it. */
- if (rwlock->__rw_kind == PTHREAD_RWLOCK_PREFER_READER_NP)
- return 1;
-
- /* Lock prefers writers, but none are waiting. */
- if (queue_is_empty(&rwlock->__rw_write_waiting))
- return 1;
-
- /* Writers are waiting, but this thread already has a read lock */
- if (have_lock_already)
- return 1;
-
- /* Writers are waiting, and this is a new lock */
- return 0;
-}
-
-/*
- * This function helps support brain-damaged recursive read locking
- * semantics required by Unix 98, while maintaining write priority.
- * This basically determines whether this thread already holds a read lock
- * already. It returns 1 if so, otherwise it returns 0.
- *
- * If the thread has any ``untracked read locks'' then it just assumes
- * that this lock is among them, just to be safe, and returns 1.
- *
- * Also, if it finds the thread's lock in the list, it sets the pointer
- * referenced by pexisting to refer to the list entry.
- *
- * If the thread has no untracked locks, and the lock is not found
- * in its list, then it is added to the list. If this fails,
- * then *pout_of_mem is set to 1.
- */
-
-static int
-rwlock_have_already(pthread_descr *pself, pthread_rwlock_t *rwlock,
- pthread_readlock_info **pexisting, int *pout_of_mem)
-{
- pthread_readlock_info *existing = NULL;
- int out_of_mem = 0, have_lock_already = 0;
- pthread_descr self = *pself;
-
- if (rwlock->__rw_kind == PTHREAD_RWLOCK_PREFER_WRITER_NP)
- {
- if (!self)
- *pself = self = thread_self();
-
- existing = rwlock_is_in_list(self, rwlock);
-
- if (existing != NULL
- || THREAD_GETMEM (self, p_untracked_readlock_count) > 0)
- have_lock_already = 1;
- else
- {
- existing = rwlock_add_to_list(self, rwlock);
- if (existing == NULL)
- out_of_mem = 1;
- }
- }
-
- *pout_of_mem = out_of_mem;
- *pexisting = existing;
-
- return have_lock_already;
-}
-
-int
-__pthread_rwlock_init (pthread_rwlock_t *rwlock,
- const pthread_rwlockattr_t *attr)
-{
- __pthread_init_lock(&rwlock->__rw_lock);
- rwlock->__rw_readers = 0;
- rwlock->__rw_writer = NULL;
- rwlock->__rw_read_waiting = NULL;
- rwlock->__rw_write_waiting = NULL;
-
- if (attr == NULL)
- {
- rwlock->__rw_kind = PTHREAD_RWLOCK_DEFAULT_NP;
- rwlock->__rw_pshared = PTHREAD_PROCESS_PRIVATE;
- }
- else
- {
- rwlock->__rw_kind = attr->__lockkind;
- rwlock->__rw_pshared = attr->__pshared;
- }
-
- return 0;
-}
-strong_alias (__pthread_rwlock_init, pthread_rwlock_init)
-
-
-int
-__pthread_rwlock_destroy (pthread_rwlock_t *rwlock)
-{
- int readers;
- _pthread_descr writer;
-
- __pthread_lock (&rwlock->__rw_lock, NULL);
- readers = rwlock->__rw_readers;
- writer = rwlock->__rw_writer;
- __pthread_unlock (&rwlock->__rw_lock);
-
- if (readers > 0 || writer != NULL)
- return EBUSY;
-
- return 0;
-}
-strong_alias (__pthread_rwlock_destroy, pthread_rwlock_destroy)
-
-int
-__pthread_rwlock_rdlock (pthread_rwlock_t *rwlock)
-{
- pthread_descr self = NULL;
- pthread_readlock_info *existing;
- int out_of_mem, have_lock_already;
-
- have_lock_already = rwlock_have_already(&self, rwlock,
- &existing, &out_of_mem);
-
- if (self == NULL)
- self = thread_self ();
-
- for (;;)
- {
- __pthread_lock (&rwlock->__rw_lock, self);
-
- if (rwlock_can_rdlock(rwlock, have_lock_already))
- break;
-
- enqueue (&rwlock->__rw_read_waiting, self);
- __pthread_unlock (&rwlock->__rw_lock);
- suspend (self); /* This is not a cancellation point */
- }
-
- ++rwlock->__rw_readers;
- __pthread_unlock (&rwlock->__rw_lock);
-
- if (have_lock_already || out_of_mem)
- {
- if (existing != NULL)
- ++existing->pr_lock_count;
- else
- ++self->p_untracked_readlock_count;
- }
-
- return 0;
-}
-strong_alias (__pthread_rwlock_rdlock, pthread_rwlock_rdlock)
-
-int
-__pthread_rwlock_timedrdlock (pthread_rwlock_t *rwlock,
- const struct timespec *abstime)
-{
- pthread_descr self = NULL;
- pthread_readlock_info *existing;
- int out_of_mem, have_lock_already;
- pthread_extricate_if extr;
-
- if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)
- return EINVAL;
-
- have_lock_already = rwlock_have_already(&self, rwlock,
- &existing, &out_of_mem);
-
- if (self == NULL)
- self = thread_self ();
-
- /* Set up extrication interface */
- extr.pu_object = rwlock;
- extr.pu_extricate_func = rwlock_rd_extricate_func;
-
- /* Register extrication interface */
- __pthread_set_own_extricate_if (self, &extr);
-
- for (;;)
- {
- __pthread_lock (&rwlock->__rw_lock, self);
-
- if (rwlock_can_rdlock(rwlock, have_lock_already))
- break;
-
- enqueue (&rwlock->__rw_read_waiting, self);
- __pthread_unlock (&rwlock->__rw_lock);
- /* This is not a cancellation point */
- if (timedsuspend (self, abstime) == 0)
- {
- int was_on_queue;
-
- __pthread_lock (&rwlock->__rw_lock, self);
- was_on_queue = remove_from_queue (&rwlock->__rw_read_waiting, self);
- __pthread_unlock (&rwlock->__rw_lock);
-
- if (was_on_queue)
- {
- __pthread_set_own_extricate_if (self, 0);
- return ETIMEDOUT;
- }
-
- /* Eat the outstanding restart() from the signaller */
- suspend (self);
- }
- }
-
- __pthread_set_own_extricate_if (self, 0);
-
- ++rwlock->__rw_readers;
- __pthread_unlock (&rwlock->__rw_lock);
-
- if (have_lock_already || out_of_mem)
- {
- if (existing != NULL)
- ++existing->pr_lock_count;
- else
- ++self->p_untracked_readlock_count;
- }
-
- return 0;
-}
-strong_alias (__pthread_rwlock_timedrdlock, pthread_rwlock_timedrdlock)
-
-int
-__pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock)
-{
- pthread_descr self = thread_self();
- pthread_readlock_info *existing;
- int out_of_mem, have_lock_already;
- int retval = EBUSY;
-
- have_lock_already = rwlock_have_already(&self, rwlock,
- &existing, &out_of_mem);
-
- __pthread_lock (&rwlock->__rw_lock, self);
-
- /* 0 is passed to here instead of have_lock_already.
- This is to meet Single Unix Spec requirements:
- if writers are waiting, pthread_rwlock_tryrdlock
- does not acquire a read lock, even if the caller has
- one or more read locks already. */
-
- if (rwlock_can_rdlock(rwlock, 0))
- {
- ++rwlock->__rw_readers;
- retval = 0;
- }
-
- __pthread_unlock (&rwlock->__rw_lock);
-
- if (retval == 0)
- {
- if (have_lock_already || out_of_mem)
- {
- if (existing != NULL)
- ++existing->pr_lock_count;
- else
- ++self->p_untracked_readlock_count;
- }
- }
-
- return retval;
-}
-strong_alias (__pthread_rwlock_tryrdlock, pthread_rwlock_tryrdlock)
-
-
-int
-__pthread_rwlock_wrlock (pthread_rwlock_t *rwlock)
-{
- pthread_descr self = thread_self ();
-
- while(1)
- {
- __pthread_lock (&rwlock->__rw_lock, self);
- if (rwlock->__rw_readers == 0 && rwlock->__rw_writer == NULL)
- {
- rwlock->__rw_writer = self;
- __pthread_unlock (&rwlock->__rw_lock);
- return 0;
- }
-
- /* Suspend ourselves, then try again */
- enqueue (&rwlock->__rw_write_waiting, self);
- __pthread_unlock (&rwlock->__rw_lock);
- suspend (self); /* This is not a cancellation point */
- }
-}
-strong_alias (__pthread_rwlock_wrlock, pthread_rwlock_wrlock)
-
-
-int
-__pthread_rwlock_timedwrlock (pthread_rwlock_t *rwlock,
- const struct timespec *abstime)
-{
- pthread_descr self;
- pthread_extricate_if extr;
-
- if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)
- return EINVAL;
-
- self = thread_self ();
-
- /* Set up extrication interface */
- extr.pu_object = rwlock;
- extr.pu_extricate_func = rwlock_wr_extricate_func;
-
- /* Register extrication interface */
- __pthread_set_own_extricate_if (self, &extr);
-
- while(1)
- {
- __pthread_lock (&rwlock->__rw_lock, self);
-
- if (rwlock->__rw_readers == 0 && rwlock->__rw_writer == NULL)
- {
- rwlock->__rw_writer = self;
- __pthread_set_own_extricate_if (self, 0);
- __pthread_unlock (&rwlock->__rw_lock);
- return 0;
- }
-
- /* Suspend ourselves, then try again */
- enqueue (&rwlock->__rw_write_waiting, self);
- __pthread_unlock (&rwlock->__rw_lock);
- /* This is not a cancellation point */
- if (timedsuspend (self, abstime) == 0)
- {
- int was_on_queue;
-
- __pthread_lock (&rwlock->__rw_lock, self);
- was_on_queue = remove_from_queue (&rwlock->__rw_write_waiting, self);
- __pthread_unlock (&rwlock->__rw_lock);
-
- if (was_on_queue)
- {
- __pthread_set_own_extricate_if (self, 0);
- return ETIMEDOUT;
- }
-
- /* Eat the outstanding restart() from the signaller */
- suspend (self);
- }
- }
-}
-strong_alias (__pthread_rwlock_timedwrlock, pthread_rwlock_timedwrlock)
-
-
-int
-__pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock)
-{
- int result = EBUSY;
-
- __pthread_lock (&rwlock->__rw_lock, NULL);
- if (rwlock->__rw_readers == 0 && rwlock->__rw_writer == NULL)
- {
- rwlock->__rw_writer = thread_self ();
- result = 0;
- }
- __pthread_unlock (&rwlock->__rw_lock);
-
- return result;
-}
-strong_alias (__pthread_rwlock_trywrlock, pthread_rwlock_trywrlock)
-
-
-int
-__pthread_rwlock_unlock (pthread_rwlock_t *rwlock)
-{
- pthread_descr torestart;
- pthread_descr th;
-
- __pthread_lock (&rwlock->__rw_lock, NULL);
- if (rwlock->__rw_writer != NULL)
- {
- /* Unlocking a write lock. */
- if (rwlock->__rw_writer != thread_self ())
- {
- __pthread_unlock (&rwlock->__rw_lock);
- return EPERM;
- }
- rwlock->__rw_writer = NULL;
-
- if ((rwlock->__rw_kind == PTHREAD_RWLOCK_PREFER_READER_NP
- && !queue_is_empty(&rwlock->__rw_read_waiting))
- || (th = dequeue(&rwlock->__rw_write_waiting)) == NULL)
- {
- /* Restart all waiting readers. */
- torestart = rwlock->__rw_read_waiting;
- rwlock->__rw_read_waiting = NULL;
- __pthread_unlock (&rwlock->__rw_lock);
- while ((th = dequeue (&torestart)) != NULL)
- restart (th);
- }
- else
- {
- /* Restart one waiting writer. */
- __pthread_unlock (&rwlock->__rw_lock);
- restart (th);
- }
- }
- else
- {
- /* Unlocking a read lock. */
- if (rwlock->__rw_readers == 0)
- {
- __pthread_unlock (&rwlock->__rw_lock);
- return EPERM;
- }
-
- --rwlock->__rw_readers;
- if (rwlock->__rw_readers == 0)
- /* Restart one waiting writer, if any. */
- th = dequeue (&rwlock->__rw_write_waiting);
- else
- th = NULL;
-
- __pthread_unlock (&rwlock->__rw_lock);
- if (th != NULL)
- restart (th);
-
- /* Recursive lock fixup */
-
- if (rwlock->__rw_kind == PTHREAD_RWLOCK_PREFER_WRITER_NP)
- {
- pthread_descr self = thread_self();
- pthread_readlock_info *victim = rwlock_remove_from_list(self, rwlock);
-
- if (victim != NULL)
- {
- if (victim->pr_lock_count == 0)
- {
- victim->pr_next = THREAD_GETMEM (self, p_readlock_free);
- THREAD_SETMEM (self, p_readlock_free, victim);
- }
- }
- else
- {
- int val = THREAD_GETMEM (self, p_untracked_readlock_count);
- if (val > 0)
- THREAD_SETMEM (self, p_untracked_readlock_count, val - 1);
- }
- }
- }
-
- return 0;
-}
-strong_alias (__pthread_rwlock_unlock, pthread_rwlock_unlock)
-
-
-
-int
-pthread_rwlockattr_init (pthread_rwlockattr_t *attr)
-{
- attr->__lockkind = 0;
- attr->__pshared = PTHREAD_PROCESS_PRIVATE;
-
- return 0;
-}
-
-
-int
-__pthread_rwlockattr_destroy (pthread_rwlockattr_t *attr)
-{
- return 0;
-}
-strong_alias (__pthread_rwlockattr_destroy, pthread_rwlockattr_destroy)
-
-
-int
-pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *attr, int *pshared)
-{
- *pshared = attr->__pshared;
- return 0;
-}
-
-
-int
-pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr, int pshared)
-{
- if (pshared != PTHREAD_PROCESS_PRIVATE && pshared != PTHREAD_PROCESS_SHARED)
- return EINVAL;
-
- /* For now it is not possible to shared a conditional variable. */
- if (pshared != PTHREAD_PROCESS_PRIVATE)
- return ENOSYS;
-
- attr->__pshared = pshared;
-
- return 0;
-}
-
-
-int
-pthread_rwlockattr_getkind_np (const pthread_rwlockattr_t *attr, int *pref)
-{
- *pref = attr->__lockkind;
- return 0;
-}
-
-
-int
-pthread_rwlockattr_setkind_np (pthread_rwlockattr_t *attr, int pref)
-{
- if (pref != PTHREAD_RWLOCK_PREFER_READER_NP
- && pref != PTHREAD_RWLOCK_PREFER_WRITER_NP
- && pref != PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP
- && pref != PTHREAD_RWLOCK_DEFAULT_NP)
- return EINVAL;
-
- attr->__lockkind = pref;
-
- return 0;
-}
diff --git a/linuxthreads/semaphore.c b/linuxthreads/semaphore.c
deleted file mode 100644
index 017539e176..0000000000
--- a/linuxthreads/semaphore.c
+++ /dev/null
@@ -1,307 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* Semaphores a la POSIX 1003.1b */
-
-#include <errno.h>
-#include "pthread.h"
-#include "semaphore.h"
-#include "internals.h"
-#include "spinlock.h"
-#include "restart.h"
-#include "queue.h"
-#include <shlib-compat.h>
-#include <not-cancel.h>
-
-int __new_sem_init(sem_t *sem, int pshared, unsigned int value)
-{
- if (value > SEM_VALUE_MAX) {
- errno = EINVAL;
- return -1;
- }
- if (pshared) {
- errno = ENOSYS;
- return -1;
- }
- __pthread_init_lock(&sem->__sem_lock);
- sem->__sem_value = value;
- sem->__sem_waiting = NULL;
- return 0;
-}
-
-/* Function called by pthread_cancel to remove the thread from
- waiting inside __new_sem_wait. */
-
-static int new_sem_extricate_func(void *obj, pthread_descr th)
-{
- volatile pthread_descr self = thread_self();
- sem_t *sem = obj;
- int did_remove = 0;
-
- __pthread_lock(&sem->__sem_lock, self);
- did_remove = remove_from_queue(&sem->__sem_waiting, th);
- __pthread_unlock(&sem->__sem_lock);
-
- return did_remove;
-}
-
-int __new_sem_wait(sem_t * sem)
-{
- volatile pthread_descr self = thread_self();
- pthread_extricate_if extr;
- int already_canceled = 0;
- int spurious_wakeup_count;
-
- /* Set up extrication interface */
- extr.pu_object = sem;
- extr.pu_extricate_func = new_sem_extricate_func;
-
- __pthread_lock(&sem->__sem_lock, self);
- if (sem->__sem_value > 0) {
- sem->__sem_value--;
- __pthread_unlock(&sem->__sem_lock);
- return 0;
- }
- /* Register extrication interface */
- THREAD_SETMEM(self, p_sem_avail, 0);
- __pthread_set_own_extricate_if(self, &extr);
- /* Enqueue only if not already cancelled. */
- if (!(THREAD_GETMEM(self, p_canceled)
- && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE))
- enqueue(&sem->__sem_waiting, self);
- else
- already_canceled = 1;
- __pthread_unlock(&sem->__sem_lock);
-
- if (already_canceled) {
- __pthread_set_own_extricate_if(self, 0);
- __pthread_do_exit(PTHREAD_CANCELED, CURRENT_STACK_FRAME);
- }
-
- /* Wait for sem_post or cancellation, or fall through if already canceled */
- spurious_wakeup_count = 0;
- while (1)
- {
- suspend(self);
- if (THREAD_GETMEM(self, p_sem_avail) == 0
- && (THREAD_GETMEM(self, p_woken_by_cancel) == 0
- || THREAD_GETMEM(self, p_cancelstate) != PTHREAD_CANCEL_ENABLE))
- {
- /* Count resumes that don't belong to us. */
- spurious_wakeup_count++;
- continue;
- }
- break;
- }
- __pthread_set_own_extricate_if(self, 0);
-
- /* Terminate only if the wakeup came from cancellation. */
- /* Otherwise ignore cancellation because we got the semaphore. */
-
- if (THREAD_GETMEM(self, p_woken_by_cancel)
- && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) {
- THREAD_SETMEM(self, p_woken_by_cancel, 0);
- __pthread_do_exit(PTHREAD_CANCELED, CURRENT_STACK_FRAME);
- }
- /* We got the semaphore */
- return 0;
-}
-
-int __new_sem_trywait(sem_t * sem)
-{
- int retval;
-
- __pthread_lock(&sem->__sem_lock, NULL);
- if (sem->__sem_value == 0) {
- errno = EAGAIN;
- retval = -1;
- } else {
- sem->__sem_value--;
- retval = 0;
- }
- __pthread_unlock(&sem->__sem_lock);
- return retval;
-}
-
-int __new_sem_post(sem_t * sem)
-{
- pthread_descr self = thread_self();
- pthread_descr th;
- struct pthread_request request;
-
- if (THREAD_GETMEM(self, p_in_sighandler) == NULL) {
- __pthread_lock(&sem->__sem_lock, self);
- if (sem->__sem_waiting == NULL) {
- if (sem->__sem_value >= SEM_VALUE_MAX) {
- /* Overflow */
- errno = ERANGE;
- __pthread_unlock(&sem->__sem_lock);
- return -1;
- }
- sem->__sem_value++;
- __pthread_unlock(&sem->__sem_lock);
- } else {
- th = dequeue(&sem->__sem_waiting);
- __pthread_unlock(&sem->__sem_lock);
- th->p_sem_avail = 1;
- WRITE_MEMORY_BARRIER();
- restart(th);
- }
- } else {
- /* If we're in signal handler, delegate post operation to
- the thread manager. */
- if (__pthread_manager_request < 0) {
- if (__pthread_initialize_manager() < 0) {
- errno = EAGAIN;
- return -1;
- }
- }
- request.req_kind = REQ_POST;
- request.req_args.post = sem;
- TEMP_FAILURE_RETRY(write_not_cancel(__pthread_manager_request,
- (char *) &request, sizeof(request)));
- }
- return 0;
-}
-
-int __new_sem_getvalue(sem_t * sem, int * sval)
-{
- *sval = sem->__sem_value;
- return 0;
-}
-
-int __new_sem_destroy(sem_t * sem)
-{
- if (sem->__sem_waiting != NULL) {
- __set_errno (EBUSY);
- return -1;
- }
- return 0;
-}
-
-sem_t *sem_open(const char *name, int oflag, ...)
-{
- __set_errno (ENOSYS);
- return SEM_FAILED;
-}
-
-int sem_close(sem_t *sem)
-{
- __set_errno (ENOSYS);
- return -1;
-}
-
-int sem_unlink(const char *name)
-{
- __set_errno (ENOSYS);
- return -1;
-}
-
-int sem_timedwait(sem_t *sem, const struct timespec *abstime)
-{
- pthread_descr self = thread_self();
- pthread_extricate_if extr;
- int already_canceled = 0;
- int spurious_wakeup_count;
-
- __pthread_lock(&sem->__sem_lock, self);
- if (sem->__sem_value > 0) {
- --sem->__sem_value;
- __pthread_unlock(&sem->__sem_lock);
- return 0;
- }
-
- if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000) {
- /* The standard requires that if the function would block and the
- time value is illegal, the function returns with an error. */
- __pthread_unlock(&sem->__sem_lock);
- __set_errno (EINVAL);
- return -1;
- }
-
- /* Set up extrication interface */
- extr.pu_object = sem;
- extr.pu_extricate_func = new_sem_extricate_func;
-
- /* Register extrication interface */
- THREAD_SETMEM(self, p_sem_avail, 0);
- __pthread_set_own_extricate_if(self, &extr);
- /* Enqueue only if not already cancelled. */
- if (!(THREAD_GETMEM(self, p_canceled)
- && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE))
- enqueue(&sem->__sem_waiting, self);
- else
- already_canceled = 1;
- __pthread_unlock(&sem->__sem_lock);
-
- if (already_canceled) {
- __pthread_set_own_extricate_if(self, 0);
- __pthread_do_exit(PTHREAD_CANCELED, CURRENT_STACK_FRAME);
- }
-
- spurious_wakeup_count = 0;
- while (1)
- {
- if (timedsuspend(self, abstime) == 0) {
- int was_on_queue;
-
- /* __pthread_lock will queue back any spurious restarts that
- may happen to it. */
-
- __pthread_lock(&sem->__sem_lock, self);
- was_on_queue = remove_from_queue(&sem->__sem_waiting, self);
- __pthread_unlock(&sem->__sem_lock);
-
- if (was_on_queue) {
- __pthread_set_own_extricate_if(self, 0);
- __set_errno (ETIMEDOUT);
- return -1;
- }
-
- /* Eat the outstanding restart() from the signaller */
- suspend(self);
- }
-
- if (THREAD_GETMEM(self, p_sem_avail) == 0
- && (THREAD_GETMEM(self, p_woken_by_cancel) == 0
- || THREAD_GETMEM(self, p_cancelstate) != PTHREAD_CANCEL_ENABLE))
- {
- /* Count resumes that don't belong to us. */
- spurious_wakeup_count++;
- continue;
- }
- break;
- }
-
- __pthread_set_own_extricate_if(self, 0);
-
- /* Terminate only if the wakeup came from cancellation. */
- /* Otherwise ignore cancellation because we got the semaphore. */
-
- if (THREAD_GETMEM(self, p_woken_by_cancel)
- && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) {
- THREAD_SETMEM(self, p_woken_by_cancel, 0);
- __pthread_do_exit(PTHREAD_CANCELED, CURRENT_STACK_FRAME);
- }
- /* We got the semaphore */
- return 0;
-}
-
-
-versioned_symbol (libpthread, __new_sem_init, sem_init, GLIBC_2_1);
-versioned_symbol (libpthread, __new_sem_wait, sem_wait, GLIBC_2_1);
-versioned_symbol (libpthread, __new_sem_trywait, sem_trywait, GLIBC_2_1);
-versioned_symbol (libpthread, __new_sem_post, sem_post, GLIBC_2_1);
-versioned_symbol (libpthread, __new_sem_getvalue, sem_getvalue, GLIBC_2_1);
-versioned_symbol (libpthread, __new_sem_destroy, sem_destroy, GLIBC_2_1);
diff --git a/linuxthreads/semaphore.h b/linuxthreads/semaphore.h
deleted file mode 100644
index 3c9696d12a..0000000000
--- a/linuxthreads/semaphore.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-#ifndef _SEMAPHORE_H
-#define _SEMAPHORE_H 1
-
-#include <features.h>
-#include <sys/types.h>
-#ifdef __USE_XOPEN2K
-# define __need_timespec
-# include <time.h>
-#endif
-#include <bits/pthreadtypes.h>
-
-#ifndef _PTHREAD_DESCR_DEFINED
-/* Thread descriptors. Needed for `sem_t' definition. */
-typedef struct _pthread_descr_struct *_pthread_descr;
-# define _PTHREAD_DESCR_DEFINED
-#endif
-
-/* System specific semaphore definition. */
-typedef struct
-{
- struct _pthread_fastlock __sem_lock;
- int __sem_value;
- _pthread_descr __sem_waiting;
-} sem_t;
-
-
-
-/* Value returned if `sem_open' failed. */
-#define SEM_FAILED ((sem_t *) 0)
-
-/* Maximum value the semaphore can have. */
-#define SEM_VALUE_MAX (2147483647)
-
-
-__BEGIN_DECLS
-
-/* Initialize semaphore object SEM to VALUE. If PSHARED then share it
- with other processes. */
-extern int sem_init (sem_t *__sem, int __pshared, unsigned int __value) __THROW;
-
-/* Free resources associated with semaphore object SEM. */
-extern int sem_destroy (sem_t *__sem) __THROW;
-
-/* Open a named semaphore NAME with open flaot OFLAG. */
-extern sem_t *sem_open (__const char *__name, int __oflag, ...) __THROW;
-
-/* Close descriptor for named semaphore SEM. */
-extern int sem_close (sem_t *__sem) __THROW;
-
-/* Remove named semaphore NAME. */
-extern int sem_unlink (__const char *__name) __THROW;
-
-/* Wait for SEM being posted. */
-extern int sem_wait (sem_t *__sem);
-
-#ifdef __USE_XOPEN2K
-/* Similar to `sem_wait' but wait only until ABSTIME. */
-extern int sem_timedwait (sem_t *__restrict __sem,
- __const struct timespec *__restrict __abstime);
-#endif
-
-/* Test whether SEM is posted. */
-extern int sem_trywait (sem_t *__sem) __THROW;
-
-/* Post SEM. */
-extern int sem_post (sem_t *__sem) __THROW;
-
-/* Get current value of SEM and store it in *SVAL. */
-extern int sem_getvalue (sem_t *__restrict __sem, int *__restrict __sval)
- __THROW;
-
-__END_DECLS
-
-#endif /* semaphore.h */
diff --git a/linuxthreads/shlib-versions b/linuxthreads/shlib-versions
deleted file mode 100644
index 58488ce65c..0000000000
--- a/linuxthreads/shlib-versions
+++ /dev/null
@@ -1,11 +0,0 @@
-# Xavier Leroy's Linux clone based thread library.
-mips.*-.*-linux.* libpthread=0 GLIBC_2.0 GLIBC_2.2
-sparc64-.*-linux.* libpthread=0 GLIBC_2.2
-sh.*-.*-linux.* libpthread=0 GLIBC_2.2
-ia64.*-.*-linux.* libpthread=0 GLIBC_2.2
-hppa.*-.*-linux.* libpthread=0 GLIBC_2.2
-s390x-.*-linux.* libpthread=0 GLIBC_2.2
-cris-.*-linux.* libpthread=0 GLIBC_2.2
-x86_64-.*-linux.* libpthread=0 GLIBC_2.2.5
-powerpc64-.*-linux.* libpthread=0 GLIBC_2.3
-.*-.*-linux.* libpthread=0
diff --git a/linuxthreads/sighandler.c b/linuxthreads/sighandler.c
deleted file mode 100644
index 9dd3e228f6..0000000000
--- a/linuxthreads/sighandler.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* Signal handlers */
-
-#include "internals.h"
-
-
-/* The wrapper around user-provided signal handlers */
-void __pthread_sighandler(int signo, SIGCONTEXT ctx)
-{
- pthread_descr self;
- char * in_sighandler;
- self = check_thread_self();
-
- /* If we're in a sigwait operation, just record the signal received
- and return without calling the user's handler */
- if (THREAD_GETMEM(self, p_sigwaiting)) {
- THREAD_SETMEM(self, p_sigwaiting, 0);
- THREAD_SETMEM(self, p_signal, signo);
- return;
- }
- /* Record that we're in a signal handler and call the user's
- handler function */
- in_sighandler = THREAD_GETMEM(self, p_in_sighandler);
- if (in_sighandler == NULL)
- THREAD_SETMEM(self, p_in_sighandler, CURRENT_STACK_FRAME);
- CALL_SIGHANDLER(__sighandler[signo].old, signo, ctx);
- if (in_sighandler == NULL)
- THREAD_SETMEM(self, p_in_sighandler, NULL);
-}
-
-/* The same, this time for real-time signals. */
-void __pthread_sighandler_rt(int signo, struct siginfo *si,
- struct ucontext *uc)
-{
- pthread_descr self;
- char * in_sighandler;
- self = check_thread_self();
-
- /* If we're in a sigwait operation, just record the signal received
- and return without calling the user's handler */
- if (THREAD_GETMEM(self, p_sigwaiting)) {
- THREAD_SETMEM(self, p_sigwaiting, 0);
- THREAD_SETMEM(self, p_signal, signo);
- return;
- }
- /* Record that we're in a signal handler and call the user's
- handler function */
- in_sighandler = THREAD_GETMEM(self, p_in_sighandler);
- if (in_sighandler == NULL)
- THREAD_SETMEM(self, p_in_sighandler, CURRENT_STACK_FRAME);
- __sighandler[signo].rt(signo, si, uc);
- if (in_sighandler == NULL)
- THREAD_SETMEM(self, p_in_sighandler, NULL);
-}
-
-
-/* A signal handler that does nothing */
-void __pthread_null_sighandler(int sig) { }
diff --git a/linuxthreads/signals.c b/linuxthreads/signals.c
deleted file mode 100644
index 50f55995a3..0000000000
--- a/linuxthreads/signals.c
+++ /dev/null
@@ -1,213 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* Handling of signals */
-
-#include <errno.h>
-#include <signal.h>
-#include "pthread.h"
-#include "internals.h"
-#include "spinlock.h"
-#include <ucontext.h>
-
-
-int pthread_sigmask(int how, const sigset_t * newmask, sigset_t * oldmask)
-{
- sigset_t mask;
-
- if (newmask != NULL) {
- mask = *newmask;
- /* Don't allow __pthread_sig_restart to be unmasked.
- Don't allow __pthread_sig_cancel to be masked. */
- switch(how) {
- case SIG_SETMASK:
- sigaddset(&mask, __pthread_sig_restart);
- sigdelset(&mask, __pthread_sig_cancel);
- if (__pthread_sig_debug > 0)
- sigdelset(&mask, __pthread_sig_debug);
- break;
- case SIG_BLOCK:
- sigdelset(&mask, __pthread_sig_cancel);
- if (__pthread_sig_debug > 0)
- sigdelset(&mask, __pthread_sig_debug);
- break;
- case SIG_UNBLOCK:
- sigdelset(&mask, __pthread_sig_restart);
- break;
- }
- newmask = &mask;
- }
- if (sigprocmask(how, newmask, oldmask) == -1)
- return errno;
- else
- return 0;
-}
-
-int pthread_kill(pthread_t thread, int signo)
-{
- pthread_handle handle = thread_handle(thread);
- int pid;
-
- __pthread_lock(&handle->h_lock, NULL);
- if (invalid_handle(handle, thread)) {
- __pthread_unlock(&handle->h_lock);
- return ESRCH;
- }
- pid = handle->h_descr->p_pid;
- __pthread_unlock(&handle->h_lock);
- if (kill(pid, signo) == -1)
- return errno;
- else
- return 0;
-}
-
-union sighandler __sighandler[NSIG] =
- { [1 ... NSIG - 1] = { (arch_sighandler_t) SIG_ERR } };
-
-/* The wrapper around sigaction. Install our own signal handler
- around the signal. */
-int __pthread_sigaction(int sig, const struct sigaction * act,
- struct sigaction * oact)
-{
- struct sigaction newact;
- struct sigaction *newactp;
- __sighandler_t old = SIG_DFL;
-
- if (sig == __pthread_sig_restart ||
- sig == __pthread_sig_cancel ||
- (sig == __pthread_sig_debug && __pthread_sig_debug > 0))
- {
- __set_errno (EINVAL);
- return -1;
- }
- if (sig > 0 && sig < NSIG)
- old = (__sighandler_t) __sighandler[sig].old;
- if (act)
- {
- newact = *act;
- if (act->sa_handler != SIG_IGN && act->sa_handler != SIG_DFL
- && sig > 0 && sig < NSIG)
- {
- if (act->sa_flags & SA_SIGINFO)
- newact.sa_handler = (__sighandler_t) __pthread_sighandler_rt;
- else
- newact.sa_handler = (__sighandler_t) __pthread_sighandler;
- if (old == SIG_IGN || old == SIG_DFL || old == SIG_ERR)
- __sighandler[sig].old = (arch_sighandler_t) act->sa_handler;
- }
- newactp = &newact;
- }
- else
- newactp = NULL;
- if (__libc_sigaction(sig, newactp, oact) == -1)
- {
- if (act)
- __sighandler[sig].old = (arch_sighandler_t) old;
- return -1;
- }
- if (sig > 0 && sig < NSIG)
- {
- if (oact != NULL
- /* We may have inherited SIG_IGN from the parent, so return the
- kernel's idea of the signal handler the first time
- through. */
- && old != SIG_ERR)
- oact->sa_handler = old;
- if (act)
- /* For the assignment it does not matter whether it's a normal
- or real-time signal. */
- __sighandler[sig].old = (arch_sighandler_t) act->sa_handler;
- }
- return 0;
-}
-#ifdef SHARED
-strong_alias(__pthread_sigaction, __sigaction)
-strong_alias(__pthread_sigaction, sigaction)
-#endif
-
-/* sigwait -- synchronously wait for a signal */
-int __pthread_sigwait(const sigset_t * set, int * sig)
-{
- volatile pthread_descr self = thread_self();
- sigset_t mask;
- int s;
- sigjmp_buf jmpbuf;
- struct sigaction sa;
-
- /* Get ready to block all signals except those in set
- and the cancellation signal.
- Also check that handlers are installed on all signals in set,
- and if not, install our dummy handler. This is conformant to
- POSIX: "The effect of sigwait() on the signal actions for the
- signals in set is unspecified." */
- sigfillset(&mask);
- sigdelset(&mask, __pthread_sig_cancel);
- for (s = 1; s < NSIG; s++) {
- if (sigismember(set, s) &&
- s != __pthread_sig_restart &&
- s != __pthread_sig_cancel &&
- s != __pthread_sig_debug) {
- sigdelset(&mask, s);
- if (__sighandler[s].old == (arch_sighandler_t) SIG_ERR ||
- __sighandler[s].old == (arch_sighandler_t) SIG_DFL ||
- __sighandler[s].old == (arch_sighandler_t) SIG_IGN) {
- sa.sa_handler = __pthread_null_sighandler;
- sigfillset(&sa.sa_mask);
- sa.sa_flags = 0;
- sigaction(s, &sa, NULL);
- }
- }
- }
- /* Test for cancellation */
- if (sigsetjmp(jmpbuf, 1) == 0) {
- THREAD_SETMEM(self, p_cancel_jmp, &jmpbuf);
- if (! (THREAD_GETMEM(self, p_canceled)
- && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE)) {
- /* Reset the signal count */
- THREAD_SETMEM(self, p_signal, 0);
- /* Say we're in sigwait */
- THREAD_SETMEM(self, p_sigwaiting, 1);
- /* Unblock the signals and wait for them */
- sigsuspend(&mask);
- }
- }
- THREAD_SETMEM(self, p_cancel_jmp, NULL);
- /* The signals are now reblocked. Check for cancellation */
- pthread_testcancel();
- /* We should have self->p_signal != 0 and equal to the signal received */
- *sig = THREAD_GETMEM(self, p_signal);
- return 0;
-}
-#ifdef SHARED
-strong_alias (__pthread_sigwait, sigwait)
-#endif
-
-/* Redefine raise() to send signal to calling thread only,
- as per POSIX 1003.1c */
-int __pthread_raise (int sig)
-{
- int retcode = pthread_kill(pthread_self(), sig);
- if (retcode == 0)
- return 0;
- else {
- errno = retcode;
- return -1;
- }
-}
-#ifdef SHARED
-strong_alias (__pthread_raise, raise)
-#endif
-
-/* This files handles cancellation internally. */
-LIBC_CANCEL_HANDLED ();
diff --git a/linuxthreads/specific.c b/linuxthreads/specific.c
deleted file mode 100644
index 92eec3d99a..0000000000
--- a/linuxthreads/specific.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* Thread-specific data */
-
-#include <errno.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include "pthread.h"
-#include "internals.h"
-#include "spinlock.h"
-#include "restart.h"
-#include <bits/libc-lock.h>
-#include <not-cancel.h>
-
-/* Table of keys. */
-
-static struct pthread_key_struct pthread_keys[PTHREAD_KEYS_MAX] =
- { { 0, NULL } };
-
-/* For debugging purposes put the maximum number of keys in a variable. */
-const int __linuxthreads_pthread_keys_max = PTHREAD_KEYS_MAX;
-const int __linuxthreads_pthread_key_2ndlevel_size = PTHREAD_KEY_2NDLEVEL_SIZE;
-
-/* Mutex to protect access to pthread_keys */
-
-static pthread_mutex_t pthread_keys_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-/* Create a new key */
-
-int __pthread_key_create(pthread_key_t * key, destr_function destr)
-{
- int i;
-
- pthread_mutex_lock(&pthread_keys_mutex);
- for (i = 0; i < PTHREAD_KEYS_MAX; i++) {
- if (! pthread_keys[i].in_use) {
- /* Mark key in use */
- pthread_keys[i].in_use = 1;
- pthread_keys[i].destr = destr;
- pthread_mutex_unlock(&pthread_keys_mutex);
- *key = i;
- return 0;
- }
- }
- pthread_mutex_unlock(&pthread_keys_mutex);
- return EAGAIN;
-}
-strong_alias (__pthread_key_create, pthread_key_create)
-
-/* Reset deleted key's value to NULL in each live thread.
- * NOTE: this executes in the context of the thread manager! */
-
-struct pthread_key_delete_helper_args {
- /* Damn, we need lexical closures in C! ;) */
- unsigned int idx1st, idx2nd;
- pthread_descr self;
-};
-
-static void pthread_key_delete_helper(void *arg, pthread_descr th)
-{
- struct pthread_key_delete_helper_args *args = arg;
- unsigned int idx1st = args->idx1st;
- unsigned int idx2nd = args->idx2nd;
- pthread_descr self = args->self;
-
- if (self == 0)
- self = args->self = thread_self();
-
- if (!th->p_terminated) {
- /* pthread_exit() may try to free th->p_specific[idx1st] concurrently. */
- __pthread_lock(th->p_lock, self);
- if (th->p_specific[idx1st] != NULL)
- th->p_specific[idx1st][idx2nd] = NULL;
- __pthread_unlock(th->p_lock);
- }
-}
-
-/* Delete a key */
-int pthread_key_delete(pthread_key_t key)
-{
- pthread_descr self = thread_self();
-
- pthread_mutex_lock(&pthread_keys_mutex);
- if (key >= PTHREAD_KEYS_MAX || !pthread_keys[key].in_use) {
- pthread_mutex_unlock(&pthread_keys_mutex);
- return EINVAL;
- }
- pthread_keys[key].in_use = 0;
- pthread_keys[key].destr = NULL;
-
- /* Set the value of the key to NULL in all running threads, so
- that if the key is reallocated later by pthread_key_create, its
- associated values will be NULL in all threads.
-
- If no threads have been created yet, clear it just in the
- current thread. */
-
- struct pthread_key_delete_helper_args args;
- args.idx1st = key / PTHREAD_KEY_2NDLEVEL_SIZE;
- args.idx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE;
- if (__pthread_manager_request != -1)
- {
- struct pthread_request request;
-
- args.self = 0;
-
- request.req_thread = self;
- request.req_kind = REQ_FOR_EACH_THREAD;
- request.req_args.for_each.arg = &args;
- request.req_args.for_each.fn = pthread_key_delete_helper;
-
- TEMP_FAILURE_RETRY(write_not_cancel(__pthread_manager_request,
- (char *) &request, sizeof(request)));
- suspend(self);
- }
- else
- {
- if (self->p_specific[args.idx1st] != NULL)
- self->p_specific[args.idx1st][args.idx2nd] = NULL;
- }
-
- pthread_mutex_unlock(&pthread_keys_mutex);
- return 0;
-}
-
-/* Set the value of a key */
-
-int __pthread_setspecific(pthread_key_t key, const void * pointer)
-{
- pthread_descr self = thread_self();
- unsigned int idx1st, idx2nd;
-
- if (key >= PTHREAD_KEYS_MAX || !pthread_keys[key].in_use)
- return EINVAL;
- idx1st = key / PTHREAD_KEY_2NDLEVEL_SIZE;
- idx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE;
- if (THREAD_GETMEM_NC(self, p_specific[idx1st]) == NULL) {
- void *newp = calloc(PTHREAD_KEY_2NDLEVEL_SIZE, sizeof (void *));
- if (newp == NULL)
- return ENOMEM;
- THREAD_SETMEM_NC(self, p_specific[idx1st], newp);
- }
- THREAD_GETMEM_NC(self, p_specific[idx1st])[idx2nd] = (void *) pointer;
- return 0;
-}
-strong_alias (__pthread_setspecific, pthread_setspecific)
-
-/* Get the value of a key */
-
-void * __pthread_getspecific(pthread_key_t key)
-{
- pthread_descr self = thread_self();
- unsigned int idx1st, idx2nd;
-
- if (key >= PTHREAD_KEYS_MAX)
- return NULL;
- idx1st = key / PTHREAD_KEY_2NDLEVEL_SIZE;
- idx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE;
- if (THREAD_GETMEM_NC(self, p_specific[idx1st]) == NULL
- || !pthread_keys[key].in_use)
- return NULL;
- return THREAD_GETMEM_NC(self, p_specific[idx1st])[idx2nd];
-}
-strong_alias (__pthread_getspecific, pthread_getspecific)
-
-/* Call the destruction routines on all keys */
-
-void __pthread_destroy_specifics()
-{
- pthread_descr self = thread_self();
- int i, j, round, found_nonzero;
- destr_function destr;
- void * data;
-
- for (round = 0, found_nonzero = 1;
- found_nonzero && round < PTHREAD_DESTRUCTOR_ITERATIONS;
- round++) {
- found_nonzero = 0;
- for (i = 0; i < PTHREAD_KEY_1STLEVEL_SIZE; i++)
- if (THREAD_GETMEM_NC(self, p_specific[i]) != NULL)
- for (j = 0; j < PTHREAD_KEY_2NDLEVEL_SIZE; j++) {
- destr = pthread_keys[i * PTHREAD_KEY_2NDLEVEL_SIZE + j].destr;
- data = THREAD_GETMEM_NC(self, p_specific[i])[j];
- if (destr != NULL && data != NULL) {
- THREAD_GETMEM_NC(self, p_specific[i])[j] = NULL;
- destr(data);
- found_nonzero = 1;
- }
- }
- }
- __pthread_lock(THREAD_GETMEM(self, p_lock), self);
- for (i = 0; i < PTHREAD_KEY_1STLEVEL_SIZE; i++) {
- if (THREAD_GETMEM_NC(self, p_specific[i]) != NULL) {
- free(THREAD_GETMEM_NC(self, p_specific[i]));
- THREAD_SETMEM_NC(self, p_specific[i], NULL);
- }
- }
- __pthread_unlock(THREAD_GETMEM(self, p_lock));
-}
-
-#if !(USE_TLS && HAVE___THREAD)
-
-/* Thread-specific data for libc. */
-
-int
-__pthread_internal_tsd_set (int key, const void * pointer)
-{
- pthread_descr self = thread_self();
-
- THREAD_SETMEM_NC(self, p_libc_specific[key], (void *) pointer);
- return 0;
-}
-
-void *
-__pthread_internal_tsd_get (int key)
-{
- pthread_descr self = thread_self();
-
- return THREAD_GETMEM_NC(self, p_libc_specific[key]);
-}
-
-void ** __attribute__ ((__const__))
-__pthread_internal_tsd_address (int key)
-{
- pthread_descr self = thread_self();
- return &self->p_libc_specific[key];
-}
-
-#endif
diff --git a/linuxthreads/spinlock.c b/linuxthreads/spinlock.c
deleted file mode 100644
index 08fff082ef..0000000000
--- a/linuxthreads/spinlock.c
+++ /dev/null
@@ -1,720 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1998 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* Internal locks */
-
-#include <errno.h>
-#include <sched.h>
-#include <time.h>
-#include <stdlib.h>
-#include <limits.h>
-#include "pthread.h"
-#include "internals.h"
-#include "spinlock.h"
-#include "restart.h"
-
-static void __pthread_acquire(int * spinlock);
-
-static inline void __pthread_release(int * spinlock)
-{
- WRITE_MEMORY_BARRIER();
- *spinlock = __LT_SPINLOCK_INIT;
- __asm __volatile ("" : "=m" (*spinlock) : "m" (*spinlock));
-}
-
-
-/* The status field of a spinlock is a pointer whose least significant
- bit is a locked flag.
-
- Thus the field values have the following meanings:
-
- status == 0: spinlock is free
- status == 1: spinlock is taken; no thread is waiting on it
-
- (status & 1) == 1: spinlock is taken and (status & ~1L) is a
- pointer to the first waiting thread; other
- waiting threads are linked via the p_nextlock
- field.
- (status & 1) == 0: same as above, but spinlock is not taken.
-
- The waiting list is not sorted by priority order.
- Actually, we always insert at top of list (sole insertion mode
- that can be performed without locking).
- For __pthread_unlock, we perform a linear search in the list
- to find the highest-priority, oldest waiting thread.
- This is safe because there are no concurrent __pthread_unlock
- operations -- only the thread that locked the mutex can unlock it. */
-
-
-void internal_function __pthread_lock(struct _pthread_fastlock * lock,
- pthread_descr self)
-{
-#if defined HAS_COMPARE_AND_SWAP
- long oldstatus, newstatus;
- int successful_seizure, spurious_wakeup_count;
- int spin_count;
-#endif
-
-#if defined TEST_FOR_COMPARE_AND_SWAP
- if (!__pthread_has_cas)
-#endif
-#if !defined HAS_COMPARE_AND_SWAP || defined TEST_FOR_COMPARE_AND_SWAP
- {
- __pthread_acquire(&lock->__spinlock);
- return;
- }
-#endif
-
-#if defined HAS_COMPARE_AND_SWAP
- /* First try it without preparation. Maybe it's a completely
- uncontested lock. */
- if (lock->__status == 0 && __compare_and_swap (&lock->__status, 0, 1))
- return;
-
- spurious_wakeup_count = 0;
- spin_count = 0;
-
- /* On SMP, try spinning to get the lock. */
-
- if (__pthread_smp_kernel) {
- int max_count = lock->__spinlock * 2 + 10;
-
- if (max_count > MAX_ADAPTIVE_SPIN_COUNT)
- max_count = MAX_ADAPTIVE_SPIN_COUNT;
-
- for (spin_count = 0; spin_count < max_count; spin_count++) {
- if (((oldstatus = lock->__status) & 1) == 0) {
- if(__compare_and_swap(&lock->__status, oldstatus, oldstatus | 1))
- {
- if (spin_count)
- lock->__spinlock += (spin_count - lock->__spinlock) / 8;
- READ_MEMORY_BARRIER();
- return;
- }
- }
-#ifdef BUSY_WAIT_NOP
- BUSY_WAIT_NOP;
-#endif
- __asm __volatile ("" : "=m" (lock->__status) : "m" (lock->__status));
- }
-
- lock->__spinlock += (spin_count - lock->__spinlock) / 8;
- }
-
-again:
-
- /* No luck, try once more or suspend. */
-
- do {
- oldstatus = lock->__status;
- successful_seizure = 0;
-
- if ((oldstatus & 1) == 0) {
- newstatus = oldstatus | 1;
- successful_seizure = 1;
- } else {
- if (self == NULL)
- self = thread_self();
- newstatus = (long) self | 1;
- }
-
- if (self != NULL) {
- THREAD_SETMEM(self, p_nextlock, (pthread_descr) (oldstatus));
- /* Make sure the store in p_nextlock completes before performing
- the compare-and-swap */
- MEMORY_BARRIER();
- }
- } while(! __compare_and_swap(&lock->__status, oldstatus, newstatus));
-
- /* Suspend with guard against spurious wakeup.
- This can happen in pthread_cond_timedwait_relative, when the thread
- wakes up due to timeout and is still on the condvar queue, and then
- locks the queue to remove itself. At that point it may still be on the
- queue, and may be resumed by a condition signal. */
-
- if (!successful_seizure) {
- for (;;) {
- suspend(self);
- if (self->p_nextlock != NULL) {
- /* Count resumes that don't belong to us. */
- spurious_wakeup_count++;
- continue;
- }
- break;
- }
- goto again;
- }
-
- /* Put back any resumes we caught that don't belong to us. */
- while (spurious_wakeup_count--)
- restart(self);
-
- READ_MEMORY_BARRIER();
-#endif
-}
-
-int __pthread_unlock(struct _pthread_fastlock * lock)
-{
-#if defined HAS_COMPARE_AND_SWAP
- long oldstatus;
- pthread_descr thr, * ptr, * maxptr;
- int maxprio;
-#endif
-
-#if defined TEST_FOR_COMPARE_AND_SWAP
- if (!__pthread_has_cas)
-#endif
-#if !defined HAS_COMPARE_AND_SWAP || defined TEST_FOR_COMPARE_AND_SWAP
- {
- __pthread_release(&lock->__spinlock);
- return 0;
- }
-#endif
-
-#if defined HAS_COMPARE_AND_SWAP
- WRITE_MEMORY_BARRIER();
-
-again:
- while ((oldstatus = lock->__status) == 1) {
- if (__compare_and_swap_with_release_semantics(&lock->__status,
- oldstatus, 0))
- return 0;
- }
-
- /* Find thread in waiting queue with maximal priority */
- ptr = (pthread_descr *) &lock->__status;
- thr = (pthread_descr) (oldstatus & ~1L);
- maxprio = 0;
- maxptr = ptr;
-
- /* Before we iterate over the wait queue, we need to execute
- a read barrier, otherwise we may read stale contents of nodes that may
- just have been inserted by other processors. One read barrier is enough to
- ensure we have a stable list; we don't need one for each pointer chase
- through the list, because we are the owner of the lock; other threads
- can only add nodes at the front; if a front node is consistent,
- the ones behind it must also be. */
-
- READ_MEMORY_BARRIER();
-
- while (thr != 0) {
- if (thr->p_priority >= maxprio) {
- maxptr = ptr;
- maxprio = thr->p_priority;
- }
- ptr = &(thr->p_nextlock);
- thr = (pthread_descr)((long)(thr->p_nextlock) & ~1L);
- }
-
- /* Remove max prio thread from waiting list. */
- if (maxptr == (pthread_descr *) &lock->__status) {
- /* If max prio thread is at head, remove it with compare-and-swap
- to guard against concurrent lock operation. This removal
- also has the side effect of marking the lock as released
- because the new status comes from thr->p_nextlock whose
- least significant bit is clear. */
- thr = (pthread_descr) (oldstatus & ~1L);
- if (! __compare_and_swap_with_release_semantics
- (&lock->__status, oldstatus, (long)(thr->p_nextlock) & ~1L))
- goto again;
- } else {
- /* No risk of concurrent access, remove max prio thread normally.
- But in this case we must also flip the least significant bit
- of the status to mark the lock as released. */
- thr = (pthread_descr)((long)*maxptr & ~1L);
- *maxptr = thr->p_nextlock;
-
- /* Ensure deletion from linked list completes before we
- release the lock. */
- WRITE_MEMORY_BARRIER();
-
- do {
- oldstatus = lock->__status;
- } while (!__compare_and_swap_with_release_semantics(&lock->__status,
- oldstatus, oldstatus & ~1L));
- }
-
- /* Wake up the selected waiting thread. Woken thread can check
- its own p_nextlock field for NULL to detect that it has been removed. No
- barrier is needed here, since restart() and suspend() take
- care of memory synchronization. */
-
- thr->p_nextlock = NULL;
- restart(thr);
-
- return 0;
-#endif
-}
-
-/*
- * Alternate fastlocks do not queue threads directly. Instead, they queue
- * these wait queue node structures. When a timed wait wakes up due to
- * a timeout, it can leave its wait node in the queue (because there
- * is no safe way to remove from the quue). Some other thread will
- * deallocate the abandoned node.
- */
-
-
-struct wait_node {
- struct wait_node *next; /* Next node in null terminated linked list */
- pthread_descr thr; /* The thread waiting with this node */
- int abandoned; /* Atomic flag */
-};
-
-static long wait_node_free_list;
-static int wait_node_free_list_spinlock;
-
-/* Allocate a new node from the head of the free list using an atomic
- operation, or else using malloc if that list is empty. A fundamental
- assumption here is that we can safely access wait_node_free_list->next.
- That's because we never free nodes once we allocate them, so a pointer to a
- node remains valid indefinitely. */
-
-static struct wait_node *wait_node_alloc(void)
-{
- struct wait_node *new_node = 0;
-
- __pthread_acquire(&wait_node_free_list_spinlock);
- if (wait_node_free_list != 0) {
- new_node = (struct wait_node *) wait_node_free_list;
- wait_node_free_list = (long) new_node->next;
- }
- WRITE_MEMORY_BARRIER();
- __pthread_release(&wait_node_free_list_spinlock);
-
- if (new_node == 0)
- return malloc(sizeof *wait_node_alloc());
-
- return new_node;
-}
-
-/* Return a node to the head of the free list using an atomic
- operation. */
-
-static void wait_node_free(struct wait_node *wn)
-{
- __pthread_acquire(&wait_node_free_list_spinlock);
- wn->next = (struct wait_node *) wait_node_free_list;
- wait_node_free_list = (long) wn;
- WRITE_MEMORY_BARRIER();
- __pthread_release(&wait_node_free_list_spinlock);
- return;
-}
-
-#if defined HAS_COMPARE_AND_SWAP
-
-/* Remove a wait node from the specified queue. It is assumed
- that the removal takes place concurrently with only atomic insertions at the
- head of the queue. */
-
-static void wait_node_dequeue(struct wait_node **pp_head,
- struct wait_node **pp_node,
- struct wait_node *p_node)
-{
- /* If the node is being deleted from the head of the
- list, it must be deleted using atomic compare-and-swap.
- Otherwise it can be deleted in the straightforward way. */
-
- if (pp_node == pp_head) {
- /* We don't need a read barrier between these next two loads,
- because it is assumed that the caller has already ensured
- the stability of *p_node with respect to p_node. */
-
- long oldvalue = (long) p_node;
- long newvalue = (long) p_node->next;
-
- if (__compare_and_swap((long *) pp_node, oldvalue, newvalue))
- return;
-
- /* Oops! Compare and swap failed, which means the node is
- no longer first. We delete it using the ordinary method. But we don't
- know the identity of the node which now holds the pointer to the node
- being deleted, so we must search from the beginning. */
-
- for (pp_node = pp_head; p_node != *pp_node; ) {
- pp_node = &(*pp_node)->next;
- READ_MEMORY_BARRIER(); /* Stabilize *pp_node for next iteration. */
- }
- }
-
- *pp_node = p_node->next;
- return;
-}
-
-#endif
-
-void __pthread_alt_lock(struct _pthread_fastlock * lock,
- pthread_descr self)
-{
-#if defined HAS_COMPARE_AND_SWAP
- long oldstatus, newstatus;
-#endif
- struct wait_node wait_node;
-
-#if defined TEST_FOR_COMPARE_AND_SWAP
- if (!__pthread_has_cas)
-#endif
-#if !defined HAS_COMPARE_AND_SWAP || defined TEST_FOR_COMPARE_AND_SWAP
- {
- int suspend_needed = 0;
- __pthread_acquire(&lock->__spinlock);
-
- if (lock->__status == 0)
- lock->__status = 1;
- else {
- if (self == NULL)
- self = thread_self();
-
- wait_node.abandoned = 0;
- wait_node.next = (struct wait_node *) lock->__status;
- wait_node.thr = self;
- lock->__status = (long) &wait_node;
- suspend_needed = 1;
- }
-
- __pthread_release(&lock->__spinlock);
-
- if (suspend_needed)
- suspend (self);
- return;
- }
-#endif
-
-#if defined HAS_COMPARE_AND_SWAP
- do {
- oldstatus = lock->__status;
- if (oldstatus == 0) {
- newstatus = 1;
- } else {
- if (self == NULL)
- self = thread_self();
- wait_node.thr = self;
- newstatus = (long) &wait_node;
- }
- wait_node.abandoned = 0;
- wait_node.next = (struct wait_node *) oldstatus;
- /* Make sure the store in wait_node.next completes before performing
- the compare-and-swap */
- MEMORY_BARRIER();
- } while(! __compare_and_swap(&lock->__status, oldstatus, newstatus));
-
- /* Suspend. Note that unlike in __pthread_lock, we don't worry
- here about spurious wakeup. That's because this lock is not
- used in situations where that can happen; the restart can
- only come from the previous lock owner. */
-
- if (oldstatus != 0)
- suspend(self);
-
- READ_MEMORY_BARRIER();
-#endif
-}
-
-/* Timed-out lock operation; returns 0 to indicate timeout. */
-
-int __pthread_alt_timedlock(struct _pthread_fastlock * lock,
- pthread_descr self, const struct timespec *abstime)
-{
- long oldstatus = 0;
-#if defined HAS_COMPARE_AND_SWAP
- long newstatus;
-#endif
- struct wait_node *p_wait_node = wait_node_alloc();
-
- /* Out of memory, just give up and do ordinary lock. */
- if (p_wait_node == 0) {
- __pthread_alt_lock(lock, self);
- return 1;
- }
-
-#if defined TEST_FOR_COMPARE_AND_SWAP
- if (!__pthread_has_cas)
-#endif
-#if !defined HAS_COMPARE_AND_SWAP || defined TEST_FOR_COMPARE_AND_SWAP
- {
- __pthread_acquire(&lock->__spinlock);
-
- if (lock->__status == 0)
- lock->__status = 1;
- else {
- if (self == NULL)
- self = thread_self();
-
- p_wait_node->abandoned = 0;
- p_wait_node->next = (struct wait_node *) lock->__status;
- p_wait_node->thr = self;
- lock->__status = (long) p_wait_node;
- oldstatus = 1; /* force suspend */
- }
-
- __pthread_release(&lock->__spinlock);
- goto suspend;
- }
-#endif
-
-#if defined HAS_COMPARE_AND_SWAP
- do {
- oldstatus = lock->__status;
- if (oldstatus == 0) {
- newstatus = 1;
- } else {
- if (self == NULL)
- self = thread_self();
- p_wait_node->thr = self;
- newstatus = (long) p_wait_node;
- }
- p_wait_node->abandoned = 0;
- p_wait_node->next = (struct wait_node *) oldstatus;
- /* Make sure the store in wait_node.next completes before performing
- the compare-and-swap */
- MEMORY_BARRIER();
- } while(! __compare_and_swap(&lock->__status, oldstatus, newstatus));
-#endif
-
-#if !defined HAS_COMPARE_AND_SWAP || defined TEST_FOR_COMPARE_AND_SWAP
- suspend:
-#endif
-
- /* If we did not get the lock, do a timed suspend. If we wake up due
- to a timeout, then there is a race; the old lock owner may try
- to remove us from the queue. This race is resolved by us and the owner
- doing an atomic testandset() to change the state of the wait node from 0
- to 1. If we succeed, then it's a timeout and we abandon the node in the
- queue. If we fail, it means the owner gave us the lock. */
-
- if (oldstatus != 0) {
- if (timedsuspend(self, abstime) == 0) {
- if (!testandset(&p_wait_node->abandoned))
- return 0; /* Timeout! */
-
- /* Eat oustanding resume from owner, otherwise wait_node_free() below
- will race with owner's wait_node_dequeue(). */
- suspend(self);
- }
- }
-
- wait_node_free(p_wait_node);
-
- READ_MEMORY_BARRIER();
-
- return 1; /* Got the lock! */
-}
-
-void __pthread_alt_unlock(struct _pthread_fastlock *lock)
-{
- struct wait_node *p_node, **pp_node, *p_max_prio, **pp_max_prio;
- struct wait_node ** const pp_head = (struct wait_node **) &lock->__status;
- int maxprio;
-
- WRITE_MEMORY_BARRIER();
-
-#if defined TEST_FOR_COMPARE_AND_SWAP
- if (!__pthread_has_cas)
-#endif
-#if !defined HAS_COMPARE_AND_SWAP || defined TEST_FOR_COMPARE_AND_SWAP
- {
- __pthread_acquire(&lock->__spinlock);
- }
-#endif
-
- while (1) {
-
- /* If no threads are waiting for this lock, try to just
- atomically release it. */
-#if defined TEST_FOR_COMPARE_AND_SWAP
- if (!__pthread_has_cas)
-#endif
-#if !defined HAS_COMPARE_AND_SWAP || defined TEST_FOR_COMPARE_AND_SWAP
- {
- if (lock->__status == 0 || lock->__status == 1) {
- lock->__status = 0;
- break;
- }
- }
-#endif
-
-#if defined TEST_FOR_COMPARE_AND_SWAP
- else
-#endif
-
-#if defined HAS_COMPARE_AND_SWAP
- {
- long oldstatus = lock->__status;
- if (oldstatus == 0 || oldstatus == 1) {
- if (__compare_and_swap_with_release_semantics (&lock->__status, oldstatus, 0))
- break;
- else
- continue;
- }
- }
-#endif
-
- /* Process the entire queue of wait nodes. Remove all abandoned
- wait nodes and put them into the global free queue, and
- remember the one unabandoned node which refers to the thread
- having the highest priority. */
-
- pp_max_prio = pp_node = pp_head;
- p_max_prio = p_node = *pp_head;
- maxprio = INT_MIN;
-
- READ_MEMORY_BARRIER(); /* Prevent access to stale data through p_node */
-
- while (p_node != (struct wait_node *) 1) {
- int prio;
-
- if (p_node->abandoned) {
- /* Remove abandoned node. */
-#if defined TEST_FOR_COMPARE_AND_SWAP
- if (!__pthread_has_cas)
-#endif
-#if !defined HAS_COMPARE_AND_SWAP || defined TEST_FOR_COMPARE_AND_SWAP
- *pp_node = p_node->next;
-#endif
-#if defined TEST_FOR_COMPARE_AND_SWAP
- else
-#endif
-#if defined HAS_COMPARE_AND_SWAP
- wait_node_dequeue(pp_head, pp_node, p_node);
-#endif
- wait_node_free(p_node);
- /* Note that the next assignment may take us to the beginning
- of the queue, to newly inserted nodes, if pp_node == pp_head.
- In that case we need a memory barrier to stabilize the first of
- these new nodes. */
- p_node = *pp_node;
- if (pp_node == pp_head)
- READ_MEMORY_BARRIER(); /* No stale reads through p_node */
- continue;
- } else if ((prio = p_node->thr->p_priority) >= maxprio) {
- /* Otherwise remember it if its thread has a higher or equal priority
- compared to that of any node seen thus far. */
- maxprio = prio;
- pp_max_prio = pp_node;
- p_max_prio = p_node;
- }
-
- /* This canno6 jump backward in the list, so no further read
- barrier is needed. */
- pp_node = &p_node->next;
- p_node = *pp_node;
- }
-
- /* If all threads abandoned, go back to top */
- if (maxprio == INT_MIN)
- continue;
-
- ASSERT (p_max_prio != (struct wait_node *) 1);
-
- /* Now we want to to remove the max priority thread's wait node from
- the list. Before we can do this, we must atomically try to change the
- node's abandon state from zero to nonzero. If we succeed, that means we
- have the node that we will wake up. If we failed, then it means the
- thread timed out and abandoned the node in which case we repeat the
- whole unlock operation. */
-
- if (!testandset(&p_max_prio->abandoned)) {
-#if defined TEST_FOR_COMPARE_AND_SWAP
- if (!__pthread_has_cas)
-#endif
-#if !defined HAS_COMPARE_AND_SWAP || defined TEST_FOR_COMPARE_AND_SWAP
- *pp_max_prio = p_max_prio->next;
-#endif
-#if defined TEST_FOR_COMPARE_AND_SWAP
- else
-#endif
-#if defined HAS_COMPARE_AND_SWAP
- wait_node_dequeue(pp_head, pp_max_prio, p_max_prio);
-#endif
- restart(p_max_prio->thr);
- break;
- }
- }
-
-#if defined TEST_FOR_COMPARE_AND_SWAP
- if (!__pthread_has_cas)
-#endif
-#if !defined HAS_COMPARE_AND_SWAP || defined TEST_FOR_COMPARE_AND_SWAP
- {
- __pthread_release(&lock->__spinlock);
- }
-#endif
-}
-
-
-/* Compare-and-swap emulation with a spinlock */
-
-#ifdef TEST_FOR_COMPARE_AND_SWAP
-int __pthread_has_cas = 0;
-#endif
-
-#if !defined HAS_COMPARE_AND_SWAP || defined TEST_FOR_COMPARE_AND_SWAP
-
-int __pthread_compare_and_swap(long * ptr, long oldval, long newval,
- int * spinlock)
-{
- int res;
-
- __pthread_acquire(spinlock);
-
- if (*ptr == oldval) {
- *ptr = newval; res = 1;
- } else {
- res = 0;
- }
-
- __pthread_release(spinlock);
-
- return res;
-}
-
-#endif
-
-/* The retry strategy is as follows:
- - We test and set the spinlock MAX_SPIN_COUNT times, calling
- sched_yield() each time. This gives ample opportunity for other
- threads with priority >= our priority to make progress and
- release the spinlock.
- - If a thread with priority < our priority owns the spinlock,
- calling sched_yield() repeatedly is useless, since we're preventing
- the owning thread from making progress and releasing the spinlock.
- So, after MAX_SPIN_LOCK attemps, we suspend the calling thread
- using nanosleep(). This again should give time to the owning thread
- for releasing the spinlock.
- Notice that the nanosleep() interval must not be too small,
- since the kernel does busy-waiting for short intervals in a realtime
- process (!). The smallest duration that guarantees thread
- suspension is currently 2ms.
- - When nanosleep() returns, we try again, doing MAX_SPIN_COUNT
- sched_yield(), then sleeping again if needed. */
-
-static void __pthread_acquire(int * spinlock)
-{
- int cnt = 0;
- struct timespec tm;
-
- READ_MEMORY_BARRIER();
-
- while (testandset(spinlock)) {
- if (cnt < MAX_SPIN_COUNT) {
- sched_yield();
- cnt++;
- } else {
- tm.tv_sec = 0;
- tm.tv_nsec = SPIN_SLEEP_DURATION;
- nanosleep(&tm, NULL);
- cnt = 0;
- }
- }
-}
diff --git a/linuxthreads/spinlock.h b/linuxthreads/spinlock.h
deleted file mode 100644
index ff96fc3360..0000000000
--- a/linuxthreads/spinlock.h
+++ /dev/null
@@ -1,218 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1998 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-#include <bits/initspin.h>
-
-
-/* There are 2 compare and swap synchronization primitives with
- different semantics:
-
- 1. compare_and_swap, which has acquire semantics (i.e. it
- completes befor subsequent writes.)
- 2. compare_and_swap_with_release_semantics, which has release
- semantics (it completes after previous writes.)
-
- For those platforms on which they are the same. HAS_COMPARE_AND_SWAP
- should be defined. For those platforms on which they are different,
- HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS has to be defined. */
-
-#ifndef HAS_COMPARE_AND_SWAP
-#ifdef HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS
-#define HAS_COMPARE_AND_SWAP
-#endif
-#endif
-
-#if defined(TEST_FOR_COMPARE_AND_SWAP)
-
-extern int __pthread_has_cas;
-extern int __pthread_compare_and_swap(long * ptr, long oldval, long newval,
- int * spinlock);
-
-static inline int compare_and_swap(long * ptr, long oldval, long newval,
- int * spinlock)
-{
- if (__builtin_expect (__pthread_has_cas, 1))
- return __compare_and_swap(ptr, oldval, newval);
- else
- return __pthread_compare_and_swap(ptr, oldval, newval, spinlock);
-}
-
-#elif defined(HAS_COMPARE_AND_SWAP)
-
-#ifdef IMPLEMENT_TAS_WITH_CAS
-#define testandset(p) !__compare_and_swap((long int *) p, 0, 1)
-#endif
-
-#ifdef HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS
-
-static inline int
-compare_and_swap_with_release_semantics (long * ptr, long oldval,
- long newval, int * spinlock)
-{
- return __compare_and_swap_with_release_semantics (ptr, oldval,
- newval);
-}
-
-#endif
-
-static inline int compare_and_swap(long * ptr, long oldval, long newval,
- int * spinlock)
-{
- return __compare_and_swap(ptr, oldval, newval);
-}
-
-#else
-
-extern int __pthread_compare_and_swap(long * ptr, long oldval, long newval,
- int * spinlock);
-
-static inline int compare_and_swap(long * ptr, long oldval, long newval,
- int * spinlock)
-{
- return __pthread_compare_and_swap(ptr, oldval, newval, spinlock);
-}
-
-#endif
-
-#ifndef HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS
-#define compare_and_swap_with_release_semantics compare_and_swap
-#define __compare_and_swap_with_release_semantics __compare_and_swap
-#endif
-
-/* Internal locks */
-
-extern void internal_function __pthread_lock(struct _pthread_fastlock * lock,
- pthread_descr self);
-extern int __pthread_unlock(struct _pthread_fastlock *lock);
-
-static inline void __pthread_init_lock(struct _pthread_fastlock * lock)
-{
- lock->__status = 0;
- lock->__spinlock = __LT_SPINLOCK_INIT;
-}
-
-static inline int __pthread_trylock (struct _pthread_fastlock * lock)
-{
-#if defined TEST_FOR_COMPARE_AND_SWAP
- if (!__pthread_has_cas)
-#endif
-#if !defined HAS_COMPARE_AND_SWAP || defined TEST_FOR_COMPARE_AND_SWAP
- {
- return (testandset(&lock->__spinlock) ? EBUSY : 0);
- }
-#endif
-
-#if defined HAS_COMPARE_AND_SWAP
- do {
- if (lock->__status != 0) return EBUSY;
- } while(! __compare_and_swap(&lock->__status, 0, 1));
- return 0;
-#endif
-}
-
-/* Variation of internal lock used for pthread_mutex_t, supporting
- timed-out waits. Warning: do not mix these operations with the above ones
- over the same lock object! */
-
-extern void __pthread_alt_lock(struct _pthread_fastlock * lock,
- pthread_descr self);
-
-extern int __pthread_alt_timedlock(struct _pthread_fastlock * lock,
- pthread_descr self, const struct timespec *abstime);
-
-extern void __pthread_alt_unlock(struct _pthread_fastlock *lock);
-
-static inline void __pthread_alt_init_lock(struct _pthread_fastlock * lock)
-{
- lock->__status = 0;
- lock->__spinlock = __LT_SPINLOCK_INIT;
-}
-
-static inline int __pthread_alt_trylock (struct _pthread_fastlock * lock)
-{
-#if defined TEST_FOR_COMPARE_AND_SWAP
- if (!__pthread_has_cas)
-#endif
-#if !defined HAS_COMPARE_AND_SWAP || defined TEST_FOR_COMPARE_AND_SWAP
- {
- int res = EBUSY;
-
- if (testandset(&lock->__spinlock) == 0)
- {
- if (lock->__status == 0)
- {
- lock->__status = 1;
- WRITE_MEMORY_BARRIER();
- res = 0;
- }
- lock->__spinlock = __LT_SPINLOCK_INIT;
- }
- return res;
- }
-#endif
-
-#if defined HAS_COMPARE_AND_SWAP
- do {
- if (lock->__status != 0) return EBUSY;
- } while(! compare_and_swap(&lock->__status, 0, 1, &lock->__spinlock));
- return 0;
-#endif
-}
-
-/* Operations on pthread_atomic, which is defined in internals.h */
-
-static inline long atomic_increment(struct pthread_atomic *pa)
-{
- long oldval;
-
- do {
- oldval = pa->p_count;
- } while (!compare_and_swap(&pa->p_count, oldval, oldval + 1, &pa->p_spinlock));
-
- return oldval;
-}
-
-
-static inline long atomic_decrement(struct pthread_atomic *pa)
-{
- long oldval;
-
- do {
- oldval = pa->p_count;
- } while (!compare_and_swap(&pa->p_count, oldval, oldval - 1, &pa->p_spinlock));
-
- return oldval;
-}
-
-
-static inline __attribute__((always_inline)) void
-__pthread_set_own_extricate_if (pthread_descr self, pthread_extricate_if *peif)
-{
- /* Only store a non-null peif if the thread has cancellation enabled.
- Otherwise pthread_cancel will unconditionally call the extricate handler,
- and restart the thread giving rise to forbidden spurious wakeups. */
- if (peif == NULL
- || THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE)
- {
- /* If we are removing the extricate interface, we need to synchronize
- against pthread_cancel so that it does not continue with a pointer
- to a deallocated pthread_extricate_if struct! The thread lock
- is (ab)used for this synchronization purpose. */
- if (peif == NULL)
- __pthread_lock (THREAD_GETMEM(self, p_lock), self);
- THREAD_SETMEM(self, p_extricate, peif);
- if (peif == NULL)
- __pthread_unlock (THREAD_GETMEM(self, p_lock));
- }
-}
diff --git a/linuxthreads/sysdeps/alpha/elf/pt-initfini.c b/linuxthreads/sysdeps/alpha/elf/pt-initfini.c
deleted file mode 100644
index ee25582101..0000000000
--- a/linuxthreads/sysdeps/alpha/elf/pt-initfini.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* Special .init and .fini section support for Alpha. Linuxthreads version.
- Copyright (C) 2002, 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-/* This file is compiled into assembly code which is then munged by a sed
- script into two files: crti.s and crtn.s.
-
- * crti.s puts a function prologue at the beginning of the .init and .fini
- sections and defines global symbols for those addresses, so they can be
- called as functions.
-
- * crtn.s puts the corresponding function epilogues in the .init and .fini
- sections.
-
- This differs from what would be generated by the generic code in that
- we save and restore the GP within the function. In order for linker
- relaxation to work, the value in the GP register on exit from a function
- must be valid for the function entry point. Normally, a function is
- contained within one object file and this is not an issue, provided
- that the function reloads the gp after making any function calls.
- However, _init and _fini are constructed from pieces of many object
- files, all of which may have different GP values. So we must reload
- the GP value from crti.o in crtn.o. */
-
-__asm__ (" \n\
-#include \"defs.h\" \n\
- \n\
-/*@HEADER_ENDS*/ \n\
- \n\
-/*@_init_PROLOG_BEGINS*/ \n\
- .section .init, \"ax\", @progbits \n\
- .globl _init \n\
- .type _init,@function \n\
- .usepv _init,std \n\
-_init: \n\
- ldgp $29, 0($27) \n\
- subq $30, 16, $30 \n\
- stq $26, 0($30) \n\
- stq $29, 8($30) \n\
- jsr $26, __pthread_initialize_minimal \n\
- ldq $29, 8($30) \n\
- .align 3 \n\
-/*@_init_PROLOG_ENDS*/ \n\
- \n\
-/*@_init_EPILOG_BEGINS*/ \n\
- .section .init, \"ax\", @progbits \n\
- ldq $26, 0($30) \n\
- ldq $29, 8($30) \n\
- addq $30, 16, $30 \n\
- ret \n\
-/*@_init_EPILOG_ENDS*/ \n\
- \n\
-/*@_fini_PROLOG_BEGINS*/ \n\
- .section .fini, \"ax\", @progbits \n\
- .globl _fini \n\
- .type _fini,@function \n\
- .usepv _fini,std \n\
-_fini: \n\
- ldgp $29, 0($27) \n\
- subq $30, 16, $30 \n\
- stq $26, 0($30) \n\
- stq $29, 8($30) \n\
- .align 3 \n\
-/*@_fini_PROLOG_ENDS*/ \n\
- \n\
-/*@_fini_EPILOG_BEGINS*/ \n\
- .section .fini, \"ax\", @progbits \n\
- ldq $26, 0($30) \n\
- ldq $29, 8($30) \n\
- addq $30, 16, $30 \n\
- ret \n\
-/*@_fini_EPILOG_ENDS*/ \n\
- \n\
-/*@TRAILER_BEGINS*/ \n\
-");
diff --git a/linuxthreads/sysdeps/alpha/pspinlock.c b/linuxthreads/sysdeps/alpha/pspinlock.c
deleted file mode 100644
index 79b7836293..0000000000
--- a/linuxthreads/sysdeps/alpha/pspinlock.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/* POSIX spinlock implementation. Alpha version.
- Copyright (C) 2000 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include "internals.h"
-
-
-/* This implementation is similar to the one used in the Linux kernel.
- But the kernel is byte instructions for the memory access. This is
- faster but unusable here. The problem is that only 128
- threads/processes could use the spinlock at the same time. If (by
- a design error in the program) a thread/process would hold the
- spinlock for a time long enough to accumulate 128 waiting
- processes, the next one will find a positive value in the spinlock
- and assume it is unlocked. We cannot accept that. */
-
-int
-__pthread_spin_lock (pthread_spinlock_t *lock)
-{
- unsigned int tmp;
- asm volatile
- ("1: ldl_l %0,%1\n"
- " blbs %0,2f\n"
- " or %0,1,%0\n"
- " stl_c %0,%1\n"
- " beq %0,2f\n"
- " mb\n"
- ".subsection 2\n"
- "2: ldl %0,%1\n"
- " blbs %0,2b\n"
- " br 1b\n"
- ".previous"
- : "=r" (tmp), "=m" (lock)
- : "m" (lock));
- return 0;
-}
-weak_alias (__pthread_spin_lock, pthread_spin_lock)
-
-
-int
-__pthread_spin_trylock (pthread_spinlock_t *lock)
-{
- unsigned long int oldval;
- unsigned long int temp;
-
- asm volatile
- ("1: ldl_l %0,%1\n"
- " and %0,%3,%2\n"
- " bne %2,2f\n"
- " xor %0,%3,%0\n"
- " stl_c %0,%1\n"
- " beq %0,3f\n"
- " mb\n"
- "2:\n"
- ".subsection 2\n"
- "3: br 1b\n"
- ".previous"
- : "=&r" (temp), "=m" (*lock), "=&r" (oldval)
- : "Ir" (1UL), "m" (*lock));
-
- return oldval == 0 ? 0 : EBUSY;
-}
-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
-
-
-int
-__pthread_spin_unlock (pthread_spinlock_t *lock)
-{
- asm volatile ("mb");
- return *lock = 0;
-}
-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
-
-
-int
-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
-{
- /* We can ignore the `pshared' parameter. Since we are busy-waiting
- all processes which can access the memory location `lock' points
- to can use the spinlock. */
- *lock = 0;
- return 0;
-}
-weak_alias (__pthread_spin_init, pthread_spin_init)
-
-
-int
-__pthread_spin_destroy (pthread_spinlock_t *lock)
-{
- /* Nothing to do. */
- return 0;
-}
-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --git a/linuxthreads/sysdeps/alpha/pt-machine.h b/linuxthreads/sysdeps/alpha/pt-machine.h
deleted file mode 100644
index 853ac6f04a..0000000000
--- a/linuxthreads/sysdeps/alpha/pt-machine.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/* Machine-dependent pthreads configuration and inline functions.
- Alpha version.
- Copyright (C) 1996, 1997, 1998, 2000, 2002, 2003
- Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Richard Henderson <rth@tamu.edu>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _PT_MACHINE_H
-#define _PT_MACHINE_H 1
-
-#ifndef PT_EI
-# define PT_EI extern inline __attribute__ ((always_inline))
-#endif
-
-#ifdef __linux__
-# include <asm/pal.h>
-#else
-# include <machine/pal.h>
-#endif
-
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
-
-/* Get some notion of the current stack. Need not be exactly the top
- of the stack, just something somewhere in the current frame. */
-#define CURRENT_STACK_FRAME stack_pointer
-register char *stack_pointer __asm__("$30");
-
-
-/* Memory barrier; default is to do nothing */
-#define MEMORY_BARRIER() __asm__ __volatile__("mb" : : : "memory")
-/* Write barrier. */
-#define WRITE_MEMORY_BARRIER() __asm__ __volatile__("wmb" : : : "memory")
-
-
-/* Spinlock implementation; required. */
-PT_EI long int
-testandset (int *spinlock)
-{
- long int ret, temp;
-
- __asm__ __volatile__(
- "/* Inline spinlock test & set */\n"
- "1:\t"
- "ldl_l %0,%3\n\t"
- "bne %0,2f\n\t"
- "or $31,1,%1\n\t"
- "stl_c %1,%2\n\t"
- "beq %1,1b\n"
- "2:\tmb\n"
- "/* End spinlock test & set */"
- : "=&r"(ret), "=&r"(temp), "=m"(*spinlock)
- : "m"(*spinlock)
- : "memory");
-
- return ret;
-}
-
-
-/* Begin allocating thread stacks at this address. Default is to allocate
- them just below the initial program stack. */
-#define THREAD_STACK_START_ADDRESS 0x40000000000
-
-
-/* Return the thread descriptor for the current thread. */
-#define THREAD_SELF \
-({ \
- register pthread_descr __self __asm__("$0"); \
- __asm__ ("call_pal %1" : "=r"(__self) : "i"(PAL_rduniq)); \
- __self; \
-})
-
-/* Initialize the thread-unique value. */
-#define INIT_THREAD_SELF(descr, nr) \
-{ \
- register pthread_descr __self __asm__("$16") = (descr); \
- __asm__ __volatile__ ("call_pal %1" : : "r"(__self), "i"(PAL_wruniq)); \
-}
-
-
-/* Compare-and-swap for semaphores. */
-
-#define HAS_COMPARE_AND_SWAP
-PT_EI int
-__compare_and_swap (long int *p, long int oldval, long int newval)
-{
- long int ret;
-
- __asm__ __volatile__ (
- "/* Inline compare & swap */\n"
- "1:\t"
- "ldq_l %0,%4\n\t"
- "cmpeq %0,%2,%0\n\t"
- "beq %0,2f\n\t"
- "mov %3,%0\n\t"
- "stq_c %0,%1\n\t"
- "beq %0,1b\n\t"
- "2:\tmb\n"
- "/* End compare & swap */"
- : "=&r"(ret), "=m"(*p)
- : "r"(oldval), "r"(newval), "m"(*p)
- : "memory");
-
- return ret;
-}
-
-/* We want the OS to assign stack addresses. */
-#define FLOATING_STACKS 1
-
-/* Maximum size of the stack if the rlimit is unlimited. */
-#define ARCH_STACK_MAX_SIZE 32*1024*1024
-
-#endif /* pt-machine.h */
diff --git a/linuxthreads/sysdeps/alpha/tls.h b/linuxthreads/sysdeps/alpha/tls.h
deleted file mode 100644
index 1eabf5b890..0000000000
--- a/linuxthreads/sysdeps/alpha/tls.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/* Definitions for thread-local data handling. linuxthreads/Alpha version.
- Copyright (C) 2002, 2003, 2005 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _TLS_H
-#define _TLS_H
-
-#ifndef __ASSEMBLER__
-
-# include <pt-machine.h>
-# include <stdbool.h>
-# include <stddef.h>
-
-/* Type for the dtv. */
-typedef union dtv
-{
- size_t counter;
- struct
- {
- void *val;
- bool is_static;
- } pointer;
-} dtv_t;
-
-
-typedef struct
-{
- dtv_t *dtv;
-
- /* Reserved for the thread implementation. Unused in LinuxThreads. */
- void *private;
-} tcbhead_t;
-#endif
-
-
-#ifdef HAVE_TLS_SUPPORT
-
-/* Signal that TLS support is available. */
-# define USE_TLS 1
-
-# ifndef __ASSEMBLER__
-/* Get system call information. */
-# include <sysdep.h>
-
-/* This is the size of the initial TCB. */
-# define TLS_INIT_TCB_SIZE 0
-
-/* Alignment requirements for the initial TCB. */
-# define TLS_INIT_TCB_ALIGN __alignof__ (struct _pthread_descr_struct)
-
-/* This is the size of the TCB. */
-# define TLS_TCB_SIZE 0
-
-/* Alignment requirements for the TCB. */
-# define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct)
-
-/* This is the size we need before TCB. */
-# ifndef IS_IN_rtld
-# define TLS_PRE_TCB_SIZE \
- (sizeof (struct _pthread_descr_struct) \
- + ((sizeof (tcbhead_t) + TLS_TCB_ALIGN - 1) & ~(TLS_TCB_ALIGN - 1)))
-# else
-# include <nptl-struct-pthread.h>
-# define TLS_PRE_TCB_SIZE \
- ((sizeof (struct _pthread_descr_struct) > NPTL_STRUCT_PTHREAD_SIZE \
- ? sizeof (struct _pthread_descr_struct) : NPTL_STRUCT_PTHREAD_SIZE) \
- + ((sizeof (tcbhead_t) + TLS_TCB_ALIGN - 1) & ~(TLS_TCB_ALIGN - 1)))
-# endif
-
-/* The DTV is allocated at the TP; the TCB is placed elsewhere. */
-# define TLS_DTV_AT_TP 1
-
-/* The following assumes that TP (R2 or R13) points to the end of the
- TCB + 0x7000 (per the ABI). This implies that TCB address is
- TP - 0x7000. As we define TLS_DTV_AT_TP we can
- assume that the pthread struct is allocated immediately ahead of the
- TCB. This implies that the pthread_descr address is
- TP - (TLS_PRE_TCB_SIZE + 0x7000). */
-/* ??? PPC uses offset 0x7000; seems like a good idea for alpha too,
- but binutils not yet changed to match. */
-# define TLS_TCB_OFFSET 0
-
-/* Install the dtv pointer. The pointer passed is to the element with
- index -1 which contain the length. */
-# define INSTALL_DTV(TCBP, DTVP) \
- (((tcbhead_t *) (TCBP))[-1].dtv = (DTVP) + 1)
-
-/* Install new dtv for current thread. */
-# define INSTALL_NEW_DTV(DTV) \
- (THREAD_DTV() = (DTV))
-
-/* Return dtv of given thread descriptor. */
-# define GET_DTV(TCBP) \
- (((tcbhead_t *) (TCBP))[-1].dtv)
-
-/* Code to initially initialize the thread pointer. This might need
- special attention since 'errno' is not yet available and if the
- operation can cause a failure 'errno' must not be touched. */
-# define TLS_INIT_TP(TCBP, SECONDCALL) \
- (__builtin_set_thread_pointer ((void *) (TCBP) + TLS_TCB_OFFSET), NULL)
-
-/* Return the address of the dtv for the current thread. */
-# define THREAD_DTV() \
- (((tcbhead_t *) (__builtin_thread_pointer () - TLS_TCB_OFFSET))[-1].dtv)
-
-/* Return the thread descriptor for the current thread. */
-# undef THREAD_SELF
-# define THREAD_SELF \
- ((pthread_descr) (__builtin_thread_pointer () \
- - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE))
-
-# undef INIT_THREAD_SELF
-# define INIT_THREAD_SELF(DESCR, NR) \
- __builtin_set_thread_pointer ((char *)(DESCR) \
- + TLS_TCB_OFFSET + TLS_PRE_TCB_SIZE)
-
-/* Get the thread descriptor definition. */
-# include <linuxthreads/descr.h>
-
-/* ??? Generic bits of LinuxThreads may call these macros with
- DESCR set to NULL. We are expected to be able to reference
- the "current" value.
-
- In our case, we'd really prefer to use DESCR, since lots of
- PAL_code calls would be expensive. We can only trust that
- the compiler does its job and unifies the multiple
- __builtin_thread_pointer instances. */
-
-#define THREAD_GETMEM(descr, member) \
- ((void) sizeof (descr), THREAD_SELF->member)
-#define THREAD_GETMEM_NC(descr, member) \
- ((void) sizeof (descr), THREAD_SELF->member)
-#define THREAD_SETMEM(descr, member, value) \
- ((void) sizeof (descr), THREAD_SELF->member = (value))
-#define THREAD_SETMEM_NC(descr, member, value) \
- ((void) sizeof (descr), THREAD_SELF->member = (value))
-
-# endif /* HAVE_TLS_SUPPORT */
-#endif /* __ASSEMBLER__ */
-
-#endif /* tls.h */
diff --git a/linuxthreads/sysdeps/cris/pspinlock.c b/linuxthreads/sysdeps/cris/pspinlock.c
deleted file mode 100644
index 402e838c00..0000000000
--- a/linuxthreads/sysdeps/cris/pspinlock.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/* POSIX spinlock implementation. CRIS version.
- Copyright (C) 2000, 2001 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include "internals.h"
-
-/* FIXME: These are just dummies. I don't know why or if they're needed;
- configury should default to these definitions. We just follow the
- crowd here. */
-
-int
-__pthread_spin_lock (pthread_spinlock_t *lock)
-{
- while (testandset (lock) != 0)
- ;
-
- return 0;
-}
-weak_alias (__pthread_spin_lock, pthread_spin_lock)
-
-
-int
-__pthread_spin_trylock (pthread_spinlock_t *lock)
-{
- return testandset (lock) != 0 ? EBUSY : 0;
-}
-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
-
-
-int
-__pthread_spin_unlock (pthread_spinlock_t *lock)
-{
- return *lock = 0;
-}
-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
-
-
-int
-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
-{
- /* We can ignore the `pshared' parameter. Since we are busy-waiting
- all processes which can access the memory location `lock' points
- to can use the spinlock. */
- return *lock = 0;
-}
-weak_alias (__pthread_spin_init, pthread_spin_init)
-
-
-int
-__pthread_spin_destroy (pthread_spinlock_t *lock)
-{
- /* Nothing to do. */
- return 0;
-}
-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --git a/linuxthreads/sysdeps/cris/pt-machine.h b/linuxthreads/sysdeps/cris/pt-machine.h
deleted file mode 100644
index 431da7101d..0000000000
--- a/linuxthreads/sysdeps/cris/pt-machine.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Machine-dependent pthreads configuration and inline functions.
- CRIS version.
- Copyright (C) 2001, 2002, 2003 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _PT_MACHINE_H
-#define _PT_MACHINE_H 1
-
-#ifndef PT_EI
-# define PT_EI extern inline __attribute__ ((always_inline))
-#endif
-
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
-
-PT_EI long int
-testandset (int *spinlock)
-{
- register unsigned long int ret;
-
- /* Note the use of a dummy output of *spinlock to expose the write. The
- memory barrier is to stop *other* writes being moved past this code. */
- __asm__ __volatile__("clearf\n"
- "0:\n\t"
- "movu.b [%2],%0\n\t"
- "ax\n\t"
- "move.b %3,[%2]\n\t"
- "bwf 0b\n\t"
- "clearf"
- : "=&r" (ret), "=m" (*spinlock)
- : "r" (spinlock), "r" ((int) 1)
- : "memory");
- return ret;
-}
-
-
-/* Get some notion of the current stack. Need not be exactly the top
- of the stack, just something somewhere in the current frame.
- I don't trust register variables, so let's do this the safe way. */
-#define CURRENT_STACK_FRAME \
- ({ char *sp; __asm__ ("move.d $sp,%0" : "=rm" (sp)); sp; })
-
-#endif /* pt-machine.h */
diff --git a/linuxthreads/sysdeps/hppa/pspinlock.c b/linuxthreads/sysdeps/hppa/pspinlock.c
deleted file mode 100644
index 7f481fa4b6..0000000000
--- a/linuxthreads/sysdeps/hppa/pspinlock.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/* POSIX spinlock implementation. hppa version.
- Copyright (C) 2000 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include "internals.h"
-
-int
-__pthread_spin_lock (pthread_spinlock_t *lock)
-{
- unsigned int val;
-
- do
- asm volatile ("ldcw %1,%0"
- : "=r" (val), "=m" (*lock)
- : "m" (*lock));
- while (!val);
-
- return 0;
-}
-weak_alias (__pthread_spin_lock, pthread_spin_lock)
-
-
-int
-__pthread_spin_trylock (pthread_spinlock_t *lock)
-{
- unsigned int val;
-
- asm volatile ("ldcw %1,%0"
- : "=r" (val), "=m" (*lock)
- : "m" (*lock));
-
- return val ? 0 : EBUSY;
-}
-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
-
-
-int
-__pthread_spin_unlock (pthread_spinlock_t *lock)
-{
- *lock = 1;
- return 0;
-}
-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
-
-
-int
-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
-{
- /* We can ignore the `pshared' parameter. Since we are busy-waiting
- all processes which can access the memory location `lock' points
- to can use the spinlock. */
- *lock = 1;
- return 0;
-}
-weak_alias (__pthread_spin_init, pthread_spin_init)
-
-
-int
-__pthread_spin_destroy (pthread_spinlock_t *lock)
-{
- /* Nothing to do. */
- return 0;
-}
-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --git a/linuxthreads/sysdeps/hppa/pt-machine.h b/linuxthreads/sysdeps/hppa/pt-machine.h
deleted file mode 100644
index abc25c4ca4..0000000000
--- a/linuxthreads/sysdeps/hppa/pt-machine.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Machine-dependent pthreads configuration and inline functions.
- hppa version.
- Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Richard Henderson <rth@tamu.edu>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _PT_MACHINE_H
-#define _PT_MACHINE_H 1
-
-#include <bits/initspin.h>
-
-#ifndef PT_EI
-# define PT_EI extern inline __attribute__ ((always_inline))
-#endif
-
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
-
-/* Get some notion of the current stack. Need not be exactly the top
- of the stack, just something somewhere in the current frame. */
-#define CURRENT_STACK_FRAME stack_pointer
-register char * stack_pointer __asm__ ("%r30");
-
-
-/* The hppa only has one atomic read and modify memory operation,
- load and clear, so hppa spinlocks must use zero to signify that
- someone is holding the lock. */
-
-#define xstr(s) str(s)
-#define str(s) #s
-/* Spinlock implementation; required. */
-PT_EI long int
-testandset (int *spinlock)
-{
- int ret;
-
- __asm__ __volatile__(
- "ldcw 0(%2),%0"
- : "=r"(ret), "=m"(*spinlock)
- : "r"(spinlock));
-
- return ret == 0;
-}
-#undef str
-#undef xstr
-
-#endif /* pt-machine.h */
diff --git a/linuxthreads/sysdeps/i386/Makefile b/linuxthreads/sysdeps/i386/Makefile
deleted file mode 100644
index d920e059a2..0000000000
--- a/linuxthreads/sysdeps/i386/Makefile
+++ /dev/null
@@ -1,23 +0,0 @@
-ifeq ($(subdir),linuxthreads)
-# On i686 we must avoid generating the trampoline functions generated
-# to get the GOT pointer.
-CFLAGS-pt-initfini.s += -march=i386 -mtune=i386
-
-# Most files must not be compiled without frame pointer since we need
-# the frame base address which is stored in %ebp unless the frame pointer
-# is optimized out.
-CFLAGS-cancel.c += -fno-omit-frame-pointer -mpreferred-stack-boundary=4
-CFLAGS-condvar.c += -fno-omit-frame-pointer
-CFLAGS-join.c += -fno-omit-frame-pointer
-CFLAGS-manager.c += -fno-omit-frame-pointer -mpreferred-stack-boundary=4
-CFLAGS-oldsemaphore.c += -fno-omit-frame-pointer
-CFLAGS-pthread.c += -fno-omit-frame-pointer -mpreferred-stack-boundary=4
-CFLAGS-ptlongjmp.c += -fno-omit-frame-pointer
-CFLAGS-semaphore.c += -fno-omit-frame-pointer
-CFLAGS-sighandler.c += -fno-omit-frame-pointer -mpreferred-stack-boundary=4
-CFLAGS-tst-align.c += -mpreferred-stack-boundary=4
-endif
-
-ifeq ($(subdir),csu)
-gen-as-const-headers += tcb-offsets.sym
-endif
diff --git a/linuxthreads/sysdeps/i386/i586/Versions b/linuxthreads/sysdeps/i386/i586/Versions
deleted file mode 100644
index 32da57080d..0000000000
--- a/linuxthreads/sysdeps/i386/i586/Versions
+++ /dev/null
@@ -1,5 +0,0 @@
-libpthread {
- GLIBC_PRIVATE {
- __pthread_clock_gettime; __pthread_clock_settime;
- }
-}
diff --git a/linuxthreads/sysdeps/i386/i686/Versions b/linuxthreads/sysdeps/i386/i686/Versions
deleted file mode 100644
index 32da57080d..0000000000
--- a/linuxthreads/sysdeps/i386/i686/Versions
+++ /dev/null
@@ -1,5 +0,0 @@
-libpthread {
- GLIBC_PRIVATE {
- __pthread_clock_gettime; __pthread_clock_settime;
- }
-}
diff --git a/linuxthreads/sysdeps/i386/i686/pt-machine.h b/linuxthreads/sysdeps/i386/i686/pt-machine.h
deleted file mode 100644
index 1c75bf9807..0000000000
--- a/linuxthreads/sysdeps/i386/i686/pt-machine.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Machine-dependent pthreads configuration and inline functions.
- i686 version.
- Copyright (C) 1996-2001, 2002, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Richard Henderson <rth@tamu.edu>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _PT_MACHINE_H
-#define _PT_MACHINE_H 1
-
-#ifndef PT_EI
-# define PT_EI extern inline __attribute__ ((always_inline))
-#endif
-#include "kernel-features.h"
-
-#ifndef __ASSEMBLER__
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
-
-/* Get some notion of the current stack. Need not be exactly the top
- of the stack, just something somewhere in the current frame. */
-#define CURRENT_STACK_FRAME __builtin_frame_address (0)
-
-
-/* Spinlock implementation; required. */
-PT_EI long int
-testandset (int *spinlock)
-{
- long int ret;
-
- __asm__ __volatile__ (
- "xchgl %0, %1"
- : "=r" (ret), "=m" (*spinlock)
- : "0" (1), "m" (*spinlock)
- : "memory");
-
- return ret;
-}
-
-
-/* Compare-and-swap for semaphores. It's always available on i686. */
-#define HAS_COMPARE_AND_SWAP
-
-PT_EI int
-__compare_and_swap (long int *p, long int oldval, long int newval)
-{
- char ret;
- long int readval;
-
- __asm__ __volatile__ ("lock; cmpxchgl %3, %1; sete %0"
- : "=q" (ret), "=m" (*p), "=a" (readval)
- : "r" (newval), "m" (*p), "a" (oldval)
- : "memory");
- return ret;
-}
-#endif
-
-#if __ASSUME_LDT_WORKS > 0
-#include "../useldt.h"
-#endif
-
-/* The P4 and above really want some help to prevent overheating. */
-#define BUSY_WAIT_NOP __asm__ ("rep; nop")
-
-#endif /* pt-machine.h */
diff --git a/linuxthreads/sysdeps/i386/pspinlock.c b/linuxthreads/sysdeps/i386/pspinlock.c
deleted file mode 100644
index 6a70093957..0000000000
--- a/linuxthreads/sysdeps/i386/pspinlock.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/* POSIX spinlock implementation. x86 version.
- Copyright (C) 2000, 2002 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include "internals.h"
-#include "kernel-features.h"
-
-
-/* This implementation is similar to the one used in the Linux kernel.
- But the kernel is byte instructions for the memory access. This is
- faster but unusable here. The problem is that only 128
- threads/processes could use the spinlock at the same time. If (by
- a design error in the program) a thread/process would hold the
- spinlock for a time long enough to accumulate 128 waiting
- processes, the next one will find a positive value in the spinlock
- and assume it is unlocked. We cannot accept that. */
-
-int
-__pthread_spin_lock (pthread_spinlock_t *lock)
-{
- asm volatile
- ("\n"
- "1:\n\t"
- "lock; decl %0\n\t"
- "js 2f\n\t"
- ".section .text.spinlock,\"ax\"\n"
- "2:\n\t"
- "cmpl $0,%0\n\t"
- "rep; nop\n\t"
- "jle 2b\n\t"
- "jmp 1b\n\t"
- ".previous"
- : "=m" (*lock));
- return 0;
-}
-weak_alias (__pthread_spin_lock, pthread_spin_lock)
-
-
-int
-__pthread_spin_trylock (pthread_spinlock_t *lock)
-{
- int oldval;
-
- asm volatile
- ("xchgl %0,%1"
- : "=r" (oldval), "=m" (*lock)
- : "0" (0));
- return oldval > 0 ? 0 : EBUSY;
-}
-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
-
-
-int
-__pthread_spin_unlock (pthread_spinlock_t *lock)
-{
- asm volatile
- ("movl $1,%0"
- : "=m" (*lock));
- return 0;
-}
-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
-
-
-int
-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
-{
- /* We can ignore the `pshared' parameter. Since we are busy-waiting
- all processes which can access the memory location `lock' points
- to can use the spinlock. */
- *lock = 1;
- return 0;
-}
-weak_alias (__pthread_spin_init, pthread_spin_init)
-
-
-int
-__pthread_spin_destroy (pthread_spinlock_t *lock)
-{
- /* Nothing to do. */
- return 0;
-}
-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
-
-#ifndef __ASSUME_SET_THREAD_AREA_SYSCALL
-int __have_no_set_thread_area;
-#endif
diff --git a/linuxthreads/sysdeps/i386/pt-machine.h b/linuxthreads/sysdeps/i386/pt-machine.h
deleted file mode 100644
index 0df096d152..0000000000
--- a/linuxthreads/sysdeps/i386/pt-machine.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/* Machine-dependent pthreads configuration and inline functions.
- i386 version.
- Copyright (C) 1996-2001, 2002, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Richard Henderson <rth@tamu.edu>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _PT_MACHINE_H
-#define _PT_MACHINE_H 1
-
-#ifndef __ASSEMBLER__
-#ifndef PT_EI
-# define PT_EI extern inline __attribute__ ((always_inline))
-#endif
-
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
-
-/* Get some notion of the current stack. Need not be exactly the top
- of the stack, just something somewhere in the current frame. */
-#define CURRENT_STACK_FRAME __builtin_frame_address (0)
-
-
-/* Spinlock implementation; required. */
-PT_EI long int
-testandset (int *spinlock)
-{
- long int ret;
-
- __asm__ __volatile__(
- "xchgl %0, %1"
- : "=r"(ret), "=m"(*spinlock)
- : "0"(1), "m"(*spinlock)
- : "memory");
-
- return ret;
-}
-
-
-/* Compare-and-swap for semaphores.
- Available on the 486 and above, but not on the 386.
- We test dynamically whether it's available or not. */
-
-#define HAS_COMPARE_AND_SWAP
-#define TEST_FOR_COMPARE_AND_SWAP
-
-PT_EI int
-__compare_and_swap (long int *p, long int oldval, long int newval)
-{
- char ret;
- long int readval;
-
- __asm__ __volatile__ ("lock; cmpxchgl %3, %1; sete %0"
- : "=q" (ret), "=m" (*p), "=a" (readval)
- : "r" (newval), "m" (*p), "a" (oldval)
- : "memory");
- return ret;
-}
-
-
-PT_EI int
-get_eflags (void)
-{
- int res;
- __asm__ __volatile__ ("pushfl; popl %0" : "=r" (res) : );
- return res;
-}
-
-
-PT_EI void
-set_eflags (int newflags)
-{
- __asm__ __volatile__ ("pushl %0; popfl" : : "r" (newflags) : "cc");
-}
-
-
-PT_EI int
-compare_and_swap_is_available (void)
-{
- int oldflags = get_eflags ();
- int changed;
- /* Flip AC bit in EFLAGS. */
- set_eflags (oldflags ^ 0x40000);
- /* See if bit changed. */
- changed = (get_eflags () ^ oldflags) & 0x40000;
- /* Restore EFLAGS. */
- set_eflags (oldflags);
- /* If the AC flag did not change, it's a 386 and it lacks cmpxchg.
- Otherwise, it's a 486 or above and it has cmpxchg. */
- return changed != 0;
-}
-#endif /* __ASSEMBLER__ */
-
-#endif /* pt-machine.h */
diff --git a/linuxthreads/sysdeps/i386/tcb-offsets.sym b/linuxthreads/sysdeps/i386/tcb-offsets.sym
deleted file mode 100644
index 69a5018d88..0000000000
--- a/linuxthreads/sysdeps/i386/tcb-offsets.sym
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <sysdep.h>
-#include <tls.h>
-
-MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads)
-#ifdef NEED_DL_SYSINFO
-SYSINFO_OFFSET offsetof (tcbhead_t, sysinfo)
-#endif
diff --git a/linuxthreads/sysdeps/i386/tls.h b/linuxthreads/sysdeps/i386/tls.h
deleted file mode 100644
index f5d555baec..0000000000
--- a/linuxthreads/sysdeps/i386/tls.h
+++ /dev/null
@@ -1,237 +0,0 @@
-/* Definition for thread-local data handling. linuxthreads/i386 version.
- Copyright (C) 2002, 2003, 2004, 2005 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _TLS_H
-#define _TLS_H
-
-# include <dl-sysdep.h>
-# include <pt-machine.h>
-
-#ifndef __ASSEMBLER__
-# include <stdbool.h>
-# include <stddef.h>
-# include <stdint.h>
-
-/* Type for the dtv. */
-typedef union dtv
-{
- size_t counter;
- struct
- {
- void *val;
- bool is_static;
- } pointer;
-} dtv_t;
-
-
-typedef struct
-{
- void *tcb; /* Pointer to the TCB. Not necessary the
- thread descriptor used by libpthread. */
- dtv_t *dtv;
- void *self; /* Pointer to the thread descriptor. */
- int multiple_threads;
-#ifdef NEED_DL_SYSINFO
- uintptr_t sysinfo;
-#endif
-} tcbhead_t;
-
-#else /* __ASSEMBLER__ */
-# include <tcb-offsets.h>
-#endif
-
-/* We can support TLS only if the floating-stack support is available.
- However, we want to compile in the support and test at runtime whether
- the running kernel can support it or not. To avoid bothering with the
- TLS support code at all, use configure --without-tls.
-
- We need USE_TLS to be consistently defined, for ldsodefs.h conditionals.
- But some of the code below can cause problems in building libpthread
- (e.g. useldt.h will defined FLOATING_STACKS when it shouldn't). */
-
-#if defined HAVE_TLS_SUPPORT \
- && (defined FLOATING_STACKS || !defined IS_IN_libpthread)
-
-/* Signal that TLS support is available. */
-# define USE_TLS 1
-
-# ifndef __ASSEMBLER__
-/* Get system call information. */
-# include <sysdep.h>
-
-
-/* Get the thread descriptor definition. */
-# include <linuxthreads/descr.h>
-
-/* This is the size of the initial TCB. */
-# define TLS_INIT_TCB_SIZE sizeof (tcbhead_t)
-
-/* Alignment requirements for the initial TCB. */
-# define TLS_INIT_TCB_ALIGN __alignof__ (tcbhead_t)
-
-/* This is the size of the TCB. */
-# ifndef IS_IN_rtld
-# define TLS_TCB_SIZE sizeof (struct _pthread_descr_struct)
-# else
-# include <nptl-struct-pthread.h>
-# define TLS_TCB_SIZE \
- (sizeof (struct _pthread_descr_struct) > NPTL_STRUCT_PTHREAD_SIZE \
- ? sizeof (struct _pthread_descr_struct) : NPTL_STRUCT_PTHREAD_SIZE)
-# endif
-
-/* Alignment requirements for the TCB. */
-# define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct)
-
-/* The TCB can have any size and the memory following the address the
- thread pointer points to is unspecified. Allocate the TCB there. */
-# define TLS_TCB_AT_TP 1
-
-
-/* Install the dtv pointer. The pointer passed is to the element with
- index -1 which contain the length. */
-# define INSTALL_DTV(descr, dtvp) \
- ((tcbhead_t *) (descr))->dtv = (dtvp) + 1
-
-/* Install new dtv for current thread. */
-# define INSTALL_NEW_DTV(dtv) \
- ({ struct _pthread_descr_struct *__descr; \
- THREAD_SETMEM (__descr, p_header.data.dtvp, (dtv)); })
-
-/* Return dtv of given thread descriptor. */
-# define GET_DTV(descr) \
- (((tcbhead_t *) (descr))->dtv)
-
-# ifdef __PIC__
-# define TLS_EBX_ARG "r"
-# define TLS_LOAD_EBX "xchgl %3, %%ebx\n\t"
-# else
-# define TLS_EBX_ARG "b"
-# define TLS_LOAD_EBX
-# endif
-
-# if !defined IS_IN_linuxthreads && !defined DO_MODIFY_LDT
-# include "useldt.h" /* For the structure. */
-# endif
-# if __ASSUME_LDT_WORKS > 0
-# define TLS_DO_MODIFY_LDT_KERNEL_CHECK(doit) (doit) /* Nothing to check. */
-# else
-# define TLS_DO_MODIFY_LDT_KERNEL_CHECK(doit) \
- (__builtin_expect (GLRO(dl_osversion) < 131939, 0) \
- ? "kernel too old for thread-local storage support\n" \
- : (doit))
-# endif
-
-# define TLS_DO_MODIFY_LDT(descr, nr) \
-TLS_DO_MODIFY_LDT_KERNEL_CHECK( \
-({ \
- struct modify_ldt_ldt_s ldt_entry = \
- { nr, (unsigned long int) (descr), 0xfffff /* 4GB in pages */, \
- 1, 0, 0, 1, 0, 1, 0 }; \
- int result; \
- asm volatile (TLS_LOAD_EBX \
- "int $0x80\n\t" \
- TLS_LOAD_EBX \
- : "=a" (result) \
- : "0" (__NR_modify_ldt), \
- /* The extra argument with the "m" constraint is necessary \
- to let the compiler know that we are accessing LDT_ENTRY \
- here. */ \
- "m" (ldt_entry), TLS_EBX_ARG (1), "c" (&ldt_entry), \
- "d" (sizeof (ldt_entry))); \
- __builtin_expect (result, 0) == 0 \
- ? ({ asm ("movw %w0, %%gs" : : "q" ((nr) * 8 + 7)); NULL; }) \
- : "cannot set up LDT for thread-local storage\n"; \
-}))
-
-# define TLS_DO_SET_THREAD_AREA(descr, secondcall) \
-({ \
- struct modify_ldt_ldt_s ldt_entry = \
- { -1, (unsigned long int) (descr), 0xfffff /* 4GB in pages */, \
- 1, 0, 0, 1, 0, 1, 0 }; \
- int result; \
- if (secondcall) \
- ldt_entry.entry_number = ({ int _gs; \
- asm ("movw %%gs, %w0" : "=q" (_gs)); \
- (_gs & 0xffff) >> 3; }); \
- asm volatile (TLS_LOAD_EBX \
- "int $0x80\n\t" \
- TLS_LOAD_EBX \
- : "=a" (result), "=m" (ldt_entry.entry_number) \
- : "0" (__NR_set_thread_area), \
- /* The extra argument with the "m" constraint is necessary \
- to let the compiler know that we are accessing LDT_ENTRY \
- here. */ \
- TLS_EBX_ARG (&ldt_entry), "m" (ldt_entry)); \
- if (__builtin_expect (result, 0) == 0) \
- asm ("movw %w0, %%gs" : : "q" (ldt_entry.entry_number * 8 + 3)); \
- result; \
-})
-
-# ifdef __ASSUME_SET_THREAD_AREA_SYSCALL
-# define TLS_SETUP_GS_SEGMENT(descr, secondcall) \
- (TLS_DO_SET_THREAD_AREA (descr, secondcall) \
- ? "set_thread_area failed when setting up thread-local storage\n" : NULL)
-# elif defined __NR_set_thread_area
-# define TLS_SETUP_GS_SEGMENT(descr, secondcall) \
- (TLS_DO_SET_THREAD_AREA (descr, secondcall) \
- ? TLS_DO_MODIFY_LDT (descr, 0) : NULL)
-# else
-# define TLS_SETUP_GS_SEGMENT(descr, secondcall) \
- TLS_DO_MODIFY_LDT ((descr), 0)
-# endif
-
-#if defined NEED_DL_SYSINFO
-# define INIT_SYSINFO \
- head->sysinfo = GLRO(dl_sysinfo)
-#else
-# define INIT_SYSINFO
-#endif
-
-/* Code to initially initialize the thread pointer. This might need
- special attention since 'errno' is not yet available and if the
- operation can cause a failure 'errno' must not be touched.
-
- The value of this macro is null if successful, or an error string. */
-# define TLS_INIT_TP(descr, secondcall) \
- ({ \
- void *_descr = (descr); \
- tcbhead_t *head = _descr; \
- \
- head->tcb = _descr; \
- /* For now the thread descriptor is at the same address. */ \
- head->self = _descr; \
- \
- INIT_SYSINFO; \
- TLS_SETUP_GS_SEGMENT (_descr, secondcall); \
- })
-
-/* Indicate that dynamic linker shouldn't try to initialize TLS even
- when no PT_TLS segments are found in the program and libraries
- it is linked against. */
-# define TLS_INIT_TP_EXPENSIVE 1
-
-/* Return the address of the dtv for the current thread. */
-# define THREAD_DTV() \
- ({ struct _pthread_descr_struct *__descr; \
- THREAD_GETMEM (__descr, p_header.data.dtvp); })
-
-# endif /* HAVE_TLS_SUPPORT && (FLOATING_STACKS || !IS_IN_libpthread) */
-#endif /* __ASSEMBLER__ */
-
-#endif /* tls.h */
diff --git a/linuxthreads/sysdeps/i386/useldt.h b/linuxthreads/sysdeps/i386/useldt.h
deleted file mode 100644
index 4ac82f1ab0..0000000000
--- a/linuxthreads/sysdeps/i386/useldt.h
+++ /dev/null
@@ -1,314 +0,0 @@
-/* Special definitions for ix86 machine using segment register based
- thread descriptor.
- Copyright (C) 1998, 2000, 2001, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef __ASSEMBLER__
-#include <stddef.h> /* For offsetof. */
-#include <stdlib.h> /* For abort(). */
-#include <sysdep.h>
-
-
-/* We don't want to include the kernel header. So duplicate the
- information. */
-
-/* Structure passed on `modify_ldt' call. */
-struct modify_ldt_ldt_s
-{
- unsigned int entry_number;
- unsigned long int base_addr;
- unsigned int limit;
- unsigned int seg_32bit:1;
- unsigned int contents:2;
- unsigned int read_exec_only:1;
- unsigned int limit_in_pages:1;
- unsigned int seg_not_present:1;
- unsigned int useable:1;
- unsigned int empty:25;
-};
-
-/* System call to set LDT entry. */
-extern int __modify_ldt (int, struct modify_ldt_ldt_s *, size_t);
-
-
-/* Return the thread descriptor for the current thread.
-
- The contained asm must *not* be marked volatile since otherwise
- assignments like
- pthread_descr self = thread_self();
- do not get optimized away. */
-#define THREAD_SELF \
-({ \
- register pthread_descr __self; \
- __asm__ ("movl %%gs:%c1,%0" : "=r" (__self) \
- : "i" (offsetof (struct _pthread_descr_struct, \
- p_header.data.self))); \
- __self; \
-})
-
-
-/* Initialize the thread-unique value. Two possible ways to do it. */
-
-#define DO_MODIFY_LDT(descr, nr) \
-({ \
- struct modify_ldt_ldt_s ldt_entry = \
- { nr, (unsigned long int) (descr), 0xfffff /* 4GB in pages */, \
- 1, 0, 0, 1, 0, 1, 0 }; \
- if (__modify_ldt (1, &ldt_entry, sizeof (ldt_entry)) != 0) \
- abort (); \
- asm ("movw %w0, %%gs" : : "q" (nr * 8 + 7)); \
-})
-
-#ifdef __PIC__
-# define USETLS_EBX_ARG "r"
-# define USETLS_LOAD_EBX "xchgl %1, %%ebx\n\t"
-#else
-# define USETLS_EBX_ARG "b"
-# define USETLS_LOAD_EBX
-#endif
-
-/* When using the new set_thread_area call, we don't need to change %gs
- because we inherited the value set up in the main thread by TLS setup.
- We need to extract that value and set up the same segment in this
- thread. */
-#if USE_TLS
-# define DO_SET_THREAD_AREA_REUSE(nr) 1
-#else
-/* Without TLS, we do the initialization of the main thread, where NR == 0. */
-# define DO_SET_THREAD_AREA_REUSE(nr) (!__builtin_constant_p (nr) || (nr))
-#endif
-#define DO_SET_THREAD_AREA(descr, nr) \
-({ \
- int __gs; \
- if (DO_SET_THREAD_AREA_REUSE (nr)) \
- { \
- asm ("movw %%gs, %w0" : "=q" (__gs)); \
- struct modify_ldt_ldt_s ldt_entry = \
- { (__gs & 0xffff) >> 3, \
- (unsigned long int) (descr), 0xfffff /* 4GB in pages */, \
- 1, 0, 0, 1, 0, 1, 0 }; \
- \
- int __result; \
- __asm (USETLS_LOAD_EBX \
- "movl %2, %%eax\n\t" \
- "int $0x80\n\t" \
- USETLS_LOAD_EBX \
- : "=&a" (__result) \
- : USETLS_EBX_ARG (&ldt_entry), "i" (__NR_set_thread_area), \
- "m" (ldt_entry) \
- : "memory"); \
- if (__result == 0) \
- asm ("movw %w0, %%gs" :: "q" (__gs)); \
- else \
- __gs = -1; \
- } \
- else \
- { \
- struct modify_ldt_ldt_s ldt_entry = \
- { -1, \
- (unsigned long int) (descr), 0xfffff /* 4GB in pages */, \
- 1, 0, 0, 1, 0, 1, 0 }; \
- int __result; \
- __asm (USETLS_LOAD_EBX \
- "movl %2, %%eax\n\t" \
- "int $0x80\n\t" \
- USETLS_LOAD_EBX \
- : "=&a" (__result) \
- : USETLS_EBX_ARG (&ldt_entry), "i" (__NR_set_thread_area), \
- "m" (ldt_entry) \
- : "memory"); \
- if (__result == 0) \
- { \
- __gs = (ldt_entry.entry_number << 3) + 3; \
- asm ("movw %w0, %%gs" : : "q" (__gs)); \
- } \
- else \
- __gs = -1; \
- } \
- __gs; \
-})
-
-#if defined __ASSUME_SET_THREAD_AREA_SYSCALL
-# define INIT_THREAD_SELF(descr, nr) DO_SET_THREAD_AREA (descr, nr)
-#elif defined __NR_set_thread_area
-# define INIT_THREAD_SELF(descr, nr) \
-({ \
- if (__builtin_expect (__have_no_set_thread_area, 0) \
- || (DO_SET_THREAD_AREA (descr, DO_SET_THREAD_AREA_REUSE (nr)) == -1 \
- && (__have_no_set_thread_area = 1))) \
- DO_MODIFY_LDT (descr, nr); \
-})
-/* Defined in pspinlock.c. */
-extern int __have_no_set_thread_area;
-#else
-# define INIT_THREAD_SELF(descr, nr) DO_MODIFY_LDT (descr, nr)
-#endif
-
-/* Free resources associated with thread descriptor. */
-#ifdef __ASSUME_SET_THREAD_AREA_SYSCALL
-#define FREE_THREAD(descr, nr) do { } while (0)
-#elif defined __NR_set_thread_area
-#define FREE_THREAD(descr, nr) \
-{ \
- int __gs; \
- __asm__ __volatile__ ("movw %%gs, %w0" : "=q" (__gs)); \
- if (__builtin_expect (__gs & 4, 0)) \
- { \
- struct modify_ldt_ldt_s ldt_entry = \
- { nr, 0, 0, 0, 0, 1, 0, 1, 0, 0 }; \
- __modify_ldt (1, &ldt_entry, sizeof (ldt_entry)); \
- } \
-}
-#else
-#define FREE_THREAD(descr, nr) \
-{ \
- struct modify_ldt_ldt_s ldt_entry = \
- { nr, 0, 0, 0, 0, 1, 0, 1, 0, 0 }; \
- __modify_ldt (1, &ldt_entry, sizeof (ldt_entry)); \
-}
-#endif
-
-/* Read member of the thread descriptor directly. */
-#define THREAD_GETMEM(descr, member) \
-({ \
- __typeof__ (descr->member) __value; \
- if (sizeof (__value) == 1) \
- __asm__ __volatile__ ("movb %%gs:%P2,%b0" \
- : "=q" (__value) \
- : "0" (0), \
- "i" (offsetof (struct _pthread_descr_struct, \
- member))); \
- else if (sizeof (__value) == 4) \
- __asm__ __volatile__ ("movl %%gs:%P1,%0" \
- : "=r" (__value) \
- : "i" (offsetof (struct _pthread_descr_struct, \
- member))); \
- else \
- { \
- if (sizeof (__value) != 8) \
- /* There should not be any value with a size other than 1, 4 or 8. */\
- abort (); \
- \
- __asm__ __volatile__ ("movl %%gs:%P1,%%eax\n\t" \
- "movl %%gs:%P2,%%edx" \
- : "=A" (__value) \
- : "i" (offsetof (struct _pthread_descr_struct, \
- member)), \
- "i" (offsetof (struct _pthread_descr_struct, \
- member) + 4)); \
- } \
- __value; \
-})
-
-/* Same as THREAD_GETMEM, but the member offset can be non-constant. */
-#define THREAD_GETMEM_NC(descr, member) \
-({ \
- __typeof__ (descr->member) __value; \
- if (sizeof (__value) == 1) \
- __asm__ __volatile__ ("movb %%gs:(%2),%b0" \
- : "=q" (__value) \
- : "0" (0), \
- "r" (offsetof (struct _pthread_descr_struct, \
- member))); \
- else if (sizeof (__value) == 4) \
- __asm__ __volatile__ ("movl %%gs:(%1),%0" \
- : "=r" (__value) \
- : "r" (offsetof (struct _pthread_descr_struct, \
- member))); \
- else \
- { \
- if (sizeof (__value) != 8) \
- /* There should not be any value with a size other than 1, 4 or 8. */\
- abort (); \
- \
- __asm__ __volatile__ ("movl %%gs:(%1),%%eax\n\t" \
- "movl %%gs:4(%1),%%edx" \
- : "=&A" (__value) \
- : "r" (offsetof (struct _pthread_descr_struct, \
- member))); \
- } \
- __value; \
-})
-
-/* Same as THREAD_SETMEM, but the member offset can be non-constant. */
-#define THREAD_SETMEM(descr, member, value) \
-({ \
- __typeof__ (descr->member) __value = (value); \
- if (sizeof (__value) == 1) \
- __asm__ __volatile__ ("movb %0,%%gs:%P1" : \
- : "q" (__value), \
- "i" (offsetof (struct _pthread_descr_struct, \
- member))); \
- else if (sizeof (__value) == 4) \
- __asm__ __volatile__ ("movl %0,%%gs:%P1" : \
- : "r" (__value), \
- "i" (offsetof (struct _pthread_descr_struct, \
- member))); \
- else \
- { \
- if (sizeof (__value) != 8) \
- /* There should not be any value with a size other than 1, 4 or 8. */\
- abort (); \
- \
- __asm__ __volatile__ ("movl %%eax,%%gs:%P1\n\n" \
- "movl %%edx,%%gs:%P2" : \
- : "A" (__value), \
- "i" (offsetof (struct _pthread_descr_struct, \
- member)), \
- "i" (offsetof (struct _pthread_descr_struct, \
- member) + 4)); \
- } \
-})
-
-/* Set member of the thread descriptor directly. */
-#define THREAD_SETMEM_NC(descr, member, value) \
-({ \
- __typeof__ (descr->member) __value = (value); \
- if (sizeof (__value) == 1) \
- __asm__ __volatile__ ("movb %0,%%gs:(%1)" : \
- : "q" (__value), \
- "r" (offsetof (struct _pthread_descr_struct, \
- member))); \
- else if (sizeof (__value) == 4) \
- __asm__ __volatile__ ("movl %0,%%gs:(%1)" : \
- : "r" (__value), \
- "r" (offsetof (struct _pthread_descr_struct, \
- member))); \
- else \
- { \
- if (sizeof (__value) != 8) \
- /* There should not be any value with a size other than 1, 4 or 8. */\
- abort (); \
- \
- __asm__ __volatile__ ("movl %%eax,%%gs:(%1)\n\t" \
- "movl %%edx,%%gs:4(%1)" : \
- : "A" (__value), \
- "r" (offsetof (struct _pthread_descr_struct, \
- member))); \
- } \
-})
-#endif
-
-#if __ASSUME_LDT_WORKS > 0
-/* We want the OS to assign stack addresses. */
-#define FLOATING_STACKS 1
-
-/* Maximum size of the stack if the rlimit is unlimited. */
-#define ARCH_STACK_MAX_SIZE 8*1024*1024
-#endif
diff --git a/linuxthreads/sysdeps/ia64/Makefile b/linuxthreads/sysdeps/ia64/Makefile
deleted file mode 100644
index 81bddf688c..0000000000
--- a/linuxthreads/sysdeps/ia64/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-ifeq ($(subdir),csu)
-gen-as-const-headers += tcb-offsets.sym
-endif
diff --git a/linuxthreads/sysdeps/ia64/Versions b/linuxthreads/sysdeps/ia64/Versions
deleted file mode 100644
index 32da57080d..0000000000
--- a/linuxthreads/sysdeps/ia64/Versions
+++ /dev/null
@@ -1,5 +0,0 @@
-libpthread {
- GLIBC_PRIVATE {
- __pthread_clock_gettime; __pthread_clock_settime;
- }
-}
diff --git a/linuxthreads/sysdeps/ia64/pspinlock.c b/linuxthreads/sysdeps/ia64/pspinlock.c
deleted file mode 100644
index d61aa3f434..0000000000
--- a/linuxthreads/sysdeps/ia64/pspinlock.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* POSIX spinlock implementation. ia64 version.
- Copyright (C) 2000, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Jes Sorensen <jes@linuxcare.com>
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include "internals.h"
-#include <ia64intrin.h>
-
-/* This implementation is inspired by the implementation used in the
- Linux kernel. */
-
-int
-__pthread_spin_lock (pthread_spinlock_t *lock)
-{
- int *p = (int *) lock;
-
- while (__builtin_expect (__sync_val_compare_and_swap (p, 0, 1), 0))
- {
- /* Spin without using the atomic instruction. */
- do
- __asm __volatile ("" : : : "memory");
- while (*p);
- }
- return 0;
-}
-weak_alias (__pthread_spin_lock, pthread_spin_lock)
-
-
-int
-__pthread_spin_trylock (pthread_spinlock_t *lock)
-{
- return __sync_val_compare_and_swap ((int *) lock, 0, 1) == 0 ? 0 : EBUSY;
-}
-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
-
-
-int
-__pthread_spin_unlock (pthread_spinlock_t *lock)
-{
- return *lock = 0;
-}
-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
-
-
-int
-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
-{
- /* We can ignore the `pshared' parameter. Since we are busy-waiting
- all processes which can access the memory location `lock' points
- to can use the spinlock. */
- return *lock = 0;
-}
-weak_alias (__pthread_spin_init, pthread_spin_init)
-
-
-int
-__pthread_spin_destroy (pthread_spinlock_t *lock)
-{
- /* Nothing to do. */
- return 0;
-}
-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --git a/linuxthreads/sysdeps/ia64/pt-machine.h b/linuxthreads/sysdeps/ia64/pt-machine.h
deleted file mode 100644
index 6c5dfe93bb..0000000000
--- a/linuxthreads/sysdeps/ia64/pt-machine.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/* Machine-dependent pthreads configuration and inline functions.
- IA-64 version.
- Copyright (C) 1999, 2000, 2002, 2003, 2004 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _PT_MACHINE_H
-#define _PT_MACHINE_H 1
-
-#include <ia64intrin.h>
-
-#ifndef PT_EI
-# define PT_EI extern inline __attribute__ ((always_inline))
-#endif
-
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
-
-/* Make sure gcc doesn't try to be clever and move things around on
- us. We need to use _exactly_ the address the user gave us, not some
- alias that contains the same information. */
-#define __atomic_fool_gcc(x) (*(volatile struct { int a[100]; } *)x)
-
-#ifndef ELF_MACHINE_NAME
-
-#define NEED_SEPARATE_REGISTER_STACK
-
-/* We want the OS to assign stack addresses. */
-#define FLOATING_STACKS 1
-
-/* Maximum size of the stack if the rlimit is unlimited. */
-#define ARCH_STACK_MAX_SIZE 32*1024*1024
-
-/* Get some notion of the current stack. Need not be exactly the top
- of the stack, just something somewhere in the current frame.
- r12 (sp) is the stack pointer. */
-#define CURRENT_STACK_FRAME stack_pointer
-register char *stack_pointer __asm__ ("sp");
-
-
-/* Register r13 (tp) is reserved by the ABI as "thread pointer". */
-struct _pthread_descr_struct;
-register struct _pthread_descr_struct *__thread_self __asm__("r13");
-
-/* Return the thread descriptor for the current thread. */
-#define THREAD_SELF __thread_self
-
-/* Initialize the thread-unique value. */
-#define INIT_THREAD_SELF(descr, nr) (__thread_self = (descr))
-
-
-/* Access to data in the thread descriptor is easy. */
-#define THREAD_GETMEM(descr, member) \
- ((void) sizeof (descr), THREAD_SELF->member)
-#define THREAD_GETMEM_NC(descr, member) \
- ((void) sizeof (descr), THREAD_SELF->member)
-#define THREAD_SETMEM(descr, member, value) \
- ((void) sizeof (descr), THREAD_SELF->member = (value))
-#define THREAD_SETMEM_NC(descr, member, value) \
- ((void) sizeof (descr), THREAD_SELF->member = (value))
-
-
-/* Memory barrier */
-#define MEMORY_BARRIER() __sync_synchronize ()
-
-
-#define HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS
-
-PT_EI int
-__compare_and_swap (long int *p, long int oldval, long int newval)
-{
- long int readval;
-
- __asm__ __volatile__
- ("mov ar.ccv=%4;;\n\t"
- "cmpxchg8.acq %0=%1,%2,ar.ccv"
- : "=r" (readval), "=m" (__atomic_fool_gcc (p))
- : "r"(newval), "m" (__atomic_fool_gcc (p)), "r" (oldval)
- : "memory");
- return readval == oldval;
-}
-
-PT_EI int
-__compare_and_swap_with_release_semantics (long int *p,
- long int oldval,
- long int newval)
-{
- long int readval;
-
- __asm__ __volatile__
- ("mov ar.ccv=%4;;\n\t"
- "cmpxchg8.rel %0=%1,%2,ar.ccv"
- : "=r" (readval), "=m" (__atomic_fool_gcc (p))
- : "r"(newval), "m" (__atomic_fool_gcc (p)), "r" (oldval)
- : "memory");
- return readval == oldval;
-}
-
-#endif /* ELF_MACHINE_NAME */
-
-/* Spinlock implementation; required. */
-PT_EI long int
-testandset (int *spinlock)
-{
- long int ret;
-
- __asm__ __volatile__(
- "xchg4 %0=%1,%2"
- : "=r"(ret), "=m"(__atomic_fool_gcc (spinlock))
- : "r"(1), "m"(__atomic_fool_gcc (spinlock))
- : "memory");
-
- return ret;
-}
-
-/* Indicate that we are looping. */
-#define BUSY_WAIT_NOP __asm__ ("hint @pause")
-
-#endif /* pt-machine.h */
diff --git a/linuxthreads/sysdeps/ia64/tcb-offsets.sym b/linuxthreads/sysdeps/ia64/tcb-offsets.sym
deleted file mode 100644
index f7793f7665..0000000000
--- a/linuxthreads/sysdeps/ia64/tcb-offsets.sym
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <sysdep.h>
-#include <tls.h>
-
---
-#ifdef USE_TLS
-MULTIPLE_THREADS_OFFSET offsetof (struct _pthread_descr_struct, p_multiple_threads) - sizeof (struct _pthread_descr_struct)
-#else
-MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads)
-#endif
diff --git a/linuxthreads/sysdeps/ia64/tls.h b/linuxthreads/sysdeps/ia64/tls.h
deleted file mode 100644
index fe8fcd15f8..0000000000
--- a/linuxthreads/sysdeps/ia64/tls.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/* Definitions for thread-local data handling. linuxthreads/IA-64 version.
- Copyright (C) 2002, 2003, 2004, 2005 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _TLS_H
-#define _TLS_H
-
-#ifndef __ASSEMBLER__
-
-# include <dl-sysdep.h>
-# include <pt-machine.h>
-# include <stdbool.h>
-# include <stddef.h>
-
-/* Type for the dtv. */
-typedef union dtv
-{
- size_t counter;
- struct
- {
- void *val;
- bool is_static;
- } pointer;
-} dtv_t;
-
-#else /* __ASSEMBLER__ */
-# include <tcb-offsets.h>
-#endif /* __ASSEMBLER__ */
-
-#ifdef HAVE_TLS_SUPPORT
-
-/* Signal that TLS support is available. */
-# define USE_TLS 1
-
-# ifndef __ASSEMBLER__
-
-typedef struct
-{
- dtv_t *dtv;
- void *private;
-} tcbhead_t;
-
-/* This is the size of the initial TCB. */
-# define TLS_INIT_TCB_SIZE sizeof (tcbhead_t)
-
-/* Alignment requirements for the initial TCB. */
-# define TLS_INIT_TCB_ALIGN __alignof__ (tcbhead_t)
-
-/* This is the size of the TCB. */
-# define TLS_TCB_SIZE sizeof (tcbhead_t)
-
-/* This is the size we need before TCB. */
-# ifndef IS_IN_rtld
-# define TLS_PRE_TCB_SIZE sizeof (struct _pthread_descr_struct)
-# else
-# include <nptl-struct-pthread.h>
-# define TLS_PRE_TCB_SIZE \
- (sizeof (struct _pthread_descr_struct) > NPTL_STRUCT_PTHREAD_SIZE \
- ? sizeof (struct _pthread_descr_struct) : NPTL_STRUCT_PTHREAD_SIZE)
-# endif
-
-/* Alignment requirements for the TCB. */
-# define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct)
-
-/* The DTV is allocated at the TP; the TCB is placed elsewhere. */
-# define TLS_DTV_AT_TP 1
-
-/* Install the dtv pointer. The pointer passed is to the element with
- index -1 which contain the length. */
-# define INSTALL_DTV(tcbp, dtvp) \
- ((tcbhead_t *) (tcbp))->dtv = (dtvp) + 1
-
-/* Install new dtv for current thread. */
-# define INSTALL_NEW_DTV(DTV) \
- (((tcbhead_t *)__thread_self)->dtv = (DTV))
-
-/* Return dtv of given thread descriptor. */
-# define GET_DTV(tcbp) \
- (((tcbhead_t *) (tcbp))->dtv)
-
-#if defined NEED_DL_SYSINFO
-# define INIT_SYSINFO \
- (((tcbhead_t *) __thread_self)->private = (void *) GLRO(dl_sysinfo))
-#else
-# define INIT_SYSINFO 0
-#endif
-
-/* Code to initially initialize the thread pointer. This might need
- special attention since 'errno' is not yet available and if the
- operation can cause a failure 'errno' must not be touched. */
-# define TLS_INIT_TP(tcbp, secondcall) \
- (__thread_self = (__typeof (__thread_self)) (tcbp), INIT_SYSINFO, NULL)
-
-/* Return the address of the dtv for the current thread. */
-# define THREAD_DTV() \
- (((tcbhead_t *)__thread_self)->dtv)
-
-/* Return the thread descriptor for the current thread. */
-# undef THREAD_SELF
-# define THREAD_SELF (__thread_self - 1)
-
-# undef INIT_THREAD_SELF
-# define INIT_THREAD_SELF(descr, nr) \
- (__thread_self = (struct _pthread_descr_struct *)(descr) + 1)
-
-# define TLS_MULTIPLE_THREADS_IN_TCB 1
-
-/* Get the thread descriptor definition. */
-# include <linuxthreads/descr.h>
-
-# endif
-
-#else
-
-# ifndef __ASSEMBLER__
-
-typedef struct
-{
- void *tcb;
- dtv_t *dtv;
- void *self;
- int multiple_threads;
-} tcbhead_t;
-
-/* Get the thread descriptor definition. */
-# include <linuxthreads/descr.h>
-
-# define NONTLS_INIT_TP \
- do { \
- static const tcbhead_t nontls_init_tp = { .multiple_threads = 0 }; \
- __thread_self = (__typeof (__thread_self)) &nontls_init_tp; \
- } while (0)
-
-#endif
-
-#endif /* USE_TLS */
-
-#endif /* tls.h */
diff --git a/linuxthreads/sysdeps/m68k/pspinlock.c b/linuxthreads/sysdeps/m68k/pspinlock.c
deleted file mode 100644
index 30b9b9e8b9..0000000000
--- a/linuxthreads/sysdeps/m68k/pspinlock.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/* POSIX spinlock implementation. M68k version.
- Copyright (C) 2000 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include "internals.h"
-
-
-int
-__pthread_spin_lock (pthread_spinlock_t *lock)
-{
- unsigned int val;
-
- do
- asm volatile ("tas %1; sne %0"
- : "=dm" (val), "=m" (*lock)
- : "m" (*lock)
- : "cc");
- while (val);
-
- return 0;
-}
-weak_alias (__pthread_spin_lock, pthread_spin_lock)
-
-
-int
-__pthread_spin_trylock (pthread_spinlock_t *lock)
-{
- unsigned int val;
-
- asm volatile ("tas %1; sne %0"
- : "=dm" (val), "=m" (*lock)
- : "m" (*lock)
- : "cc");
-
- return val ? EBUSY : 0;
-}
-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
-
-
-int
-__pthread_spin_unlock (pthread_spinlock_t *lock)
-{
- return *lock = 0;
-}
-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
-
-
-int
-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
-{
- /* We can ignore the `pshared' parameter. Since we are busy-waiting
- all processes which can access the memory location `lock' points
- to can use the spinlock. */
- return *lock = 0;
-}
-weak_alias (__pthread_spin_init, pthread_spin_init)
-
-
-int
-__pthread_spin_destroy (pthread_spinlock_t *lock)
-{
- /* Nothing to do. */
- return 0;
-}
-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --git a/linuxthreads/sysdeps/m68k/pt-machine.h b/linuxthreads/sysdeps/m68k/pt-machine.h
deleted file mode 100644
index ad524d6d2e..0000000000
--- a/linuxthreads/sysdeps/m68k/pt-machine.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* Machine-dependent pthreads configuration and inline functions.
- m68k version.
- Copyright (C) 1996, 1998, 2000, 2002, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Richard Henderson <rth@tamu.edu>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-#ifndef _PT_MACHINE_H
-#define _PT_MACHINE_H 1
-
-#ifndef PT_EI
-# define PT_EI extern inline __attribute__ ((always_inline))
-#endif
-
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
-
-/* Spinlock implementation; required. */
-PT_EI long int
-testandset (int *spinlock)
-{
- char ret;
-
- __asm__ __volatile__("tas %1; sne %0"
- : "=dm"(ret), "=m"(*spinlock)
- : "m"(*spinlock)
- : "cc");
-
- return ret;
-}
-
-
-/* Get some notion of the current stack. Need not be exactly the top
- of the stack, just something somewhere in the current frame. */
-#define CURRENT_STACK_FRAME stack_pointer
-register char * stack_pointer __asm__ ("%sp");
-
-
-/* Compare-and-swap for semaphores. */
-
-#define HAS_COMPARE_AND_SWAP
-PT_EI int
-__compare_and_swap (long int *p, long int oldval, long int newval)
-{
- char ret;
- long int readval;
-
- __asm__ __volatile__ ("casl %2, %3, %1; seq %0"
- : "=dm" (ret), "=m" (*p), "=d" (readval)
- : "d" (newval), "m" (*p), "2" (oldval));
-
- return ret;
-}
-
-#endif /* pt-machine.h */
diff --git a/linuxthreads/sysdeps/mips/pspinlock.c b/linuxthreads/sysdeps/mips/pspinlock.c
deleted file mode 100644
index 350aa7553c..0000000000
--- a/linuxthreads/sysdeps/mips/pspinlock.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/* POSIX spinlock implementation. MIPS version.
- Copyright (C) 2000, 2002, 2003, 2004 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include <sgidefs.h>
-#include <sys/tas.h>
-#include "internals.h"
-
-#include <sgidefs.h>
-
-/* This implementation is similar to the one used in the Linux kernel. */
-int
-__pthread_spin_lock (pthread_spinlock_t *lock)
-{
- unsigned int tmp1, tmp2;
-
- asm volatile
- ("\t\t\t# spin_lock\n"
- "1:\n\t"
- ".set push\n\t"
-#if _MIPS_SIM == _ABIO32
- ".set mips2\n\t"
-#endif
- "ll %1,%3\n\t"
- "li %2,1\n\t"
- "bnez %1,1b\n\t"
- "sc %2,%0\n\t"
- ".set pop\n\t"
- "beqz %2,1b"
- : "=m" (*lock), "=&r" (tmp1), "=&r" (tmp2)
- : "m" (*lock)
- : "memory");
-
- return 0;
-}
-
-weak_alias (__pthread_spin_lock, pthread_spin_lock)
-
-
-int
-__pthread_spin_trylock (pthread_spinlock_t *lock)
-{
- /* To be done. */
- return 0;
-}
-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
-
-
-int
-__pthread_spin_unlock (pthread_spinlock_t *lock)
-{
- asm volatile
- ("\t\t\t# spin_unlock\n\t"
- "sw $0,%0"
- : "=m" (*lock)
- :
- : "memory");
- return 0;
-}
-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
-
-
-int
-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
-{
- /* We can ignore the `pshared' parameter. Since we are busy-waiting
- all processes which can access the memory location `lock' points
- to can use the spinlock. */
- *lock = 0;
- return 0;
-}
-weak_alias (__pthread_spin_init, pthread_spin_init)
-
-
-int
-__pthread_spin_destroy (pthread_spinlock_t *lock)
-{
- /* Nothing to do. */
- return 0;
-}
-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --git a/linuxthreads/sysdeps/mips/pt-machine.h b/linuxthreads/sysdeps/mips/pt-machine.h
deleted file mode 100644
index 96f7a7f8c6..0000000000
--- a/linuxthreads/sysdeps/mips/pt-machine.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Machine-dependent pthreads configuration and inline functions.
-
- Copyright (C) 1996, 1997, 1998, 2000, 2002, 2003, 2004
- Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ralf Baechle <ralf@gnu.org>.
- Based on the Alpha version by Richard Henderson <rth@tamu.edu>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-#ifndef _PT_MACHINE_H
-#define _PT_MACHINE_H 1
-
-#include <sgidefs.h>
-#include <sys/tas.h>
-
-#ifndef PT_EI
-# define PT_EI extern inline __attribute__ ((always_inline))
-#endif
-
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
-
-
-/* Spinlock implementation; required. */
-
-PT_EI long int
-testandset (int *spinlock)
-{
- return _test_and_set (spinlock, 1);
-}
-
-
-/* Get some notion of the current stack. Need not be exactly the top
- of the stack, just something somewhere in the current frame. */
-#define CURRENT_STACK_FRAME stack_pointer
-register char * stack_pointer __asm__ ("$29");
-
-
-/* Compare-and-swap for semaphores. */
-
-#define HAS_COMPARE_AND_SWAP
-PT_EI int
-__compare_and_swap (long int *p, long int oldval, long int newval)
-{
- long int ret, temp;
-
- __asm__ __volatile__
- ("/* Inline compare & swap */\n"
- "1:\n\t"
- ".set push\n\t"
-#if _MIPS_SIM == _ABIO32
- ".set mips2\n\t"
-#endif
-#if _MIPS_SIM == _ABI64
- "lld %1,%5\n\t"
-#else
- "ll %1,%5\n\t"
-#endif
- "move %0,$0\n\t"
- "bne %1,%3,2f\n\t"
- "move %0,%4\n\t"
-#if _MIPS_SIM == _ABI64
- "scd %0,%2\n\t"
-#else
- "sc %0,%2\n\t"
-#endif
- ".set pop\n\t"
- "beqz %0,1b\n"
- "2:\n\t"
- "/* End compare & swap */"
- : "=&r" (ret), "=&r" (temp), "=m" (*p)
- : "r" (oldval), "r" (newval), "m" (*p)
- : "memory");
-
- return ret;
-}
-
-#endif /* pt-machine.h */
diff --git a/linuxthreads/sysdeps/mips/tls.h b/linuxthreads/sysdeps/mips/tls.h
deleted file mode 100644
index be4478db43..0000000000
--- a/linuxthreads/sysdeps/mips/tls.h
+++ /dev/null
@@ -1,170 +0,0 @@
-/* Definitions for thread-local data handling. linuxthreads/MIPS version.
- Copyright (C) 2005 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _TLS_H
-#define _TLS_H
-
-#ifndef __ASSEMBLER__
-
-# include <stdbool.h>
-# include <pt-machine.h>
-# include <stddef.h>
-
-/* Type for the dtv. */
-typedef union dtv
-{
- size_t counter;
- struct
- {
- void *val;
- bool is_static;
- } pointer;
-} dtv_t;
-
-# define READ_THREAD_POINTER() \
- ({ void *__result; \
- asm volatile (".set\tpush\n\t.set\tmips32r2\n\t" \
- "rdhwr\t%0, $29\n\t.set\tpop" : "=v" (__result)); \
- __result; })
-
-#else /* __ASSEMBLER__ */
-# include <tcb-offsets.h>
-
-/* Note: rd must be $v1 to be ABI-conformant. */
-# define READ_THREAD_POINTER(rd) \
- .set push; \
- .set mips32r2; \
- rdhwr rd, $29; \
- .set pop
-#endif /* __ASSEMBLER__ */
-
-/* LinuxThreads can only use TLS if both floating stacks (in the MIPS case,
- that means support for "rdhwr") and support from the tools are available.
-
- We have to define USE_TLS consistently, or ldsodefs.h will lay out types
- differently between an NPTL build and a LinuxThreads build. It can be set
- for libc.so and not libpthread.so, but only if we provide appropriate padding
- in the _pthread_descr_struct.
-
- Currently nothing defines FLOATING_STACKS. We could assume this based on
- kernel version once the TLS patches are available in kernel.org, but
- it hardly seems worth it. Use NPTL if you can.
-
- To avoid bothering with the TLS support code at all, use configure
- --without-tls. */
-
-#if defined HAVE_TLS_SUPPORT \
- && (defined FLOATING_STACKS || !defined IS_IN_libpthread)
-
-/* Signal that TLS support is available. */
-# define USE_TLS 1
-
-/* Include padding in _pthread_descr_struct so that libc can find p_errno,
- if libpthread will only include the padding because of the !IS_IN_libpthread
- check. */
-#ifndef FLOATING_STACKS
-# define INCLUDE_TLS_PADDING 1
-#endif
-
-# ifndef __ASSEMBLER__
-
-/* This layout is actually wholly private and not affected by the ABI.
- Nor does it overlap the pthread data structure, so we need nothing
- extra here at all. */
-typedef struct
-{
- dtv_t *dtv;
- void *private;
-} tcbhead_t;
-
-/* This is the size of the initial TCB. */
-# define TLS_INIT_TCB_SIZE 0
-
-/* Alignment requirements for the initial TCB. */
-# define TLS_INIT_TCB_ALIGN __alignof__ (struct _pthread_descr_struct)
-
-/* This is the size of the TCB. */
-# define TLS_TCB_SIZE 0
-
-/* Alignment requirements for the TCB. */
-# define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct)
-
-/* This is the size we need before TCB. */
-# define TLS_PRE_TCB_SIZE \
- (sizeof (struct _pthread_descr_struct) \
- + ((sizeof (tcbhead_t) + TLS_TCB_ALIGN - 1) & ~(TLS_TCB_ALIGN - 1)))
-
-/* The thread pointer (in hardware register $29) points to the end of
- the TCB + 0x7000, as for PowerPC. The pthread_descr structure is
- immediately in front of the TCB. */
-#define TLS_TCB_OFFSET 0x7000
-
-/* The DTV is allocated at the TP; the TCB is placed elsewhere. */
-/* This is not really true for powerpc64. We are following alpha
- where the DTV pointer is first doubleword in the TCB. */
-# define TLS_DTV_AT_TP 1
-
-/* Install the dtv pointer. The pointer passed is to the element with
- index -1 which contain the length. */
-# define INSTALL_DTV(TCBP, DTVP) \
- (((tcbhead_t *) (TCBP))[-1].dtv = (DTVP) + 1)
-
-/* Install new dtv for current thread. */
-# define INSTALL_NEW_DTV(DTV) (THREAD_DTV() = (DTV))
-
-/* Return dtv of given thread descriptor. */
-# define GET_DTV(TCBP) (((tcbhead_t *) (TCBP))[-1].dtv)
-
-/* Code to initially initialize the thread pointer. This might need
- special attention since 'errno' is not yet available and if the
- operation can cause a failure 'errno' must not be touched. */
-# define TLS_INIT_TP(tcbp, secondcall) \
- ({ INTERNAL_SYSCALL_DECL (err); \
- long result_var; \
- result_var = INTERNAL_SYSCALL (set_thread_area, err, 1, \
- (char *) (tcbp) + TLS_TCB_OFFSET); \
- INTERNAL_SYSCALL_ERROR_P (result_var, err) \
- ? "unknown error" : NULL; })
-
-/* Return the address of the dtv for the current thread. */
-# define THREAD_DTV() \
- (((tcbhead_t *) (READ_THREAD_POINTER () - TLS_TCB_OFFSET))[-1].dtv)
-
-/* Return the thread descriptor for the current thread. */
-# undef THREAD_SELF
-# define THREAD_SELF \
- ((pthread_descr) (READ_THREAD_POINTER () \
- - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE))
-
-/* Get the thread descriptor definition. */
-# include <linuxthreads/descr.h>
-
-/* l_tls_offset == 0 is perfectly valid on MIPS, so we have to use some
- different value to mean unset l_tls_offset. */
-# define NO_TLS_OFFSET -1
-
-/* Initializing the thread pointer requires a syscall which may not be
- available, so don't do it if we don't need to. */
-# define TLS_INIT_TP_EXPENSIVE 1
-
-# endif /* __ASSEMBLER__ */
-
-#endif /* HAVE_TLS_SUPPORT */
-
-#endif /* tls.h */
diff --git a/linuxthreads/sysdeps/powerpc/Makefile b/linuxthreads/sysdeps/powerpc/Makefile
deleted file mode 100644
index 33e4aceb5b..0000000000
--- a/linuxthreads/sysdeps/powerpc/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-ifeq ($(subdir):$(elf),linuxthreads:yes)
-# See CFLAGS-initfini.s above; this is the same code.
-CFLAGS-pt-initfini.s = -g0 -fpic -O1
-endif
-ifeq ($(subdir),csu)
-gen-as-const-headers += tcb-offsets.sym
-endif
diff --git a/linuxthreads/sysdeps/powerpc/powerpc32/pspinlock.c b/linuxthreads/sysdeps/powerpc/powerpc32/pspinlock.c
deleted file mode 100644
index 15fd545c14..0000000000
--- a/linuxthreads/sysdeps/powerpc/powerpc32/pspinlock.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* POSIX spinlock implementation. PowerPC version.
- Copyright (C) 2000, 2003 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include "internals.h"
-
-int
-__pthread_spin_lock (pthread_spinlock_t *lock)
-{
- while (! __compare_and_swap ((long int *)lock, 0, 1))
- ;
- return 0;
-}
-weak_alias (__pthread_spin_lock, pthread_spin_lock)
-
-
-int
-__pthread_spin_trylock (pthread_spinlock_t *lock)
-{
- return __compare_and_swap ((long int *)lock, 0, 1) ? 0 : EBUSY;
-}
-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
-
-
-int
-__pthread_spin_unlock (pthread_spinlock_t *lock)
-{
- MEMORY_BARRIER ();
- *lock = 0;
- return 0;
-}
-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
-
-
-int
-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
-{
- /* We can ignore the `pshared' parameter. Since we are busy-waiting
- all processes which can access the memory location `lock' points
- to can use the spinlock. */
- *lock = 0;
- return 0;
-}
-weak_alias (__pthread_spin_init, pthread_spin_init)
-
-
-int
-__pthread_spin_destroy (pthread_spinlock_t *lock)
-{
- /* Nothing to do. */
- return 0;
-}
-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --git a/linuxthreads/sysdeps/powerpc/powerpc32/pt-machine.h b/linuxthreads/sysdeps/powerpc/powerpc32/pt-machine.h
deleted file mode 100644
index 8363d16d08..0000000000
--- a/linuxthreads/sysdeps/powerpc/powerpc32/pt-machine.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/* Machine-dependent pthreads configuration and inline functions.
- powerpc version.
- Copyright (C) 1996, 1997, 1998, 2000, 2001, 2002, 2003
- 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, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-/* These routines are from Appendix G of the 'PowerPC 601 RISC Microprocessor
- User's Manual', by IBM and Motorola. */
-
-#ifndef _PT_MACHINE_H
-#define _PT_MACHINE_H 1
-
-#ifndef PT_EI
-# define PT_EI extern inline __attribute__ ((always_inline))
-#endif
-
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
-
-/* For multiprocessor systems, we want to ensure all memory accesses
- are completed before we reset a lock. On other systems, we still
- need to make sure that the compiler has flushed everything to memory. */
-#define MEMORY_BARRIER() __asm__ __volatile__ ("sync" : : : "memory")
-
-/* We want the OS to assign stack addresses. */
-#define FLOATING_STACKS 1
-
-/* Maximum size of the stack if the rlimit is unlimited. */
-#define ARCH_STACK_MAX_SIZE 8*1024*1024
-
-/* Get some notion of the current stack. Need not be exactly the top
- of the stack, just something somewhere in the current frame. */
-#define CURRENT_STACK_FRAME stack_pointer
-register char * stack_pointer __asm__ ("r1");
-
-/* Register r2 (tp) is reserved by the ABI as "thread pointer". */
-struct _pthread_descr_struct;
-register struct _pthread_descr_struct *__thread_self __asm__("r2");
-
-/* Return the thread descriptor for the current thread. */
-#define THREAD_SELF __thread_self
-
-/* Initialize the thread-unique value. */
-#define INIT_THREAD_SELF(descr, nr) (__thread_self = (descr))
-
-/* Access to data in the thread descriptor is easy. */
-#define THREAD_GETMEM(descr, member) \
- ((void) (descr), THREAD_SELF->member)
-#define THREAD_GETMEM_NC(descr, member) \
- ((void) (descr), THREAD_SELF->member)
-#define THREAD_SETMEM(descr, member, value) \
- ((void) (descr), THREAD_SELF->member = (value))
-#define THREAD_SETMEM_NC(descr, member, value) \
- ((void) (descr), THREAD_SELF->member = (value))
-
-/* Compare-and-swap for semaphores. */
-/* note that test-and-set(x) is the same as !compare-and-swap(x, 0, 1) */
-
-#define HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS
-#define IMPLEMENT_TAS_WITH_CAS
-
-PT_EI int
-__compare_and_swap (long int *p, long int oldval, long int newval)
-{
- int ret;
-
- __asm__ __volatile__ (
- "0: lwarx %0,0,%1 ;"
- " xor. %0,%3,%0;"
- " bne 1f;"
- " stwcx. %2,0,%1;"
- " bne- 0b;"
- "1: "
- : "=&r"(ret)
- : "r"(p), "r"(newval), "r"(oldval)
- : "cr0", "memory");
- /* This version of __compare_and_swap is to be used when acquiring
- a lock, so we don't need to worry about whether other memory
- operations have completed, but we do need to be sure that any loads
- after this point really occur after we have acquired the lock. */
- __asm__ __volatile__ ("isync" : : : "memory");
- return ret == 0;
-}
-
-PT_EI int
-__compare_and_swap_with_release_semantics (long int *p,
- long int oldval, long int newval)
-{
- int ret;
-
- MEMORY_BARRIER ();
- __asm__ __volatile__ (
- "0: lwarx %0,0,%1 ;"
- " xor. %0,%3,%0;"
- " bne 1f;"
- " stwcx. %2,0,%1;"
- " bne- 0b;"
- "1: "
- : "=&r"(ret)
- : "r"(p), "r"(newval), "r"(oldval)
- : "cr0", "memory");
- return ret == 0;
-}
-
-#endif /* pt-machine.h */
diff --git a/linuxthreads/sysdeps/powerpc/powerpc64/pspinlock.c b/linuxthreads/sysdeps/powerpc/powerpc64/pspinlock.c
deleted file mode 100644
index 19161c6e10..0000000000
--- a/linuxthreads/sysdeps/powerpc/powerpc64/pspinlock.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* POSIX spinlock implementation. PowerPC version.
- Copyright (C) 2000, 2003 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include "internals.h"
-
-int
-__pthread_spin_lock (pthread_spinlock_t *lock)
-{
- while (! __compare_and_swap32 ((int *)lock, 0, 1))
- ;
- return 0;
-}
-weak_alias (__pthread_spin_lock, pthread_spin_lock)
-
-
-int
-__pthread_spin_trylock (pthread_spinlock_t *lock)
-{
- return __compare_and_swap32 ((int *)lock, 0, 1) ? 0 : EBUSY;
-}
-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
-
-
-int
-__pthread_spin_unlock (pthread_spinlock_t *lock)
-{
- MEMORY_BARRIER ();
- *lock = 0;
- return 0;
-}
-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
-
-
-int
-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
-{
- /* We can ignore the `pshared' parameter. Since we are busy-waiting
- all processes which can access the memory location `lock' points
- to can use the spinlock. */
- *lock = 0;
- return 0;
-}
-weak_alias (__pthread_spin_init, pthread_spin_init)
-
-
-int
-__pthread_spin_destroy (pthread_spinlock_t *lock)
-{
- /* Nothing to do. */
- return 0;
-}
-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --git a/linuxthreads/sysdeps/powerpc/powerpc64/pt-machine.h b/linuxthreads/sysdeps/powerpc/powerpc64/pt-machine.h
deleted file mode 100644
index 562e69fa18..0000000000
--- a/linuxthreads/sysdeps/powerpc/powerpc64/pt-machine.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/* Machine-dependent pthreads configuration and inline functions.
- powerpc version.
- Copyright (C) 2002, 2003 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, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-/* These routines are from Appendix G of the 'PowerPC 601 RISC Microprocessor
- User's Manual', by IBM and Motorola. */
-
-#ifndef _PT_MACHINE_H
-#define _PT_MACHINE_H 1
-
-#ifndef PT_EI
-# define PT_EI extern inline __attribute__ ((always_inline))
-#endif
-
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
-extern int __compare_and_swap32 (int *p, int oldval, int newval);
-
-/* For multiprocessor systems, we want to ensure all memory accesses
- are completed before we reset a lock. On other systems, we still
- need to make sure that the compiler has flushed everything to memory. */
-#define MEMORY_BARRIER() __asm__ __volatile__ ("lwsync" : : : "memory")
-#define READ_MEMORY_BARRIER() __asm__ __volatile__ ("lwsync" : : : "memory")
-#define WRITE_MEMORY_BARRIER() __asm__ __volatile__ ("eieio" : : : "memory")
-
-/* We want the OS to assign stack addresses. */
-#define FLOATING_STACKS 1
-
-/* Maximum size of the stack if the rlimit is unlimited. */
-#define ARCH_STACK_MAX_SIZE 16*1024*1024
-
-/* Get some notion of the current stack. Need not be exactly the top
- of the stack, just something somewhere in the current frame. */
-#define CURRENT_STACK_FRAME stack_pointer
-register char * stack_pointer __asm__ ("r1");
-
-/* Register r13 (tp) is reserved by the ABI as "thread pointer". */
-struct _pthread_descr_struct;
-register struct _pthread_descr_struct *__thread_self __asm__("r13");
-
-/* Return the thread descriptor for the current thread. */
-#define THREAD_SELF __thread_self
-
-/* Initialize the thread-unique value. */
-#define INIT_THREAD_SELF(descr, nr) (__thread_self = (descr))
-
-/* Access to data in the thread descriptor is easy. */
-#define THREAD_GETMEM(descr, member) \
- ((void) (descr), THREAD_SELF->member)
-#define THREAD_GETMEM_NC(descr, member) \
- ((void) (descr), THREAD_SELF->member)
-#define THREAD_SETMEM(descr, member, value) \
- ((void) (descr), THREAD_SELF->member = (value))
-#define THREAD_SETMEM_NC(descr, member, value) \
- ((void) (descr), THREAD_SELF->member = (value))
-
-/* Compare-and-swap for semaphores. */
-/* note that test-and-set(x) is the same as !compare-and-swap(x, 0, 1) */
-
-#define HAS_COMPARE_AND_SWAP
-#define HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS
-
-PT_EI int
-__compare_and_swap (long int *p, long int oldval, long int newval)
-{
- long int ret;
-
- __asm__ __volatile__ (
- "0: ldarx %0,0,%1 ;"
- " xor. %0,%3,%0;"
- " bne 1f;"
- " stdcx. %2,0,%1;"
- " bne- 0b;"
- "1: "
- : "=&r"(ret)
- : "r"(p), "r"(newval), "r"(oldval)
- : "cr0", "memory");
- /* This version of __compare_and_swap is to be used when acquiring
- a lock, so we don't need to worry about whether other memory
- operations have completed, but we do need to be sure that any loads
- after this point really occur after we have acquired the lock. */
- __asm__ __volatile__ ("isync" : : : "memory");
- return (int)(ret == 0);
-}
-
-PT_EI int
-__compare_and_swap_with_release_semantics (long int *p,
- long int oldval, long int newval)
-{
- long int ret;
-
- MEMORY_BARRIER ();
- __asm__ __volatile__ (
- "0: ldarx %0,0,%1 ;"
- " xor. %0,%3,%0;"
- " bne 1f;"
- " stdcx. %2,0,%1;"
- " bne- 0b;"
- "1: "
- : "=&r"(ret)
- : "r"(p), "r"(newval), "r"(oldval)
- : "cr0", "memory");
- return (int)(ret == 0);
-}
-
-PT_EI int
-__compare_and_swap32 (int *p, int oldval, int newval)
-{
- int ret;
-
- __asm__ __volatile__ (
- "0: lwarx %0,0,%1 ;"
- " xor. %0,%3,%0;"
- " bne 1f;"
- " stwcx. %2,0,%1;"
- " bne- 0b;"
- "1: "
- : "=&r"(ret)
- : "r"(p), "r"(newval), "r"(oldval)
- : "cr0", "memory");
- /* This version of __compare_and_swap is to be used when acquiring
- a lock, so we don't need to worry about whether other memory
- operations have completed, but we do need to be sure that any loads
- after this point really occur after we have acquired the lock. */
- __asm__ __volatile__ ("isync" : : : "memory");
- return (int)(ret == 0);
-}
-
-PT_EI int
-__compare_and_swap32_with_release_semantics (long int *p,
- long int oldval, long int newval)
-{
- long int ret;
-
- MEMORY_BARRIER ();
- __asm__ __volatile__ (
- "0: lwarx %0,0,%1 ;"
- " xor. %0,%3,%0;"
- " bne 1f;"
- " stwcx. %2,0,%1;"
- " bne- 0b;"
- "1: "
- : "=&r"(ret)
- : "r"(p), "r"(newval), "r"(oldval)
- : "cr0", "memory");
- return (int)(ret == 0);
-}
-
-PT_EI long int
-testandset (int *p)
-{
- long int ret, val = 1;
-
- MEMORY_BARRIER ();
- __asm__ __volatile__ (
- "0: lwarx %0,0,%1 ;"
- " cmpwi 0,%0,0;"
- " bne 1f;"
- " stwcx. %2,0,%1;"
- " bne- 0b;"
- "1: "
- : "=&r"(ret)
- : "r"(p), "r" (val)
- : "cr0", "memory");
- MEMORY_BARRIER ();
- return ret != 0;
-}
-
-#endif /* pt-machine.h */
diff --git a/linuxthreads/sysdeps/powerpc/tcb-offsets.sym b/linuxthreads/sysdeps/powerpc/tcb-offsets.sym
deleted file mode 100644
index 7c5cca01ea..0000000000
--- a/linuxthreads/sysdeps/powerpc/tcb-offsets.sym
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <sysdep.h>
-#include <tls.h>
-
--- This line separates the #include lines from conditionals.
-
-# ifdef USE_TLS
-
--- Abuse tls.h macros to derive offsets relative to the thread register.
-# undef __thread_register
-# define __thread_register ((void *) 0)
-# define thread_offsetof(mem) ((ptrdiff_t) THREAD_SELF + offsetof (struct _pthread_descr_struct, p_##mem))
-
-# else
-
-# define thread_offsetof(mem) offsetof (tcbhead_t, mem)
-
-# endif
-
-MULTIPLE_THREADS_OFFSET thread_offsetof (multiple_threads)
diff --git a/linuxthreads/sysdeps/powerpc/tls.h b/linuxthreads/sysdeps/powerpc/tls.h
deleted file mode 100644
index 35472081d6..0000000000
--- a/linuxthreads/sysdeps/powerpc/tls.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/* Definitions for thread-local data handling. linuxthreads/PPC version.
- Copyright (C) 2003, 2005 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _TLS_H
-#define _TLS_H
-
-#ifndef __ASSEMBLER__
-
-# include <pt-machine.h>
-# include <stdbool.h>
-# include <stddef.h>
-
-/* Type for the dtv. */
-typedef union dtv
-{
- size_t counter;
- struct
- {
- void *val;
- bool is_static;
- } pointer;
-} dtv_t;
-
-#else /* __ASSEMBLER__ */
-# include <tcb-offsets.h>
-#endif /* __ASSEMBLER__ */
-
-#ifdef HAVE_TLS_SUPPORT
-
-/* Signal that TLS support is available. */
-# define USE_TLS 1
-
-# ifndef __ASSEMBLER__
-
-/* This layout is actually wholly private and not affected by the ABI.
- Nor does it overlap the pthread data structure, so we need nothing
- extra here at all. */
-typedef struct
-{
- dtv_t *dtv;
-} tcbhead_t;
-
-/* This is the size of the initial TCB. */
-# define TLS_INIT_TCB_SIZE 0
-
-/* Alignment requirements for the initial TCB. */
-# define TLS_INIT_TCB_ALIGN __alignof__ (struct _pthread_descr_struct)
-
-/* This is the size of the TCB. */
-# define TLS_TCB_SIZE 0
-
-/* Alignment requirements for the TCB. */
-# define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct)
-
-/* This is the size we need before TCB. */
-# ifndef IS_IN_rtld
-# define TLS_PRE_TCB_SIZE \
- (sizeof (struct _pthread_descr_struct) \
- + ((sizeof (tcbhead_t) + TLS_TCB_ALIGN - 1) & ~(TLS_TCB_ALIGN - 1)))
-# else
-# include <nptl-struct-pthread.h>
-# define TLS_PRE_TCB_SIZE \
- ((sizeof (struct _pthread_descr_struct) > NPTL_STRUCT_PTHREAD_SIZE \
- ? sizeof (struct _pthread_descr_struct) : NPTL_STRUCT_PTHREAD_SIZE) \
- + ((sizeof (tcbhead_t) + TLS_TCB_ALIGN - 1) & ~(TLS_TCB_ALIGN - 1)))
-# endif
-
-/* The following assumes that TP (R2 or R13) points to the end of the
- TCB + 0x7000 (per the ABI). This implies that TCB address is
- TP - 0x7000. As we define TLS_DTV_AT_TP we can
- assume that the pthread_descr is allocated immediately ahead of the
- TCB. This implies that the pthread_descr address is
- TP - (TLS_PRE_TCB_SIZE + 0x7000). */
-#define TLS_TCB_OFFSET 0x7000
-
-/* The DTV is allocated at the TP; the TCB is placed elsewhere. */
-/* This is not really true for powerpc64. We are following alpha
- where the DTV pointer is first doubleword in the TCB. */
-# define TLS_DTV_AT_TP 1
-
-/* Install the dtv pointer. The pointer passed is to the element with
- index -1 which contain the length. */
-# define INSTALL_DTV(TCBP, DTVP) \
- (((tcbhead_t *) (TCBP))[-1].dtv = (DTVP) + 1)
-
-/* Install new dtv for current thread. */
-# define INSTALL_NEW_DTV(DTV) (THREAD_DTV() = (DTV))
-
-/* Return dtv of given thread descriptor. */
-# define GET_DTV(TCBP) (((tcbhead_t *) (TCBP))[-1].dtv)
-
-/* We still need this define so that tcb-offsets.sym can override it and
- use THREAD_SELF to generate MULTIPLE_THREADS_OFFSET. */
-# define __thread_register ((void *) __thread_self)
-
-/* Code to initially initialize the thread pointer. This might need
- special attention since 'errno' is not yet available and if the
- operation can cause a failure 'errno' must not be touched.
-
- The global register variable is declared in pt-machine.h with the
- wrong type, so we need some extra casts to get the desired result.
- This avoids a lvalue cast that gcc-3.4 does not like. */
-# define TLS_INIT_TP(TCBP, SECONDCALL) \
- (__thread_self = (struct _pthread_descr_struct *) \
- ((void *) (TCBP) + TLS_TCB_OFFSET), NULL)
-
-/* Return the address of the dtv for the current thread. */
-# define THREAD_DTV() \
- (((tcbhead_t *) ((void *) __thread_self - TLS_TCB_OFFSET))[-1].dtv)
-
-/* Return the thread descriptor for the current thread. */
-# undef THREAD_SELF
-# define THREAD_SELF \
- ((pthread_descr) (__thread_register \
- - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE))
-
-# undef INIT_THREAD_SELF
-# define INIT_THREAD_SELF(DESCR, NR) \
- (__thread_self = (struct _pthread_descr_struct *)((void *) (DESCR) \
- + TLS_TCB_OFFSET + TLS_PRE_TCB_SIZE))
-
-/* Make sure we have the p_multiple_threads member in the thread structure.
- See below. */
-# define TLS_MULTIPLE_THREADS_IN_TCB 1
-
-/* Get the thread descriptor definition. */
-# include <linuxthreads/descr.h>
-
-/* l_tls_offset == 0 is perfectly valid on PPC, so we have to use some
- different value to mean unset l_tls_offset. */
-# define NO_TLS_OFFSET -1
-
-# endif /* __ASSEMBLER__ */
-
-#elif !defined __ASSEMBLER__
-
-/* This overlaps the start of the pthread_descr. System calls
- and such use this to find the multiple_threads flag and need
- to use the same offset relative to the thread register in both
- single-threaded and multi-threaded code. */
-typedef struct
-{
- void *tcb; /* Never used. */
- dtv_t *dtv; /* Never used. */
- void *self; /* Used only if multithreaded, and rarely. */
- int multiple_threads; /* Only this member is really used. */
-} tcbhead_t;
-
-#define NONTLS_INIT_TP \
- do { \
- static const tcbhead_t nontls_init_tp = { .multiple_threads = 0 }; \
- __thread_self = (__typeof (__thread_self)) &nontls_init_tp; \
- } while (0)
-
-#endif /* HAVE_TLS_SUPPORT */
-
-#endif /* tls.h */
diff --git a/linuxthreads/sysdeps/pthread/Makefile b/linuxthreads/sysdeps/pthread/Makefile
deleted file mode 100644
index 6f5a296e3c..0000000000
--- a/linuxthreads/sysdeps/pthread/Makefile
+++ /dev/null
@@ -1,26 +0,0 @@
-ifeq ($(subdir),rt)
-librt-sysdep_routines += timer_routines
-CPPFLAGS += -DBROKEN_THREAD_SIGNALS
-
-ifeq (yes,$(build-shared))
-$(objpfx)tst-timer: $(objpfx)librt.so $(shared-thread-library)
-else
-$(objpfx)tst-timer: $(objpfx)librt.a $(static-thread-library)
-endif
-endif
-
-ifeq ($(subdir),posix)
-CFLAGS-confstr.c += -DLIBPTHREAD_VERSION="\"$(shell sed 's/\(.*\) by .*/\1/' ../linuxthreads/Banner)\""
-endif
-
-ifeq ($(subdir),csu)
-# Find out the size of NPTL struct pthread
-ifneq (,$(wildcard $(..)nptl/descr.h))
-gen-as-const-headers += nptl-struct-pthread.sym
-else
-before-compile += $(common-objpfx)nptl-struct-pthread.h
-common-generated += nptl-struct-pthread.h
-$(common-objpfx)nptl-struct-pthread.h:
- @echo '#define NPTL_STRUCT_PTHREAD_SIZE 0' > $@
-endif
-endif
diff --git a/linuxthreads/sysdeps/pthread/Subdirs b/linuxthreads/sysdeps/pthread/Subdirs
deleted file mode 100644
index 2c56497842..0000000000
--- a/linuxthreads/sysdeps/pthread/Subdirs
+++ /dev/null
@@ -1 +0,0 @@
-linuxthreads_db
diff --git a/linuxthreads/sysdeps/pthread/bits/initspin.h b/linuxthreads/sysdeps/pthread/bits/initspin.h
deleted file mode 100644
index a19ec077e8..0000000000
--- a/linuxthreads/sysdeps/pthread/bits/initspin.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Generic definitions for spinlock initializers.
- Copyright (C) 2000, 2001 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* Initial value of a spinlock. Most platforms should use zero,
- unless they only implement a "test and clear" operation instead of
- the usual "test and set". */
-#define __LT_SPINLOCK_INIT 0
-
-/* Macros for lock initializers, using the above definition. */
-#define __LOCK_INITIALIZER { 0, __LT_SPINLOCK_INIT }
-#define __ALT_LOCK_INITIALIZER { 0, __LT_SPINLOCK_INIT }
-#define __ATOMIC_INITIALIZER { 0, __LT_SPINLOCK_INIT }
diff --git a/linuxthreads/sysdeps/pthread/bits/libc-lock.h b/linuxthreads/sysdeps/pthread/bits/libc-lock.h
deleted file mode 100644
index 7e22166862..0000000000
--- a/linuxthreads/sysdeps/pthread/bits/libc-lock.h
+++ /dev/null
@@ -1,413 +0,0 @@
-/* libc-internal interface for mutex locks. LinuxThreads version.
- Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003
- 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _BITS_LIBC_LOCK_H
-#define _BITS_LIBC_LOCK_H 1
-
-#include <pthread.h>
-
-#if defined _LIBC && !defined NOT_IN_libc
-#include <linuxthreads/internals.h>
-#endif
-
-/* Mutex type. */
-#if defined(_LIBC) || defined(_IO_MTSAFE_IO)
-typedef pthread_mutex_t __libc_lock_t;
-typedef struct { pthread_mutex_t mutex; } __libc_lock_recursive_t;
-# ifdef __USE_UNIX98
-typedef pthread_rwlock_t __libc_rwlock_t;
-# else
-typedef struct __libc_rwlock_opaque__ __libc_rwlock_t;
-# endif
-typedef __libc_lock_recursive_t __rtld_lock_recursive_t;
-#else
-typedef struct __libc_lock_opaque__ __libc_lock_t;
-typedef struct __libc_lock_recursive_opaque__ __libc_lock_recursive_t;
-typedef struct __libc_rwlock_opaque__ __libc_rwlock_t;
-#endif
-
-/* Type for key to thread-specific data. */
-typedef pthread_key_t __libc_key_t;
-
-/* Define a lock variable NAME with storage class CLASS. The lock must be
- initialized with __libc_lock_init before it can be used (or define it
- with __libc_lock_define_initialized, below). Use `extern' for CLASS to
- declare a lock defined in another module. In public structure
- definitions you must use a pointer to the lock structure (i.e., NAME
- begins with a `*'), because its storage size will not be known outside
- of libc. */
-#define __libc_lock_define(CLASS,NAME) \
- CLASS __libc_lock_t NAME;
-#define __libc_rwlock_define(CLASS,NAME) \
- CLASS __libc_rwlock_t NAME;
-#define __libc_lock_define_recursive(CLASS,NAME) \
- CLASS __libc_lock_recursive_t NAME;
-#define __rtld_lock_define_recursive(CLASS,NAME) \
- CLASS __rtld_lock_recursive_t NAME;
-
-/* Define an initialized lock variable NAME with storage class CLASS.
-
- For the C library we take a deeper look at the initializer. For
- this implementation all fields are initialized to zero. Therefore
- we don't initialize the variable which allows putting it into the
- BSS section. (Except on PA-RISC and other odd architectures, where
- initialized locks must be set to one due to the lack of normal
- atomic operations.) */
-
-#if __LT_SPINLOCK_INIT == 0
-# define __libc_lock_define_initialized(CLASS,NAME) \
- CLASS __libc_lock_t NAME;
-#else
-# define __libc_lock_define_initialized(CLASS,NAME) \
- CLASS __libc_lock_t NAME = PTHREAD_MUTEX_INITIALIZER;
-#endif
-
-#define __libc_rwlock_define_initialized(CLASS,NAME) \
- CLASS __libc_rwlock_t NAME = PTHREAD_RWLOCK_INITIALIZER;
-
-/* Define an initialized recursive lock variable NAME with storage
- class CLASS. */
-#define __libc_lock_define_initialized_recursive(CLASS,NAME) \
- CLASS __libc_lock_recursive_t NAME = _LIBC_LOCK_RECURSIVE_INITIALIZER;
-#define _LIBC_LOCK_RECURSIVE_INITIALIZER \
- {PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP}
-
-#define __rtld_lock_define_initialized_recursive(CLASS,NAME) \
- CLASS __rtld_lock_recursive_t NAME = _RTLD_LOCK_RECURSIVE_INITIALIZER;
-#define _RTLD_LOCK_RECURSIVE_INITIALIZER \
- {PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP}
-
-#if defined _LIBC && defined IS_IN_libpthread
-# define __libc_maybe_call(FUNC, ARGS, ELSE) FUNC ARGS
-#else
-# if defined __PIC__ || (defined _LIBC && defined SHARED)
-# define __libc_maybe_call(FUNC, ARGS, ELSE) \
- (__extension__ ({ __typeof (FUNC) *_fn = (FUNC); \
- _fn != NULL ? (*_fn) ARGS : ELSE; }))
-# else
-# define __libc_maybe_call(FUNC, ARGS, ELSE) \
- (FUNC != NULL ? FUNC ARGS : ELSE)
-# endif
-#endif
-#if defined _LIBC && !defined NOT_IN_libc && defined SHARED
-# define __libc_maybe_call2(FUNC, ARGS, ELSE) \
- ({__builtin_expect (__libc_pthread_functions.ptr_##FUNC != NULL, 0) \
- ? __libc_pthread_functions.ptr_##FUNC ARGS : ELSE; })
-#else
-# define __libc_maybe_call2(FUNC, ARGS, ELSE) __libc_maybe_call (__##FUNC, ARGS, ELSE)
-#endif
-
-/* Initialize the named lock variable, leaving it in a consistent, unlocked
- state. */
-#if defined _LIBC && !defined NOT_IN_libc && defined SHARED
-#define __libc_lock_init(NAME) \
- ({ \
- (NAME).__m_count = 0; \
- (NAME).__m_owner = NULL; \
- (NAME).__m_kind = PTHREAD_MUTEX_TIMED_NP; \
- (NAME).__m_lock.__status = 0; \
- (NAME).__m_lock.__spinlock = __LT_SPINLOCK_INIT; \
- 0; })
-#else
-#define __libc_lock_init(NAME) \
- (__libc_maybe_call2 (pthread_mutex_init, (&(NAME), NULL), 0))
-#endif
-#define __libc_rwlock_init(NAME) \
- (__libc_maybe_call (__pthread_rwlock_init, (&(NAME), NULL), 0));
-
-/* Same as last but this time we initialize a recursive mutex. */
-#if defined _LIBC && !defined NOT_IN_libc && defined SHARED
-#define __libc_lock_init_recursive(NAME) \
- ({ \
- (NAME).mutex.__m_count = 0; \
- (NAME).mutex.__m_owner = NULL; \
- (NAME).mutex.__m_kind = PTHREAD_MUTEX_RECURSIVE_NP; \
- (NAME).mutex.__m_lock.__status = 0; \
- (NAME).mutex.__m_lock.__spinlock = __LT_SPINLOCK_INIT; \
- 0; })
-#else
-#define __libc_lock_init_recursive(NAME) \
- do { \
- if (__pthread_mutex_init != NULL) \
- { \
- pthread_mutexattr_t __attr; \
- __pthread_mutexattr_init (&__attr); \
- __pthread_mutexattr_settype (&__attr, PTHREAD_MUTEX_RECURSIVE_NP); \
- __pthread_mutex_init (&(NAME).mutex, &__attr); \
- __pthread_mutexattr_destroy (&__attr); \
- } \
- } while (0);
-#endif
-#define __rtld_lock_init_recursive(NAME) \
- __libc_lock_init_recursive (NAME)
-
-/* Finalize the named lock variable, which must be locked. It cannot be
- used again until __libc_lock_init is called again on it. This must be
- called on a lock variable before the containing storage is reused. */
-#define __libc_lock_fini(NAME) \
- (__libc_maybe_call2 (pthread_mutex_destroy, (&(NAME)), 0));
-#define __libc_rwlock_fini(NAME) \
- (__libc_maybe_call (__pthread_rwlock_destroy, (&(NAME)), 0));
-
-/* Finalize recursive named lock. */
-#define __libc_lock_fini_recursive(NAME) __libc_lock_fini ((NAME).mutex)
-#define __rtld_lock_fini_recursive(NAME) __libc_lock_fini_recursive (NAME)
-
-/* Lock the named lock variable. */
-#define __libc_lock_lock(NAME) \
- (__libc_maybe_call2 (pthread_mutex_lock, (&(NAME)), 0));
-#define __libc_rwlock_rdlock(NAME) \
- (__libc_maybe_call (__pthread_rwlock_rdlock, (&(NAME)), 0));
-#define __libc_rwlock_wrlock(NAME) \
- (__libc_maybe_call (__pthread_rwlock_wrlock, (&(NAME)), 0));
-
-/* Lock the recursive named lock variable. */
-#define __libc_lock_lock_recursive(NAME) __libc_lock_lock ((NAME).mutex)
-
-/* Try to lock the named lock variable. */
-#define __libc_lock_trylock(NAME) \
- (__libc_maybe_call2 (pthread_mutex_trylock, (&(NAME)), 0))
-#define __libc_rwlock_tryrdlock(NAME) \
- (__libc_maybe_call (__pthread_rwlock_tryrdlock, (&(NAME)), 0))
-#define __libc_rwlock_trywrlock(NAME) \
- (__libc_maybe_call (__pthread_rwlock_trywrlock, (&(NAME)), 0))
-
-/* Try to lock the recursive named lock variable. */
-#define __libc_lock_trylock_recursive(NAME) __libc_lock_trylock ((NAME).mutex)
-#define __rtld_lock_trylock_recursive(NAME) \
- __libc_lock_trylock_recursive (NAME)
-
-/* Unlock the named lock variable. */
-#define __libc_lock_unlock(NAME) \
- (__libc_maybe_call2 (pthread_mutex_unlock, (&(NAME)), 0));
-#define __libc_rwlock_unlock(NAME) \
- (__libc_maybe_call (__pthread_rwlock_unlock, (&(NAME)), 0));
-
-/* Unlock the recursive named lock variable. */
-#define __libc_lock_unlock_recursive(NAME) __libc_lock_unlock ((NAME).mutex)
-
-#if defined _LIBC && defined SHARED
-# define __rtld_lock_default_lock_recursive(lock) \
- ++((pthread_mutex_t *)(lock))->__m_count;
-
-# define __rtld_lock_default_unlock_recursive(lock) \
- --((pthread_mutex_t *)(lock))->__m_count;
-
-# define __rtld_lock_lock_recursive(NAME) \
- GL(dl_rtld_lock_recursive) (&(NAME).mutex)
-
-# define __rtld_lock_unlock_recursive(NAME) \
- GL(dl_rtld_unlock_recursive) (&(NAME).mutex)
-#else
-#define __rtld_lock_lock_recursive(NAME) __libc_lock_lock_recursive (NAME)
-#define __rtld_lock_unlock_recursive(NAME) __libc_lock_unlock_recursive (NAME)
-#endif
-
-/* Define once control variable. */
-#if PTHREAD_ONCE_INIT == 0
-/* Special case for static variables where we can avoid the initialization
- if it is zero. */
-# define __libc_once_define(CLASS, NAME) \
- CLASS pthread_once_t NAME
-#else
-# define __libc_once_define(CLASS, NAME) \
- CLASS pthread_once_t NAME = PTHREAD_ONCE_INIT
-#endif
-
-/* Call handler iff the first call. */
-#define __libc_once(ONCE_CONTROL, INIT_FUNCTION) \
- do { \
- if (__pthread_once != NULL) \
- __pthread_once (&(ONCE_CONTROL), (INIT_FUNCTION)); \
- else if ((ONCE_CONTROL) == PTHREAD_ONCE_INIT) { \
- INIT_FUNCTION (); \
- (ONCE_CONTROL) = 2; \
- } \
- } while (0)
-
-
-/* Start critical region with cleanup. */
-#define __libc_cleanup_region_start(DOIT, FCT, ARG) \
- { struct _pthread_cleanup_buffer _buffer; \
- int _avail = (DOIT) && _pthread_cleanup_push_defer != NULL; \
- if (_avail) { \
- _pthread_cleanup_push_defer (&_buffer, (FCT), (ARG)); \
- }
-
-/* End critical region with cleanup. */
-#define __libc_cleanup_region_end(DOIT) \
- if (_avail) { \
- _pthread_cleanup_pop_restore (&_buffer, (DOIT)); \
- } \
- }
-
-/* Sometimes we have to exit the block in the middle. */
-#define __libc_cleanup_end(DOIT) \
- if (_avail) { \
- _pthread_cleanup_pop_restore (&_buffer, (DOIT)); \
- }
-
-#define __libc_cleanup_push(fct, arg) \
- { struct _pthread_cleanup_buffer _buffer; \
- __libc_maybe_call (_pthread_cleanup_push, (&_buffer, (fct), (arg)), 0)
-
-#define __libc_cleanup_pop(execute) \
- __libc_maybe_call (_pthread_cleanup_pop, (&_buffer, execute), 0); \
- }
-
-/* Create thread-specific key. */
-#define __libc_key_create(KEY, DESTRUCTOR) \
- (__libc_maybe_call (__pthread_key_create, (KEY, DESTRUCTOR), 1))
-
-/* Get thread-specific data. */
-#define __libc_getspecific(KEY) \
- (__libc_maybe_call (__pthread_getspecific, (KEY), NULL))
-
-/* Set thread-specific data. */
-#define __libc_setspecific(KEY, VALUE) \
- (__libc_maybe_call (__pthread_setspecific, (KEY, VALUE), 0))
-
-
-/* Register handlers to execute before and after `fork'. */
-#define __libc_atfork(PREPARE, PARENT, CHILD) \
- (__libc_maybe_call (__pthread_atfork, (PREPARE, PARENT, CHILD), 0))
-
-/* Functions that are used by this file and are internal to the GNU C
- library. */
-
-extern int __pthread_mutex_init (pthread_mutex_t *__mutex,
- __const pthread_mutexattr_t *__mutex_attr);
-
-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_unlock (pthread_mutex_t *__mutex);
-
-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);
-
-#ifdef __USE_UNIX98
-extern int __pthread_rwlock_init (pthread_rwlock_t *__rwlock,
- __const pthread_rwlockattr_t *__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);
-#endif
-
-extern int __pthread_key_create (pthread_key_t *__key,
- void (*__destr_function) (void *));
-
-extern int __pthread_setspecific (pthread_key_t __key,
- __const void *__pointer);
-
-extern void *__pthread_getspecific (pthread_key_t __key);
-
-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));
-
-
-
-/* Make the pthread functions weak so that we can elide them from
- single-threaded processes. */
-#ifndef __NO_WEAK_PTHREAD_ALIASES
-# ifdef weak_extern
-# if _LIBC
-# include <bp-sym.h>
-# else
-# define BP_SYM (sym) sym
-# endif
-weak_extern (BP_SYM (__pthread_mutex_init))
-weak_extern (BP_SYM (__pthread_mutex_destroy))
-weak_extern (BP_SYM (__pthread_mutex_lock))
-weak_extern (BP_SYM (__pthread_mutex_trylock))
-weak_extern (BP_SYM (__pthread_mutex_unlock))
-weak_extern (BP_SYM (__pthread_mutexattr_init))
-weak_extern (BP_SYM (__pthread_mutexattr_destroy))
-weak_extern (BP_SYM (__pthread_mutexattr_settype))
-weak_extern (BP_SYM (__pthread_rwlock_init))
-weak_extern (BP_SYM (__pthread_rwlock_destroy))
-weak_extern (BP_SYM (__pthread_rwlock_rdlock))
-weak_extern (BP_SYM (__pthread_rwlock_tryrdlock))
-weak_extern (BP_SYM (__pthread_rwlock_wrlock))
-weak_extern (BP_SYM (__pthread_rwlock_trywrlock))
-weak_extern (BP_SYM (__pthread_rwlock_unlock))
-weak_extern (BP_SYM (__pthread_key_create))
-weak_extern (BP_SYM (__pthread_setspecific))
-weak_extern (BP_SYM (__pthread_getspecific))
-weak_extern (BP_SYM (__pthread_once))
-weak_extern (__pthread_initialize)
-weak_extern (__pthread_atfork)
-weak_extern (BP_SYM (_pthread_cleanup_push))
-weak_extern (BP_SYM (_pthread_cleanup_pop))
-weak_extern (BP_SYM (_pthread_cleanup_push_defer))
-weak_extern (BP_SYM (_pthread_cleanup_pop_restore))
-# else
-# pragma weak __pthread_mutex_init
-# pragma weak __pthread_mutex_destroy
-# pragma weak __pthread_mutex_lock
-# pragma weak __pthread_mutex_trylock
-# pragma weak __pthread_mutex_unlock
-# pragma weak __pthread_mutexattr_init
-# pragma weak __pthread_mutexattr_destroy
-# pragma weak __pthread_mutexattr_settype
-# pragma weak __pthread_rwlock_destroy
-# pragma weak __pthread_rwlock_rdlock
-# pragma weak __pthread_rwlock_tryrdlock
-# pragma weak __pthread_rwlock_wrlock
-# pragma weak __pthread_rwlock_trywrlock
-# pragma weak __pthread_rwlock_unlock
-# pragma weak __pthread_key_create
-# pragma weak __pthread_setspecific
-# pragma weak __pthread_getspecific
-# pragma weak __pthread_once
-# pragma weak __pthread_initialize
-# pragma weak __pthread_atfork
-# pragma weak _pthread_cleanup_push_defer
-# pragma weak _pthread_cleanup_pop_restore
-# pragma weak _pthread_cleanup_push
-# pragma weak _pthread_cleanup_pop
-# endif
-#endif
-
-/* We need portable names for some functions. E.g., when they are
- used as argument to __libc_cleanup_region_start. */
-#define __libc_mutex_unlock __pthread_mutex_unlock
-
-#endif /* bits/libc-lock.h */
diff --git a/linuxthreads/sysdeps/pthread/bits/libc-tsd.h b/linuxthreads/sysdeps/pthread/bits/libc-tsd.h
deleted file mode 100644
index fa6eb4be28..0000000000
--- a/linuxthreads/sysdeps/pthread/bits/libc-tsd.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* libc-internal interface for thread-specific data. LinuxThreads version.
- Copyright (C) 1997-2002, 2003 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _BITS_LIBC_TSD_H
-#define _BITS_LIBC_TSD_H 1
-
-#include <linuxthreads/descr.h>
-#include <tls.h>
-
-#if USE_TLS && HAVE___THREAD
-
-/* When __thread works, the generic definition is what we want. */
-# include <sysdeps/generic/bits/libc-tsd.h>
-
-#else
-
-# include <bits/libc-lock.h>
-
-# ifndef SHARED
-extern void ** __pthread_internal_tsd_address (int);
-extern void *__pthread_internal_tsd_get (int);
-extern int __pthread_internal_tsd_set (int, const void *);
-
-weak_extern (__pthread_internal_tsd_address)
-weak_extern (__pthread_internal_tsd_get)
-weak_extern (__pthread_internal_tsd_set)
-# endif
-
-#define __libc_tsd_define(CLASS, KEY) CLASS void *__libc_tsd_##KEY##_data;
-#define __libc_tsd_address(KEY) \
- __libc_maybe_call2 (pthread_internal_tsd_address, \
- (_LIBC_TSD_KEY_##KEY), &__libc_tsd_##KEY##_data)
-#define __libc_tsd_get(KEY) \
- __libc_maybe_call2 (pthread_internal_tsd_get, \
- (_LIBC_TSD_KEY_##KEY), __libc_tsd_##KEY##_data)
-#define __libc_tsd_set(KEY, VALUE) \
- __libc_maybe_call2 (pthread_internal_tsd_set, \
- (_LIBC_TSD_KEY_##KEY, (VALUE)), \
- (__libc_tsd_##KEY##_data = (VALUE), 0))
-
-#endif
-
-#endif /* bits/libc-tsd.h */
diff --git a/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h b/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h
deleted file mode 100644
index d1daef07aa..0000000000
--- a/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-#if !defined _BITS_TYPES_H && !defined _PTHREAD_H
-# error "Never include <bits/pthreadtypes.h> directly; use <sys/types.h> instead."
-#endif
-
-#ifndef _BITS_PTHREADTYPES_H
-#define _BITS_PTHREADTYPES_H 1
-
-#define __need_schedparam
-#include <bits/sched.h>
-
-/* Fast locks (not abstract because mutexes and conditions aren't abstract). */
-struct _pthread_fastlock
-{
- long int __status; /* "Free" or "taken" or head of waiting list */
- int __spinlock; /* Used by compare_and_swap emulation. Also,
- adaptive SMP lock stores spin count here. */
-};
-
-#ifndef _PTHREAD_DESCR_DEFINED
-/* Thread descriptors */
-typedef struct _pthread_descr_struct *_pthread_descr;
-# define _PTHREAD_DESCR_DEFINED
-#endif
-
-
-/* Attributes for threads. */
-typedef struct __pthread_attr_s
-{
- int __detachstate;
- int __schedpolicy;
- struct __sched_param __schedparam;
- int __inheritsched;
- int __scope;
- size_t __guardsize;
- int __stackaddr_set;
- void *__stackaddr;
- size_t __stacksize;
-} pthread_attr_t;
-
-
-/* Conditions (not abstract because of PTHREAD_COND_INITIALIZER */
-
-#ifdef __GLIBC_HAVE_LONG_LONG
-__extension__ typedef long long __pthread_cond_align_t;
-#else
-typedef long __pthread_cond_align_t;
-#endif
-
-typedef struct
-{
- struct _pthread_fastlock __c_lock; /* Protect against concurrent access */
- _pthread_descr __c_waiting; /* Threads waiting on this condition */
- char __padding[48 - sizeof (struct _pthread_fastlock)
- - sizeof (_pthread_descr) - sizeof (__pthread_cond_align_t)];
- __pthread_cond_align_t __align;
-} pthread_cond_t;
-
-
-/* Attribute for conditionally variables. */
-typedef struct
-{
- int __dummy;
-} pthread_condattr_t;
-
-/* Keys for thread-specific data */
-typedef unsigned int pthread_key_t;
-
-
-/* Mutexes (not abstract because of PTHREAD_MUTEX_INITIALIZER). */
-/* (The layout is unnatural to maintain binary compatibility
- with earlier releases of LinuxThreads.) */
-typedef struct
-{
- int __m_reserved; /* Reserved for future use */
- int __m_count; /* Depth of recursive locking */
- _pthread_descr __m_owner; /* Owner thread (if recursive or errcheck) */
- int __m_kind; /* Mutex kind: fast, recursive or errcheck */
- struct _pthread_fastlock __m_lock; /* Underlying fast lock */
-} pthread_mutex_t;
-
-
-/* Attribute for mutex. */
-typedef struct
-{
- int __mutexkind;
-} pthread_mutexattr_t;
-
-
-/* Once-only execution */
-typedef int pthread_once_t;
-
-
-#if defined __USE_UNIX98 || defined __USE_XOPEN2K
-/* Read-write locks. */
-typedef struct _pthread_rwlock_t
-{
- struct _pthread_fastlock __rw_lock; /* Lock to guarantee mutual exclusion */
- int __rw_readers; /* Number of readers */
- _pthread_descr __rw_writer; /* Identity of writer, or NULL if none */
- _pthread_descr __rw_read_waiting; /* Threads waiting for reading */
- _pthread_descr __rw_write_waiting; /* Threads waiting for writing */
- int __rw_kind; /* Reader/Writer preference selection */
- int __rw_pshared; /* Shared between processes or not */
-} pthread_rwlock_t;
-
-
-/* Attribute for read-write locks. */
-typedef struct
-{
- int __lockkind;
- int __pshared;
-} pthread_rwlockattr_t;
-#endif
-
-#ifdef __USE_XOPEN2K
-/* POSIX spinlock data type. */
-typedef volatile int pthread_spinlock_t;
-
-/* POSIX barrier. */
-typedef struct {
- struct _pthread_fastlock __ba_lock; /* Lock to guarantee mutual exclusion */
- int __ba_required; /* Threads needed for completion */
- int __ba_present; /* Threads waiting */
- _pthread_descr __ba_waiting; /* Queue of waiting threads */
-} pthread_barrier_t;
-
-/* barrier attribute */
-typedef struct {
- int __pshared;
-} pthread_barrierattr_t;
-
-#endif
-
-
-/* Thread identifiers */
-typedef unsigned long int pthread_t;
-
-#endif /* bits/pthreadtypes.h */
diff --git a/linuxthreads/sysdeps/pthread/bits/typesizes.h b/linuxthreads/sysdeps/pthread/bits/typesizes.h
deleted file mode 100644
index 45264ac9cf..0000000000
--- a/linuxthreads/sysdeps/pthread/bits/typesizes.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* bits/typesizes.h -- underlying types for *_t. Generic version.
- Copyright (C) 2002, 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _BITS_TYPES_H
-# error "Never include <bits/typesizes.h> directly; use <sys/types.h> instead."
-#endif
-
-#ifndef _BITS_TYPESIZES_H
-#define _BITS_TYPESIZES_H 1
-
-/* See <bits/types.h> for the meaning of these macros. This file exists so
- that <bits/types.h> need not vary across different GNU platforms. */
-
-#define __DEV_T_TYPE __UQUAD_TYPE
-#define __UID_T_TYPE __U32_TYPE
-#define __GID_T_TYPE __U32_TYPE
-#define __INO_T_TYPE __ULONGWORD_TYPE
-#define __INO64_T_TYPE __UQUAD_TYPE
-#define __MODE_T_TYPE __U32_TYPE
-#define __NLINK_T_TYPE __UWORD_TYPE
-#define __OFF_T_TYPE __SLONGWORD_TYPE
-#define __OFF64_T_TYPE __SQUAD_TYPE
-#define __PID_T_TYPE __S32_TYPE
-#define __RLIM_T_TYPE __ULONGWORD_TYPE
-#define __RLIM64_T_TYPE __UQUAD_TYPE
-#define __BLKCNT_T_TYPE __SLONGWORD_TYPE
-#define __BLKCNT64_T_TYPE __SQUAD_TYPE
-#define __FSBLKCNT_T_TYPE __ULONGWORD_TYPE
-#define __FSBLKCNT64_T_TYPE __UQUAD_TYPE
-#define __FSFILCNT_T_TYPE __ULONGWORD_TYPE
-#define __FSFILCNT64_T_TYPE __UQUAD_TYPE
-#define __ID_T_TYPE __U32_TYPE
-#define __CLOCK_T_TYPE __SLONGWORD_TYPE
-#define __TIME_T_TYPE __SLONGWORD_TYPE
-#define __USECONDS_T_TYPE __U32_TYPE
-#define __SUSECONDS_T_TYPE __SLONGWORD_TYPE
-#define __DADDR_T_TYPE __S32_TYPE
-#define __SWBLK_T_TYPE __SLONGWORD_TYPE
-#define __KEY_T_TYPE __S32_TYPE
-#define __CLOCKID_T_TYPE __S32_TYPE
-#define __TIMER_T_TYPE __S32_TYPE
-#define __BLKSIZE_T_TYPE __SLONGWORD_TYPE
-#define __FSID_T_TYPE struct { int __val[2]; }
-#define __SSIZE_T_TYPE __SWORD_TYPE
-
-/* Number of descriptors that can fit in an `fd_set'. */
-#define __FD_SETSIZE 1024
-
-
-#endif /* bits/typesizes.h */
diff --git a/linuxthreads/sysdeps/pthread/errno-loc.c b/linuxthreads/sysdeps/pthread/errno-loc.c
deleted file mode 100644
index 0a8f0f9076..0000000000
--- a/linuxthreads/sysdeps/pthread/errno-loc.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* MT support function to get address of `errno' variable, linuxthreads
- version.
- Copyright (C) 1996, 1998, 2002, 2003, 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <errno.h>
-#include <tls.h>
-#include <linuxthreads/internals.h>
-#include <sysdep-cancel.h>
-
-#if ! USE___THREAD && !RTLD_PRIVATE_ERRNO
-#undef errno
-extern int errno;
-#endif
-
-int *
-#if ! USE___THREAD
-weak_const_function
-#endif
-__errno_location (void)
-{
-#if ! USE___THREAD && !defined NOT_IN_libc
- if (! SINGLE_THREAD_P)
- {
- pthread_descr self = thread_self();
- return LIBC_THREAD_GETMEM (self, p_errnop);
- }
-#endif
- return &errno;
-}
-libc_hidden_def (__errno_location)
diff --git a/linuxthreads/sysdeps/pthread/flockfile.c b/linuxthreads/sysdeps/pthread/flockfile.c
deleted file mode 100644
index 918cb84f61..0000000000
--- a/linuxthreads/sysdeps/pthread/flockfile.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <pthread.h>
-#include <stdio.h>
-#include <libio.h>
-#include <bits/stdio-lock.h>
-
-
-void
-__flockfile (stream)
- FILE *stream;
-{
- _IO_lock_lock (*stream->_lock);
-}
-strong_alias (__flockfile, _IO_flockfile)
-weak_alias (__flockfile, flockfile)
diff --git a/linuxthreads/sysdeps/pthread/ftrylockfile.c b/linuxthreads/sysdeps/pthread/ftrylockfile.c
deleted file mode 100644
index 21c1ea01ed..0000000000
--- a/linuxthreads/sysdeps/pthread/ftrylockfile.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <bits/stdio-lock.h>
-
-
-int
-__ftrylockfile (stream)
- FILE *stream;
-{
- return _IO_lock_trylock (*stream->_lock);
-}
-strong_alias (__ftrylockfile, _IO_ftrylockfile)
-weak_alias (__ftrylockfile, ftrylockfile)
diff --git a/linuxthreads/sysdeps/pthread/funlockfile.c b/linuxthreads/sysdeps/pthread/funlockfile.c
deleted file mode 100644
index f941fc9851..0000000000
--- a/linuxthreads/sysdeps/pthread/funlockfile.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <pthread.h>
-#include <stdio.h>
-#include <libio.h>
-#include <bits/stdio-lock.h>
-
-
-void
-__funlockfile (stream)
- FILE *stream;
-{
- _IO_lock_unlock (*stream->_lock);
-}
-strong_alias (__funlockfile, _IO_funlockfile)
-weak_alias (__funlockfile, funlockfile)
diff --git a/linuxthreads/sysdeps/pthread/getcpuclockid.c b/linuxthreads/sysdeps/pthread/getcpuclockid.c
deleted file mode 100644
index 1c64e6c2be..0000000000
--- a/linuxthreads/sysdeps/pthread/getcpuclockid.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/* pthread_getcpuclockid -- Get POSIX clockid_t for a pthread_t. Linux version
- Copyright (C) 2000, 2001, 2004, 2005 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include <sys/time.h>
-#include <time.h>
-#include <internals.h>
-#include <spinlock.h>
-#include <kernel-features.h>
-#include <kernel-posix-cpu-timers.h>
-
-
-#if !(__ASSUME_POSIX_CPU_TIMERS > 0)
-int __libc_missing_posix_cpu_timers attribute_hidden;
-#endif
-#if !(__ASSUME_POSIX_TIMERS > 0)
-int __libc_missing_posix_timers attribute_hidden;
-#endif
-
-int
-pthread_getcpuclockid (pthread_t thread_id, clockid_t *clock_id)
-{
-#ifdef __NR_clock_getres
- pthread_handle handle = thread_handle(thread_id);
- int pid;
-
- __pthread_lock (&handle->h_lock, NULL);
- if (nonexisting_handle (handle, thread_id))
- {
- __pthread_unlock (&handle->h_lock);
- return ESRCH;
- }
- pid = handle->h_descr->p_pid;
- __pthread_unlock (&handle->h_lock);
-
- /* The clockid_t value is a simple computation from the PID.
- But we do a clock_getres call to validate it if we aren't
- yet sure we have the kernel support. */
-
- const clockid_t pidclock = MAKE_PROCESS_CPUCLOCK (pid, CPUCLOCK_SCHED);
-
-# if !(__ASSUME_POSIX_CPU_TIMERS > 0)
-# if !(__ASSUME_POSIX_TIMERS > 0)
- if (__libc_missing_posix_timers && !__libc_missing_posix_cpu_timers)
- __libc_missing_posix_cpu_timers = 1;
-# endif
- if (!__libc_missing_posix_cpu_timers)
- {
- INTERNAL_SYSCALL_DECL (err);
- int r = INTERNAL_SYSCALL (clock_getres, err, 2, pidclock, NULL);
- if (!INTERNAL_SYSCALL_ERROR_P (r, err))
-# endif
- {
- *clock_id = pidclock;
- return 0;
- }
-
-# if !(__ASSUME_POSIX_CPU_TIMERS > 0)
-# if !(__ASSUME_POSIX_TIMERS > 0)
- if (INTERNAL_SYSCALL_ERRNO (r, err) == ENOSYS)
- {
- /* The kernel doesn't support these calls at all. */
- __libc_missing_posix_timers = 1;
- __libc_missing_posix_cpu_timers = 1;
- }
- else
-# endif
- if (INTERNAL_SYSCALL_ERRNO (r, err) == EINVAL)
- {
- /* The kernel doesn't support these clocks at all. */
- __libc_missing_posix_cpu_timers = 1;
- }
- else
- return INTERNAL_SYSCALL_ERRNO (r, err);
- }
-# endif
-#endif
-
-#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 (2 * PTHREAD_THREADS_MAX
- >= 1 << (8 * sizeof (*clock_id) - CLOCK_IDFIELD_SIZE))
- return ERANGE;
-
- /* Store the number. */
- *clock_id = CLOCK_THREAD_CPUTIME_ID | (thread_id << CLOCK_IDFIELD_SIZE);
-
- return 0;
-#else
- /* We don't have a timer for that. */
- return ENOENT;
-#endif
-}
diff --git a/linuxthreads/sysdeps/pthread/herrno-loc.c b/linuxthreads/sysdeps/pthread/herrno-loc.c
deleted file mode 100644
index fbc5576166..0000000000
--- a/linuxthreads/sysdeps/pthread/herrno-loc.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Copyright (C) 1996, 97, 98, 2002, 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <netdb.h>
-#include <tls.h>
-#include <linuxthreads/internals.h>
-#include <sysdep-cancel.h>
-
-#if ! USE___THREAD
-# undef h_errno
-extern int h_errno;
-#endif
-
-/* When threaded, h_errno may be a per-thread variable. */
-int *
-weak_const_function
-__h_errno_location (void)
-{
-#if ! USE___THREAD
- if (! SINGLE_THREAD_P)
- {
- pthread_descr self = thread_self();
- return LIBC_THREAD_GETMEM (self, p_h_errnop);
- }
-#endif
- return &h_errno;
-}
-libc_hidden_def (__h_errno_location)
diff --git a/linuxthreads/sysdeps/pthread/list.h b/linuxthreads/sysdeps/pthread/list.h
deleted file mode 100644
index 43186a2d51..0000000000
--- a/linuxthreads/sysdeps/pthread/list.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _LIST_H
-#define _LIST_H 1
-
-/* The definitions of this file are adopted from those which can be
- found in the Linux kernel headers to enable people familiar with
- the latter find their way in these sources as well. */
-
-
-/* Basic type for the double-link list. */
-typedef struct list_head
-{
- struct list_head *next;
- struct list_head *prev;
-} list_t;
-
-
-/* Define a variable with the head and tail of the list. */
-#define LIST_HEAD(name) \
- list_t name = { &(name), &(name) }
-
-/* Initialize a new list head. */
-#define INIT_LIST_HEAD(ptr) \
- (ptr)->next = (ptr)->prev = (ptr)
-
-
-/* Add new element at the head of the list. */
-static inline void
-list_add (list_t *newp, list_t *head)
-{
- head->next->prev = newp;
- newp->next = head->next;
- newp->prev = head;
- head->next = newp;
-}
-
-
-/* Add new element at the tail of the list. */
-static inline void
-list_add_tail (list_t *newp, list_t *head)
-{
- head->prev->next = newp;
- newp->next = head;
- newp->prev = head->prev;
- head->prev = newp;
-}
-
-
-/* Remove element from list. */
-static inline void
-list_del (list_t *elem)
-{
- elem->next->prev = elem->prev;
- elem->prev->next = elem->next;
-}
-
-
-/* Join two lists. */
-static inline void
-list_splice (list_t *add, list_t *head)
-{
- /* Do nothing if the list which gets added is empty. */
- if (add != add->next)
- {
- add->next->prev = head;
- add->prev->next = head->next;
- head->next->prev = add->prev;
- head->next = add->next;
- }
-}
-
-
-/* Get typed element from list at a given position. */
-#define list_entry(ptr, type, member) \
- ((type *) ((char *) (ptr) - (unsigned long) (&((type *) 0)->member)))
-
-
-
-/* Iterate forward over the elements of the list. */
-#define list_for_each(pos, head) \
- for (pos = (head)->next; pos != (head); pos = pos->next)
-
-
-/* Iterate forward over the elements of the list. */
-#define list_for_each_prev(pos, head) \
- for (pos = (head)->prev; pos != (head); pos = pos->prev)
-
-
-/* Iterate backwards over the elements list. The list elements can be
- removed from the list while doing this. */
-#define list_for_each_prev_safe(pos, p, head) \
- for (pos = (head)->prev, p = pos->prev; \
- pos != (head); \
- pos = p, p = pos->prev)
-
-#endif /* list.h */
diff --git a/linuxthreads/sysdeps/pthread/malloc-machine.h b/linuxthreads/sysdeps/pthread/malloc-machine.h
deleted file mode 100644
index 5191f8c779..0000000000
--- a/linuxthreads/sysdeps/pthread/malloc-machine.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Basic platform-independent macro definitions for mutexes,
- thread-specific data and parameters for malloc.
- Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _MALLOC_MACHINE_H
-#define _MALLOC_MACHINE_H
-
-#undef thread_atfork_static
-
-#include <atomic.h>
-#include <bits/libc-lock.h>
-
-__libc_lock_define (typedef, mutex_t)
-
-#define mutex_init(m) \
- __libc_maybe_call2 (pthread_mutex_init, (m, NULL), (*(int *)(m) = 0))
-#define mutex_lock(m) \
- __libc_maybe_call2 (pthread_mutex_lock, (m), ((*(int *)(m) = 1), 0))
-#define mutex_trylock(m) \
- __libc_maybe_call2 (pthread_mutex_trylock, (m), \
- (*(int *)(m) ? 1 : ((*(int *)(m) = 1), 0)))
-#define mutex_unlock(m) \
- __libc_maybe_call2 (pthread_mutex_unlock, (m), (*(int *)(m) = 0))
-
-/* This is defined by newer gcc version unique for each module. */
-extern void *__dso_handle __attribute__ ((__weak__));
-
-#include <fork.h>
-
-#ifdef SHARED
-# define thread_atfork(prepare, parent, child) \
- __register_atfork (prepare, parent, child, __dso_handle)
-#else
-# define thread_atfork(prepare, parent, child) \
- __register_atfork (prepare, parent, child, \
- &__dso_handle == NULL ? NULL : __dso_handle)
-#endif
-
-/* thread specific data for glibc */
-
-#include <bits/libc-tsd.h>
-
-typedef int tsd_key_t[1]; /* no key data structure, libc magic does it */
-__libc_tsd_define (static, MALLOC) /* declaration/common definition */
-#define tsd_key_create(key, destr) ((void) (key))
-#define tsd_setspecific(key, data) __libc_tsd_set (MALLOC, (data))
-#define tsd_getspecific(key, vptr) ((vptr) = __libc_tsd_get (MALLOC))
-
-#include <sysdeps/generic/malloc-machine.h>
-
-#endif /* !defined(_MALLOC_MACHINE_H) */
diff --git a/linuxthreads/sysdeps/pthread/posix-timer.h b/linuxthreads/sysdeps/pthread/posix-timer.h
deleted file mode 100644
index 1b0a2b65e4..0000000000
--- a/linuxthreads/sysdeps/pthread/posix-timer.h
+++ /dev/null
@@ -1,204 +0,0 @@
-/* Definitions for POSIX timer implementation on top of LinuxThreads.
- Copyright (C) 2000, 2002, 2004 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Kaz Kylheku <kaz@ashi.footprints.net>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <limits.h>
-#include <signal.h>
-
-/* Double linked list. */
-struct list_links
-{
- struct list_links *next;
- struct list_links *prev;
-};
-
-
-/* Forward declaration. */
-struct timer_node;
-
-
-/* Definitions for an internal thread of the POSIX timer implementation. */
-struct thread_node
-{
- struct list_links links;
- pthread_attr_t attr;
- pthread_t id;
- unsigned int exists;
- struct list_links timer_queue;
- pthread_cond_t cond;
- struct timer_node *current_timer;
- pthread_t captured;
- clockid_t clock_id;
-};
-
-
-/* Internal representation of a timer. */
-struct timer_node
-{
- struct list_links links;
- struct sigevent event;
- clockid_t clock;
- struct itimerspec value;
- struct timespec expirytime;
- pthread_attr_t attr;
- unsigned int abstime;
- unsigned int armed;
- enum {
- TIMER_FREE, TIMER_INUSE, TIMER_DELETED
- } inuse;
- struct thread_node *thread;
- pid_t creator_pid;
- int refcount;
- int overrun_count;
-};
-
-
-/* Static array with the structures for all the timers. */
-extern struct timer_node __timer_array[TIMER_MAX];
-
-/* Global lock to protect operation on the lists. */
-extern pthread_mutex_t __timer_mutex;
-
-/* Variable to protext initialization. */
-extern pthread_once_t __timer_init_once_control;
-
-/* Nonzero if initialization of timer implementation failed. */
-extern int __timer_init_failed;
-
-/* Nodes for the threads used to deliver signals. */
-/* A distinct thread is used for each clock type. */
-
-extern struct thread_node __timer_signal_thread_rclk;
-
-
-/* Return pointer to timer structure corresponding to ID. */
-static inline struct timer_node *
-timer_id2ptr (timer_t timerid)
-{
- if (timerid >= 0 && timerid < TIMER_MAX)
- return &__timer_array[timerid];
-
- return NULL;
-}
-
-/* Return ID of TIMER. */
-static inline int
-timer_ptr2id (struct timer_node *timer)
-{
- return timer - __timer_array;
-}
-
-/* Check whether timer is valid; global mutex must be held. */
-static inline int
-timer_valid (struct timer_node *timer)
-{
- return timer && timer->inuse == TIMER_INUSE;
-}
-
-/* Timer refcount functions; need global mutex. */
-extern void __timer_dealloc (struct timer_node *timer);
-
-static inline void
-timer_addref (struct timer_node *timer)
-{
- timer->refcount++;
-}
-
-static inline void
-timer_delref (struct timer_node *timer)
-{
- if (--timer->refcount == 0)
- __timer_dealloc (timer);
-}
-
-/* Timespec helper routines. */
-static inline int
-timespec_compare (const struct timespec *left, const struct timespec *right)
-{
- if (left->tv_sec < right->tv_sec)
- return -1;
- if (left->tv_sec > right->tv_sec)
- return 1;
-
- if (left->tv_nsec < right->tv_nsec)
- return -1;
- if (left->tv_nsec > right->tv_nsec)
- return 1;
-
- return 0;
-}
-
-static inline void
-timespec_add (struct timespec *sum, const struct timespec *left,
- const struct timespec *right)
-{
- sum->tv_sec = left->tv_sec + right->tv_sec;
- sum->tv_nsec = left->tv_nsec + right->tv_nsec;
-
- if (sum->tv_nsec >= 1000000000)
- {
- ++sum->tv_sec;
- sum->tv_nsec -= 1000000000;
- }
-}
-
-static inline void
-timespec_sub (struct timespec *diff, const struct timespec *left,
- const struct timespec *right)
-{
- diff->tv_sec = left->tv_sec - right->tv_sec;
- diff->tv_nsec = left->tv_nsec - right->tv_nsec;
-
- if (diff->tv_nsec < 0)
- {
- --diff->tv_sec;
- diff->tv_nsec += 1000000000;
- }
-}
-
-
-/* We need one of the list functions in the other modules. */
-static inline void
-list_unlink_ip (struct list_links *list)
-{
- struct list_links *lnext = list->next, *lprev = list->prev;
-
- lnext->prev = lprev;
- lprev->next = lnext;
-
- /* The suffix ip means idempotent; list_unlink_ip can be called
- * two or more times on the same node.
- */
-
- list->next = list;
- list->prev = list;
-}
-
-
-/* Functions in the helper file. */
-extern void __timer_mutex_cancel_handler (void *arg);
-extern void __timer_init_once (void);
-extern struct timer_node *__timer_alloc (void);
-extern int __timer_thread_start (struct thread_node *thread);
-extern struct thread_node *__timer_thread_find_matching (const pthread_attr_t *desired_attr, clockid_t);
-extern struct thread_node *__timer_thread_alloc (const pthread_attr_t *desired_attr, clockid_t);
-extern void __timer_thread_dealloc (struct thread_node *thread);
-extern int __timer_thread_queue_timer (struct thread_node *thread,
- struct timer_node *insert);
-extern void __timer_thread_wakeup (struct thread_node *thread);
diff --git a/linuxthreads/sysdeps/pthread/pt-initfini.c b/linuxthreads/sysdeps/pthread/pt-initfini.c
deleted file mode 100644
index 1ccac2f6ef..0000000000
--- a/linuxthreads/sysdeps/pthread/pt-initfini.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/* Special .init and .fini section support. Linuxthread version.
- Copyright (C) 1995, 1996, 1997, 2000, 2001 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 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.)
-
- The GNU C Library is distributed in the hope that it will be
- useful, but WITHOUT ANY WARRANTY; without even the implied warranty
- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General 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,
- write to the Free Software Foundation, 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* This file is compiled into assembly code which is then munged by a sed
- script into two files: crti.s and crtn.s.
-
- * crti.s puts a function prologue at the beginning of the
- .init and .fini sections and defines global symbols for
- those addresses, so they can be called as functions.
-
- * crtn.s puts the corresponding function epilogues
- in the .init and .fini sections. */
-
-#include <stdlib.h>
-
-/* We use embedded asm for .section unconditionally, as this makes it
- easier to insert the necessary directives into crtn.S. */
-#define SECTION(x) asm (".section " x )
-
-/* Embed an #include to pull in the alignment and .end directives. */
-asm ("\n#include \"defs.h\"");
-
-/* The initial common code ends here. */
-asm ("\n/*@HEADER_ENDS*/");
-
-/* To determine whether we need .end and .align: */
-asm ("\n/*@TESTS_BEGIN*/");
-extern void dummy (void (*foo) (void));
-void
-dummy (void (*foo) (void))
-{
- if (foo)
- (*foo) ();
-}
-asm ("\n/*@TESTS_END*/");
-
-/* The beginning of _init: */
-asm ("\n/*@_init_PROLOG_BEGINS*/");
-
-static void
-call_initialize_minimal (void)
-{
- extern void __pthread_initialize_minimal (void);
-
- __pthread_initialize_minimal ();
-}
-
-SECTION (".init");
-extern void _init (void);
-void
-_init (void)
-{
- /* The very first thing we must do is to set up the registers. */
- call_initialize_minimal ();
-
- asm ("ALIGN");
- asm("END_INIT");
- /* Now the epilog. */
- asm ("\n/*@_init_PROLOG_ENDS*/");
- asm ("\n/*@_init_EPILOG_BEGINS*/");
- SECTION(".init");
-}
-asm ("END_INIT");
-
-/* End of the _init epilog, beginning of the _fini prolog. */
-asm ("\n/*@_init_EPILOG_ENDS*/");
-asm ("\n/*@_fini_PROLOG_BEGINS*/");
-
-SECTION (".fini");
-extern void _fini (void);
-void
-_fini (void)
-{
-
- /* End of the _fini prolog. */
- asm ("ALIGN");
- asm ("END_FINI");
- asm ("\n/*@_fini_PROLOG_ENDS*/");
-
- {
- /* Let GCC know that _fini is not a leaf function by having a dummy
- function call here. We arrange for this call to be omitted from
- either crt file. */
- extern void i_am_not_a_leaf (void);
- i_am_not_a_leaf ();
- }
-
- /* Beginning of the _fini epilog. */
- asm ("\n/*@_fini_EPILOG_BEGINS*/");
- SECTION (".fini");
-}
-asm ("END_FINI");
-
-/* End of the _fini epilog. Any further generated assembly (e.g. .ident)
- is shared between both crt files. */
-asm ("\n/*@_fini_EPILOG_ENDS*/");
-asm ("\n/*@TRAILER_BEGINS*/");
-
-/* End of file. */
diff --git a/linuxthreads/sysdeps/pthread/pthread-functions.h b/linuxthreads/sysdeps/pthread/pthread-functions.h
deleted file mode 100644
index 43a328ae9c..0000000000
--- a/linuxthreads/sysdeps/pthread/pthread-functions.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/* Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _PTHREAD_FUNCTIONS_H
-#define _PTHREAD_FUNCTIONS_H 1
-
-#include <pthread.h>
-#include <setjmp.h>
-#include <linuxthreads/descr.h>
-
-struct fork_block;
-
-/* Data type shared with libc. The libc uses it to pass on calls to
- the thread functions. Wine pokes directly into this structure,
- so if possible avoid breaking it and append new hooks to the end. */
-struct pthread_functions
-{
- pid_t (*ptr_pthread_fork) (struct fork_block *);
- int (*ptr_pthread_attr_destroy) (pthread_attr_t *);
- int (*ptr___pthread_attr_init_2_0) (pthread_attr_t *);
- int (*ptr___pthread_attr_init_2_1) (pthread_attr_t *);
- int (*ptr_pthread_attr_getdetachstate) (const pthread_attr_t *, int *);
- int (*ptr_pthread_attr_setdetachstate) (pthread_attr_t *, int);
- int (*ptr_pthread_attr_getinheritsched) (const pthread_attr_t *, int *);
- int (*ptr_pthread_attr_setinheritsched) (pthread_attr_t *, int);
- int (*ptr_pthread_attr_getschedparam) (const pthread_attr_t *,
- struct sched_param *);
- int (*ptr_pthread_attr_setschedparam) (pthread_attr_t *,
- const struct sched_param *);
- int (*ptr_pthread_attr_getschedpolicy) (const pthread_attr_t *, int *);
- int (*ptr_pthread_attr_setschedpolicy) (pthread_attr_t *, int);
- int (*ptr_pthread_attr_getscope) (const pthread_attr_t *, int *);
- int (*ptr_pthread_attr_setscope) (pthread_attr_t *, int);
- int (*ptr_pthread_condattr_destroy) (pthread_condattr_t *);
- int (*ptr_pthread_condattr_init) (pthread_condattr_t *);
- int (*ptr___pthread_cond_broadcast) (pthread_cond_t *);
- int (*ptr___pthread_cond_destroy) (pthread_cond_t *);
- int (*ptr___pthread_cond_init) (pthread_cond_t *,
- const pthread_condattr_t *);
- int (*ptr___pthread_cond_signal) (pthread_cond_t *);
- int (*ptr___pthread_cond_wait) (pthread_cond_t *, pthread_mutex_t *);
- int (*ptr_pthread_equal) (pthread_t, pthread_t);
- void (*ptr___pthread_exit) (void *);
- int (*ptr_pthread_getschedparam) (pthread_t, int *, struct sched_param *);
- int (*ptr_pthread_setschedparam) (pthread_t, int,
- const struct sched_param *);
- int (*ptr_pthread_mutex_destroy) (pthread_mutex_t *);
- int (*ptr_pthread_mutex_init) (pthread_mutex_t *,
- const pthread_mutexattr_t *);
- int (*ptr_pthread_mutex_lock) (pthread_mutex_t *);
- int (*ptr_pthread_mutex_trylock) (pthread_mutex_t *);
- int (*ptr_pthread_mutex_unlock) (pthread_mutex_t *);
- pthread_t (*ptr_pthread_self) (void);
- int (*ptr_pthread_setcancelstate) (int, int *);
- int (*ptr_pthread_setcanceltype) (int, int *);
- void (*ptr_pthread_do_exit) (void *retval, char *currentframe);
- void (*ptr_pthread_cleanup_upto) (__jmp_buf target,
- char *targetframe);
- pthread_descr (*ptr_pthread_thread_self) (void);
- int (*ptr_pthread_internal_tsd_set) (int key, const void *pointer);
- void * (*ptr_pthread_internal_tsd_get) (int key);
- void ** __attribute__ ((__const__))
- (*ptr_pthread_internal_tsd_address) (int key);
- int (*ptr_pthread_sigaction) (int sig, const struct sigaction * act,
- struct sigaction *oact);
- int (*ptr_pthread_sigwait) (const sigset_t *set, int *sig);
- int (*ptr_pthread_raise) (int sig);
- int (*ptr___pthread_cond_timedwait) (pthread_cond_t *, pthread_mutex_t *,
- const struct timespec *);
- void (*ptr__pthread_cleanup_push) (struct _pthread_cleanup_buffer * buffer,
- void (*routine)(void *), void * arg);
-
- void (*ptr__pthread_cleanup_pop) (struct _pthread_cleanup_buffer * buffer,
- int execute);
-};
-
-/* Variable in libc.so. */
-extern struct pthread_functions __libc_pthread_functions attribute_hidden;
-
-#endif /* pthread-functions.h */
diff --git a/linuxthreads/sysdeps/pthread/pthread.h b/linuxthreads/sysdeps/pthread/pthread.h
deleted file mode 100644
index 86c7ff7391..0000000000
--- a/linuxthreads/sysdeps/pthread/pthread.h
+++ /dev/null
@@ -1,686 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-#ifndef _PTHREAD_H
-#define _PTHREAD_H 1
-
-#include <features.h>
-
-#include <sched.h>
-#include <time.h>
-
-#define __need_sigset_t
-#include <signal.h>
-#include <bits/pthreadtypes.h>
-#include <bits/initspin.h>
-
-
-__BEGIN_DECLS
-
-/* Initializers. */
-
-#define PTHREAD_MUTEX_INITIALIZER \
- {0, 0, 0, PTHREAD_MUTEX_TIMED_NP, __LOCK_INITIALIZER}
-#ifdef __USE_GNU
-# define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \
- {0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, __LOCK_INITIALIZER}
-# define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \
- {0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, __LOCK_INITIALIZER}
-# define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP \
- {0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP, __LOCK_INITIALIZER}
-#endif
-
-#define PTHREAD_COND_INITIALIZER {__LOCK_INITIALIZER, 0, "", 0}
-
-#if defined __USE_UNIX98 || defined __USE_XOPEN2K
-# define PTHREAD_RWLOCK_INITIALIZER \
- { __LOCK_INITIALIZER, 0, NULL, NULL, NULL, \
- PTHREAD_RWLOCK_DEFAULT_NP, PTHREAD_PROCESS_PRIVATE }
-#endif
-#ifdef __USE_GNU
-# define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \
- { __LOCK_INITIALIZER, 0, NULL, NULL, NULL, \
- PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, PTHREAD_PROCESS_PRIVATE }
-#endif
-
-/* Values for attributes. */
-
-enum
-{
- PTHREAD_CREATE_JOINABLE,
-#define PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_JOINABLE
- PTHREAD_CREATE_DETACHED
-#define PTHREAD_CREATE_DETACHED PTHREAD_CREATE_DETACHED
-};
-
-enum
-{
- PTHREAD_INHERIT_SCHED,
-#define PTHREAD_INHERIT_SCHED PTHREAD_INHERIT_SCHED
- PTHREAD_EXPLICIT_SCHED
-#define PTHREAD_EXPLICIT_SCHED PTHREAD_EXPLICIT_SCHED
-};
-
-enum
-{
- PTHREAD_SCOPE_SYSTEM,
-#define PTHREAD_SCOPE_SYSTEM PTHREAD_SCOPE_SYSTEM
- PTHREAD_SCOPE_PROCESS
-#define PTHREAD_SCOPE_PROCESS PTHREAD_SCOPE_PROCESS
-};
-
-enum
-{
- PTHREAD_MUTEX_TIMED_NP,
- PTHREAD_MUTEX_RECURSIVE_NP,
- PTHREAD_MUTEX_ERRORCHECK_NP,
- PTHREAD_MUTEX_ADAPTIVE_NP
-#ifdef __USE_UNIX98
- ,
- PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP,
- PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
- PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
- PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
-#endif
-#ifdef __USE_GNU
- /* For compatibility. */
- , PTHREAD_MUTEX_FAST_NP = PTHREAD_MUTEX_ADAPTIVE_NP
-#endif
-};
-
-enum
-{
- PTHREAD_PROCESS_PRIVATE,
-#define PTHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE
- PTHREAD_PROCESS_SHARED
-#define PTHREAD_PROCESS_SHARED PTHREAD_PROCESS_SHARED
-};
-
-#if defined __USE_UNIX98 || defined __USE_XOPEN2K
-enum
-{
- PTHREAD_RWLOCK_PREFER_READER_NP,
- PTHREAD_RWLOCK_PREFER_WRITER_NP,
- PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP,
- PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_WRITER_NP
-};
-#endif /* Unix98 */
-
-#define PTHREAD_ONCE_INIT 0
-
-/* Special constants */
-
-#ifdef __USE_XOPEN2K
-/* -1 is distinct from 0 and all errno constants */
-# define PTHREAD_BARRIER_SERIAL_THREAD -1
-#endif
-
-/* Cleanup buffers */
-
-struct _pthread_cleanup_buffer
-{
- void (*__routine) (void *); /* Function to call. */
- void *__arg; /* Its argument. */
- int __canceltype; /* Saved cancellation type. */
- struct _pthread_cleanup_buffer *__prev; /* Chaining of cleanup functions. */
-};
-
-/* Cancellation */
-
-enum
-{
- PTHREAD_CANCEL_ENABLE,
-#define PTHREAD_CANCEL_ENABLE PTHREAD_CANCEL_ENABLE
- PTHREAD_CANCEL_DISABLE
-#define PTHREAD_CANCEL_DISABLE PTHREAD_CANCEL_DISABLE
-};
-enum
-{
- PTHREAD_CANCEL_DEFERRED,
-#define PTHREAD_CANCEL_DEFERRED PTHREAD_CANCEL_DEFERRED
- PTHREAD_CANCEL_ASYNCHRONOUS
-#define PTHREAD_CANCEL_ASYNCHRONOUS PTHREAD_CANCEL_ASYNCHRONOUS
-};
-#define PTHREAD_CANCELED ((void *) -1)
-
-
-/* Function for handling threads. */
-
-/* Create a thread with given attributes ATTR (or default attributes
- if ATTR is NULL), and call function START_ROUTINE with given
- arguments ARG. */
-extern int pthread_create (pthread_t *__restrict __threadp,
- __const pthread_attr_t *__restrict __attr,
- void *(*__start_routine) (void *),
- void *__restrict __arg) __THROW;
-
-/* Obtain the identifier of the current thread. */
-extern pthread_t pthread_self (void) __THROW;
-
-/* Compare two thread identifiers. */
-extern int pthread_equal (pthread_t __thread1, pthread_t __thread2) __THROW;
-
-/* Terminate calling thread. */
-extern void pthread_exit (void *__retval) __attribute__ ((__noreturn__));
-
-/* Make calling thread wait for termination of the thread TH. The
- exit status of the thread is stored in *THREAD_RETURN, if THREAD_RETURN
- is not NULL. */
-extern int pthread_join (pthread_t __th, void **__thread_return);
-
-/* Indicate that the thread TH is never to be joined with PTHREAD_JOIN.
- The resources of TH will therefore be freed immediately when it
- terminates, instead of waiting for another thread to perform PTHREAD_JOIN
- on it. */
-extern int pthread_detach (pthread_t __th) __THROW;
-
-
-/* Functions for handling attributes. */
-
-/* Initialize thread attribute *ATTR with default attributes
- (detachstate is PTHREAD_JOINABLE, scheduling policy is SCHED_OTHER,
- no user-provided stack). */
-extern int pthread_attr_init (pthread_attr_t *__attr) __THROW;
-
-/* Destroy thread attribute *ATTR. */
-extern int pthread_attr_destroy (pthread_attr_t *__attr) __THROW;
-
-/* Set the `detachstate' attribute in *ATTR according to DETACHSTATE. */
-extern int pthread_attr_setdetachstate (pthread_attr_t *__attr,
- int __detachstate) __THROW;
-
-/* Return in *DETACHSTATE the `detachstate' attribute in *ATTR. */
-extern int pthread_attr_getdetachstate (__const pthread_attr_t *__attr,
- int *__detachstate) __THROW;
-
-/* Set scheduling parameters (priority, etc) in *ATTR according to PARAM. */
-extern int pthread_attr_setschedparam (pthread_attr_t *__restrict __attr,
- __const struct sched_param *__restrict
- __param) __THROW;
-
-/* Return in *PARAM the scheduling parameters of *ATTR. */
-extern int pthread_attr_getschedparam (__const pthread_attr_t *__restrict
- __attr,
- struct sched_param *__restrict __param)
- __THROW;
-
-/* Set scheduling policy in *ATTR according to POLICY. */
-extern int pthread_attr_setschedpolicy (pthread_attr_t *__attr, int __policy)
- __THROW;
-
-/* Return in *POLICY the scheduling policy of *ATTR. */
-extern int pthread_attr_getschedpolicy (__const pthread_attr_t *__restrict
- __attr, int *__restrict __policy)
- __THROW;
-
-/* Set scheduling inheritance mode in *ATTR according to INHERIT. */
-extern int pthread_attr_setinheritsched (pthread_attr_t *__attr,
- int __inherit) __THROW;
-
-/* Return in *INHERIT the scheduling inheritance mode of *ATTR. */
-extern int pthread_attr_getinheritsched (__const pthread_attr_t *__restrict
- __attr, int *__restrict __inherit)
- __THROW;
-
-/* Set scheduling contention scope in *ATTR according to SCOPE. */
-extern int pthread_attr_setscope (pthread_attr_t *__attr, int __scope)
- __THROW;
-
-/* Return in *SCOPE the scheduling contention scope of *ATTR. */
-extern int pthread_attr_getscope (__const pthread_attr_t *__restrict __attr,
- int *__restrict __scope) __THROW;
-
-#ifdef __USE_UNIX98
-/* Set the size of the guard area at the bottom of the thread. */
-extern int pthread_attr_setguardsize (pthread_attr_t *__attr,
- size_t __guardsize) __THROW;
-
-/* Get the size of the guard area at the bottom of the thread. */
-extern int pthread_attr_getguardsize (__const pthread_attr_t *__restrict
- __attr, size_t *__restrict __guardsize)
- __THROW;
-#endif
-
-/* Set the starting address of the stack of the thread to be created.
- Depending on whether the stack grows up or down the value must either
- be higher or lower than all the address in the memory block. The
- minimal size of the block must be PTHREAD_STACK_MIN. */
-extern int pthread_attr_setstackaddr (pthread_attr_t *__attr,
- void *__stackaddr) __THROW;
-
-/* Return the previously set address for the stack. */
-extern int pthread_attr_getstackaddr (__const pthread_attr_t *__restrict
- __attr, void **__restrict __stackaddr)
- __THROW;
-
-#ifdef __USE_XOPEN2K
-/* The following two interfaces are intended to replace the last two. They
- require setting the address as well as the size since only setting the
- address will make the implementation on some architectures impossible. */
-extern int pthread_attr_setstack (pthread_attr_t *__attr, void *__stackaddr,
- size_t __stacksize) __THROW;
-
-/* Return the previously set address for the stack. */
-extern int pthread_attr_getstack (__const pthread_attr_t *__restrict __attr,
- void **__restrict __stackaddr,
- size_t *__restrict __stacksize) __THROW;
-#endif
-
-/* Add information about the minimum stack size needed for the thread
- to be started. This size must never be less than PTHREAD_STACK_MIN
- and must also not exceed the system limits. */
-extern int pthread_attr_setstacksize (pthread_attr_t *__attr,
- size_t __stacksize) __THROW;
-
-/* Return the currently used minimal stack size. */
-extern int pthread_attr_getstacksize (__const pthread_attr_t *__restrict
- __attr, size_t *__restrict __stacksize)
- __THROW;
-
-#ifdef __USE_GNU
-/* Initialize thread attribute *ATTR with attributes corresponding to the
- already running thread TH. It shall be called on unitialized ATTR
- and destroyed with pthread_attr_destroy when no longer needed. */
-extern int pthread_getattr_np (pthread_t __th, pthread_attr_t *__attr) __THROW;
-#endif
-
-/* Functions for scheduling control. */
-
-/* Set the scheduling parameters for TARGET_THREAD according to POLICY
- and *PARAM. */
-extern int pthread_setschedparam (pthread_t __target_thread, int __policy,
- __const struct sched_param *__param)
- __THROW;
-
-/* Return in *POLICY and *PARAM the scheduling parameters for TARGET_THREAD. */
-extern int pthread_getschedparam (pthread_t __target_thread,
- int *__restrict __policy,
- struct sched_param *__restrict __param)
- __THROW;
-
-#ifdef __USE_UNIX98
-/* Determine level of concurrency. */
-extern int pthread_getconcurrency (void) __THROW;
-
-/* Set new concurrency level to LEVEL. */
-extern int pthread_setconcurrency (int __level) __THROW;
-#endif
-
-#ifdef __USE_GNU
-/* Yield the processor to another thread or process.
- This function is similar to the POSIX `sched_yield' function but
- might be differently implemented in the case of a m-on-n thread
- implementation. */
-extern int pthread_yield (void) __THROW;
-#endif
-
-/* Functions for mutex handling. */
-
-/* Initialize MUTEX using attributes in *MUTEX_ATTR, or use the
- default values if later is NULL. */
-extern int pthread_mutex_init (pthread_mutex_t *__restrict __mutex,
- __const pthread_mutexattr_t *__restrict
- __mutex_attr) __THROW;
-
-/* Destroy MUTEX. */
-extern int pthread_mutex_destroy (pthread_mutex_t *__mutex) __THROW;
-
-/* Try to lock MUTEX. */
-extern int pthread_mutex_trylock (pthread_mutex_t *__mutex) __THROW;
-
-/* Wait until lock for MUTEX becomes available and lock it. */
-extern int pthread_mutex_lock (pthread_mutex_t *__mutex) __THROW;
-
-#ifdef __USE_XOPEN2K
-/* Wait until lock becomes available, or specified time passes. */
-extern int pthread_mutex_timedlock (pthread_mutex_t *__restrict __mutex,
- __const struct timespec *__restrict
- __abstime) __THROW;
-#endif
-
-/* Unlock MUTEX. */
-extern int pthread_mutex_unlock (pthread_mutex_t *__mutex) __THROW;
-
-
-/* Functions for handling mutex attributes. */
-
-/* Initialize mutex attribute object ATTR with default attributes
- (kind is PTHREAD_MUTEX_TIMED_NP). */
-extern int pthread_mutexattr_init (pthread_mutexattr_t *__attr) __THROW;
-
-/* Destroy mutex attribute object ATTR. */
-extern int pthread_mutexattr_destroy (pthread_mutexattr_t *__attr) __THROW;
-
-/* Get the process-shared flag of the mutex attribute ATTR. */
-extern int pthread_mutexattr_getpshared (__const pthread_mutexattr_t *
- __restrict __attr,
- int *__restrict __pshared) __THROW;
-
-/* Set the process-shared flag of the mutex attribute ATTR. */
-extern int pthread_mutexattr_setpshared (pthread_mutexattr_t *__attr,
- int __pshared) __THROW;
-
-#ifdef __USE_UNIX98
-/* Set the mutex kind attribute in *ATTR to KIND (either PTHREAD_MUTEX_NORMAL,
- PTHREAD_MUTEX_RECURSIVE, PTHREAD_MUTEX_ERRORCHECK, or
- PTHREAD_MUTEX_DEFAULT). */
-extern int pthread_mutexattr_settype (pthread_mutexattr_t *__attr, int __kind)
- __THROW;
-
-/* Return in *KIND the mutex kind attribute in *ATTR. */
-extern int pthread_mutexattr_gettype (__const pthread_mutexattr_t *__restrict
- __attr, int *__restrict __kind) __THROW;
-#endif
-
-
-/* Functions for handling conditional variables. */
-
-/* Initialize condition variable COND using attributes ATTR, or use
- the default values if later is NULL. */
-extern int pthread_cond_init (pthread_cond_t *__restrict __cond,
- __const pthread_condattr_t *__restrict
- __cond_attr) __THROW;
-
-/* Destroy condition variable COND. */
-extern int pthread_cond_destroy (pthread_cond_t *__cond) __THROW;
-
-/* Wake up one thread waiting for condition variable COND. */
-extern int pthread_cond_signal (pthread_cond_t *__cond) __THROW;
-
-/* Wake up all threads waiting for condition variables COND. */
-extern int pthread_cond_broadcast (pthread_cond_t *__cond) __THROW;
-
-/* Wait for condition variable COND to be signaled or broadcast.
- MUTEX is assumed to be locked before. */
-extern int pthread_cond_wait (pthread_cond_t *__restrict __cond,
- pthread_mutex_t *__restrict __mutex);
-
-/* Wait for condition variable COND to be signaled or broadcast until
- ABSTIME. MUTEX is assumed to be locked before. ABSTIME is an
- absolute time specification; zero is the beginning of the epoch
- (00:00:00 GMT, January 1, 1970). */
-extern int pthread_cond_timedwait (pthread_cond_t *__restrict __cond,
- pthread_mutex_t *__restrict __mutex,
- __const struct timespec *__restrict
- __abstime);
-
-/* Functions for handling condition variable attributes. */
-
-/* Initialize condition variable attribute ATTR. */
-extern int pthread_condattr_init (pthread_condattr_t *__attr) __THROW;
-
-/* Destroy condition variable attribute ATTR. */
-extern int pthread_condattr_destroy (pthread_condattr_t *__attr) __THROW;
-
-/* Get the process-shared flag of the condition variable attribute ATTR. */
-extern int pthread_condattr_getpshared (__const pthread_condattr_t *
- __restrict __attr,
- int *__restrict __pshared) __THROW;
-
-/* Set the process-shared flag of the condition variable attribute ATTR. */
-extern int pthread_condattr_setpshared (pthread_condattr_t *__attr,
- int __pshared) __THROW;
-
-
-#if defined __USE_UNIX98 || defined __USE_XOPEN2K
-/* Functions for handling read-write locks. */
-
-/* Initialize read-write lock RWLOCK using attributes ATTR, or use
- the default values if later is NULL. */
-extern int pthread_rwlock_init (pthread_rwlock_t *__restrict __rwlock,
- __const pthread_rwlockattr_t *__restrict
- __attr) __THROW;
-
-/* Destroy read-write lock RWLOCK. */
-extern int pthread_rwlock_destroy (pthread_rwlock_t *__rwlock) __THROW;
-
-/* Acquire read lock for RWLOCK. */
-extern int pthread_rwlock_rdlock (pthread_rwlock_t *__rwlock) __THROW;
-
-/* Try to acquire read lock for RWLOCK. */
-extern int pthread_rwlock_tryrdlock (pthread_rwlock_t *__rwlock) __THROW;
-
-# ifdef __USE_XOPEN2K
-/* Try to acquire read lock for RWLOCK or return after specfied time. */
-extern int pthread_rwlock_timedrdlock (pthread_rwlock_t *__restrict __rwlock,
- __const struct timespec *__restrict
- __abstime) __THROW;
-# endif
-
-/* Acquire write lock for RWLOCK. */
-extern int pthread_rwlock_wrlock (pthread_rwlock_t *__rwlock) __THROW;
-
-/* Try to acquire write lock for RWLOCK. */
-extern int pthread_rwlock_trywrlock (pthread_rwlock_t *__rwlock) __THROW;
-
-# ifdef __USE_XOPEN2K
-/* Try to acquire write lock for RWLOCK or return after specfied time. */
-extern int pthread_rwlock_timedwrlock (pthread_rwlock_t *__restrict __rwlock,
- __const struct timespec *__restrict
- __abstime) __THROW;
-# endif
-
-/* Unlock RWLOCK. */
-extern int pthread_rwlock_unlock (pthread_rwlock_t *__rwlock) __THROW;
-
-
-/* Functions for handling read-write lock attributes. */
-
-/* Initialize attribute object ATTR with default values. */
-extern int pthread_rwlockattr_init (pthread_rwlockattr_t *__attr) __THROW;
-
-/* Destroy attribute object ATTR. */
-extern int pthread_rwlockattr_destroy (pthread_rwlockattr_t *__attr) __THROW;
-
-/* Return current setting of process-shared attribute of ATTR in PSHARED. */
-extern int pthread_rwlockattr_getpshared (__const pthread_rwlockattr_t *
- __restrict __attr,
- int *__restrict __pshared) __THROW;
-
-/* Set process-shared attribute of ATTR to PSHARED. */
-extern int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *__attr,
- int __pshared) __THROW;
-
-/* Return current setting of reader/writer preference. */
-extern int pthread_rwlockattr_getkind_np (__const pthread_rwlockattr_t *__attr,
- int *__pref) __THROW;
-
-/* Set reader/write preference. */
-extern int pthread_rwlockattr_setkind_np (pthread_rwlockattr_t *__attr,
- int __pref) __THROW;
-#endif
-
-#ifdef __USE_XOPEN2K
-/* The IEEE Std. 1003.1j-2000 introduces functions to implement
- spinlocks. */
-
-/* Initialize the spinlock LOCK. If PSHARED is nonzero the spinlock can
- be shared between different processes. */
-extern int pthread_spin_init (pthread_spinlock_t *__lock, int __pshared)
- __THROW;
-
-/* Destroy the spinlock LOCK. */
-extern int pthread_spin_destroy (pthread_spinlock_t *__lock) __THROW;
-
-/* Wait until spinlock LOCK is retrieved. */
-extern int pthread_spin_lock (pthread_spinlock_t *__lock) __THROW;
-
-/* Try to lock spinlock LOCK. */
-extern int pthread_spin_trylock (pthread_spinlock_t *__lock) __THROW;
-
-/* Release spinlock LOCK. */
-extern int pthread_spin_unlock (pthread_spinlock_t *__lock) __THROW;
-
-
-/* Barriers are a also a new feature in 1003.1j-2000. */
-
-extern int pthread_barrier_init (pthread_barrier_t *__restrict __barrier,
- __const pthread_barrierattr_t *__restrict
- __attr, unsigned int __count) __THROW;
-
-extern int pthread_barrier_destroy (pthread_barrier_t *__barrier) __THROW;
-
-extern int pthread_barrierattr_init (pthread_barrierattr_t *__attr) __THROW;
-
-extern int pthread_barrierattr_destroy (pthread_barrierattr_t *__attr) __THROW;
-
-extern int pthread_barrierattr_getpshared (__const pthread_barrierattr_t *
- __restrict __attr,
- int *__restrict __pshared) __THROW;
-
-extern int pthread_barrierattr_setpshared (pthread_barrierattr_t *__attr,
- int __pshared) __THROW;
-
-extern int pthread_barrier_wait (pthread_barrier_t *__barrier) __THROW;
-#endif
-
-
-/* Functions for handling thread-specific data. */
-
-/* Create a key value identifying a location in the thread-specific
- data area. Each thread maintains a distinct thread-specific data
- area. DESTR_FUNCTION, if non-NULL, is called with the value
- associated to that key when the key is destroyed.
- DESTR_FUNCTION is not called if the value associated is NULL when
- the key is destroyed. */
-extern int pthread_key_create (pthread_key_t *__key,
- void (*__destr_function) (void *)) __THROW;
-
-/* Destroy KEY. */
-extern int pthread_key_delete (pthread_key_t __key) __THROW;
-
-/* Store POINTER in the thread-specific data slot identified by KEY. */
-extern int pthread_setspecific (pthread_key_t __key,
- __const void *__pointer) __THROW;
-
-/* Return current value of the thread-specific data slot identified by KEY. */
-extern void *pthread_getspecific (pthread_key_t __key) __THROW;
-
-
-/* Functions for handling initialization. */
-
-/* Guarantee that the initialization function INIT_ROUTINE will be called
- only once, even if pthread_once is executed several times with the
- same ONCE_CONTROL argument. ONCE_CONTROL must point to a static or
- extern variable initialized to PTHREAD_ONCE_INIT.
-
- The initialization functions might throw exception which is why
- this function is not marked with __THROW. */
-extern int pthread_once (pthread_once_t *__once_control,
- void (*__init_routine) (void));
-
-
-/* Functions for handling cancellation. */
-
-/* Set cancelability state of current thread to STATE, returning old
- state in *OLDSTATE if OLDSTATE is not NULL. */
-extern int pthread_setcancelstate (int __state, int *__oldstate);
-
-/* Set cancellation state of current thread to TYPE, returning the old
- type in *OLDTYPE if OLDTYPE is not NULL. */
-extern int pthread_setcanceltype (int __type, int *__oldtype);
-
-/* Cancel THREAD immediately or at the next possibility. */
-extern int pthread_cancel (pthread_t __cancelthread);
-
-/* Test for pending cancellation for the current thread and terminate
- the thread as per pthread_exit(PTHREAD_CANCELED) if it has been
- cancelled. */
-extern void pthread_testcancel (void);
-
-
-/* Install a cleanup handler: ROUTINE will be called with arguments ARG
- when the thread is cancelled or calls pthread_exit. ROUTINE will also
- be called with arguments ARG when the matching pthread_cleanup_pop
- is executed with non-zero EXECUTE argument.
- pthread_cleanup_push and pthread_cleanup_pop are macros and must always
- be used in matching pairs at the same nesting level of braces. */
-
-#define pthread_cleanup_push(routine,arg) \
- { struct _pthread_cleanup_buffer _buffer; \
- _pthread_cleanup_push (&_buffer, (routine), (arg));
-
-extern void _pthread_cleanup_push (struct _pthread_cleanup_buffer *__buffer,
- void (*__routine) (void *),
- void *__arg) __THROW;
-
-/* Remove a cleanup handler installed by the matching pthread_cleanup_push.
- If EXECUTE is non-zero, the handler function is called. */
-
-#define pthread_cleanup_pop(execute) \
- _pthread_cleanup_pop (&_buffer, (execute)); }
-
-extern void _pthread_cleanup_pop (struct _pthread_cleanup_buffer *__buffer,
- int __execute) __THROW;
-
-/* Install a cleanup handler as pthread_cleanup_push does, but also
- saves the current cancellation type and set it to deferred cancellation. */
-
-#ifdef __USE_GNU
-# define pthread_cleanup_push_defer_np(routine,arg) \
- { struct _pthread_cleanup_buffer _buffer; \
- _pthread_cleanup_push_defer (&_buffer, (routine), (arg));
-
-extern void _pthread_cleanup_push_defer (struct _pthread_cleanup_buffer *__buffer,
- void (*__routine) (void *),
- void *__arg) __THROW;
-
-/* Remove a cleanup handler as pthread_cleanup_pop does, but also
- restores the cancellation type that was in effect when the matching
- pthread_cleanup_push_defer was called. */
-
-# define pthread_cleanup_pop_restore_np(execute) \
- _pthread_cleanup_pop_restore (&_buffer, (execute)); }
-
-extern void _pthread_cleanup_pop_restore (struct _pthread_cleanup_buffer *__buffer,
- int __execute) __THROW;
-#endif
-
-
-#ifdef __USE_XOPEN2K
-/* Get ID of CPU-time clock for thread THREAD_ID. */
-extern int pthread_getcpuclockid (pthread_t __thread_id,
- __clockid_t *__clock_id) __THROW;
-#endif
-
-
-/* Functions for handling signals. */
-#include <bits/sigthread.h>
-
-
-/* Functions for handling process creation and process execution. */
-
-/* Install handlers to be called when a new process is created with FORK.
- The PREPARE handler is called in the parent process just before performing
- FORK. The PARENT handler is called in the parent process just after FORK.
- The CHILD handler is called in the child process. Each of the three
- handlers can be NULL, meaning that no handler needs to be called at that
- point.
- PTHREAD_ATFORK can be called several times, in which case the PREPARE
- handlers are called in LIFO order (last added with PTHREAD_ATFORK,
- first called before FORK), and the PARENT and CHILD handlers are called
- in FIFO (first added, first called). */
-
-extern int pthread_atfork (void (*__prepare) (void),
- void (*__parent) (void),
- void (*__child) (void)) __THROW;
-
-/* Terminate all threads in the program except the calling process.
- Should be called just before invoking one of the exec*() functions. */
-
-extern void pthread_kill_other_threads_np (void) __THROW;
-
-__END_DECLS
-
-#endif /* pthread.h */
diff --git a/linuxthreads/sysdeps/pthread/ptlongjmp.c b/linuxthreads/sysdeps/pthread/ptlongjmp.c
deleted file mode 100644
index a2a56b8d9c..0000000000
--- a/linuxthreads/sysdeps/pthread/ptlongjmp.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1998 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* Redefine siglongjmp and longjmp so that they interact correctly
- with cleanup handlers */
-
-#include <setjmp.h>
-#include "pthread.h"
-#include "internals.h"
-
-/* These functions are not declared anywhere since they shouldn't be
- used at another place but here. */
-extern void __libc_siglongjmp (sigjmp_buf env, int val)
- __attribute__ ((noreturn));
-extern void __libc_longjmp (sigjmp_buf env, int val)
- __attribute__ ((noreturn));
-
-#ifdef SHARED
-void siglongjmp (sigjmp_buf env, int val)
-{
- __libc_siglongjmp (env, val);
-}
-
-void longjmp (jmp_buf env, int val)
-{
- __libc_longjmp (env, val);
-}
-#endif
diff --git a/linuxthreads/sysdeps/pthread/res-state.c b/linuxthreads/sysdeps/pthread/res-state.c
deleted file mode 100644
index 016e20b4ef..0000000000
--- a/linuxthreads/sysdeps/pthread/res-state.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Copyright (C) 1996, 97, 98, 2002, 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <resolv.h>
-#include <tls.h>
-#include <linuxthreads/internals.h>
-#include <sysdep-cancel.h>
-
-#if ! USE___THREAD
-# undef _res
-extern struct __res_state _res;
-#endif
-
-/* When threaded, _res may be a per-thread variable. */
-struct __res_state *
-#if ! USE___THREAD
-weak_const_function
-#endif
-__res_state (void)
-{
-#if ! USE___THREAD
- if (! SINGLE_THREAD_P)
- {
- pthread_descr self = thread_self();
- return LIBC_THREAD_GETMEM (self, p_resp);
- }
- return &_res;
-#else
- return __resp;
-#endif
-}
-libc_hidden_def (__res_state)
diff --git a/linuxthreads/sysdeps/pthread/semaphore.h b/linuxthreads/sysdeps/pthread/semaphore.h
deleted file mode 100644
index 8793768a8e..0000000000
--- a/linuxthreads/sysdeps/pthread/semaphore.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <linuxthreads/semaphore.h>
diff --git a/linuxthreads/sysdeps/pthread/sigaction.c b/linuxthreads/sysdeps/pthread/sigaction.c
deleted file mode 100644
index f4e20790d9..0000000000
--- a/linuxthreads/sysdeps/pthread/sigaction.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-/* This is tricky. GCC doesn't like #include_next in the primary
- source file and even if it did, the first #include_next is this
- exact file anyway. */
-#ifndef LIBC_SIGACTION
-
-# include <bits/libc-lock.h>
-
-# define LIBC_SIGACTION 1
-
-# include <linuxthreads/sysdeps/pthread/sigaction.c>
-
-# ifndef NOT_IN_libc
-# ifndef SHARED
-weak_extern (__pthread_sigaction)
-# endif
-
-int
-__sigaction (sig, act, oact)
- int sig;
- const struct sigaction *act;
- struct sigaction *oact;
-{
- return __libc_maybe_call2 (pthread_sigaction, (sig, act, oact),
- __libc_sigaction (sig, act, oact));
-}
-# else
-weak_alias (__libc_sigaction, __sigaction)
-# endif
-libc_hidden_weak (__sigaction)
-weak_alias (__sigaction, sigaction)
-
-#else
-
-# include_next <sigaction.c>
-
-#endif /* LIBC_SIGACTION */
diff --git a/linuxthreads/sysdeps/pthread/tcb-offsets.h b/linuxthreads/sysdeps/pthread/tcb-offsets.h
deleted file mode 100644
index 3fe13702ea..0000000000
--- a/linuxthreads/sysdeps/pthread/tcb-offsets.h
+++ /dev/null
@@ -1 +0,0 @@
-/* This is overridden by generated tcb-offsets.h on arches which need it. */
diff --git a/linuxthreads/sysdeps/pthread/timer_create.c b/linuxthreads/sysdeps/pthread/timer_create.c
deleted file mode 100644
index 7f7e886c83..0000000000
--- a/linuxthreads/sysdeps/pthread/timer_create.c
+++ /dev/null
@@ -1,170 +0,0 @@
-/* Copyright (C) 2000, 2003, 2004 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Kaz Kylheku <kaz@ashi.footprints.net>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <signal.h>
-#include <pthread.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "posix-timer.h"
-
-
-/* Create new per-process timer using CLOCK. */
-int
-timer_create (clock_id, evp, timerid)
- clockid_t clock_id;
- struct sigevent *evp;
- timer_t *timerid;
-{
- int retval = -1;
- struct timer_node *newtimer = NULL;
- struct thread_node *thread = NULL;
-
- if (0
-#ifdef _POSIX_CPUTIME
- || clock_id == CLOCK_PROCESS_CPUTIME_ID
-#endif
-#ifdef _POSIX_THREAD_CPUTIME
- || clock_id == CLOCK_THREAD_CPUTIME_ID
-#endif
- )
- {
- /* We don't allow timers for CPU clocks. At least not in the
- moment. */
- __set_errno (ENOTSUP);
- return -1;
- }
-
- if (clock_id != CLOCK_REALTIME)
- {
- __set_errno (EINVAL);
- return -1;
- }
-
- pthread_once (&__timer_init_once_control, __timer_init_once);
-
- if (__timer_init_failed)
- {
- __set_errno (ENOMEM);
- return -1;
- }
-
- pthread_mutex_lock (&__timer_mutex);
-
- newtimer = __timer_alloc ();
- if (__builtin_expect (newtimer == NULL, 0))
- {
- __set_errno (EAGAIN);
- goto unlock_bail;
- }
-
- if (evp != NULL)
- newtimer->event = *evp;
- else
- {
- newtimer->event.sigev_notify = SIGEV_SIGNAL;
- newtimer->event.sigev_signo = SIGALRM;
- newtimer->event.sigev_value.sival_int = timer_ptr2id (newtimer);
- newtimer->event.sigev_notify_function = 0;
- }
-
- newtimer->event.sigev_notify_attributes = &newtimer->attr;
- newtimer->creator_pid = getpid ();
-
- switch (__builtin_expect (newtimer->event.sigev_notify, SIGEV_SIGNAL))
- {
- case SIGEV_NONE:
- case SIGEV_SIGNAL:
- /* We have a global thread for delivering timed signals.
- If it is not running, try to start it up. */
- thread = &__timer_signal_thread_rclk;
- if (! thread->exists)
- {
- if (__builtin_expect (__timer_thread_start (thread),
- 1) < 0)
- {
- __set_errno (EAGAIN);
- goto unlock_bail;
- }
- }
- break;
-
- case SIGEV_THREAD:
- /* Copy over thread attributes or set up default ones. */
- if (evp->sigev_notify_attributes)
- newtimer->attr = *(pthread_attr_t *) evp->sigev_notify_attributes;
- else
- pthread_attr_init (&newtimer->attr);
-
- /* Ensure thread attributes call for deatched thread. */
- pthread_attr_setdetachstate (&newtimer->attr, PTHREAD_CREATE_DETACHED);
-
- /* Try to find existing thread having the right attributes. */
- thread = __timer_thread_find_matching (&newtimer->attr, clock_id);
-
- /* If no existing thread has these attributes, try to allocate one. */
- if (thread == NULL)
- thread = __timer_thread_alloc (&newtimer->attr, clock_id);
-
- /* Out of luck; no threads are available. */
- if (__builtin_expect (thread == NULL, 0))
- {
- __set_errno (EAGAIN);
- goto unlock_bail;
- }
-
- /* If the thread is not running already, try to start it. */
- if (! thread->exists
- && __builtin_expect (! __timer_thread_start (thread), 0))
- {
- __set_errno (EAGAIN);
- goto unlock_bail;
- }
- break;
-
- default:
- __set_errno (EINVAL);
- goto unlock_bail;
- }
-
- newtimer->clock = clock_id;
- newtimer->abstime = 0;
- newtimer->armed = 0;
- newtimer->thread = thread;
-
- *timerid = timer_ptr2id (newtimer);
- retval = 0;
-
- if (__builtin_expect (retval, 0) == -1)
- {
- unlock_bail:
- if (thread != NULL)
- __timer_thread_dealloc (thread);
- if (newtimer != NULL)
- {
- timer_delref (newtimer);
- __timer_dealloc (newtimer);
- }
- }
-
- pthread_mutex_unlock (&__timer_mutex);
-
- return retval;
-}
diff --git a/linuxthreads/sysdeps/pthread/timer_delete.c b/linuxthreads/sysdeps/pthread/timer_delete.c
deleted file mode 100644
index 48ba1f2726..0000000000
--- a/linuxthreads/sysdeps/pthread/timer_delete.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Kaz Kylheku <kaz@ashi.footprints.net>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <assert.h>
-#include <errno.h>
-#include <pthread.h>
-#include <time.h>
-
-#include "posix-timer.h"
-
-
-/* Delete timer TIMERID. */
-int
-timer_delete (timerid)
- timer_t timerid;
-{
- struct timer_node *timer;
- int retval = -1;
-
- pthread_mutex_lock (&__timer_mutex);
-
- timer = timer_id2ptr (timerid);
- if (! timer_valid (timer))
- /* Invalid timer ID or the timer is not in use. */
- __set_errno (EINVAL);
- else
- {
- if (timer->armed && timer->thread != NULL)
- {
- struct thread_node *thread = timer->thread;
- assert (thread != NULL);
-
- /* If thread is cancelled while waiting for handler to terminate,
- the mutex is unlocked and timer_delete is aborted. */
- pthread_cleanup_push (__timer_mutex_cancel_handler, &__timer_mutex);
-
- /* If timer is currently being serviced, wait for it to finish. */
- while (thread->current_timer == timer)
- pthread_cond_wait (&thread->cond, &__timer_mutex);
-
- pthread_cleanup_pop (0);
- }
-
- /* Remove timer from whatever queue it may be on and deallocate it. */
- timer->inuse = TIMER_DELETED;
- list_unlink_ip (&timer->links);
- timer_delref (timer);
- retval = 0;
- }
-
- pthread_mutex_unlock (&__timer_mutex);
-
- return retval;
-}
diff --git a/linuxthreads/sysdeps/pthread/timer_getoverr.c b/linuxthreads/sysdeps/pthread/timer_getoverr.c
deleted file mode 100644
index f3e22215b2..0000000000
--- a/linuxthreads/sysdeps/pthread/timer_getoverr.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Kaz Kylheku <kaz@ashi.footprints.net>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include <time.h>
-
-#include "posix-timer.h"
-
-
-/* Get expiration overrun for timer TIMERID. */
-int
-timer_getoverrun (timerid)
- timer_t timerid;
-{
- struct timer_node *timer;
- int retval = -1;
-
- pthread_mutex_lock (&__timer_mutex);
-
- if (! timer_valid (timer = timer_id2ptr (timerid)))
- __set_errno (EINVAL);
- else
- retval = timer->overrun_count;
-
- pthread_mutex_unlock (&__timer_mutex);
-
- return retval;
-}
diff --git a/linuxthreads/sysdeps/pthread/timer_gettime.c b/linuxthreads/sysdeps/pthread/timer_gettime.c
deleted file mode 100644
index 723a61632f..0000000000
--- a/linuxthreads/sysdeps/pthread/timer_gettime.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/* Copyright (C) 2000, 2004 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Kaz Kylheku <kaz@ashi.footprints.net>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include <time.h>
-
-#include "posix-timer.h"
-
-
-/* Get current value of timer TIMERID and store it in VLAUE. */
-int
-timer_gettime (timerid, value)
- timer_t timerid;
- struct itimerspec *value;
-{
- struct timer_node *timer;
- struct timespec now, expiry;
- int retval = -1, armed = 0, valid;
- clock_t clock = 0;
-
- pthread_mutex_lock (&__timer_mutex);
-
- timer = timer_id2ptr (timerid);
- valid = timer_valid (timer);
-
- if (valid) {
- armed = timer->armed;
- expiry = timer->expirytime;
- clock = timer->clock;
- value->it_interval = timer->value.it_interval;
- }
-
- pthread_mutex_unlock (&__timer_mutex);
-
- if (valid)
- {
- if (armed)
- {
- clock_gettime (clock, &now);
- if (timespec_compare (&now, &expiry) < 0)
- timespec_sub (&value->it_value, &expiry, &now);
- else
- {
- value->it_value.tv_sec = 0;
- value->it_value.tv_nsec = 0;
- }
- }
- else
- {
- value->it_value.tv_sec = 0;
- value->it_value.tv_nsec = 0;
- }
-
- retval = 0;
- }
- else
- __set_errno (EINVAL);
-
- return retval;
-}
diff --git a/linuxthreads/sysdeps/pthread/timer_routines.c b/linuxthreads/sysdeps/pthread/timer_routines.c
deleted file mode 100644
index 3877b86fbb..0000000000
--- a/linuxthreads/sysdeps/pthread/timer_routines.c
+++ /dev/null
@@ -1,573 +0,0 @@
-/* Helper code for POSIX timer implementation on LinuxThreads.
- Copyright (C) 2000, 2001, 2002, 2004 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Kaz Kylheku <kaz@ashi.footprints.net>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <assert.h>
-#include <errno.h>
-#include <pthread.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysdep.h>
-#include <time.h>
-#include <unistd.h>
-#include <sys/syscall.h>
-
-#include "posix-timer.h"
-
-
-/* Number of threads used. */
-#define THREAD_MAXNODES 16
-
-/* Array containing the descriptors for the used threads. */
-static struct thread_node thread_array[THREAD_MAXNODES];
-
-/* Static array with the structures for all the timers. */
-struct timer_node __timer_array[TIMER_MAX];
-
-/* Global lock to protect operation on the lists. */
-pthread_mutex_t __timer_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-/* Variable to protext initialization. */
-pthread_once_t __timer_init_once_control = PTHREAD_ONCE_INIT;
-
-/* Nonzero if initialization of timer implementation failed. */
-int __timer_init_failed;
-
-/* Node for the thread used to deliver signals. */
-struct thread_node __timer_signal_thread_rclk;
-
-/* Lists to keep free and used timers and threads. */
-struct list_links timer_free_list;
-struct list_links thread_free_list;
-struct list_links thread_active_list;
-
-
-#ifdef __NR_rt_sigqueueinfo
-extern int __syscall_rt_sigqueueinfo (int, int, siginfo_t *);
-#endif
-
-
-/* List handling functions. */
-static inline void
-list_init (struct list_links *list)
-{
- list->next = list->prev = list;
-}
-
-static inline void
-list_append (struct list_links *list, struct list_links *newp)
-{
- newp->prev = list->prev;
- newp->next = list;
- list->prev->next = newp;
- list->prev = newp;
-}
-
-static inline void
-list_insbefore (struct list_links *list, struct list_links *newp)
-{
- list_append (list, newp);
-}
-
-/*
- * Like list_unlink_ip, except that calling it on a node that
- * is already unlinked is disastrous rather than a noop.
- */
-
-static inline void
-list_unlink (struct list_links *list)
-{
- struct list_links *lnext = list->next, *lprev = list->prev;
-
- lnext->prev = lprev;
- lprev->next = lnext;
-}
-
-static inline struct list_links *
-list_first (struct list_links *list)
-{
- return list->next;
-}
-
-static inline struct list_links *
-list_null (struct list_links *list)
-{
- return list;
-}
-
-static inline struct list_links *
-list_next (struct list_links *list)
-{
- return list->next;
-}
-
-static inline int
-list_isempty (struct list_links *list)
-{
- return list->next == list;
-}
-
-
-/* Functions build on top of the list functions. */
-static inline struct thread_node *
-thread_links2ptr (struct list_links *list)
-{
- return (struct thread_node *) ((char *) list
- - offsetof (struct thread_node, links));
-}
-
-static inline struct timer_node *
-timer_links2ptr (struct list_links *list)
-{
- return (struct timer_node *) ((char *) list
- - offsetof (struct timer_node, links));
-}
-
-
-/* Initialize a newly allocated thread structure. */
-static void
-thread_init (struct thread_node *thread, const pthread_attr_t *attr, clockid_t clock_id)
-{
- if (attr != NULL)
- thread->attr = *attr;
- else
- {
- pthread_attr_init (&thread->attr);
- pthread_attr_setdetachstate (&thread->attr, PTHREAD_CREATE_DETACHED);
- }
-
- thread->exists = 0;
- list_init (&thread->timer_queue);
- pthread_cond_init (&thread->cond, 0);
- thread->current_timer = 0;
- thread->captured = pthread_self ();
- thread->clock_id = clock_id;
-}
-
-
-/* Initialize the global lists, and acquire global resources. Error
- reporting is done by storing a non-zero value to the global variable
- timer_init_failed. */
-static void
-init_module (void)
-{
- int i;
-
- list_init (&timer_free_list);
- list_init (&thread_free_list);
- list_init (&thread_active_list);
-
- for (i = 0; i < TIMER_MAX; ++i)
- {
- list_append (&timer_free_list, &__timer_array[i].links);
- __timer_array[i].inuse = TIMER_FREE;
- }
-
- for (i = 0; i < THREAD_MAXNODES; ++i)
- list_append (&thread_free_list, &thread_array[i].links);
-
- thread_init (&__timer_signal_thread_rclk, 0, CLOCK_REALTIME);
-}
-
-
-/* This is a handler executed in a child process after a fork()
- occurs. It reinitializes the module, resetting all of the data
- structures to their initial state. The mutex is initialized in
- case it was locked in the parent process. */
-static void
-reinit_after_fork (void)
-{
- init_module ();
- pthread_mutex_init (&__timer_mutex, 0);
-}
-
-
-/* Called once form pthread_once in timer_init. This initializes the
- module and ensures that reinit_after_fork will be executed in any
- child process. */
-void
-__timer_init_once (void)
-{
- init_module ();
- pthread_atfork (0, 0, reinit_after_fork);
-}
-
-
-/* Deinitialize a thread that is about to be deallocated. */
-static void
-thread_deinit (struct thread_node *thread)
-{
- assert (list_isempty (&thread->timer_queue));
- pthread_cond_destroy (&thread->cond);
-}
-
-
-/* Allocate a thread structure from the global free list. Global
- mutex lock must be held by caller. The thread is moved to
- the active list. */
-struct thread_node *
-__timer_thread_alloc (const pthread_attr_t *desired_attr, clockid_t clock_id)
-{
- struct list_links *node = list_first (&thread_free_list);
-
- if (node != list_null (&thread_free_list))
- {
- struct thread_node *thread = thread_links2ptr (node);
- list_unlink (node);
- thread_init (thread, desired_attr, clock_id);
- list_append (&thread_active_list, node);
- return thread;
- }
-
- return 0;
-}
-
-
-/* Return a thread structure to the global free list. Global lock
- must be held by caller. */
-void
-__timer_thread_dealloc (struct thread_node *thread)
-{
- thread_deinit (thread);
- list_unlink (&thread->links);
- list_append (&thread_free_list, &thread->links);
-}
-
-
-/* Each of our threads which terminates executes this cleanup
- handler. We never terminate threads ourselves; if a thread gets here
- it means that the evil application has killed it. If the thread has
- timers, these require servicing and so we must hire a replacement
- thread right away. We must also unblock another thread that may
- have been waiting for this thread to finish servicing a timer (see
- timer_delete()). */
-
-static void
-thread_cleanup (void *val)
-{
- if (val != NULL)
- {
- struct thread_node *thread = val;
-
- /* How did the signal thread get killed? */
- assert (thread != &__timer_signal_thread_rclk);
-
- pthread_mutex_lock (&__timer_mutex);
-
- thread->exists = 0;
-
- /* We are no longer processing a timer event. */
- thread->current_timer = 0;
-
- if (list_isempty (&thread->timer_queue))
- __timer_thread_dealloc (thread);
- else
- (void) __timer_thread_start (thread);
-
- pthread_mutex_unlock (&__timer_mutex);
-
- /* Unblock potentially blocked timer_delete(). */
- pthread_cond_broadcast (&thread->cond);
- }
-}
-
-
-/* Handle a timer which is supposed to go off now. */
-static void
-thread_expire_timer (struct thread_node *self, struct timer_node *timer)
-{
- self->current_timer = timer; /* Lets timer_delete know timer is running. */
-
- pthread_mutex_unlock (&__timer_mutex);
-
- switch (__builtin_expect (timer->event.sigev_notify, SIGEV_SIGNAL))
- {
- case SIGEV_NONE:
- break;
-
- case SIGEV_SIGNAL:
-#ifdef __NR_rt_sigqueueinfo
- {
- siginfo_t info;
-
- /* First, clear the siginfo_t structure, so that we don't pass our
- stack content to other tasks. */
- memset (&info, 0, sizeof (siginfo_t));
- /* We must pass the information about the data in a siginfo_t
- value. */
- info.si_signo = timer->event.sigev_signo;
- info.si_code = SI_TIMER;
- info.si_pid = timer->creator_pid;
- info.si_uid = getuid ();
- info.si_value = timer->event.sigev_value;
-
- INLINE_SYSCALL (rt_sigqueueinfo, 3, info.si_pid, info.si_signo, &info);
- }
-#else
- if (pthread_kill (self->captured, timer->event.sigev_signo) != 0)
- {
- if (pthread_kill (self->id, timer->event.sigev_signo) != 0)
- abort ();
- }
-#endif
- break;
-
- case SIGEV_THREAD:
- timer->event.sigev_notify_function (timer->event.sigev_value);
- break;
-
- default:
- assert (! "unknown event");
- break;
- }
-
- pthread_mutex_lock (&__timer_mutex);
-
- self->current_timer = 0;
-
- pthread_cond_broadcast (&self->cond);
-}
-
-
-/* Thread function; executed by each timer thread. The job of this
- function is to wait on the thread's timer queue and expire the
- timers in chronological order as close to their scheduled time as
- possible. */
-static void
-__attribute__ ((noreturn))
-thread_func (void *arg)
-{
- struct thread_node *self = arg;
-
- /* Register cleanup handler, in case rogue application terminates
- this thread. (This cannot happen to __timer_signal_thread, which
- doesn't invoke application callbacks). */
-
- pthread_cleanup_push (thread_cleanup, self);
-
- pthread_mutex_lock (&__timer_mutex);
-
- while (1)
- {
- struct list_links *first;
- struct timer_node *timer = NULL;
-
- /* While the timer queue is not empty, inspect the first node. */
- first = list_first (&self->timer_queue);
- if (first != list_null (&self->timer_queue))
- {
- struct timespec now;
-
- timer = timer_links2ptr (first);
-
- /* This assumes that the elements of the list of one thread
- are all for the same clock. */
- clock_gettime (timer->clock, &now);
-
- while (1)
- {
- /* If the timer is due or overdue, remove it from the queue.
- If it's a periodic timer, re-compute its new time and
- requeue it. Either way, perform the timer expiry. */
- if (timespec_compare (&now, &timer->expirytime) < 0)
- break;
-
- list_unlink_ip (first);
-
- if (__builtin_expect (timer->value.it_interval.tv_sec, 0) != 0
- || timer->value.it_interval.tv_nsec != 0)
- {
- timer->overrun_count = 0;
- timespec_add (&timer->expirytime, &timer->expirytime,
- &timer->value.it_interval);
- while (timespec_compare (&timer->expirytime, &now) < 0)
- {
- timespec_add (&timer->expirytime, &timer->expirytime,
- &timer->value.it_interval);
- if (timer->overrun_count < DELAYTIMER_MAX)
- ++timer->overrun_count;
- }
- __timer_thread_queue_timer (self, timer);
- }
-
- thread_expire_timer (self, timer);
-
- first = list_first (&self->timer_queue);
- if (first == list_null (&self->timer_queue))
- break;
-
- timer = timer_links2ptr (first);
- }
- }
-
- /* If the queue is not empty, wait until the expiry time of the
- first node. Otherwise wait indefinitely. Insertions at the
- head of the queue must wake up the thread by broadcasting
- this condition variable. */
- if (timer != NULL)
- pthread_cond_timedwait (&self->cond, &__timer_mutex,
- &timer->expirytime);
- else
- pthread_cond_wait (&self->cond, &__timer_mutex);
- }
- /* This macro will never be executed since the while loop loops
- forever - but we have to add it for proper nesting. */
- pthread_cleanup_pop (1);
-}
-
-
-/* Enqueue a timer in wakeup order in the thread's timer queue.
- Returns 1 if the timer was inserted at the head of the queue,
- causing the queue's next wakeup time to change. */
-
-int
-__timer_thread_queue_timer (struct thread_node *thread,
- struct timer_node *insert)
-{
- struct list_links *iter;
- int athead = 1;
-
- for (iter = list_first (&thread->timer_queue);
- iter != list_null (&thread->timer_queue);
- iter = list_next (iter))
- {
- struct timer_node *timer = timer_links2ptr (iter);
-
- if (timespec_compare (&insert->expirytime, &timer->expirytime) < 0)
- break;
- athead = 0;
- }
-
- list_insbefore (iter, &insert->links);
- return athead;
-}
-
-
-/* Start a thread and associate it with the given thread node. Global
- lock must be held by caller. */
-int
-__timer_thread_start (struct thread_node *thread)
-{
- int retval = 1;
-
- assert (!thread->exists);
- thread->exists = 1;
-
- if (pthread_create (&thread->id, &thread->attr,
- (void *(*) (void *)) thread_func, thread) != 0)
- {
- thread->exists = 0;
- retval = -1;
- }
-
- return retval;
-}
-
-
-void
-__timer_thread_wakeup (struct thread_node *thread)
-{
- pthread_cond_broadcast (&thread->cond);
-}
-
-
-/* Compare two pthread_attr_t thread attributes for exact equality.
- Returns 1 if they are equal, otherwise zero if they are not equal or
- contain illegal values. This version is LinuxThreads-specific for
- performance reason. One could use the access functions to get the
- values of all the fields of the attribute structure. */
-static int
-thread_attr_compare (const pthread_attr_t *left, const pthread_attr_t *right)
-{
- return (left->__detachstate == right->__detachstate
- && left->__schedpolicy == right->__schedpolicy
- && left->__guardsize == right->__guardsize
- && (left->__schedparam.sched_priority
- == right->__schedparam.sched_priority)
- && left->__inheritsched == right->__inheritsched
- && left->__scope == right->__scope
- && left->__stacksize == right->__stacksize
- && left->__stackaddr_set == right->__stackaddr_set
- && (left->__stackaddr_set
- || left->__stackaddr == right->__stackaddr));
-}
-
-
-/* Search the list of active threads and find one which has matching
- attributes. Global mutex lock must be held by caller. */
-struct thread_node *
-__timer_thread_find_matching (const pthread_attr_t *desired_attr,
- clockid_t desired_clock_id)
-{
- struct list_links *iter = list_first (&thread_active_list);
-
- while (iter != list_null (&thread_active_list))
- {
- struct thread_node *candidate = thread_links2ptr (iter);
-
- if (thread_attr_compare (desired_attr, &candidate->attr)
- && desired_clock_id == candidate->clock_id)
- return candidate;
-
- iter = list_next (iter);
- }
-
- return NULL;
-}
-
-
-/* Grab a free timer structure from the global free list. The global
- lock must be held by the caller. */
-struct timer_node *
-__timer_alloc (void)
-{
- struct list_links *node = list_first (&timer_free_list);
-
- if (node != list_null (&timer_free_list))
- {
- struct timer_node *timer = timer_links2ptr (node);
- list_unlink_ip (node);
- timer->inuse = TIMER_INUSE;
- timer->refcount = 1;
- return timer;
- }
-
- return NULL;
-}
-
-
-/* Return a timer structure to the global free list. The global lock
- must be held by the caller. */
-void
-__timer_dealloc (struct timer_node *timer)
-{
- assert (timer->refcount == 0);
- timer->thread = NULL; /* Break association between timer and thread. */
- timer->inuse = TIMER_FREE;
- list_append (&timer_free_list, &timer->links);
-}
-
-
-/* Thread cancellation handler which unlocks a mutex. */
-void
-__timer_mutex_cancel_handler (void *arg)
-{
- pthread_mutex_unlock (arg);
-}
diff --git a/linuxthreads/sysdeps/pthread/timer_settime.c b/linuxthreads/sysdeps/pthread/timer_settime.c
deleted file mode 100644
index 592b5271ba..0000000000
--- a/linuxthreads/sysdeps/pthread/timer_settime.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Kaz Kylheku <kaz@ashi.footprints.net>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include <time.h>
-
-#include "posix-timer.h"
-
-
-/* Set timer TIMERID to VALUE, returning old value in OVLAUE. */
-int
-timer_settime (timerid, flags, value, ovalue)
- timer_t timerid;
- int flags;
- const struct itimerspec *value;
- struct itimerspec *ovalue;
-{
- struct timer_node *timer;
- struct thread_node *thread = NULL;
- struct timespec now;
- int have_now = 0, need_wakeup = 0;
- int retval = -1;
-
- timer = timer_id2ptr (timerid);
- if (timer == NULL)
- {
- __set_errno (EINVAL);
- goto bail;
- }
-
- if (value->it_interval.tv_nsec < 0
- || value->it_interval.tv_nsec >= 1000000000
- || value->it_value.tv_nsec < 0
- || value->it_value.tv_nsec >= 1000000000)
- {
- __set_errno (EINVAL);
- goto bail;
- }
-
- /* Will need to know current time since this is a relative timer;
- might as well make the system call outside of the lock now! */
-
- if ((flags & TIMER_ABSTIME) == 0)
- {
- clock_gettime (timer->clock, &now);
- have_now = 1;
- }
-
- pthread_mutex_lock (&__timer_mutex);
- timer_addref (timer);
-
- /* One final check of timer validity; this one is possible only
- until we have the mutex, because it accesses the inuse flag. */
-
- if (! timer_valid(timer))
- {
- __set_errno (EINVAL);
- goto unlock_bail;
- }
-
- if (ovalue != NULL)
- {
- ovalue->it_interval = timer->value.it_interval;
-
- if (timer->armed)
- {
- if (! have_now)
- {
- pthread_mutex_unlock (&__timer_mutex);
- clock_gettime (timer->clock, &now);
- have_now = 1;
- pthread_mutex_lock (&__timer_mutex);
- timer_addref (timer);
- }
-
- timespec_sub (&ovalue->it_value, &timer->expirytime, &now);
- }
- else
- {
- ovalue->it_value.tv_sec = 0;
- ovalue->it_value.tv_nsec = 0;
- }
- }
-
- timer->value = *value;
-
- list_unlink_ip (&timer->links);
- timer->armed = 0;
-
- thread = timer->thread;
-
- /* A value of { 0, 0 } causes the timer to be stopped. */
- if (value->it_value.tv_sec != 0
- || __builtin_expect (value->it_value.tv_nsec != 0, 1))
- {
- if ((flags & TIMER_ABSTIME) != 0)
- /* The user specified the expiration time. */
- timer->expirytime = value->it_value;
- else
- timespec_add (&timer->expirytime, &now, &value->it_value);
-
- /* Only need to wake up the thread if timer is inserted
- at the head of the queue. */
- if (thread != NULL)
- need_wakeup = __timer_thread_queue_timer (thread, timer);
- timer->armed = 1;
- }
-
- retval = 0;
-
-unlock_bail:
- timer_delref (timer);
- pthread_mutex_unlock (&__timer_mutex);
-
-bail:
- if (thread != NULL && need_wakeup)
- __timer_thread_wakeup (thread);
-
- return retval;
-}
diff --git a/linuxthreads/sysdeps/pthread/tst-timer.c b/linuxthreads/sysdeps/pthread/tst-timer.c
deleted file mode 100644
index 7417bcd5f0..0000000000
--- a/linuxthreads/sysdeps/pthread/tst-timer.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/* Tests for POSIX timer implementation.
- Copyright (C) 2000, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Kaz Kylheku <kaz@ashi.footprints.net>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <signal.h>
-#include <stdio.h>
-#include <time.h>
-#include <unistd.h>
-
-
-static void
-notify_func (union sigval sigval)
-{
- puts ("notify_func");
-}
-
-
-static void
-signal_func (int sig)
-{
- static const char text[] = "signal_func\n";
- signal (sig, signal_func);
- write (STDOUT_FILENO, text, sizeof text - 1);
-}
-
-static void
-intr_sleep (int sec)
-{
- struct timespec ts;
-
- ts.tv_sec = sec;
- ts.tv_nsec = 0;
-
- while (nanosleep (&ts, &ts) == -1 && errno == EINTR)
- ;
-}
-
-#define ZSIGALRM 14
-
-
-int
-main (void)
-{
- struct timespec ts;
- timer_t timer_sig, timer_thr1, timer_thr2;
- int retval;
- struct sigevent sigev1 =
- {
- .sigev_notify = SIGEV_SIGNAL,
- .sigev_signo = ZSIGALRM
- };
- struct sigevent sigev2;
- struct itimerspec itimer1 = { { 0, 200000000 }, { 0, 200000000 } };
- struct itimerspec itimer2 = { { 0, 100000000 }, { 0, 500000000 } };
- struct itimerspec itimer3 = { { 0, 150000000 }, { 0, 300000000 } };
- struct itimerspec old;
-
- retval = clock_gettime (CLOCK_REALTIME, &ts);
-
- sigev2.sigev_notify = SIGEV_THREAD;
- sigev2.sigev_notify_function = notify_func;
- sigev2.sigev_notify_attributes = NULL;
-
- setvbuf (stdout, 0, _IOLBF, 0);
-
- printf ("clock_gettime returned %d, timespec = { %ld, %ld }\n",
- retval, ts.tv_sec, ts.tv_nsec);
-
- retval = clock_getres (CLOCK_REALTIME, &ts);
-
- printf ("clock_getres returned %d, timespec = { %ld, %ld }\n",
- retval, ts.tv_sec, ts.tv_nsec);
-
- timer_create (CLOCK_REALTIME, &sigev1, &timer_sig);
- timer_create (CLOCK_REALTIME, &sigev2, &timer_thr1);
- timer_create (CLOCK_REALTIME, &sigev2, &timer_thr2);
-
- timer_settime (timer_thr1, 0, &itimer2, &old);
- timer_settime (timer_thr2, 0, &itimer3, &old);
-
- signal (ZSIGALRM, signal_func);
-
- timer_settime (timer_sig, 0, &itimer1, &old);
-
- timer_delete (-1);
-
- intr_sleep (3);
-
- timer_delete (timer_sig);
- timer_delete (timer_thr1);
-
- intr_sleep (3);
-
- timer_delete (timer_thr2);
-
- return 0;
-}
diff --git a/linuxthreads/sysdeps/s390/Makefile b/linuxthreads/sysdeps/s390/Makefile
deleted file mode 100644
index 2885c968b3..0000000000
--- a/linuxthreads/sysdeps/s390/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-ifeq ($(subdir),csu)
-gen-as-const-headers += tcb-offsets.sym
-endif
-ifeq ($(subdir),linuxthreads)
-libpthread-routines += ptw-sysdep
-endif
diff --git a/linuxthreads/sysdeps/s390/pspinlock.c b/linuxthreads/sysdeps/s390/pspinlock.c
deleted file mode 100644
index f963f35371..0000000000
--- a/linuxthreads/sysdeps/s390/pspinlock.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* POSIX spinlock implementation. S/390 version.
- Copyright (C) 2000, 2004 Free Software Foundation, Inc.
- Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
- 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include "internals.h"
-
-/* This implementation is similar to the one used in the Linux kernel.
- But the kernel is byte instructions for the memory access. This is
- faster but unusable here. The problem is that only 128
- threads/processes could use the spinlock at the same time. If (by
- a design error in the program) a thread/process would hold the
- spinlock for a time long enough to accumulate 128 waiting
- processes, the next one will find a positive value in the spinlock
- and assume it is unlocked. We cannot accept that. */
-
-int
-__pthread_spin_lock (pthread_spinlock_t *lock)
-{
- asm volatile(" basr 1,0\n"
- "0: slr 0,0\n"
- " cs 0,1,%1\n"
- " jl 0b\n"
- : "=m" (*lock)
- : "m" (*lock) : "0", "1", "cc" );
- return 0;
-}
-weak_alias (__pthread_spin_lock, pthread_spin_lock)
-
-int
-__pthread_spin_trylock (pthread_spinlock_t *lock)
-{
- int oldval;
-
- asm volatile(" slr %1,%1\n"
- " basr 1,0\n"
- "0: cs %1,1,%0"
- : "=m" (*lock), "=&d" (oldval)
- : "m" (*lock) : "1", "cc" );
- return oldval == 0 ? 0 : EBUSY;
-}
-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
-
-
-int
-__pthread_spin_unlock (pthread_spinlock_t *lock)
-{
- asm volatile(" xc 0(4,%0),0(%0)\n"
- " bcr 15,0"
- : : "a" (lock) : "memory" );
- return 0;
-}
-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
-
-
-int
-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
-{
- /* We can ignore the `pshared' parameter. Since we are busy-waiting
- all processes which can access the memory location `lock' points
- to can use the spinlock. */
- *lock = 0;
- return 0;
-}
-weak_alias (__pthread_spin_init, pthread_spin_init)
-
-
-int
-__pthread_spin_destroy (pthread_spinlock_t *lock)
-{
- /* Nothing to do. */
- return 0;
-}
-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --git a/linuxthreads/sysdeps/s390/s390-32/pt-machine.h b/linuxthreads/sysdeps/s390/s390-32/pt-machine.h
deleted file mode 100644
index 398332965f..0000000000
--- a/linuxthreads/sysdeps/s390/s390-32/pt-machine.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/* Machine-dependent pthreads configuration and inline functions.
- S390 version.
- Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
- Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
- 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _PT_MACHINE_H
-#define _PT_MACHINE_H 1
-
-#ifndef PT_EI
-# define PT_EI extern inline __attribute__ ((always_inline))
-#endif
-
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
-
-/* For multiprocessor systems, we want to ensure all memory accesses
- are completed before we reset a lock. On other systems, we still
- need to make sure that the compiler has flushed everything to memory. */
-#define MEMORY_BARRIER() __asm__ __volatile__ ("bcr 15,0" : : : "memory")
-
-/* Spinlock implementation; required. */
-PT_EI long int
-testandset (int *spinlock)
-{
- int ret;
-
- __asm__ __volatile__(
- " la 1,%1\n"
- " lhi 0,1\n"
- " l %0,%1\n"
- "0: cs %0,0,0(1)\n"
- " jl 0b"
- : "=&d" (ret), "+m" (*spinlock)
- : : "0", "1", "cc");
-
- return ret;
-}
-
-
-/* Get some notion of the current stack. Need not be exactly the top
- of the stack, just something somewhere in the current frame. */
-#define CURRENT_STACK_FRAME stack_pointer
-register char * stack_pointer __asm__ ("15");
-
-#ifdef USE_TLS
-/* Return the thread descriptor for the current thread. */
-# define THREAD_SELF ((pthread_descr) __builtin_thread_pointer ())
-
-/* Initialize the thread-unique value. */
-#define INIT_THREAD_SELF(descr, nr) __builtin_set_thread_pointer (descr)
-#else
-/* Return the thread descriptor for the current thread.
- S/390 registers uses access register 0 as "thread register". */
-#define THREAD_SELF ({ \
- register pthread_descr __self; \
- __asm__ ("ear %0,%%a0" : "=d" (__self) ); \
- __self; \
-})
-
-/* Initialize the thread-unique value. */
-#define INIT_THREAD_SELF(descr, nr) ({ \
- __asm__ ("sar %%a0,%0" : : "d" (descr) ); \
-})
-#endif
-
-/* Access to data in the thread descriptor is easy. */
-#define THREAD_GETMEM(descr, member) \
- ((void) sizeof (descr), THREAD_SELF->member)
-#define THREAD_GETMEM_NC(descr, member) \
- ((void) sizeof (descr), THREAD_SELF->member)
-#define THREAD_SETMEM(descr, member, value) \
- ((void) sizeof (descr), THREAD_SELF->member = (value))
-#define THREAD_SETMEM_NC(descr, member, value) \
- ((void) sizeof (descr), THREAD_SELF->member = (value))
-
-/* We want the OS to assign stack addresses. */
-#define FLOATING_STACKS 1
-
-/* Maximum size of the stack if the rlimit is unlimited. */
-#define ARCH_STACK_MAX_SIZE 8*1024*1024
-
-/* Compare-and-swap for semaphores. */
-
-#define HAS_COMPARE_AND_SWAP
-
-PT_EI int
-__compare_and_swap(long int *p, long int oldval, long int newval)
-{
- int retval;
-
- __asm__ __volatile__(
- " la 1,%1\n"
- " lr 0,%2\n"
- " cs 0,%3,0(1)\n"
- " ipm %0\n"
- " srl %0,28\n"
- "0:"
- : "=&d" (retval), "+m" (*p)
- : "d" (oldval) , "d" (newval)
- : "cc", "0", "1" );
- return retval == 0;
-}
-
-#endif /* pt-machine.h */
diff --git a/linuxthreads/sysdeps/s390/s390-64/pt-machine.h b/linuxthreads/sysdeps/s390/s390-64/pt-machine.h
deleted file mode 100644
index 49f8ae2b9a..0000000000
--- a/linuxthreads/sysdeps/s390/s390-64/pt-machine.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/* Machine-dependent pthreads configuration and inline functions.
- 64 bit S/390 version.
- Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
- Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
- 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _PT_MACHINE_H
-#define _PT_MACHINE_H 1
-
-#ifndef PT_EI
-# define PT_EI extern inline __attribute__ ((always_inline))
-#endif
-
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
-
-/* For multiprocessor systems, we want to ensure all memory accesses
- are completed before we reset a lock. On other systems, we still
- need to make sure that the compiler has flushed everything to memory. */
-#define MEMORY_BARRIER() __asm__ __volatile__ ("bcr 15,0" : : : "memory")
-
-/* Spinlock implementation; required. */
-PT_EI long int
-testandset (int *spinlock)
-{
- int ret;
-
- __asm__ __volatile__(
- " la 1,%1\n"
- " lhi 0,1\n"
- " l %0,%1\n"
- "0: cs %0,0,0(1)\n"
- " jl 0b"
- : "=&d" (ret), "+m" (*spinlock)
- : : "0", "1", "cc");
-
- return ret;
-}
-
-
-/* Get some notion of the current stack. Need not be exactly the top
- of the stack, just something somewhere in the current frame. */
-#define CURRENT_STACK_FRAME stack_pointer
-register char * stack_pointer __asm__ ("15");
-
-#ifdef USE_TLS
-/* Return the thread descriptor for the current thread. */
-# define THREAD_SELF ((pthread_descr) __builtin_thread_pointer ())
-
-/* Initialize the thread-unique value. */
-#define INIT_THREAD_SELF(descr, nr) __builtin_set_thread_pointer (descr)
-#else
-/* Return the thread descriptor for the current thread.
- 64 bit S/390 uses access register 0 and 1 as "thread register". */
-#define THREAD_SELF ({ \
- register pthread_descr __self; \
- __asm__ (" ear %0,%%a0\n" \
- " sllg %0,%0,32\n" \
- " ear %0,%%a1\n" \
- : "=d" (__self) ); \
- __self; \
-})
-
-/* Initialize the thread-unique value. */
-#define INIT_THREAD_SELF(descr, nr) ({ \
- __asm__ (" sar %%a1,%0\n" \
- " srlg 0,%0,32\n" \
- " sar %%a0,0\n" \
- : : "d" (descr) : "0" ); \
-})
-#endif
-
-/* Access to data in the thread descriptor is easy. */
-#define THREAD_GETMEM(descr, member) \
- ((void) sizeof (descr), THREAD_SELF->member)
-#define THREAD_GETMEM_NC(descr, member) \
- ((void) sizeof (descr), THREAD_SELF->member)
-#define THREAD_SETMEM(descr, member, value) \
- ((void) sizeof (descr), THREAD_SELF->member = (value))
-#define THREAD_SETMEM_NC(descr, member, value) \
- ((void) sizeof (descr), THREAD_SELF->member = (value))
-
-/* We want the OS to assign stack addresses. */
-#define FLOATING_STACKS 1
-
-/* Maximum size of the stack if the rlimit is unlimited. */
-#define ARCH_STACK_MAX_SIZE 8*1024*1024
-
-/* Compare-and-swap for semaphores. */
-
-#define HAS_COMPARE_AND_SWAP
-
-PT_EI int
-__compare_and_swap(long int *p, long int oldval, long int newval)
-{
- int retval;
-
- __asm__ __volatile__(
- " lgr 0,%2\n"
- " csg 0,%3,%1\n"
- " ipm %0\n"
- " srl %0,28\n"
- "0:"
- : "=&d" (retval), "+m" (*p)
- : "d" (oldval) , "d" (newval)
- : "cc", "0");
- return retval == 0;
-}
-
-#endif /* pt-machine.h */
diff --git a/linuxthreads/sysdeps/s390/tcb-offsets.sym b/linuxthreads/sysdeps/s390/tcb-offsets.sym
deleted file mode 100644
index aee6be2570..0000000000
--- a/linuxthreads/sysdeps/s390/tcb-offsets.sym
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <sysdep.h>
-#include <tls.h>
-
-MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads)
diff --git a/linuxthreads/sysdeps/s390/tls.h b/linuxthreads/sysdeps/s390/tls.h
deleted file mode 100644
index 00a4df9382..0000000000
--- a/linuxthreads/sysdeps/s390/tls.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/* Definitions for thread-local data handling. linuxthreads/s390 version.
- Copyright (C) 2002, 2003, 2005 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _TLS_H
-#define _TLS_H
-
-#ifndef __ASSEMBLER__
-
-# include <pt-machine.h>
-# include <stdbool.h>
-# include <stddef.h>
-
-/* Type for the dtv. */
-typedef union dtv
-{
- size_t counter;
- struct
- {
- void *val;
- bool is_static;
- } pointer;
-} dtv_t;
-
-typedef struct
-{
- void *tcb; /* Pointer to the TCB. Not necessary the
- thread descriptor used by libpthread. */
- dtv_t *dtv;
- void *self; /* Pointer to the thread descriptor. */
- int multiple_threads;
-} tcbhead_t;
-
-#else /* __ASSEMBLER__ */
-# include <tcb-offsets.h>
-#endif /* __ASSEMBLER__ */
-
-/* TLS is always supported if the tools support it. There are no
- kernel dependencies. To avoid bothering with the TLS support code
- at all, use configure --without-tls.
-
- We need USE_TLS to be consistently defined, for ldsodefs.h
- conditionals. */
-
-#ifdef HAVE_TLS_SUPPORT
-
-/* Signal that TLS support is available. */
-# define USE_TLS 1
-
-# ifndef __ASSEMBLER__
-/* Get system call information. */
-# include <sysdep.h>
-
-
-/* Get the thread descriptor definition. */
-# include <linuxthreads/descr.h>
-
-/* This is the size of the initial TCB. */
-# define TLS_INIT_TCB_SIZE sizeof (tcbhead_t)
-
-/* Alignment requirements for the initial TCB. */
-# define TLS_INIT_TCB_ALIGN __alignof__ (tcbhead_t)
-
-/* This is the size of the TCB. */
-# ifndef IS_IN_rtld
-# define TLS_TCB_SIZE sizeof (struct _pthread_descr_struct)
-# else
-# include <nptl-struct-pthread.h>
-# define TLS_TCB_SIZE \
- (sizeof (struct _pthread_descr_struct) > NPTL_STRUCT_PTHREAD_SIZE \
- ? sizeof (struct _pthread_descr_struct) : NPTL_STRUCT_PTHREAD_SIZE)
-# endif
-
-/* Alignment requirements for the TCB. */
-# define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct)
-
-/* The TCB can have any size and the memory following the address the
- thread pointer points to is unspecified. Allocate the TCB there. */
-# define TLS_TCB_AT_TP 1
-
-
-/* Install the dtv pointer. The pointer passed is to the element with
- index -1 which contain the length. */
-# define INSTALL_DTV(descr, dtvp) \
- ((tcbhead_t *) (descr))->dtv = (dtvp) + 1
-
-/* Install new dtv for current thread. */
-# define INSTALL_NEW_DTV(dtv) \
- (((tcbhead_t *) __builtin_thread_pointer ())->dtv = (dtv))
-
-/* Return dtv of given thread descriptor. */
-# define GET_DTV(descr) \
- (((tcbhead_t *) (descr))->dtv)
-
-/* Code to initially initialize the thread pointer. This might need
- special attention since 'errno' is not yet available and if the
- operation can cause a failure 'errno' must not be touched.
-
- The value of this macro is null if successful, or an error string. */
-# define TLS_INIT_TP(descr, secondcall) \
- ({ \
- void *_descr = (descr); \
- tcbhead_t *head = _descr; \
- \
- head->tcb = _descr; \
- /* For now the thread descriptor is at the same address. */ \
- head->self = _descr; \
- \
- __builtin_set_thread_pointer (_descr); \
- NULL; \
- })
-
-/* Return the address of the dtv for the current thread. */
-# define THREAD_DTV() \
- (((tcbhead_t *) __builtin_thread_pointer ())->dtv)
-
-# endif /* __ASSEMBLER__ */
-
-#else /* HAVE_TLS_SUPPORT && (FLOATING_STACKS || !IS_IN_libpthread) */
-
-# ifndef __ASSEMBLER__
-
-/* Get the thread descriptor definition. */
-# include <linuxthreads/descr.h>
-
-# define NONTLS_INIT_TP \
- do { \
- static const tcbhead_t nontls_init_tp \
- = { .multiple_threads = 0 }; \
- INIT_THREAD_SELF (&nontls_init_tp, 0); \
- } while (0)
-
-# endif /* __ASSEMBLER__ */
-
-#endif /* HAVE_TLS_SUPPORT && (FLOATING_STACKS || !IS_IN_libpthread) */
-
-#endif /* tls.h */
diff --git a/linuxthreads/sysdeps/sh/Makefile b/linuxthreads/sysdeps/sh/Makefile
deleted file mode 100644
index 81bddf688c..0000000000
--- a/linuxthreads/sysdeps/sh/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-ifeq ($(subdir),csu)
-gen-as-const-headers += tcb-offsets.sym
-endif
diff --git a/linuxthreads/sysdeps/sh/pspinlock.c b/linuxthreads/sysdeps/sh/pspinlock.c
deleted file mode 100644
index 2dec849d3c..0000000000
--- a/linuxthreads/sysdeps/sh/pspinlock.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/* POSIX spinlock implementation. SH version.
- Copyright (C) 2000, 2001 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include "internals.h"
-
-int
-__pthread_spin_lock (pthread_spinlock_t *lock)
-{
- unsigned int val;
-
- do
- asm volatile ("tas.b @%1; movt %0"
- : "=r" (val)
- : "r" (lock)
- : "memory");
- while (val == 0);
-
- return 0;
-}
-weak_alias (__pthread_spin_lock, pthread_spin_lock)
-
-
-int
-__pthread_spin_trylock (pthread_spinlock_t *lock)
-{
- unsigned int val;
-
- asm volatile ("tas.b @%1; movt %0"
- : "=r" (val)
- : "r" (lock)
- : "memory");
- return val ? 0 : EBUSY;
-}
-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
-
-
-int
-__pthread_spin_unlock (pthread_spinlock_t *lock)
-{
- return *lock = 0;
-}
-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
-
-
-int
-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
-{
- /* We can ignore the `pshared' parameter. Since we are busy-waiting
- all processes which can access the memory location `lock' points
- to can use the spinlock. */
- return *lock = 0;
-}
-weak_alias (__pthread_spin_init, pthread_spin_init)
-
-
-int
-__pthread_spin_destroy (pthread_spinlock_t *lock)
-{
- /* Nothing to do. */
- return 0;
-}
-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --git a/linuxthreads/sysdeps/sh/pt-machine.h b/linuxthreads/sysdeps/sh/pt-machine.h
deleted file mode 100644
index 02545e6b45..0000000000
--- a/linuxthreads/sysdeps/sh/pt-machine.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* Machine-dependent pthreads configuration and inline functions.
- SuperH version.
- Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Niibe Yutaka <gniibe@m17n.org>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _PT_MACHINE_H
-#define _PT_MACHINE_H 1
-
-#ifndef __ASSEMBLER__
-#ifndef PT_EI
-# define PT_EI extern inline __attribute__ ((always_inline))
-#endif
-
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
-
-/* Spinlock implementation; required. */
-PT_EI long int
-testandset (int *spinlock)
-{
- int ret;
-
- __asm__ __volatile__(
- "tas.b @%1\n\t"
- "movt %0"
- : "=r" (ret)
- : "r" (spinlock)
- : "memory", "cc");
-
- return (ret == 0);
-}
-
-/* We want the OS to assign stack addresses. */
-#define FLOATING_STACKS 1
-
-/* Maximum size of the stack if the rlimit is unlimited. */
-#define ARCH_STACK_MAX_SIZE 32*1024*1024
-
-/* Get some notion of the current stack. Need not be exactly the top
- of the stack, just something somewhere in the current frame. */
-#define CURRENT_STACK_FRAME stack_pointer
-register char * stack_pointer __asm__ ("r15");
-
-/* Return the thread descriptor for the current thread. */
-struct _pthread_descr_struct;
-#define THREAD_SELF \
- ({ struct _pthread_descr_struct *self; \
- __asm__("stc gbr,%0" : "=r" (self)); self;})
-
-/* Initialize the thread-unique value. */
-#define INIT_THREAD_SELF(descr, nr) \
- ({ __asm__ __volatile__("ldc %0,gbr" : : "r" (descr));})
-
-/* Access to data in the thread descriptor is easy. */
-#define THREAD_GETMEM(descr, member) \
- ((void) sizeof (descr), THREAD_SELF->member)
-#define THREAD_GETMEM_NC(descr, member) \
- ((void) sizeof (descr), THREAD_SELF->member)
-#define THREAD_SETMEM(descr, member, value) \
- ((void) sizeof (descr), THREAD_SELF->member = (value))
-#define THREAD_SETMEM_NC(descr, member, value) \
- ((void) sizeof (descr), THREAD_SELF->member = (value))
-#endif /* __ASSEMBLER__ */
-
-#endif /* pt-machine.h */
diff --git a/linuxthreads/sysdeps/sh/tcb-offsets.sym b/linuxthreads/sysdeps/sh/tcb-offsets.sym
deleted file mode 100644
index 328eb05738..0000000000
--- a/linuxthreads/sysdeps/sh/tcb-offsets.sym
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <sysdep.h>
-#include <tls.h>
-
---
-#ifdef USE_TLS
-MULTIPLE_THREADS_OFFSET offsetof (struct _pthread_descr_struct, p_multiple_threads)
-TLS_PRE_TCB_SIZE sizeof (struct _pthread_descr_struct)
-#else
-MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads)
-#endif
diff --git a/linuxthreads/sysdeps/sh/tls.h b/linuxthreads/sysdeps/sh/tls.h
deleted file mode 100644
index fbc6f01151..0000000000
--- a/linuxthreads/sysdeps/sh/tls.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/* Definition for thread-local data handling. linuxthreads/SH version.
- Copyright (C) 2002, 2003, 2005 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _TLS_H
-#define _TLS_H
-
-# include <dl-sysdep.h>
-# include <pt-machine.h>
-
-#ifndef __ASSEMBLER__
-# include <stdbool.h>
-# include <stddef.h>
-# include <stdint.h>
-
-/* Type for the dtv. */
-typedef union dtv
-{
- size_t counter;
- struct
- {
- void *val;
- bool is_static;
- } pointer;
-} dtv_t;
-
-#else /* __ASSEMBLER__ */
-# include <tcb-offsets.h>
-#endif /* __ASSEMBLER__ */
-
-
-/* We can support TLS only if the floating-stack support is available. */
-#if defined HAVE_TLS_SUPPORT \
- && (defined FLOATING_STACKS || !defined IS_IN_libpthread)
-
-/* Signal that TLS support is available. */
-# define USE_TLS 1
-
-# ifndef __ASSEMBLER__
-
-typedef struct
-{
- dtv_t *dtv;
- void *private;
-} tcbhead_t;
-
-/* This is the size of the initial TCB. */
-# define TLS_INIT_TCB_SIZE sizeof (tcbhead_t)
-
-/* Alignment requirements for the initial TCB. */
-# define TLS_INIT_TCB_ALIGN __alignof__ (tcbhead_t)
-
-/* This is the size of the TCB. */
-# define TLS_TCB_SIZE sizeof (tcbhead_t)
-
-/* This is the size we need before TCB. */
-# ifndef IS_IN_rtld
-# define TLS_PRE_TCB_SIZE sizeof (struct _pthread_descr_struct)
-# else
-# include <nptl-struct-pthread.h>
-# define TLS_PRE_TCB_SIZE \
- (sizeof (struct _pthread_descr_struct) > NPTL_STRUCT_PTHREAD_SIZE \
- ? sizeof (struct _pthread_descr_struct) : NPTL_STRUCT_PTHREAD_SIZE)
-# endif
-
-/* Alignment requirements for the TCB. */
-# define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct)
-
-/* The TLS blocks start right after the TCB. */
-# define TLS_DTV_AT_TP 1
-
-/* Install the dtv pointer. The pointer passed is to the element with
- index -1 which contain the length. */
-# define INSTALL_DTV(tcbp, dtvp) \
- ((tcbhead_t *) (tcbp))->dtv = dtvp + 1
-
-/* Install new dtv for current thread. */
-# define INSTALL_NEW_DTV(dtv) \
- ({ tcbhead_t *__tcbp; \
- __asm __volatile ("stc gbr,%0" : "=r" (__tcbp)); \
- __tcbp->dtv = (dtv);})
-
-/* Return dtv of given thread descriptor. */
-# define GET_DTV(tcbp) \
- (((tcbhead_t *) (tcbp))->dtv)
-
-/* Code to initially initialize the thread pointer. This might need
- special attention since 'errno' is not yet available and if the
- operation can cause a failure 'errno' must not be touched. */
-# define TLS_INIT_TP(tcbp, secondcall) \
- ({ __asm __volatile ("ldc %0,gbr" : : "r" (tcbp)); 0; })
-
-/* Return the address of the dtv for the current thread. */
-# define THREAD_DTV() \
- ({ tcbhead_t *__tcbp; \
- __asm __volatile ("stc gbr,%0" : "=r" (__tcbp)); \
- __tcbp->dtv;})
-
-/* Return the thread descriptor for the current thread. */
-# undef THREAD_SELF
-# define THREAD_SELF \
- ({ struct _pthread_descr_struct *__self; \
- __asm ("stc gbr,%0" : "=r" (__self)); \
- __self - 1;})
-
-# undef INIT_THREAD_SELF
-# define INIT_THREAD_SELF(descr, nr) \
- ({ struct _pthread_descr_struct *__self = (void *) descr; \
- __asm __volatile ("ldc %0,gbr" : : "r" (__self + 1)); \
- 0; })
-
-# define TLS_MULTIPLE_THREADS_IN_TCB 1
-
-/* Get the thread descriptor definition. This must be after the
- the definition of THREAD_SELF for TLS. */
-# include <linuxthreads/descr.h>
-
-# endif /* __ASSEMBLER__ */
-
-#else
-
-# ifndef __ASSEMBLER__
-
-typedef struct
-{
- void *tcb;
- dtv_t *dtv;
- void *self;
- int multiple_threads;
-} tcbhead_t;
-
-/* Get the thread descriptor definition. */
-# include <linuxthreads/descr.h>
-
-# define NONTLS_INIT_TP \
- do { \
- static const tcbhead_t nontls_init_tp = { .multiple_threads = 0 }; \
- __asm __volatile ("ldc %0,gbr" : : "r" (&nontls_init_tp)); \
- } while (0)
-
-# endif /* __ASSEMBLER__ */
-
-#endif /* HAVE_TLS_SUPPORT && (FLOATING_STACKS || !IS_IN_libpthread) */
-
-#endif /* tls.h */
diff --git a/linuxthreads/sysdeps/sparc/Makefile b/linuxthreads/sysdeps/sparc/Makefile
deleted file mode 100644
index 81bddf688c..0000000000
--- a/linuxthreads/sysdeps/sparc/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-ifeq ($(subdir),csu)
-gen-as-const-headers += tcb-offsets.sym
-endif
diff --git a/linuxthreads/sysdeps/sparc/sparc32/pspinlock.c b/linuxthreads/sysdeps/sparc/sparc32/pspinlock.c
deleted file mode 100644
index a67dbf901e..0000000000
--- a/linuxthreads/sysdeps/sparc/sparc32/pspinlock.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/* POSIX spinlock implementation. SPARC32 version.
- Copyright (C) 2000 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include "internals.h"
-
-/* This implementation is similar to the one used in the Linux kernel. */
-int
-__pthread_spin_lock (pthread_spinlock_t *lock)
-{
- asm volatile
- ("1: ldstub [%0], %%g2\n"
- " orcc %%g2, 0x0, %%g0\n"
- " bne,a 2f\n"
- " ldub [%0], %%g2\n"
- ".subsection 2\n"
- "2: orcc %%g2, 0x0, %%g0\n"
- " bne,a 2b\n"
- " ldub [%0], %%g2\n"
- " b,a 1b\n"
- ".previous"
- : /* no outputs */
- : "r" (lock)
- : "g2", "memory", "cc");
- return 0;
-}
-weak_alias (__pthread_spin_lock, pthread_spin_lock)
-
-
-int
-__pthread_spin_trylock (pthread_spinlock_t *lock)
-{
- int result;
- asm volatile
- ("ldstub [%1], %0"
- : "=r" (result)
- : "r" (lock)
- : "memory");
- return result == 0 ? 0 : EBUSY;
-}
-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
-
-
-int
-__pthread_spin_unlock (pthread_spinlock_t *lock)
-{
- *lock = 0;
- return 0;
-}
-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
-
-
-int
-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
-{
- /* We can ignore the `pshared' parameter. Since we are busy-waiting
- all processes which can access the memory location `lock' points
- to can use the spinlock. */
- *lock = 0;
- return 0;
-}
-weak_alias (__pthread_spin_init, pthread_spin_init)
-
-
-int
-__pthread_spin_destroy (pthread_spinlock_t *lock)
-{
- /* Nothing to do. */
- return 0;
-}
-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --git a/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h b/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h
deleted file mode 100644
index 322a52051f..0000000000
--- a/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Machine-dependent pthreads configuration and inline functions.
- sparc version.
- Copyright (C) 1996-1998, 2000-2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Richard Henderson <rth@tamu.edu>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _PT_MACHINE_H
-#define _PT_MACHINE_H 1
-
-#ifndef PT_EI
-# define PT_EI extern inline __attribute__ ((always_inline))
-#endif
-
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
-
-/* Spinlock implementation; required. */
-PT_EI long int
-testandset (int *spinlock)
-{
- int ret;
-
- __asm__ __volatile__("ldstub %1,%0"
- : "=r"(ret), "=m"(*spinlock)
- : "m"(*spinlock));
-
- return ret;
-}
-
-
-/* Memory barrier; default is to do nothing */
-#define MEMORY_BARRIER() __asm__ __volatile__("stbar" : : : "memory")
-
-
-/* Get some notion of the current stack. Need not be exactly the top
- of the stack, just something somewhere in the current frame. */
-#define CURRENT_STACK_FRAME (stack_pointer + (2 * 64))
-register char *stack_pointer __asm__("%sp");
-
-
-/* Registers %g6 and %g7 are reserved by the ABI for "system use".
- %g7 is specified in the TLS ABI as thread pointer -- we do the same. */
-struct _pthread_descr_struct;
-register struct _pthread_descr_struct *__thread_self __asm__("%g7");
-
-/* Return the thread descriptor for the current thread. */
-#define THREAD_SELF __thread_self
-
-/* Initialize the thread-unique value. */
-#define INIT_THREAD_SELF(descr, nr) (__thread_self = (descr))
-
-/* Access to data in the thread descriptor is easy. */
-#define THREAD_GETMEM(descr, member) \
- ((void) sizeof (descr), THREAD_SELF->member)
-#define THREAD_GETMEM_NC(descr, member) \
- ((void) sizeof (descr), THREAD_SELF->member)
-#define THREAD_SETMEM(descr, member, value) \
- ((void) sizeof (descr), THREAD_SELF->member = (value))
-#define THREAD_SETMEM_NC(descr, member, value) \
- ((void) sizeof (descr), THREAD_SELF->member = (value))
-
-/* We want the OS to assign stack addresses. */
-#define FLOATING_STACKS 1
-
-/* Maximum size of the stack if the rlimit is unlimited. */
-#define ARCH_STACK_MAX_SIZE 8*1024*1024
-
-#endif /* pt-machine.h */
diff --git a/linuxthreads/sysdeps/sparc/sparc32/sparcv9/Versions b/linuxthreads/sysdeps/sparc/sparc32/sparcv9/Versions
deleted file mode 100644
index 32da57080d..0000000000
--- a/linuxthreads/sysdeps/sparc/sparc32/sparcv9/Versions
+++ /dev/null
@@ -1,5 +0,0 @@
-libpthread {
- GLIBC_PRIVATE {
- __pthread_clock_gettime; __pthread_clock_settime;
- }
-}
diff --git a/linuxthreads/sysdeps/sparc/sparc32/sparcv9/pspinlock.c b/linuxthreads/sysdeps/sparc/sparc32/sparcv9/pspinlock.c
deleted file mode 100644
index 04f588bed5..0000000000
--- a/linuxthreads/sysdeps/sparc/sparc32/sparcv9/pspinlock.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/* POSIX spinlock implementation. SPARC v9 version.
- Copyright (C) 2000 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include "internals.h"
-
-
-/* This implementation is similar to the one used in the Linux kernel. */
-int
-__pthread_spin_lock (pthread_spinlock_t *lock)
-{
- asm volatile
- ("1: ldstub [%0], %%g2\n"
- " brnz,pn %%g2, 2f\n"
- " membar #StoreLoad | #StoreStore\n"
- ".subsection 2\n"
- "2: ldub [%0], %%g2\n"
- " brnz,pt %%g2, 2b\n"
- " membar #LoadLoad\n"
- " b,a,pt %%xcc, 1b\n"
- ".previous"
- : /* no outputs */
- : "r" (lock)
- : "g2", "memory");
- return 0;
-}
-weak_alias (__pthread_spin_lock, pthread_spin_lock)
-
-
-int
-__pthread_spin_trylock (pthread_spinlock_t *lock)
-{
- int result;
- asm volatile
- ("ldstub [%1], %0\n"
- "membar #StoreLoad | #StoreStore"
- : "=r" (result)
- : "r" (lock)
- : "memory");
- return result == 0 ? 0 : EBUSY;
-}
-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
-
-
-int
-__pthread_spin_unlock (pthread_spinlock_t *lock)
-{
- asm volatile
- ("membar #StoreStore | #LoadStore\n"
- "stb %%g0, [%0]"
- :
- : "r" (lock)
- : "memory");
- return 0;
-}
-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
-
-
-int
-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
-{
- /* We can ignore the `pshared' parameter. Since we are busy-waiting
- all processes which can access the memory location `lock' points
- to can use the spinlock. */
- *lock = 0;
- return 0;
-}
-weak_alias (__pthread_spin_init, pthread_spin_init)
-
-
-int
-__pthread_spin_destroy (pthread_spinlock_t *lock)
-{
- /* Nothing to do. */
- return 0;
-}
-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --git a/linuxthreads/sysdeps/sparc/sparc64/Versions b/linuxthreads/sysdeps/sparc/sparc64/Versions
deleted file mode 100644
index 32da57080d..0000000000
--- a/linuxthreads/sysdeps/sparc/sparc64/Versions
+++ /dev/null
@@ -1,5 +0,0 @@
-libpthread {
- GLIBC_PRIVATE {
- __pthread_clock_gettime; __pthread_clock_settime;
- }
-}
diff --git a/linuxthreads/sysdeps/sparc/sparc64/pspinlock.c b/linuxthreads/sysdeps/sparc/sparc64/pspinlock.c
deleted file mode 100644
index 92b84f5108..0000000000
--- a/linuxthreads/sysdeps/sparc/sparc64/pspinlock.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/* POSIX spinlock implementation. SPARC64 version.
- Copyright (C) 2000 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include "internals.h"
-
-/* This implementation is similar to the one used in the Linux kernel. */
-int
-__pthread_spin_lock (pthread_spinlock_t *lock)
-{
- asm volatile
- ("1: ldstub [%0], %%g5\n"
- " brnz,pn %%g5, 2f\n"
- " membar #StoreLoad | #StoreStore\n"
- ".subsection 2\n"
- "2: ldub [%0], %%g5\n"
- " brnz,pt %%g5, 2b\n"
- " membar #LoadLoad\n"
- " b,a,pt %%xcc, 1b\n"
- ".previous"
- : /* no outputs */
- : "r" (lock)
- : "g5", "memory");
- return 0;
-}
-weak_alias (__pthread_spin_lock, pthread_spin_lock)
-
-
-int
-__pthread_spin_trylock (pthread_spinlock_t *lock)
-{
- int result;
- asm volatile
- ("ldstub [%1], %0\n"
- "membar #StoreLoad | #StoreStore"
- : "=r" (result)
- : "r" (lock)
- : "memory");
- return result == 0 ? 0 : EBUSY;
-}
-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
-
-
-int
-__pthread_spin_unlock (pthread_spinlock_t *lock)
-{
- asm volatile
- ("membar #StoreStore | #LoadStore\n"
- "stb %%g0, [%0]"
- :
- : "r" (lock)
- : "memory");
- return 0;
-}
-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
-
-
-int
-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
-{
- /* We can ignore the `pshared' parameter. Since we are busy-waiting
- all processes which can access the memory location `lock' points
- to can use the spinlock. */
- *lock = 0;
- return 0;
-}
-weak_alias (__pthread_spin_init, pthread_spin_init)
-
-
-int
-__pthread_spin_destroy (pthread_spinlock_t *lock)
-{
- /* Nothing to do. */
- return 0;
-}
-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --git a/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h b/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h
deleted file mode 100644
index f65c13be1b..0000000000
--- a/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/* Machine-dependent pthreads configuration and inline functions.
- Sparc v9 version.
- Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Richard Henderson <rth@tamu.edu>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General 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, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-#ifndef _PT_MACHINE_H
-#define _PT_MACHINE_H 1
-
-#ifndef PT_EI
-# define PT_EI extern inline __attribute__ ((always_inline))
-#endif
-
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
-
-/* Spinlock implementation; required. */
-PT_EI long int
-testandset (int *spinlock)
-{
- int ret;
-
- __asm__ __volatile__("ldstub %1,%0"
- : "=r" (ret), "=m" (*spinlock) : "m" (*spinlock));
-
- return ret;
-}
-
-
-/* Memory barrier; default is to do nothing */
-#define MEMORY_BARRIER() \
- __asm__ __volatile__("membar #LoadLoad | #LoadStore | #StoreLoad | #StoreStore" : : : "memory")
-/* Read barrier. */
-#define READ_MEMORY_BARRIER() \
- __asm__ __volatile__("membar #LoadLoad | #LoadStore" : : : "memory")
-/* Write barrier. */
-#define WRITE_MEMORY_BARRIER() \
- __asm__ __volatile__("membar #StoreLoad | #StoreStore" : : : "memory")
-
-
-/* Get some notion of the current stack. Need not be exactly the top
- of the stack, just something somewhere in the current frame. */
-#define CURRENT_STACK_FRAME (stack_pointer + (2 * 128))
-register char *stack_pointer __asm__ ("%sp");
-
-
-/* Registers %g6 and %g7 are reserved by the ABI for "system use". The
- TLS ABI specifies %g7 as the thread pointer. */
-struct _pthread_descr_struct;
-register struct _pthread_descr_struct *__thread_self __asm__ ("%g7");
-
-/* Return the thread descriptor for the current thread. */
-#define THREAD_SELF __thread_self
-
-/* Initialize the thread-unique value. */
-#define INIT_THREAD_SELF(descr, nr) (__thread_self = (descr))
-
-
-/* Compare-and-swap for semaphores. */
-
-#define HAS_COMPARE_AND_SWAP
-PT_EI int
-__compare_and_swap (long int *p, long int oldval, long int newval)
-{
- long int readval;
-
- __asm__ __volatile__ ("casx [%4], %2, %0"
- : "=r"(readval), "=m"(*p)
- : "r"(oldval), "m"(*p), "r"(p), "0"(newval));
- MEMORY_BARRIER();
- return readval == oldval;
-}
-
-/* Access to data in the thread descriptor is easy. */
-#define THREAD_GETMEM(descr, member) \
- ((void) sizeof (descr), THREAD_SELF->member)
-#define THREAD_GETMEM_NC(descr, member) \
- ((void) sizeof (descr), THREAD_SELF->member)
-#define THREAD_SETMEM(descr, member, value) \
- ((void) sizeof (descr), THREAD_SELF->member = (value))
-#define THREAD_SETMEM_NC(descr, member, value) \
- ((void) sizeof (descr), THREAD_SELF->member = (value))
-
-/* We want the OS to assign stack addresses. */
-#define FLOATING_STACKS 1
-
-/* Maximum size of the stack if the rlimit is unlimited. */
-#define ARCH_STACK_MAX_SIZE 32*1024*1024
-
-#endif /* pt-machine.h */
diff --git a/linuxthreads/sysdeps/sparc/tcb-offsets.sym b/linuxthreads/sysdeps/sparc/tcb-offsets.sym
deleted file mode 100644
index aee6be2570..0000000000
--- a/linuxthreads/sysdeps/sparc/tcb-offsets.sym
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <sysdep.h>
-#include <tls.h>
-
-MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads)
diff --git a/linuxthreads/sysdeps/sparc/tls.h b/linuxthreads/sysdeps/sparc/tls.h
deleted file mode 100644
index 3e550fa7c7..0000000000
--- a/linuxthreads/sysdeps/sparc/tls.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/* Definitions for thread-local data handling. linuxthreads/sparc version.
- Copyright (C) 2002, 2003, 2005 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _TLS_H
-#define _TLS_H
-
-#ifndef __ASSEMBLER__
-
-# include <pt-machine.h>
-# include <stdbool.h>
-# include <stddef.h>
-
-/* Type for the dtv. */
-typedef union dtv
-{
- size_t counter;
- struct
- {
- void *val;
- bool is_static;
- } pointer;
-} dtv_t;
-
-typedef struct
-{
- void *tcb; /* Pointer to the TCB. Not necessary the
- thread descriptor used by libpthread. */
- dtv_t *dtv;
- void *self; /* Pointer to the thread descriptor. */
- int multiple_threads;
-} tcbhead_t;
-
-#else /* __ASSEMBLER__ */
-# include <tcb-offsets.h>
-#endif /* __ASSEMBLER__ */
-
-#ifdef HAVE_TLS_SUPPORT
-
-/* Signal that TLS support is available. */
-# define USE_TLS 1
-
-# ifndef __ASSEMBLER__
-/* Get system call information. */
-# include <sysdep.h>
-
-/* Get the thread descriptor definition. */
-# include <linuxthreads/descr.h>
-
-/* This is the size of the initial TCB. */
-# define TLS_INIT_TCB_SIZE sizeof (tcbhead_t)
-
-/* Alignment requirements for the initial TCB. */
-# define TLS_INIT_TCB_ALIGN __alignof__ (tcbhead_t)
-
-/* This is the size of the TCB. */
-# ifndef IS_IN_rtld
-# define TLS_TCB_SIZE sizeof (struct _pthread_descr_struct)
-# else
-# include <nptl-struct-pthread.h>
-# define TLS_TCB_SIZE \
- (sizeof (struct _pthread_descr_struct) > NPTL_STRUCT_PTHREAD_SIZE \
- ? sizeof (struct _pthread_descr_struct) : NPTL_STRUCT_PTHREAD_SIZE)
-# endif
-
-/* Alignment requirements for the TCB. */
-# define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct)
-
-/* The TCB can have any size and the memory following the address the
- thread pointer points to is unspecified. Allocate the TCB there. */
-# define TLS_TCB_AT_TP 1
-
-/* Install the dtv pointer. The pointer passed is to the element with
- index -1 which contain the length. */
-# define INSTALL_DTV(descr, dtvp) \
- ((tcbhead_t *) (descr))->dtv = (dtvp) + 1
-
-/* Install new dtv for current thread. */
-# define INSTALL_NEW_DTV(DTV) \
- (((tcbhead_t *) __thread_self)->dtv = (DTV))
-
-/* Return dtv of given thread descriptor. */
-# define GET_DTV(descr) \
- (((tcbhead_t *) (descr))->dtv)
-
-/* Code to initially initialize the thread pointer. */
-# define TLS_INIT_TP(descr, secondcall) \
- (__thread_self = (__typeof (__thread_self)) (descr), NULL)
-
-/* Return the address of the dtv for the current thread. */
-# define THREAD_DTV() \
- (((tcbhead_t *) __thread_self)->dtv)
-
-# endif
-
-#else
-
-# define NONTLS_INIT_TP \
- do { \
- static const tcbhead_t nontls_init_tp \
- = { .multiple_threads = 0 }; \
- __thread_self = (__typeof (__thread_self)) &nontls_init_tp; \
- } while (0)
-
-#endif /* USE_TLS */
-
-#endif /* tls.h */
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/Implies b/linuxthreads/sysdeps/unix/sysv/linux/Implies
deleted file mode 100644
index f1b3e8939c..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/Implies
+++ /dev/null
@@ -1 +0,0 @@
-pthread
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/Makefile b/linuxthreads/sysdeps/unix/sysv/linux/Makefile
deleted file mode 100644
index 38c6cbc1af..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-ifeq ($(subdir),linuxthreads)
-sysdep_routines += register-atfork unregister-atfork
-endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/Versions b/linuxthreads/sysdeps/unix/sysv/linux/Versions
deleted file mode 100644
index 6cd3dbe372..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/Versions
+++ /dev/null
@@ -1,5 +0,0 @@
-libc {
- GLIBC_2.3.2 {
- __register_atfork;
- }
-}
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/allocalim.h b/linuxthreads/sysdeps/unix/sysv/linux/allocalim.h
deleted file mode 100644
index f62f7d6e9f..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/allocalim.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Determine whether block of given size can be allocated on the stack or not.
- Copyright (C) 2002 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <limits.h>
-
-extern inline int __libc_use_alloca (size_t size)
-{
- return (__builtin_expect (size <= PTHREAD_STACK_MIN / 4, 1)
- || __libc_alloca_cutoff (size));
-}
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/allocrtsig.c b/linuxthreads/sysdeps/unix/sysv/linux/allocrtsig.c
deleted file mode 100644
index af1581a4c3..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/allocrtsig.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/* Handle real-time signal allocation.
- Copyright (C) 1997,98,99,2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <signal.h>
-
-/* Sanity check. */
-#if !defined __SIGRTMIN || (__SIGRTMAX - __SIGRTMIN) < 3
-# error "This must not happen"
-#endif
-
-static int current_rtmin;
-static int current_rtmax;
-
-static int initialized;
-
-#include <testrtsig.h>
-
-static void
-init (void)
-{
- if (!kernel_has_rtsig ())
- {
- current_rtmin = -1;
- current_rtmax = -1;
- }
- else
- {
- current_rtmin = __SIGRTMIN + 3;
- current_rtmax = __SIGRTMAX;
- }
- initialized = 1;
-}
-
-/* Return number of available real-time signal with highest priority. */
-int
-__libc_current_sigrtmin (void)
-{
- if (!initialized)
- init ();
- return current_rtmin;
-}
-strong_alias (__libc_current_sigrtmin, __libc_current_sigrtmin_private);
-libc_hidden_def (__libc_current_sigrtmin)
-
-/* Return number of available real-time signal with lowest priority. */
-int
-__libc_current_sigrtmax (void)
-{
- if (!initialized)
- init ();
- return current_rtmax;
-}
-strong_alias (__libc_current_sigrtmax, __libc_current_sigrtmax_private);
-libc_hidden_def (__libc_current_sigrtmax)
-
-/* Allocate real-time signal with highest/lowest available
- priority. Please note that we don't use a lock since we assume
- this function to be called at program start. */
-int
-__libc_allocate_rtsig (int high)
-{
- if (!initialized)
- init ();
- if (current_rtmin == -1 || current_rtmin > current_rtmax)
- /* We don't have anymore signal available. */
- return -1;
-
- return high ? current_rtmin++ : current_rtmax--;
-}
-strong_alias (__libc_allocate_rtsig, __libc_allocate_rtsig_private);
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/alpha/Makefile b/linuxthreads/sysdeps/unix/sysv/linux/alpha/Makefile
deleted file mode 100644
index e03aee99fc..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/alpha/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-ifeq ($(subdir),linuxthreads)
-libpthread-routines += ptw-sysdep ptw-sigblock ptw-sigprocmask
-endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/alpha/Versions b/linuxthreads/sysdeps/unix/sysv/linux/alpha/Versions
deleted file mode 100644
index d102772482..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/alpha/Versions
+++ /dev/null
@@ -1,6 +0,0 @@
-libpthread {
- GLIBC_2.3.3 {
- # Changed PTHREAD_STACK_MIN.
- pthread_attr_setstack; pthread_attr_setstacksize;
- }
-}
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/alpha/aio_cancel.c b/linuxthreads/sysdeps/unix/sysv/linux/alpha/aio_cancel.c
deleted file mode 100644
index 0d6da82919..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/alpha/aio_cancel.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <shlib-compat.h>
-
-#define aio_cancel64 XXX
-#include <aio.h>
-#undef aio_cancel64
-#include <errno.h>
-
-extern __typeof (aio_cancel) __new_aio_cancel;
-extern __typeof (aio_cancel) __old_aio_cancel;
-
-#define aio_cancel __new_aio_cancel
-
-#include <sysdeps/pthread/aio_cancel.c>
-
-#undef aio_cancel
-strong_alias (__new_aio_cancel, __new_aio_cancel64);
-versioned_symbol (librt, __new_aio_cancel, aio_cancel, GLIBC_2_3);
-versioned_symbol (librt, __new_aio_cancel64, aio_cancel64, GLIBC_2_3);
-
-#if SHLIB_COMPAT (librt, GLIBC_2_1, GLIBC_2_3)
-
-#undef ECANCELED
-#define aio_cancel __old_aio_cancel
-#define ECANCELED 125
-
-#include <sysdeps/pthread/aio_cancel.c>
-
-#undef aio_cancel
-strong_alias (__old_aio_cancel, __old_aio_cancel64);
-compat_symbol (librt, __old_aio_cancel, aio_cancel, GLIBC_2_1);
-compat_symbol (librt, __old_aio_cancel64, aio_cancel64, GLIBC_2_1);
-
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h b/linuxthreads/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h
deleted file mode 100644
index 96893c59da..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Minimum guaranteed maximum values for system limits. Linux/Alpha version.
- Copyright (C) 1993-1998,2000,2002,2003,2004 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* The kernel header pollutes the namespace with the NR_OPEN symbol
- and defines LINK_MAX although filesystems have different maxima. A
- similar thing is true for OPEN_MAX: the limit can be changed at
- runtime and therefore the macro must not be defined. Remove this
- after including the header if necessary. */
-#ifndef NR_OPEN
-# define __undef_NR_OPEN
-#endif
-#ifndef LINK_MAX
-# define __undef_LINK_MAX
-#endif
-#ifndef OPEN_MAX
-# define __undef_OPEN_MAX
-#endif
-
-/* The kernel sources contain a file with all the needed information. */
-#include <linux/limits.h>
-
-/* Have to remove NR_OPEN? */
-#ifdef __undef_NR_OPEN
-# undef NR_OPEN
-# undef __undef_NR_OPEN
-#endif
-/* Have to remove LINK_MAX? */
-#ifdef __undef_LINK_MAX
-# undef LINK_MAX
-# undef __undef_LINK_MAX
-#endif
-/* Have to remove OPEN_MAX? */
-#ifdef __undef_OPEN_MAX
-# undef OPEN_MAX
-# undef __undef_OPEN_MAX
-#endif
-
-/* The number of data keys per process. */
-#define _POSIX_THREAD_KEYS_MAX 128
-/* This is the value this implementation supports. */
-#define PTHREAD_KEYS_MAX 1024
-
-/* Controlling the iterations of destructors for thread-specific data. */
-#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4
-/* Number of iterations this implementation does. */
-#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS
-
-/* The number of threads per process. */
-#define _POSIX_THREAD_THREADS_MAX 64
-/* This is the value this implementation supports. */
-#define PTHREAD_THREADS_MAX 16384
-
-/* Maximum amount by which a process can descrease its asynchronous I/O
- priority level. */
-#define AIO_PRIO_DELTA_MAX 20
-
-/* Minimum size for a thread. We are free to choose a reasonable value. */
-#define PTHREAD_STACK_MIN 24576
-
-/* Maximum number of POSIX timers available. */
-#define TIMER_MAX 256
-
-/* Maximum number of timer expiration overruns. */
-#define DELAYTIMER_MAX 2147483647
-
-/* Maximum tty name length. */
-#define TTY_NAME_MAX 32
-
-/* Maximum login name length. This is arbitrary. */
-#define LOGIN_NAME_MAX 256
-
-/* Maximum host name length. */
-#define HOST_NAME_MAX 64
-
-/* Maximum message queue priority level. */
-#define MQ_PRIO_MAX 32768
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h b/linuxthreads/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h
deleted file mode 100644
index a2724885e2..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* bits/typesizes.h -- underlying types for *_t. Linux/Alpha version.
- Copyright (C) 2002, 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _BITS_TYPES_H
-# error "Never include <bits/typesizes.h> directly; use <sys/types.h> instead."
-#endif
-
-#ifndef _BITS_TYPESIZES_H
-#define _BITS_TYPESIZES_H 1
-
-/* See <bits/types.h> for the meaning of these macros. This file exists so
- that <bits/types.h> need not vary across different GNU platforms. */
-
-#define __DEV_T_TYPE __U64_TYPE
-#define __UID_T_TYPE __U32_TYPE
-#define __GID_T_TYPE __U32_TYPE
-#define __INO_T_TYPE __U32_TYPE
-#define __INO64_T_TYPE __U64_TYPE
-#define __MODE_T_TYPE __U32_TYPE
-#define __NLINK_T_TYPE __U32_TYPE
-#define __OFF_T_TYPE __SLONGWORD_TYPE
-#define __OFF64_T_TYPE __S64_TYPE
-#define __PID_T_TYPE __S32_TYPE
-#define __RLIM_T_TYPE __ULONGWORD_TYPE
-#define __RLIM64_T_TYPE __U64_TYPE
-#define __BLKCNT_T_TYPE __U32_TYPE
-#define __BLKCNT64_T_TYPE __U64_TYPE
-#define __FSBLKCNT_T_TYPE __S32_TYPE
-#define __FSBLKCNT64_T_TYPE __S64_TYPE
-#define __FSFILCNT_T_TYPE __U32_TYPE
-#define __FSFILCNT64_T_TYPE __U64_TYPE
-#define __ID_T_TYPE __U32_TYPE
-#define __CLOCK_T_TYPE __SLONGWORD_TYPE
-#define __TIME_T_TYPE __SLONGWORD_TYPE
-#define __USECONDS_T_TYPE __U32_TYPE
-#define __SUSECONDS_T_TYPE __S64_TYPE
-#define __DADDR_T_TYPE __S32_TYPE
-#define __SWBLK_T_TYPE __SLONGWORD_TYPE
-#define __KEY_T_TYPE __S32_TYPE
-#define __CLOCKID_T_TYPE __S32_TYPE
-#define __TIMER_T_TYPE __S32_TYPE
-#define __BLKSIZE_T_TYPE __U32_TYPE
-#define __FSID_T_TYPE struct { int __val[2]; }
-#define __SSIZE_T_TYPE __SWORD_TYPE
-
-/* Number of descriptors that can fit in an `fd_set'. */
-#define __FD_SETSIZE 1024
-
-
-#endif /* bits/typesizes.h */
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/alpha/pt-sigsuspend.S b/linuxthreads/sysdeps/unix/sysv/linux/alpha/pt-sigsuspend.S
deleted file mode 100644
index 91e5c86782..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/alpha/pt-sigsuspend.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Internal sigsuspend system call for LinuxThreads. Alpha version.
- Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-
-#undef PSEUDO_PREPARE_ARGS
-#define PSEUDO_PREPARE_ARGS ldq a0, 0(a0);
-
- .hidden __pthread_sigsuspend
-PSEUDO_NOERRNO(__pthread_sigsuspend, sigsuspend, 1)
- ret
-PSEUDO_END_NOERRNO(__pthread_sigsuspend)
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h
deleted file mode 100644
index 9ea779e0d5..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h
+++ /dev/null
@@ -1,146 +0,0 @@
-/* Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-#ifndef __ASSEMBLER__
-# include <linuxthreads/internals.h>
-#endif
-
-#if !defined NOT_IN_libc || defined IS_IN_libpthread
-
-# ifdef PROF
-# define PSEUDO_PROF \
- .set noat; \
- lda AT, _mcount; \
- jsr AT, (AT), _mcount; \
- .set at
-# else
-# define PSEUDO_PROF
-# endif
-
-/* ??? Assumes that nothing comes between PSEUDO and PSEUDO_END
- besides "ret". */
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .globl name; \
- .align 4; \
- .type name, @function; \
- .usepv name, std; \
- cfi_startproc; \
-__LABEL(name) \
- ldgp gp, 0(pv); \
- PSEUDO_PROF; \
- PSEUDO_PREPARE_ARGS \
- SINGLE_THREAD_P(t0); \
- bne t0, $pseudo_cancel; \
- lda v0, SYS_ify(syscall_name); \
- call_pal PAL_callsys; \
- bne a3, SYSCALL_ERROR_LABEL; \
-__LABEL($pseudo_ret) \
- .subsection 2; \
-__LABEL($pseudo_cancel) \
- subq sp, 64, sp; \
- cfi_def_cfa_offset(64); \
- stq ra, 0(sp); \
- cfi_offset(ra, -64); \
- SAVE_ARGS_##args; \
- CENABLE; \
- LOAD_ARGS_##args; \
- lda v0, SYS_ify(syscall_name); \
- call_pal PAL_callsys; \
- stq v0, 8(sp); \
- bne a3, $multi_error; \
- CDISABLE; \
- ldq ra, 0(sp); \
- ldq v0, 8(sp); \
- addq sp, 64, sp; \
- cfi_remember_state; \
- cfi_restore(ra); \
- cfi_def_cfa_offset(0); \
- ret; \
- cfi_restore_state; \
-__LABEL($multi_error) \
- CDISABLE; \
- ldq ra, 0(sp); \
- ldq v0, 8(sp); \
- addq sp, 64, sp; \
- cfi_restore(ra); \
- cfi_def_cfa_offset(0); \
-__LABEL($syscall_error) \
- SYSCALL_ERROR_HANDLER; \
- .previous
-
-# undef PSEUDO_END
-# define PSEUDO_END(sym) \
- .subsection 2; \
- cfi_endproc; \
- .size sym, .-sym
-
-# define SAVE_ARGS_0 /* Nothing. */
-# define SAVE_ARGS_1 SAVE_ARGS_0; stq a0, 8(sp)
-# define SAVE_ARGS_2 SAVE_ARGS_1; stq a1, 16(sp)
-# define SAVE_ARGS_3 SAVE_ARGS_2; stq a2, 24(sp)
-# define SAVE_ARGS_4 SAVE_ARGS_3; stq a3, 32(sp)
-# define SAVE_ARGS_5 SAVE_ARGS_4; stq a4, 40(sp)
-# define SAVE_ARGS_6 SAVE_ARGS_5; stq a5, 48(sp)
-
-# define LOAD_ARGS_0 /* Nothing. */
-# define LOAD_ARGS_1 LOAD_ARGS_0; ldq a0, 8(sp)
-# define LOAD_ARGS_2 LOAD_ARGS_1; ldq a1, 16(sp)
-# define LOAD_ARGS_3 LOAD_ARGS_2; ldq a2, 24(sp)
-# define LOAD_ARGS_4 LOAD_ARGS_3; ldq a3, 32(sp)
-# define LOAD_ARGS_5 LOAD_ARGS_4; ldq a4, 40(sp)
-# define LOAD_ARGS_6 LOAD_ARGS_5; ldq a5, 48(sp)
-
-# ifdef IS_IN_libpthread
-# define __local_enable_asynccancel __pthread_enable_asynccancel
-# define __local_disable_asynccancel __pthread_disable_asynccancel
-# define __local_multiple_threads __pthread_multiple_threads
-# else
-# define __local_enable_asynccancel __libc_enable_asynccancel
-# define __local_disable_asynccancel __libc_disable_asynccancel
-# define __local_multiple_threads __libc_multiple_threads
-# endif
-
-# ifdef PIC
-# define CENABLE bsr ra, __local_enable_asynccancel !samegp
-# define CDISABLE bsr ra, __local_disable_asynccancel !samegp
-# else
-# define CENABLE jsr ra, __local_enable_asynccancel; ldgp ra, 0(gp)
-# define CDISABLE jsr ra, __local_disable_asynccancel; ldgp ra, 0(gp)
-# endif
-
-# ifndef __ASSEMBLER__
-extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P \
- __builtin_expect (__local_multiple_threads == 0, 1)
-# elif defined(PIC)
-# define SINGLE_THREAD_P(reg) ldl reg, __local_multiple_threads(gp) !gprel
-# else
-# define SINGLE_THREAD_P(reg) \
- ldah reg, __local_multiple_threads(gp) !gprelhigh; \
- ldl reg, __local_multiple_threads(reg) !gprellow
-# endif
-
-#elif !defined __ASSEMBLER__
-
-/* This code should never be used but we define it anyhow. */
-# define SINGLE_THREAD_P (1)
-
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S
deleted file mode 100644
index cfaae10606..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-
-#include <sysdep-cancel.h>
-
- .align 4
- .globl __vfork
- .type __vfork, @function
- .usepv __vfork, std
- cfi_startproc
-__vfork:
- ldgp gp, 0(pv)
- PSEUDO_PROF
-
-#ifdef SHARED
- ldq t0, __libc_pthread_functions(gp) !gprel
- bne t0, HIDDEN_JUMPTARGET (__fork) !samegp
-#else
- .weak pthread_create
- ldq t0, pthread_create(gp) !literal
- bne t0, $do_fork
-#endif
-
- lda v0, SYS_ify(vfork)
- call_pal PAL_callsys
- bne a3, SYSCALL_ERROR_LABEL
- ret
-
-#ifndef SHARED
- /* Can't tail-call due to possible mismatch between GP in
- fork and vfork object files. */
-$do_fork:
- subq sp, 16, sp
- cfi_adjust_cfa_offset(16)
- stq ra, 0(sp)
- cfi_offset(ra, -16)
- jsr ra, HIDDEN_JUMPTARGET (__fork)
- ldgp gp, 0(ra)
- ldq ra, 0(sp)
- addq sp, 16, sp
- cfi_restore(ra)
- cfi_adjust_cfa_offset(-16)
- ret
-
-$syscall_error:
- SYSCALL_ERROR_HANDLER
-#endif
-
- cfi_endproc
- .size __vfork, .-__vfork
-
-libc_hidden_def (__vfork)
-
-weak_alias (__vfork, vfork)
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h b/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h
deleted file mode 100644
index ed6c3c589b..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Minimum guaranteed maximum values for system limits. Linux version.
- Copyright (C) 1993-1998,2000,2002,2003,2004 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* The kernel header pollutes the namespace with the NR_OPEN symbol
- and defines LINK_MAX although filesystems have different maxima. A
- similar thing is true for OPEN_MAX: the limit can be changed at
- runtime and therefore the macro must not be defined. Remove this
- after including the header if necessary. */
-#ifndef NR_OPEN
-# define __undef_NR_OPEN
-#endif
-#ifndef LINK_MAX
-# define __undef_LINK_MAX
-#endif
-#ifndef OPEN_MAX
-# define __undef_OPEN_MAX
-#endif
-
-/* The kernel sources contain a file with all the needed information. */
-#include <linux/limits.h>
-
-/* Have to remove NR_OPEN? */
-#ifdef __undef_NR_OPEN
-# undef NR_OPEN
-# undef __undef_NR_OPEN
-#endif
-/* Have to remove LINK_MAX? */
-#ifdef __undef_LINK_MAX
-# undef LINK_MAX
-# undef __undef_LINK_MAX
-#endif
-/* Have to remove OPEN_MAX? */
-#ifdef __undef_OPEN_MAX
-# undef OPEN_MAX
-# undef __undef_OPEN_MAX
-#endif
-
-/* The number of data keys per process. */
-#define _POSIX_THREAD_KEYS_MAX 128
-/* This is the value this implementation supports. */
-#define PTHREAD_KEYS_MAX 1024
-
-/* Controlling the iterations of destructors for thread-specific data. */
-#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4
-/* Number of iterations this implementation does. */
-#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS
-
-/* The number of threads per process. */
-#define _POSIX_THREAD_THREADS_MAX 64
-/* This is the value this implementation supports. */
-#define PTHREAD_THREADS_MAX 16384
-
-/* Maximum amount by which a process can descrease its asynchronous I/O
- priority level. */
-#define AIO_PRIO_DELTA_MAX 20
-
-/* Minimum size for a thread. We are free to choose a reasonable value. */
-#define PTHREAD_STACK_MIN 16384
-
-/* Maximum number of POSIX timers available. */
-#define TIMER_MAX 256
-
-/* Maximum number of timer expiration overruns. */
-#define DELAYTIMER_MAX 2147483647
-
-/* Maximum tty name length. */
-#define TTY_NAME_MAX 32
-
-/* Maximum login name length. This is arbitrary. */
-#define LOGIN_NAME_MAX 256
-
-/* Maximum host name length. */
-#define HOST_NAME_MAX 64
-
-/* Maximum message queue priority level. */
-#define MQ_PRIO_MAX 32768
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/bits/posix_opt.h b/linuxthreads/sysdeps/unix/sysv/linux/bits/posix_opt.h
deleted file mode 100644
index 71b7e74649..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/bits/posix_opt.h
+++ /dev/null
@@ -1,181 +0,0 @@
-/* Define POSIX options for Linux.
- Copyright (C) 1996-2001, 2002, 2003, 2004 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _POSIX_OPT_H
-#define _POSIX_OPT_H 1
-
-/* Job control is supported. */
-#define _POSIX_JOB_CONTROL 1
-
-/* Processes have a saved set-user-ID and a saved set-group-ID. */
-#define _POSIX_SAVED_IDS 1
-
-/* Priority scheduling is supported. */
-#define _POSIX_PRIORITY_SCHEDULING 200112L
-
-/* Synchronizing file data is supported. */
-#define _POSIX_SYNCHRONIZED_IO 200112L
-
-/* The fsync function is present. */
-#define _POSIX_FSYNC 200112L
-
-/* Mapping of files to memory is supported. */
-#define _POSIX_MAPPED_FILES 200112L
-
-/* Locking of all memory is supported. */
-#define _POSIX_MEMLOCK 200112L
-
-/* Locking of ranges of memory is supported. */
-#define _POSIX_MEMLOCK_RANGE 200112L
-
-/* Setting of memory protections is supported. */
-#define _POSIX_MEMORY_PROTECTION 200112L
-
-/* Only root can change owner of file. */
-#define _POSIX_CHOWN_RESTRICTED 1
-
-/* `c_cc' member of 'struct termios' structure can be disabled by
- using the value _POSIX_VDISABLE. */
-#define _POSIX_VDISABLE '\0'
-
-/* Filenames are not silently truncated. */
-#define _POSIX_NO_TRUNC 1
-
-/* X/Open realtime support is available. */
-#define _XOPEN_REALTIME 1
-
-/* X/Open realtime thread support is available. */
-#define _XOPEN_REALTIME_THREADS 1
-
-/* XPG4.2 shared memory is supported. */
-#define _XOPEN_SHM 1
-
-/* Tell we have POSIX threads. */
-#define _POSIX_THREADS 200112L
-
-/* We have the reentrant functions described in POSIX. */
-#define _POSIX_REENTRANT_FUNCTIONS 1
-#define _POSIX_THREAD_SAFE_FUNCTIONS 200112L
-
-/* We provide priority scheduling for threads. */
-#define _POSIX_THREAD_PRIORITY_SCHEDULING 200112L
-
-/* We support user-defined stack sizes. */
-#define _POSIX_THREAD_ATTR_STACKSIZE 200112L
-
-/* We support user-defined stacks. */
-#define _POSIX_THREAD_ATTR_STACKADDR 200112L
-
-/* We support POSIX.1b semaphores, but only the non-shared form for now. */
-#define _POSIX_SEMAPHORES 200112L
-
-/* Real-time signals are supported. */
-#define _POSIX_REALTIME_SIGNALS 200112L
-
-/* We support asynchronous I/O. */
-#define _POSIX_ASYNCHRONOUS_IO 200112L
-#define _POSIX_ASYNC_IO 1
-/* Alternative name for Unix98. */
-#define _LFS_ASYNCHRONOUS_IO 1
-/* Support for prioritization is also available. */
-#define _POSIX_PRIORITIZED_IO 200112L
-
-/* The LFS support in asynchronous I/O is also available. */
-#define _LFS64_ASYNCHRONOUS_IO 1
-
-/* The rest of the LFS is also available. */
-#define _LFS_LARGEFILE 1
-#define _LFS64_LARGEFILE 1
-#define _LFS64_STDIO 1
-
-/* POSIX shared memory objects are implemented. */
-#define _POSIX_SHARED_MEMORY_OBJECTS 200112L
-
-/* CPU-time clocks support needs to be checked at runtime. */
-#define _POSIX_CPUTIME 0
-
-/* Clock support in threads must be also checked at runtime. */
-#define _POSIX_THREAD_CPUTIME 0
-
-/* GNU libc provides regular expression handling. */
-#define _POSIX_REGEXP 1
-
-/* Reader/Writer locks are available. */
-#define _POSIX_READER_WRITER_LOCKS 200112L
-
-/* We have a POSIX shell. */
-#define _POSIX_SHELL 1
-
-/* We support the Timeouts option. */
-#define _POSIX_TIMEOUTS 200112L
-
-/* We support spinlocks. */
-#define _POSIX_SPIN_LOCKS 200112L
-
-/* The `spawn' function family is supported. */
-#define _POSIX_SPAWN 200112L
-
-/* We have POSIX timers. */
-#define _POSIX_TIMERS 200112L
-
-/* The barrier functions are available. */
-#define _POSIX_BARRIERS 200112L
-
-/* POSIX message queues are available. */
-#define _POSIX_MESSAGE_PASSING 200112L
-
-/* Thread process-shared synchronization is not supported. */
-#define _POSIX_THREAD_PROCESS_SHARED -1
-
-/* The monotonic clock might be available. */
-#define _POSIX_MONOTONIC_CLOCK 0
-
-/* The clock selection interfaces are not available. */
-#define _POSIX_CLOCK_SELECTION -1
-
-/* Advisory information interfaces are available. */
-#define _POSIX_ADVISORY_INFO 200112L
-
-/* IPv6 support is available. */
-#define _POSIX_IPV6 200112L
-
-/* Raw socket support is available. */
-#define _POSIX_RAW_SOCKETS 200112L
-
-/* We have at least one terminal. */
-#define _POSIX2_CHAR_TERM 200112L
-
-/* Neither process nor thread sporadic server interfaces is available. */
-#define _POSIX_SPORADIC_SERVER -1
-#define _POSIX_THREAD_SPORADIC_SERVER -1
-
-/* trace.h is not available. */
-#define _POSIX_TRACE -1
-#define _POSIX_TRACE_EVENT_FILTER -1
-#define _POSIX_TRACE_INHERIT -1
-#define _POSIX_TRACE_LOG -1
-
-/* Typed memory objects are not available. */
-#define _POSIX_TYPED_MEMORY_OBJECTS -1
-
-/* No support for priority inheritance or protection. */
-#define _POSIX_THREAD_PRIO_INHERIT -1
-#define _POSIX_THREAD_PRIO_PROTECT -1
-
-#endif /* posix_opt.h */
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h b/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h
deleted file mode 100644
index 960bde18a9..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Signal handling function for threaded programs.
- Copyright (C) 1998, 1999, 2000, 2002 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _BITS_SIGTHREAD_H
-#define _BITS_SIGTHREAD_H 1
-
-#if !defined _SIGNAL_H && !defined _PTHREAD_H
-# error "Never include this file directly. Use <pthread.h> instead"
-#endif
-
-/* Functions for handling signals. */
-
-/* Modify the signal mask for the calling thread. The arguments have
- the same meaning as for sigprocmask(2). */
-extern int pthread_sigmask (int __how,
- __const __sigset_t *__restrict __newmask,
- __sigset_t *__restrict __oldmask)__THROW;
-
-/* Send signal SIGNO to the given thread. */
-extern int pthread_kill (pthread_t __threadid, int __signo) __THROW;
-
-#endif /* bits/sigthread.h */
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/execve.c b/linuxthreads/sysdeps/unix/sysv/linux/execve.c
deleted file mode 100644
index 9fa912b90d..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/execve.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/* Copyright (C) 1999, 2000, 2002 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <errno.h>
-#include <unistd.h>
-
-#include <sysdep.h>
-#include <alloca.h>
-#include <sys/syscall.h>
-#include <bp-checks.h>
-
-extern int __syscall_execve (const char *__unbounded file,
- char *__unbounded const *__unbounded argv,
- char *__unbounded const *__unbounded envp);
-extern void __pthread_kill_other_threads_np (void);
-weak_extern (__pthread_kill_other_threads_np)
-
-
-int
-__execve (file, argv, envp)
- const char *file;
- char *const argv[];
- char *const envp[];
-{
- /* If this is a threaded application kill all other threads. */
- if (__pthread_kill_other_threads_np)
- __pthread_kill_other_threads_np ();
-#if __BOUNDED_POINTERS__
- {
- char *const *v;
- int i;
- char *__unbounded *__unbounded ubp_argv;
- char *__unbounded *__unbounded ubp_envp;
- char *__unbounded *__unbounded ubp_v;
-
- for (v = argv; *v; v++)
- ;
- i = v - argv + 1;
- ubp_argv = (char *__unbounded *__unbounded) alloca (sizeof (*ubp_argv) * i);
- for (v = argv, ubp_v = ubp_argv; --i; v++, ubp_v++)
- *ubp_v = CHECK_STRING (*v);
- *ubp_v = 0;
-
- for (v = envp; *v; v++)
- ;
- i = v - envp + 1;
- ubp_envp = (char *__unbounded *__unbounded) alloca (sizeof (*ubp_envp) * i);
- for (v = envp, ubp_v = ubp_envp; --i; v++, ubp_v++)
- *ubp_v = CHECK_STRING (*v);
- *ubp_v = 0;
-
- return INLINE_SYSCALL (execve, 3, CHECK_STRING (file), ubp_argv, ubp_envp);
- }
-#else
- return INLINE_SYSCALL (execve, 3, file, argv, envp);
-#endif
-}
-weak_alias (__execve, execve)
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/fork.c b/linuxthreads/sysdeps/unix/sysv/linux/fork.c
deleted file mode 100644
index 00eb787093..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/fork.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Copyright (C) 2002, 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <errno.h>
-#include <fork.h>
-#include <bits/libc-lock.h>
-
-#ifndef SHARED
-weak_extern (__pthread_fork);
-#endif
-
-struct fork_block __fork_block =
-{
- .lock = PTHREAD_MUTEX_INITIALIZER,
- .prepare_list = { &__fork_block.prepare_list, &__fork_block.prepare_list },
- .parent_list = { &__fork_block.parent_list, &__fork_block.parent_list },
- .child_list = { &__fork_block.child_list, &__fork_block.child_list }
-};
-
-pid_t
-__libc_fork (void)
-{
- return __libc_maybe_call2 (pthread_fork, (&__fork_block), ARCH_FORK ());
-}
-weak_alias (__libc_fork, __fork)
-libc_hidden_def (__fork)
-weak_alias (__libc_fork, fork)
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/fork.h b/linuxthreads/sysdeps/unix/sysv/linux/fork.h
deleted file mode 100644
index 76708e3e39..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/fork.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <list.h>
-#include <bits/libc-lock.h>
-#include <sysdep.h>
-
-struct fork_block
-{
- /* Lock to protect handling of fork handlers. */
- __libc_lock_define (, lock);
-
- /* Lists of registered fork handlers. */
- list_t prepare_list;
- list_t parent_list;
- list_t child_list;
-};
-
-extern struct fork_block __fork_block attribute_hidden;
-
-/* Elements of the fork handler lists. */
-struct fork_handler
-{
- list_t list;
- void (*handler) (void);
- void *dso_handle;
-};
-
-
-/* Function to call to unregister fork handlers. */
-extern void __unregister_atfork (void *dso_handle) attribute_hidden;
-#define UNREGISTER_ATFORK(dso_handle) __unregister_atfork (dso_handle)
-
-
-/* C library side function to register new fork handlers. */
-extern int __register_atfork (void (*__prepare) (void),
- void (*__parent) (void),
- void (*__child) (void),
- void *dso_handle);
-libc_hidden_proto (__register_atfork)
-
-#ifndef ARCH_FORK
-# define ARCH_FORK() INLINE_SYSCALL (fork, 0)
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/hppa/aio_cancel.c b/linuxthreads/sysdeps/unix/sysv/linux/hppa/aio_cancel.c
deleted file mode 100644
index 0d6da82919..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/hppa/aio_cancel.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <shlib-compat.h>
-
-#define aio_cancel64 XXX
-#include <aio.h>
-#undef aio_cancel64
-#include <errno.h>
-
-extern __typeof (aio_cancel) __new_aio_cancel;
-extern __typeof (aio_cancel) __old_aio_cancel;
-
-#define aio_cancel __new_aio_cancel
-
-#include <sysdeps/pthread/aio_cancel.c>
-
-#undef aio_cancel
-strong_alias (__new_aio_cancel, __new_aio_cancel64);
-versioned_symbol (librt, __new_aio_cancel, aio_cancel, GLIBC_2_3);
-versioned_symbol (librt, __new_aio_cancel64, aio_cancel64, GLIBC_2_3);
-
-#if SHLIB_COMPAT (librt, GLIBC_2_1, GLIBC_2_3)
-
-#undef ECANCELED
-#define aio_cancel __old_aio_cancel
-#define ECANCELED 125
-
-#include <sysdeps/pthread/aio_cancel.c>
-
-#undef aio_cancel
-strong_alias (__old_aio_cancel, __old_aio_cancel64);
-compat_symbol (librt, __old_aio_cancel, aio_cancel, GLIBC_2_1);
-compat_symbol (librt, __old_aio_cancel64, aio_cancel64, GLIBC_2_1);
-
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/hppa/bits/initspin.h b/linuxthreads/sysdeps/unix/sysv/linux/hppa/bits/initspin.h
deleted file mode 100644
index 9b13400286..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/hppa/bits/initspin.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* PA-RISC specific definitions for spinlock initializers.
- Copyright (C) 2000, 2001 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* Initial value of a spinlock. PA-RISC only implements atomic load
- and clear so this must be non-zero. */
-#define __LT_SPINLOCK_INIT 1
-
-/* Macros for lock initializers, using the above definition. */
-#define __LOCK_INITIALIZER { 0, __LT_SPINLOCK_INIT }
-#define __ALT_LOCK_INITIALIZER { 0, __LT_SPINLOCK_INIT }
-#define __ATOMIC_INITIALIZER { 0, __LT_SPINLOCK_INIT }
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/hppa/malloc-machine.h b/linuxthreads/sysdeps/unix/sysv/linux/hppa/malloc-machine.h
deleted file mode 100644
index 817cf59222..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/hppa/malloc-machine.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* HP-PARISC macro definitions for mutexes, thread-specific data
- and parameters for malloc.
- Copyright (C) 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Carlos O'Donell <carlos@baldric.uwo.ca>, 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _MALLOC_MACHINE_H
-#define _MALLOC_MACHINE_H
-
-#undef thread_atfork_static
-
-#include <atomic.h>
-#include <bits/libc-lock.h>
-
-__libc_lock_define (typedef, mutex_t)
-
-/* Since our lock structure does not tolerate being initialized to zero, we must
- modify the standard function calls made by malloc */
-# define mutex_init(m) \
- __libc_maybe_call (__pthread_mutex_init, (m, NULL), \
- (((m)->__m_lock.__spinlock = __LT_SPINLOCK_INIT),(*(int *)(m))) )
-# define mutex_lock(m) \
- __libc_maybe_call (__pthread_mutex_lock, (m), \
- (__load_and_clear(&((m)->__m_lock.__spinlock)), 0))
-# define mutex_trylock(m) \
- __libc_maybe_call (__pthread_mutex_trylock, (m), \
- (*(int *)(m) ? 1 : (__load_and_clear(&((m)->__m_lock.__spinlock)), 0)))
-# define mutex_unlock(m) \
- __libc_maybe_call (__pthread_mutex_unlock, (m), \
- (((m)->__m_lock.__spinlock = __LT_SPINLOCK_INIT), (*(int *)(m))) )
-
-/* This is defined by newer gcc version unique for each module. */
-extern void *__dso_handle __attribute__ ((__weak__));
-
-#include <fork.h>
-
-#ifdef SHARED
-# define thread_atfork(prepare, parent, child) \
- __register_atfork (prepare, parent, child, __dso_handle)
-#else
-# define thread_atfork(prepare, parent, child) \
- __register_atfork (prepare, parent, child, \
- &__dso_handle == NULL ? NULL : __dso_handle)
-#endif
-
-/* thread specific data for glibc */
-
-#include <bits/libc-tsd.h>
-
-typedef int tsd_key_t[1]; /* no key data structure, libc magic does it */
-__libc_tsd_define (static, MALLOC) /* declaration/common definition */
-#define tsd_key_create(key, destr) ((void) (key))
-#define tsd_setspecific(key, data) __libc_tsd_set (MALLOC, (data))
-#define tsd_getspecific(key, vptr) ((vptr) = __libc_tsd_get (MALLOC))
-
-#include <sysdeps/generic/malloc-machine.h>
-
-#endif /* !defined(_MALLOC_MACHINE_H) */
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/hppa/pt-initfini.c b/linuxthreads/sysdeps/unix/sysv/linux/hppa/pt-initfini.c
deleted file mode 100644
index 27f850cf8f..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/hppa/pt-initfini.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/* Special .init and .fini section support for HPPA. Linuxthreads version.
- Copyright (C) 2001, 2003 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 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.)
-
- The GNU C Library is distributed in the hope that it will be
- useful, but WITHOUT ANY WARRANTY; without even the implied warranty
- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General 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,
- write to the Free Software Foundation, 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* This file is compiled into assembly code which is then munged by a sed
- script into two files: crti.s and crtn.s.
-
- * crti.s puts a function prologue at the beginning of the
- .init and .fini sections and defines global symbols for
- those addresses, so they can be called as functions.
-
- * crtn.s puts the corresponding function epilogues
- in the .init and .fini sections. */
-
-/* If we use the standard C version, the linkage table pointer won't
- be properly preserved due to the splitting up of function prologues
- and epilogues. Therefore we write these in assembly to make sure
- they do the right thing. */
-
-__asm__ (
-"#include \"defs.h\"\n"
-"\n"
-"/*@HEADER_ENDS*/\n"
-"\n"
-"/*@_init_PROLOG_BEGINS*/\n"
-" .section .init\n"
-" .align 4\n"
-" .globl _init\n"
-" .type _init,@function\n"
-"_init:\n"
-" stw %rp,-20(%sp)\n"
-" stwm %r4,64(%sp)\n"
-" stw %r19,-32(%sp)\n"
-" bl __pthread_initialize_minimal,%rp\n"
-" copy %r19,%r4 /* delay slot */\n"
-" copy %r4,%r19\n"
-"/*@_init_PROLOG_ENDS*/\n"
-"\n"
-"/*@_init_EPILOG_BEGINS*/\n"
-"/* Here is the tail end of _init. */\n"
-" .section .init\n"
-" ldw -84(%sp),%rp\n"
-" copy %r4,%r19\n"
-" bv %r0(%rp)\n"
-"_end_init:\n"
-" ldwm -64(%sp),%r4\n"
-"\n"
-"/* Our very own unwind info, because the assembler can't handle\n"
-" functions split into two or more pieces. */\n"
-" .section .PARISC.unwind,\"a\",@progbits\n"
-" .extern _init\n"
-" .word _init, _end_init\n"
-" .byte 0x08, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08\n"
-"\n"
-"/*@_init_EPILOG_ENDS*/\n"
-"\n"
-"/*@_fini_PROLOG_BEGINS*/\n"
-" .section .fini\n"
-" .align 4\n"
-" .globl _fini\n"
-" .type _fini,@function\n"
-"_fini:\n"
-" stw %rp,-20(%sp)\n"
-" stwm %r4,64(%sp)\n"
-" stw %r19,-32(%sp)\n"
-" copy %r19,%r4\n"
-"/*@_fini_PROLOG_ENDS*/\n"
-"\n"
-"/*@_fini_EPILOG_BEGINS*/\n"
-" .section .fini\n"
-" ldw -84(%sp),%rp\n"
-" copy %r4,%r19\n"
-" bv %r0(%rp)\n"
-"_end_fini:\n"
-" ldwm -64(%sp),%r4\n"
-"\n"
-" .section .PARISC.unwind,\"a\",@progbits\n"
-" .extern _fini\n"
-" .word _fini, _end_fini\n"
-" .byte 0x08, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08\n"
-"\n"
-"/*@_fini_EPILOG_ENDS*/\n"
-"\n"
-"/*@TRAILER_BEGINS*/\n"
-);
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h
deleted file mode 100644
index 134977e074..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h
+++ /dev/null
@@ -1,189 +0,0 @@
-/* cancellable system calls for Linux/HPPA.
- Copyright (C) 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Carlos O'Donell <carlos@baldric.uwo.ca>, 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-#ifndef __ASSEMBLER__
-# include <linuxthreads/internals.h>
-#endif
-
-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-
-# ifndef NO_ERROR
-# define NO_ERROR -0x1000
-# endif
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- ENTRY (name) \
- SINGLE_THREAD_P ASM_LINE_SEP \
- cmpib,<> 0,%ret0,Lpseudo_cancel ASM_LINE_SEP \
- nop ASM_LINE_SEP \
- DO_CALL(syscall_name, args) ASM_LINE_SEP \
- /* DONE! */ ASM_LINE_SEP \
- bv 0(2) ASM_LINE_SEP \
- nop ASM_LINE_SEP \
- Lpseudo_cancel: ASM_LINE_SEP \
- /* store return ptr */ ASM_LINE_SEP \
- stw %rp, -20(%sr0,%sp) ASM_LINE_SEP \
- /* save syscall args */ ASM_LINE_SEP \
- PUSHARGS_##args /* MACRO */ ASM_LINE_SEP \
- STW_PIC ASM_LINE_SEP \
- CENABLE /* FUNC CALL */ ASM_LINE_SEP \
- ldo 64(%sp), %sp ASM_LINE_SEP \
- ldo -64(%sp), %sp ASM_LINE_SEP \
- LDW_PIC ASM_LINE_SEP \
- /* restore syscall args */ ASM_LINE_SEP \
- POPARGS_##args ASM_LINE_SEP \
- /* save r4 in arg0 stack slot */ ASM_LINE_SEP \
- stw %r4, -36(%sr0,%sp) ASM_LINE_SEP \
- /* save mask from cenable */ ASM_LINE_SEP \
- copy %ret0, %r4 ASM_LINE_SEP \
- ble 0x100(%sr2,%r0) ASM_LINE_SEP \
- ldi SYS_ify (syscall_name), %r20 ASM_LINE_SEP \
- LDW_PIC ASM_LINE_SEP \
- /* pass mask as arg0 to cdisable */ ASM_LINE_SEP \
- copy %r4, %r26 ASM_LINE_SEP \
- copy %ret0, %r4 ASM_LINE_SEP \
- CDISABLE ASM_LINE_SEP \
- ldo 64(%sp), %sp ASM_LINE_SEP \
- ldo -64(%sp), %sp ASM_LINE_SEP \
- LDW_PIC ASM_LINE_SEP \
- /* compare error */ ASM_LINE_SEP \
- ldi NO_ERROR,%r1 ASM_LINE_SEP \
- /* branch if no error */ ASM_LINE_SEP \
- cmpb,>>=,n %r1,%r4,Lpre_end ASM_LINE_SEP \
- nop ASM_LINE_SEP \
- SYSCALL_ERROR_HANDLER ASM_LINE_SEP \
- ldo 64(%sp), %sp ASM_LINE_SEP \
- ldo -64(%sp), %sp ASM_LINE_SEP \
- /* No need to LDW_PIC */ ASM_LINE_SEP \
- /* make syscall res value positive */ ASM_LINE_SEP \
- sub %r0, %r4, %r4 ASM_LINE_SEP \
- /* store into errno location */ ASM_LINE_SEP \
- stw %r4, 0(%sr0,%ret0) ASM_LINE_SEP \
- /* return -1 */ ASM_LINE_SEP \
- ldo -1(%r0), %ret0 ASM_LINE_SEP \
- Lpre_end: ASM_LINE_SEP \
- ldw -20(%sr0,%sp), %rp ASM_LINE_SEP \
- /* No need to LDW_PIC */ ASM_LINE_SEP \
- ldw -36(%sr0,%sp), %r4 ASM_LINE_SEP
-
-/* Save arguments into our frame */
-# define PUSHARGS_0 /* nothing to do */
-# define PUSHARGS_1 PUSHARGS_0 stw %r26, -36(%sr0,%sp) ASM_LINE_SEP
-# define PUSHARGS_2 PUSHARGS_1 stw %r25, -40(%sr0,%sp) ASM_LINE_SEP
-# define PUSHARGS_3 PUSHARGS_2 stw %r24, -44(%sr0,%sp) ASM_LINE_SEP
-# define PUSHARGS_4 PUSHARGS_3 stw %r23, -48(%sr0,%sp) ASM_LINE_SEP
-# define PUSHARGS_5 PUSHARGS_4 /* Args are on the stack... */
-# define PUSHARGS_6 PUSHARGS_5
-
-/* Bring them back from the stack */
-# define POPARGS_0 /* nothing to do */
-# define POPARGS_1 POPARGS_0 ldw -36(%sr0,%sp), %r26 ASM_LINE_SEP
-# define POPARGS_2 POPARGS_1 ldw -40(%sr0,%sp), %r25 ASM_LINE_SEP
-# define POPARGS_3 POPARGS_2 ldw -44(%sr0,%sp), %r24 ASM_LINE_SEP
-# define POPARGS_4 POPARGS_3 ldw -48(%sr0,%sp), %r23 ASM_LINE_SEP
-# define POPARGS_5 POPARGS_4 ldw -52(%sr0,%sp), %r22 ASM_LINE_SEP
-# define POPARGS_6 POPARGS_5 ldw -54(%sr0,%sp), %r21 ASM_LINE_SEP
-
-# ifdef IS_IN_libpthread
-# ifdef PIC
-# define CENABLE .import __pthread_enable_asynccancel,code ASM_LINE_SEP \
- bl __pthread_enable_asynccancel,%r2 ASM_LINE_SEP
-# define CDISABLE .import __pthread_disable_asynccancel,code ASM_LINE_SEP \
- bl __pthread_disable_asynccancel,%r2 ASM_LINE_SEP
-# else
-# define CENABLE .import __pthread_enable_asynccancel,code ASM_LINE_SEP \
- bl __pthread_enable_asynccancel,%r2 ASM_LINE_SEP
-# define CDISABLE .import __pthread_disable_asynccancel,code ASM_LINE_SEP \
- bl __pthread_disable_asynccancel,%r2 ASM_LINE_SEP
-# endif
-# elif !defined NOT_IN_libc
-# ifdef PIC
-# define CENABLE .import __libc_enable_asynccancel,code ASM_LINE_SEP \
- bl __libc_enable_asynccancel,%r2 ASM_LINE_SEP
-# define CDISABLE .import __libc_disable_asynccancel,code ASM_LINE_SEP \
- bl __libc_disable_asynccancel,%r2 ASM_LINE_SEP
-# else
-# define CENABLE .import __libc_enable_asynccancel,code ASM_LINE_SEP \
- bl __libc_enable_asynccancel,%r2 ASM_LINE_SEP
-# define CDISABLE .import __libc_disable_asynccancel,code ASM_LINE_SEP \
- bl __libc_disable_asynccancel,%r2 ASM_LINE_SEP
-# endif
-# else
-# ifdef PIC
-# define CENABLE .import __librt_enable_asynccancel,code ASM_LINE_SEP \
- bl __librt_enable_asynccancel,%r2 ASM_LINE_SEP
-# define CDISABLE .import __librt_disable_asynccancel,code ASM_LINE_SEP \
- bl __librt_disable_asynccancel,%r2 ASM_LINE_SEP
-# else
-# define CENABLE .import __librt_enable_asynccancel,code ASM_LINE_SEP \
- bl __librt_enable_asynccancel,%r2 ASM_LINE_SEP
-# define CDISABLE .import __librt_disable_asynccancel,code ASM_LINE_SEP \
- bl __librt_disable_asynccancel,%r2 ASM_LINE_SEP
-# endif
-# endif
-
-/* p_header.multiple_threads is +12 from the pthread_descr struct start,
- We could have called __get_cr27() but we really want less overhead */
-# define MULTIPLE_THREADS_OFFSET 0xC
-
-/* cr27 has been initialized to 0x0 by kernel */
-# define NO_THREAD_CR27 0x0
-
-# ifdef IS_IN_libpthread
-# define __local_multiple_threads __pthread_multiple_threads
-# elif !defined NOT_IN_libc
-# define __local_multiple_threads __libc_multiple_threads
-# else
-# define __local_multiple_threads __librt_multiple_threads
-# endif
-
-# ifndef __ASSEMBLER__
- extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
-# else
-/* This ALT version requires newer kernel support */
-# define SINGLE_THREAD_P_MFCTL \
- mfctl %cr27, %ret0 ASM_LINE_SEP \
- cmpib,= NO_THREAD_CR27,%ret0,Lstp ASM_LINE_SEP \
- nop ASM_LINE_SEP \
- ldw MULTIPLE_THREADS_OFFSET(%sr0,%ret0),%ret0 ASM_LINE_SEP \
- Lstp: ASM_LINE_SEP
-# ifdef PIC
-/* Slower version uses GOT to get value of __local_multiple_threads */
-# define SINGLE_THREAD_P \
- addil LT%__local_multiple_threads, %r19 ASM_LINE_SEP \
- ldw RT%__local_multiple_threads(%sr0,%r1), %ret0 ASM_LINE_SEP \
- ldw 0(%sr0,%ret0), %ret0 ASM_LINE_SEP
-# else
- /* Slow non-pic version using DP */
-# define SINGLE_THREAD_P \
- addil LR%__local_multiple_threads-$global$,%r27 ASM_LINE_SEP \
- ldw RR%__local_multiple_threads-$global$(%sr0,%r1),%ret0 ASM_LINE_SEP
-# endif
-# endif
-#elif !defined __ASSEMBLER__
-
-/* This code should never be used but we define it anyhow. */
-# define SINGLE_THREAD_P (1)
-
-#endif
-/* !defined NOT_IN_libc || defined IS_IN_libpthread */
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/i386/dl-sysdep.h b/linuxthreads/sysdeps/unix/sysv/linux/i386/dl-sysdep.h
deleted file mode 100644
index 5355310ccd..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/i386/dl-sysdep.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* System-specific settings for dynamic linker code. IA-32 version.
- Copyright (C) 2002, 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _DL_SYSDEP_H
-#define _DL_SYSDEP_H 1
-
-/* This macro must be defined to either 0 or 1.
-
- If 1, then an errno global variable hidden in ld.so will work right with
- all the errno-using libc code compiled for ld.so, and there is never a
- need to share the errno location with libc. This is appropriate only if
- all the libc functions that ld.so uses are called without PLT and always
- get the versions linked into ld.so rather than the libc ones. */
-
-#ifdef IS_IN_rtld
-# define RTLD_PRIVATE_ERRNO 1
-#else
-# define RTLD_PRIVATE_ERRNO 0
-#endif
-
-/* Traditionally system calls have been made using int $0x80. A
- second method was introduced which, if possible, will use the
- sysenter/syscall instructions. To signal the presence and where to
- find the code the kernel passes an AT_SYSINFO value in the
- auxiliary vector to the application.
- sysenter/syscall is not useful on i386 through i586, but the dynamic
- linker and dl code in libc.a has to be able to load i686 compiled
- libraries. */
-#define NEED_DL_SYSINFO 1
-#undef USE_DL_SYSINFO
-
-#if defined NEED_DL_SYSINFO && !defined __ASSEMBLER__
-extern void _dl_sysinfo_int80 (void) attribute_hidden;
-# define DL_SYSINFO_DEFAULT (uintptr_t) _dl_sysinfo_int80
-# define DL_SYSINFO_IMPLEMENTATION \
- asm (".text\n\t" \
- ".type _dl_sysinfo_int80,@function\n\t" \
- ".hidden _dl_sysinfo_int80\n" \
- CFI_STARTPROC "\n" \
- "_dl_sysinfo_int80:\n\t" \
- "int $0x80;\n\t" \
- "ret;\n\t" \
- CFI_ENDPROC "\n" \
- ".size _dl_sysinfo_int80,.-_dl_sysinfo_int80\n\t" \
- ".previous");
-#endif
-
-#endif /* dl-sysdep.h */
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
deleted file mode 100644
index c8be0fdd39..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/* Copyright (C) 2002, 2003, 2004, 2005 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-#include <tls.h>
-#include <pt-machine.h>
-#ifndef __ASSEMBLER__
-# include <linuxthreads/internals.h>
-#endif
-
-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
- ENTRY (name) \
- SINGLE_THREAD_P; \
- jne L(pseudo_cancel); \
- DO_CALL (syscall_name, args); \
- cmpl $-4095, %eax; \
- jae SYSCALL_ERROR_LABEL; \
- ret; \
- L(pseudo_cancel): \
- CENABLE \
- SAVE_OLDTYPE_##args \
- PUSHCARGS_##args \
- DOCARGS_##args \
- movl $SYS_ify (syscall_name), %eax; \
- int $0x80 \
- POPCARGS_##args; \
- POPSTATE_##args \
- cmpl $-4095, %eax; \
- jae SYSCALL_ERROR_LABEL; \
- L(pseudo_end):
-
-# define SAVE_OLDTYPE_0 movl %eax, %ecx;
-# define SAVE_OLDTYPE_1 SAVE_OLDTYPE_0
-# define SAVE_OLDTYPE_2 pushl %eax; cfi_adjust_cfa_offset (4);
-# define SAVE_OLDTYPE_3 SAVE_OLDTYPE_2
-# define SAVE_OLDTYPE_4 SAVE_OLDTYPE_2
-# define SAVE_OLDTYPE_5 SAVE_OLDTYPE_2
-
-# define PUSHCARGS_0 /* No arguments to push. */
-# define DOCARGS_0 /* No arguments to frob. */
-# define POPCARGS_0 /* No arguments to pop. */
-# define _PUSHCARGS_0 /* No arguments to push. */
-# define _POPCARGS_0 /* No arguments to pop. */
-
-# define PUSHCARGS_1 movl %ebx, %edx; cfi_register (ebx, edx); PUSHCARGS_0
-# define DOCARGS_1 _DOARGS_1 (4)
-# define POPCARGS_1 POPCARGS_0; movl %edx, %ebx; cfi_restore (ebx);
-# define _PUSHCARGS_1 pushl %ebx; cfi_adjust_cfa_offset (4); \
- cfi_rel_offset (ebx, 0); _PUSHCARGS_0
-# define _POPCARGS_1 _POPCARGS_0; popl %ebx; \
- cfi_adjust_cfa_offset (-4); cfi_restore (ebx);
-
-# define PUSHCARGS_2 PUSHCARGS_1
-# define DOCARGS_2 _DOARGS_2 (12)
-# define POPCARGS_2 POPCARGS_1
-# define _PUSHCARGS_2 _PUSHCARGS_1
-# define _POPCARGS_2 _POPCARGS_1
-
-# define PUSHCARGS_3 _PUSHCARGS_2
-# define DOCARGS_3 _DOARGS_3 (20)
-# define POPCARGS_3 _POPCARGS_3
-# define _PUSHCARGS_3 _PUSHCARGS_2
-# define _POPCARGS_3 _POPCARGS_2
-
-# define PUSHCARGS_4 _PUSHCARGS_4
-# define DOCARGS_4 _DOARGS_4 (28)
-# define POPCARGS_4 _POPCARGS_4
-# define _PUSHCARGS_4 pushl %esi; cfi_adjust_cfa_offset (4); \
- cfi_rel_offset (esi, 0); _PUSHCARGS_3
-# define _POPCARGS_4 _POPCARGS_3; popl %esi; \
- cfi_adjust_cfa_offset (-4); cfi_restore (esi);
-
-# define PUSHCARGS_5 _PUSHCARGS_5
-# define DOCARGS_5 _DOARGS_5 (36)
-# define POPCARGS_5 _POPCARGS_5
-# define _PUSHCARGS_5 pushl %edi; cfi_adjust_cfa_offset (4); \
- cfi_rel_offset (edi, 0); _PUSHCARGS_4
-# define _POPCARGS_5 _POPCARGS_4; popl %edi; \
- cfi_adjust_cfa_offset (-4); cfi_restore (edi);
-
-# ifdef IS_IN_libpthread
-# define CENABLE call __pthread_enable_asynccancel;
-# define CDISABLE call __pthread_disable_asynccancel
-# elif defined IS_IN_librt
-# ifdef PIC
-# define CENABLE pushl %ebx; \
- call __i686.get_pc_thunk.bx; \
- addl $_GLOBAL_OFFSET_TABLE_, %ebx; \
- call __librt_enable_asynccancel@PLT; \
- popl %ebx;
-# define CDISABLE pushl %ebx; \
- call __i686.get_pc_thunk.bx; \
- addl $_GLOBAL_OFFSET_TABLE_, %ebx; \
- call __librt_disable_asynccancel@PLT; \
- popl %ebx;
-# else
-# define CENABLE call __librt_enable_asynccancel;
-# define CDISABLE call __librt_disable_asynccancel
-# endif
-# else
-# define CENABLE call __libc_enable_asynccancel;
-# define CDISABLE call __libc_disable_asynccancel
-# endif
-# define POPSTATE_0 \
- pushl %eax; cfi_adjust_cfa_offset (4); movl %ecx, %eax; \
- CDISABLE; popl %eax; cfi_adjust_cfa_offset (-4);
-# define POPSTATE_1 POPSTATE_0
-# define POPSTATE_2 xchgl (%esp), %eax; CDISABLE; popl %eax; \
- cfi_adjust_cfa_offset (-4);
-# define POPSTATE_3 POPSTATE_2
-# define POPSTATE_4 POPSTATE_3
-# define POPSTATE_5 POPSTATE_4
-
-#if !defined NOT_IN_libc
-# define __local_multiple_threads __libc_multiple_threads
-#elif defined IS_IN_libpthread
-# define __local_multiple_threads __pthread_multiple_threads
-#else
-# define __local_multiple_threads __librt_multiple_threads
-#endif
-
-# ifndef __ASSEMBLER__
-# if defined FLOATING_STACKS && USE___THREAD && defined PIC
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- p_header.data.multiple_threads) == 0, 1)
-# else
-extern int __local_multiple_threads
-# if !defined NOT_IN_libc || defined IS_IN_libpthread
- attribute_hidden;
-# else
- ;
-# endif
-# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
-# endif
-# else
-# if !defined PIC
-# define SINGLE_THREAD_P cmpl $0, __local_multiple_threads
-# elif defined FLOATING_STACKS && USE___THREAD
-# define SINGLE_THREAD_P cmpl $0, %gs:MULTIPLE_THREADS_OFFSET
-# else
-# if !defined NOT_IN_libc || defined IS_IN_libpthread
-# define __SINGLE_THREAD_CMP cmpl $0, __local_multiple_threads@GOTOFF(%ecx)
-# else
-# define __SINGLE_THREAD_CMP \
- movl __local_multiple_threads@GOT(%ecx), %ecx;\
- cmpl $0, (%ecx)
-# endif
-# if !defined HAVE_HIDDEN || !USE___THREAD
-# define SINGLE_THREAD_P \
- SETUP_PIC_REG (cx); \
- addl $_GLOBAL_OFFSET_TABLE_, %ecx; \
- __SINGLE_THREAD_CMP
-# else
-# define SINGLE_THREAD_P \
- call __i686.get_pc_thunk.cx; \
- addl $_GLOBAL_OFFSET_TABLE_, %ecx; \
- __SINGLE_THREAD_CMP
-# endif
-# endif
-# endif
-
-#elif !defined __ASSEMBLER__
-
-/* This code should never be used but we define it anyhow. */
-# define SINGLE_THREAD_P (1)
-
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/i386/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/i386/vfork.S
deleted file mode 100644
index c7a120d239..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/i386/vfork.S
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Andreas Schwab <schwab@gnu.org>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep-cancel.h>
-#define _ERRNO_H 1
-#include <bits/errno.h>
-#include <kernel-features.h>
-
-/* Clone the calling process, but without copying the whole address space.
- The calling process is suspended until the new process exits or is
- replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
- and the process ID of the new process to the old process. */
-
-ENTRY (__vfork)
-
-#ifdef __NR_vfork
-
-# ifdef SHARED
-# if !defined HAVE_HIDDEN || !USE___THREAD
- SETUP_PIC_REG (cx)
-# else
- call __i686.get_pc_thunk.cx
-# endif
- addl $_GLOBAL_OFFSET_TABLE_, %ecx
- cmpl $0, __libc_pthread_functions@GOTOFF(%ecx)
-# else
- .weak pthread_create
- movl $pthread_create, %eax
- testl %eax, %eax
-# endif
- jne HIDDEN_JUMPTARGET (__fork)
-
- /* Pop the return PC value into ECX. */
- popl %ecx
-
- /* Stuff the syscall number in EAX and enter into the kernel. */
- movl $SYS_ify (vfork), %eax
- int $0x80
-
- /* Jump to the return PC. Don't jump directly since this
- disturbs the branch target cache. Instead push the return
- address back on the stack. */
- pushl %ecx
-
- cmpl $-4095, %eax
- /* Branch forward if it failed. */
-# ifdef __ASSUME_VFORK_SYSCALL
- jae SYSCALL_ERROR_LABEL
-.Lpseudo_end:
-# else
- jae .Lerror
-# endif
-
- ret
-
-# ifndef __ASSUME_VFORK_SYSCALL
-.Lerror:
- /* Check if vfork syscall is known at all. */
- cmpl $-ENOSYS, %eax
- jne SYSCALL_ERROR_LABEL
-# endif
-#endif
-
-#ifndef __ASSUME_VFORK_SYSCALL
- /* If we don't have vfork, fork is close enough. */
-
- movl $SYS_ify (fork), %eax
- int $0x80
- cmpl $-4095, %eax
- jae SYSCALL_ERROR_LABEL
-.Lpseudo_end:
- ret
-#elif !defined __NR_vfork
-# error "__NR_vfork not available and __ASSUME_VFORK_SYSCALL defined"
-#endif
-PSEUDO_END (__vfork)
-libc_hidden_def (__vfork)
-
-weak_alias (__vfork, vfork)
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/ia64/Makefile b/linuxthreads/sysdeps/unix/sysv/linux/ia64/Makefile
deleted file mode 100644
index e03aee99fc..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/ia64/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-ifeq ($(subdir),linuxthreads)
-libpthread-routines += ptw-sysdep ptw-sigblock ptw-sigprocmask
-endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/ia64/Versions b/linuxthreads/sysdeps/unix/sysv/linux/ia64/Versions
deleted file mode 100644
index d102772482..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/ia64/Versions
+++ /dev/null
@@ -1,6 +0,0 @@
-libpthread {
- GLIBC_2.3.3 {
- # Changed PTHREAD_STACK_MIN.
- pthread_attr_setstack; pthread_attr_setstacksize;
- }
-}
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h b/linuxthreads/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h
deleted file mode 100644
index 629b1f89c1..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Minimum guaranteed maximum values for system limits. Linux/Alpha version.
- Copyright (C) 1993-1998,2000,2002,2003,2004 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* The kernel header pollutes the namespace with the NR_OPEN symbol
- and defines LINK_MAX although filesystems have different maxima. A
- similar thing is true for OPEN_MAX: the limit can be changed at
- runtime and therefore the macro must not be defined. Remove this
- after including the header if necessary. */
-#ifndef NR_OPEN
-# define __undef_NR_OPEN
-#endif
-#ifndef LINK_MAX
-# define __undef_LINK_MAX
-#endif
-#ifndef OPEN_MAX
-# define __undef_OPEN_MAX
-#endif
-
-/* The kernel sources contain a file with all the needed information. */
-#include <linux/limits.h>
-
-/* Have to remove NR_OPEN? */
-#ifdef __undef_NR_OPEN
-# undef NR_OPEN
-# undef __undef_NR_OPEN
-#endif
-/* Have to remove LINK_MAX? */
-#ifdef __undef_LINK_MAX
-# undef LINK_MAX
-# undef __undef_LINK_MAX
-#endif
-/* Have to remove OPEN_MAX? */
-#ifdef __undef_OPEN_MAX
-# undef OPEN_MAX
-# undef __undef_OPEN_MAX
-#endif
-
-/* The number of data keys per process. */
-#define _POSIX_THREAD_KEYS_MAX 128
-/* This is the value this implementation supports. */
-#define PTHREAD_KEYS_MAX 1024
-
-/* Controlling the iterations of destructors for thread-specific data. */
-#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4
-/* Number of iterations this implementation does. */
-#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS
-
-/* The number of threads per process. */
-#define _POSIX_THREAD_THREADS_MAX 64
-/* This is the value this implementation supports. */
-#define PTHREAD_THREADS_MAX 16384
-
-/* Maximum amount by which a process can descrease its asynchronous I/O
- priority level. */
-#define AIO_PRIO_DELTA_MAX 20
-
-/* Minimum size for a thread. We are free to choose a reasonable value. */
-#define PTHREAD_STACK_MIN 196608
-
-/* Maximum number of POSIX timers available. */
-#define TIMER_MAX 256
-
-/* Maximum number of timer expiration overruns. */
-#define DELAYTIMER_MAX 2147483647
-
-/* Maximum tty name length. */
-#define TTY_NAME_MAX 32
-
-/* Maximum login name length. This is arbitrary. */
-#define LOGIN_NAME_MAX 256
-
-/* Maximum host name length. */
-#define HOST_NAME_MAX 64
-
-/* Maximum message queue priority level. */
-#define MQ_PRIO_MAX 32768
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/ia64/dl-sysdep.h b/linuxthreads/sysdeps/unix/sysv/linux/ia64/dl-sysdep.h
deleted file mode 100644
index 27d5fdfbf5..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/ia64/dl-sysdep.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* System-specific settings for dynamic linker code. IA-64 version.
- Copyright (C) 2003, 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _DL_SYSDEP_H
-#define _DL_SYSDEP_H 1
-
-#define NEED_DL_SYSINFO 1
-#undef USE_DL_SYSINFO
-
-#if defined NEED_DL_SYSINFO && !defined __ASSEMBLER__
-/* Don't declare this as a function---we want it's entry-point, not
- it's function descriptor... */
-extern int _dl_sysinfo_break attribute_hidden;
-# define DL_SYSINFO_DEFAULT ((uintptr_t) &_dl_sysinfo_break)
-# define DL_SYSINFO_IMPLEMENTATION \
- asm (".text\n\t" \
- ".hidden _dl_sysinfo_break\n\t" \
- ".proc _dl_sysinfo_break\n\t" \
- "_dl_sysinfo_break:\n\t" \
- ".prologue\n\t" \
- ".altrp b6\n\t" \
- ".body\n\t" \
- "break 0x100000;\n\t" \
- "br.ret.sptk.many b6;\n\t" \
- ".endp _dl_sysinfo_break" \
- ".previous");
-#endif
-
-/* _dl_argv cannot be attribute_relro, because _dl_start_user
- might write into it after _dl_start returns. */
-#define DL_ARGV_NOT_RELRO 1
-
-#endif /* dl-sysdep.h */
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/ia64/fork.h b/linuxthreads/sysdeps/unix/sysv/linux/ia64/fork.h
deleted file mode 100644
index 30a0cc1918..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/ia64/fork.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Copyright (C) 2002 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <signal.h>
-#include <sysdep.h>
-
-#define ARCH_FORK() INLINE_SYSCALL (clone, 2, SIGCHLD, 0)
-
-#include_next <fork.h>
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-initfini.c b/linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-initfini.c
deleted file mode 100644
index af8a63c163..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-initfini.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/* Special .init and .fini section support for ia64. LinuxThreads version.
- Copyright (C) 2000, 2001, 2002, 2003 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 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.)
-
- The GNU C Library is distributed in the hope that it will be
- useful, but WITHOUT ANY WARRANTY; without even the implied warranty
- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General 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,
- write to the Free Software Foundation, 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* This file is compiled into assembly code which is then munged by a sed
- script into two files: crti.s and crtn.s.
-
- * crti.s puts a function prologue at the beginning of the
- .init and .fini sections and defines global symbols for
- those addresses, so they can be called as functions.
-
- * crtn.s puts the corresponding function epilogues
- in the .init and .fini sections. */
-
-#include <stddef.h>
-
-#ifdef HAVE_INITFINI_ARRAY
-
-# define INIT_NEW_WAY \
- ".xdata8 \".init_array\", @fptr(__pthread_initialize_minimal)\n"
-# define INIT_OLD_WAY ""
-#else
-# define INIT_NEW_WAY ""
-# define INIT_OLD_WAY \
- "\n\
- st8 [r12] = gp, -16\n\
- br.call.sptk.many b0 = __pthread_initialize_minimal# ;;\n\
- ;;\n\
- adds r12 = 16, r12\n\
- ;;\n\
- ld8 gp = [r12]\n\
- ;;\n"
-#endif
-
-__asm__ ("\n\
-\n\
-#include \"defs.h\"\n\
-\n\
-/*@HEADER_ENDS*/\n\
-\n\
-/*@_init_PROLOG_BEGINS*/\n"
- INIT_NEW_WAY
- ".section .init\n\
- .align 16\n\
- .global _init#\n\
- .proc _init#\n\
-_init:\n\
- .prologue\n\
- .save ar.pfs, r34\n\
- alloc r34 = ar.pfs, 0, 3, 0, 0\n\
- .vframe r32\n\
- mov r32 = r12\n\
- .save rp, r33\n\
- mov r33 = b0\n\
- .body\n\
- adds r12 = -16, r12\n\
- ;;\n"
- INIT_OLD_WAY
- ".endp _init#\n\
-\n\
-/*@_init_PROLOG_ENDS*/\n\
-\n\
-/*@_init_EPILOG_BEGINS*/\n\
- .section .init\n\
- .proc _init#\n\
-_init:\n\
- .prologue\n\
- .save ar.pfs, r34\n\
- .vframe r32\n\
- .save rp, r33\n\
- .body\n\
- mov r12 = r32\n\
- mov ar.pfs = r34\n\
- mov b0 = r33\n\
- br.ret.sptk.many b0\n\
- .endp _init#\n\
-/*@_init_EPILOG_ENDS*/\n\
-\n\
-/*@_fini_PROLOG_BEGINS*/\n\
- .section .fini\n\
- .align 16\n\
- .global _fini#\n\
- .proc _fini#\n\
-_fini:\n\
- .prologue\n\
- .save ar.pfs, r34\n\
- alloc r34 = ar.pfs, 0, 3, 0, 0\n\
- .vframe r32\n\
- mov r32 = r12\n\
- .save rp, r33\n\
- mov r33 = b0\n\
- .body\n\
- adds r12 = -16, r12\n\
- ;;\n\
- .endp _fini#\n\
-\n\
-/*@_fini_PROLOG_ENDS*/\n\
-\n\
-/*@_fini_EPILOG_BEGINS*/\n\
- .section .fini\n\
- .proc _fini#\n\
-_fini:\n\
- .prologue\n\
- .save ar.pfs, r34\n\
- .vframe r32\n\
- .save rp, r33\n\
- .body\n\
- mov r12 = r32\n\
- mov ar.pfs = r34\n\
- mov b0 = r33\n\
- br.ret.sptk.many b0\n\
- .endp _fini#\n\
-\n\
-/*@_fini_EPILOG_ENDS*/\n\
-\n\
-/*@TRAILER_BEGINS*/\n\
- .weak __gmon_start__#\n\
-");
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-sigsuspend.c b/linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-sigsuspend.c
deleted file mode 100644
index 0b96e3d5bd..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-sigsuspend.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Internal sigsuspend system call for LinuxThreads. IA64 version.
- Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <errno.h>
-#include <signal.h>
-#include <unistd.h>
-
-#include <sysdep.h>
-#include <sys/syscall.h>
-#include <linuxthreads/internals.h>
-
-void
-__pthread_sigsuspend (const sigset_t *set)
-{
- INTERNAL_SYSCALL_DECL (err);
- INTERNAL_SYSCALL (rt_sigsuspend, err, 2, set, _NSIG / 8);
-}
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
deleted file mode 100644
index dd9637d2b5..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/* Copyright (C) 2002, 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <linuxthreads/internals.h>
-#endif
-
-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-
-# ifdef IS_IN_librt
-# define PSEUDO_NLOCAL 6
-# define PSEUDO_SAVE_GP mov loc5 = gp
-# define PSEUDO_RESTORE_GP mov gp = loc5
-# define PSEUDO_SAVE_GP_1
-# define PSEUDO_RESTORE_GP_1 mov gp = loc5
-# else
-# define PSEUDO_NLOCAL 5
-# define PSEUDO_SAVE_GP
-# define PSEUDO_RESTORE_GP
-# define PSEUDO_SAVE_GP_1 mov loc4 = gp;;
-# define PSEUDO_RESTORE_GP_1 mov gp = loc4
-# endif
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
-.text; \
-ENTRY (name) \
- adds r14 = MULTIPLE_THREADS_OFFSET, r13;; \
- ld4 r14 = [r14]; \
- mov r15 = SYS_ify(syscall_name);; \
- cmp4.ne p6, p7 = 0, r14; \
-(p6) br.cond.spnt .Lpseudo_cancel;; \
- break __BREAK_SYSCALL;; \
- cmp.eq p6,p0=-1,r10; \
-(p6) br.cond.spnt.few __syscall_error; \
- ret;; \
- .endp name; \
- .proc __GC_##name; \
- .globl __GC_##name; \
- .hidden __GC_##name; \
-__GC_##name: \
-.Lpseudo_cancel: \
- .prologue; \
- .regstk args, PSEUDO_NLOCAL, args, 0; \
- .save ar.pfs, loc0; \
- alloc loc0 = ar.pfs, args, PSEUDO_NLOCAL, args, 0; \
- .save rp, loc1; \
- mov loc1 = rp; \
- PSEUDO_SAVE_GP;; \
- .body; \
- CENABLE;; \
- PSEUDO_RESTORE_GP; \
- mov loc2 = r8; \
- COPY_ARGS_##args \
- mov r15 = SYS_ify(syscall_name); \
- break __BREAK_SYSCALL;; \
- mov loc3 = r8; \
- mov loc4 = r10; \
- mov out0 = loc2; \
- CDISABLE;; \
- PSEUDO_RESTORE_GP; \
- cmp.eq p6,p0=-1,loc4; \
-(p6) br.cond.spnt.few __syscall_error_##args; \
- mov r8 = loc3; \
- mov rp = loc1; \
- mov ar.pfs = loc0; \
-.Lpseudo_end: \
- ret; \
- .endp __GC_##name; \
-.section .gnu.linkonce.t.__syscall_error_##args, "ax"; \
- .align 32; \
- .proc __syscall_error_##args; \
- .global __syscall_error_##args; \
- .hidden __syscall_error_##args; \
- .size __syscall_error_##args, 64; \
-__syscall_error_##args: \
- .prologue; \
- .regstk args, PSEUDO_NLOCAL, args, 0; \
- .save ar.pfs, loc0; \
- .save rp, loc1; \
- .body; \
- PSEUDO_SAVE_GP_1; \
- br.call.sptk.many b0 = __errno_location;; \
- st4 [r8] = loc3; \
- PSEUDO_RESTORE_GP_1; \
- mov rp = loc1; \
- mov r8 = -1; \
- mov ar.pfs = loc0
-
-#undef PSEUDO_END
-#define PSEUDO_END(name) .endp
-
-# ifdef IS_IN_libpthread
-# define CENABLE br.call.sptk.many b0 = __pthread_enable_asynccancel
-# define CDISABLE br.call.sptk.many b0 = __pthread_disable_asynccancel
-# elif !defined NOT_IN_libc
-# define CENABLE br.call.sptk.many b0 = __libc_enable_asynccancel
-# define CDISABLE br.call.sptk.many b0 = __libc_disable_asynccancel
-# else
-# define CENABLE br.call.sptk.many b0 = __librt_enable_asynccancel
-# define CDISABLE br.call.sptk.many b0 = __librt_disable_asynccancel
-# endif
-
-#define COPY_ARGS_0 /* Nothing */
-#define COPY_ARGS_1 COPY_ARGS_0 mov out0 = in0;
-#define COPY_ARGS_2 COPY_ARGS_1 mov out1 = in1;
-#define COPY_ARGS_3 COPY_ARGS_2 mov out2 = in2;
-#define COPY_ARGS_4 COPY_ARGS_3 mov out3 = in3;
-#define COPY_ARGS_5 COPY_ARGS_4 mov out4 = in4;
-#define COPY_ARGS_6 COPY_ARGS_5 mov out5 = in5;
-#define COPY_ARGS_7 COPY_ARGS_6 mov out6 = in6;
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, p_multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- adds r14 = MULTIPLE_THREADS_OFFSET, r13 ;; ld4 r14 = [r14] ;; cmp4.ne p6, p7 = 0, r14
-# endif
-
-#elif !defined __ASSEMBLER__
-
-/* This code should never be used but we define it anyhow. */
-# define SINGLE_THREAD_P (1)
-
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/ia64/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/ia64/vfork.S
deleted file mode 100644
index 54acedad4c..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/ia64/vfork.S
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright (C) 2000, 2002, 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-
-#include <sysdep-cancel.h>
-#define _SIGNAL_H
-#include <bits/signum.h>
-
-/* The following are defined in linux/sched.h, which unfortunately */
-/* is not safe for inclusion in an assembly file. */
-#define CLONE_VM 0x00000100 /* set if VM shared between processes */
-#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
-
-/* pid_t vfork(void); */
-/* Implemented as __clone_syscall(CLONE_VFORK | CLONE_VM | SIGCHLD, 0) */
-
-ENTRY(__vfork)
-#ifdef SHARED
- addl r14 = @gprel(__libc_pthread_functions#), gp;;
-#else
- .weak pthread_create
- addl r14 = @ltoff(@fptr(pthread_create#)), gp;;
-#endif
- ld8 r14 = [r14];;
- cmp.ne p6, p7 = 0, r14
-(p6) br.cond.spnt.few HIDDEN_JUMPTARGET (__fork);;
- alloc r2=ar.pfs,0,0,2,0
- mov out0=CLONE_VM+CLONE_VFORK+SIGCHLD
- mov out1=0 /* Standard sp value. */
- ;;
- DO_CALL (SYS_ify (clone))
- cmp.eq p6,p0=-1,r10
- ;;
-(p6) br.cond.spnt.few __syscall_error
- ret
-PSEUDO_END(__vfork)
-libc_hidden_def (__vfork)
-
-weak_alias (__vfork, vfork)
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/jmp-unwind.c b/linuxthreads/sysdeps/unix/sysv/linux/jmp-unwind.c
deleted file mode 100644
index 4b90315707..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/jmp-unwind.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* _longjmp_unwind -- Clean up stack frames unwound by longjmp.
- Copyright (C) 2002, 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <setjmp.h>
-#include <stddef.h>
-#include <bits/libc-lock.h>
-
-#ifndef SHARED
-weak_extern (__pthread_cleanup_upto);
-#endif
-
-void
-_longjmp_unwind (jmp_buf env, int val)
-{
- __libc_maybe_call2 (pthread_cleanup_upto,
- (env->__jmpbuf, __builtin_frame_address (0)),
- (void) 0);
-}
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h
deleted file mode 100644
index bb798e40d6..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Andreas Schwab <schwab@suse.de>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-#ifndef __ASSEMBLER__
-# include <linuxthreads/internals.h>
-#endif
-
-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
- ENTRY (name) \
- SINGLE_THREAD_P; \
- jne .Lpseudo_cancel; \
- DO_CALL (syscall_name, args); \
- cmp.l &-4095, %d0; \
- jcc SYSCALL_ERROR_LABEL; \
- rts; \
- .Lpseudo_cancel: \
- CENABLE; \
- DOCARGS_##args \
- move.l %d0, -(%sp); \
- move.l &SYS_ify (syscall_name), %d0; \
- trap &0; \
- move.l %d0, %d2; \
- CDISABLE; \
- addq.l &4, %sp; \
- move.l %d2, %d0; \
- UNDOCARGS_##args \
- cmp.l &-4095, %d0; \
- jcc SYSCALL_ERROR_LABEL
-
-# define DOCARGS_0 move.l %d2, -(%sp);
-# define _DOCARGS_0(n)
-# define UNDOCARGS_0 move.l (%sp)+, %d2;
-
-# define DOCARGS_1 _DOCARGS_1 (4); DOCARGS_0
-# define _DOCARGS_1(n) move.l n(%sp), %d1; _DOARGS_0 (n)
-# define UNDOCARGS_1 UNDOCARGS_0
-
-# define DOCARGS_2 _DOCARGS_2 (8)
-# define _DOCARGS_2(n) move.l %d2, -(%sp); move.l n+4(%sp), %d2; \
- _DOCARGS_1 (n)
-# define UNDOCARGS_2 UNDOCARGS_1
-
-# define DOCARGS_3 _DOCARGS_3 (12)
-# define _DOCARGS_3(n) move.l %d3, -(%sp); move.l n+4(%sp), %d3; \
- _DOCARGS_2 (n)
-# define UNDOCARGS_3 UNDOCARGS_2; move.l (%sp)+, %d3;
-
-# define DOCARGS_4 _DOCARGS_4 (16)
-# define _DOCARGS_4(n) move.l %d4, -(%sp); move.l n+4(%sp), %d4; \
- _DOCARGS_3 (n)
-# define UNDOCARGS_4 UNDOCARGS_3; move.l (%sp)+, %d4;
-
-# define DOCARGS_5 _DOCARGS_5 (20)
-# define _DOCARGS_5(n) move.l %d5, -(%sp); move.l n+4(%sp), %d5; \
- _DOCARGS_4 (n)
-# define UNDOCARGS_5 UNDOCARGS_4; move.l (%sp)+, %d5;
-
-# ifdef IS_IN_libpthread
-# ifdef PIC
-# define CENABLE jbsr __pthread_enable_asynccancel@PLTPC
-# define CDISABLE jbsr __pthread_disable_asynccancel@PLTPC
-# else
-# define CENABLE jbsr __pthread_enable_asynccancel
-# define CDISABLE jbsr __pthread_disable_asynccancel
-# endif
-# elif !defined NOT_IN_libc
-# ifdef PIC
-# define CENABLE jbsr __libc_enable_asynccancel@PLTPC
-# define CDISABLE jbsr __libc_disable_asynccancel@PLTPC
-# else
-# define CENABLE jbsr __libc_enable_asynccancel
-# define CDISABLE jbsr __libc_disable_asynccancel
-# endif
-# else
-# ifdef PIC
-# define CENABLE jbsr __librt_enable_asynccancel@PLTPC
-# define CDISABLE jbsr __librt_disable_asynccancel@PLTPC
-# else
-# define CENABLE jbsr __librt_enable_asynccancel
-# define CDISABLE jbsr __librt_disable_asynccancel
-# endif
-# endif
-
-# if !defined NOT_IN_libc
-# define __local_multiple_threads __libc_multiple_threads
-# elif defined IS_IN_libpthread
-# define __local_multiple_threads __pthread_multiple_threads
-# else
-# define __local_multiple_threads __librt_multiple_threads
-# endif
-
-# ifndef __ASSEMBLER__
-extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
-# else
-# if !defined PIC
-# define SINGLE_THREAD_P tst.l __local_multiple_threads
-# else
-# define SINGLE_THREAD_P tst.l (__local_multiple_threads, %pc)
-# endif
-# endif
-
-#elif !defined __ASSEMBLER__
-
-/* This code should never be used but we define it anyhow. */
-# define SINGLE_THREAD_P (1)
-
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/m68k/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/m68k/vfork.S
deleted file mode 100644
index 49b8a3c0ac..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/m68k/vfork.S
+++ /dev/null
@@ -1,84 +0,0 @@
-/* Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Andreas Schwab <schwab@gnu.org>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep-cancel.h>
-#define _ERRNO_H 1
-#include <bits/errno.h>
-#include <kernel-features.h>
-
-/* Clone the calling process, but without copying the whole address space.
- The calling process is suspended until the new process exits or is
- replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
- and the process ID of the new process to the old process. */
-
-ENTRY (__vfork)
-
-#ifdef SHARED
- tstl (__libc_pthread_functions@GOTPC, %pc)
-#else
- .weak pthread_create
- movel #pthread_create, %d0
-#endif
- jbne HIDDEN_JUMPTARGET (__fork)
-
-#ifdef __NR_vfork
-
- /* Pop the return PC value into A0. */
- movel %sp@+, %a0
-
- /* Stuff the syscall number in D0 and trap into the kernel. */
- movel #SYS_ify (vfork), %d0
- trap #0
- tstl %d0
- jmi .Lerror /* Branch forward if it failed. */
-
- /* Jump to the return PC. */
- jmp %a0@
-
-.Lerror:
- /* Push back the return PC. */
- movel %a0,%sp@-
-
-# ifdef __ASSUME_VFORK_SYSCALL
-# ifndef PIC
- jbra SYSCALL_ERROR_LABEL
-# endif
-# else
- /* Check if vfork syscall is known at all. */
- movel #-ENOSYS,%d1
- cmpl %d0,%d1
- jne SYSCALL_ERROR_LABEL
-
-# endif
-#endif
-
-#ifndef __ASSUME_VFORK_SYSCALL
- /* If we don't have vfork, fork is close enough. */
-
- movel #SYS_ify (fork), %d0
- trap #0
- tstl %d0
- jmi SYSCALL_ERROR_LABEL
- rts
-#endif
-
-PSEUDO_END (__vfork)
-libc_hidden_def (__vfork)
-
-weak_alias (__vfork, vfork)
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/mips/Makefile b/linuxthreads/sysdeps/unix/sysv/linux/mips/Makefile
deleted file mode 100644
index 56eeecc789..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/mips/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-# pull in __syscall_error routine
-libpthread-routines += sysdep
-
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h
deleted file mode 100644
index fc51774252..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/mips/mips64/sysdep-cancel.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/* system call stubs with cancellation handling. Linux/MIPS version.
- Copyright (C) 2003, 2004 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Chris Demetriou of Broadcom Corporation,
- based on work by Guido Guenther <agx@sigxcpu.org>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-#ifndef __ASSEMBLER__
-# include <linuxthreads/internals.h>
-#endif
-#include <sys/asm.h>
-
-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-
-#ifdef __PIC__
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .align 2; \
- 99: \
- PTR_LA t9,__syscall_error; \
- /* manual cpreturn. */ \
- REG_L gp, STKOFF_GP(sp); \
- RESTORESTK ; \
- jr t9; \
- ENTRY (name) \
- SAVESTK ; \
- .cpsetup t9, STKOFF_GP, name ; \
- .set reorder; \
- SINGLE_THREAD_P(t0); \
- bne zero, t0, L(pseudo_cancel); \
- .set noreorder; \
- li v0, SYS_ify(syscall_name); \
- syscall; \
- .set reorder; \
- bne a3, zero, SYSCALL_ERROR_LABEL; \
- /* manual cpreturn. */ \
- REG_L gp, STKOFF_GP(sp); \
- RESTORESTK ; \
- ret; \
- L(pseudo_cancel): \
- REG_S ra, STKOFF_RA(sp); \
- PUSHARGS_##args; /* save syscall args */ \
- CENABLE; \
- REG_S v0, STKOFF_SVMSK(sp); /* save mask */ \
- POPARGS_##args; /* restore syscall args */ \
- .set noreorder; \
- li v0, SYS_ify (syscall_name); \
- syscall; \
- .set reorder; \
- REG_S v0, STKOFF_SC_V0(sp); /* save syscall result */ \
- REG_S a3, STKOFF_SC_ERR(sp); /* save syscall error flag */ \
- REG_L a0, STKOFF_SVMSK(sp); /* pass mask as arg1 */ \
- CDISABLE; \
- REG_L a3, STKOFF_SC_ERR(sp); /* restore syscall error flag */ \
- REG_L ra, STKOFF_RA(sp); /* restore return address */ \
- REG_L v0, STKOFF_SC_V0(sp); /* restore syscall result */ \
- bne a3, zero, SYSCALL_ERROR_LABEL; \
- /* manual cpreturn. */ \
- REG_L gp, STKOFF_GP(sp); \
- RESTORESTK ; \
- L(pseudo_end):
-#endif
-
-# define PUSHARGS_0 /* nothing to do */
-# define PUSHARGS_1 PUSHARGS_0 REG_S a0, STKOFF_A0(sp);
-# define PUSHARGS_2 PUSHARGS_1 REG_S a1, STKOFF_A1(sp);
-# define PUSHARGS_3 PUSHARGS_2 REG_S a2, STKOFF_A2(sp);
-# define PUSHARGS_4 PUSHARGS_3 REG_S a3, STKOFF_A3(sp);
-# define PUSHARGS_5 PUSHARGS_4 REG_S a4, STKOFF_A4(sp);
-# define PUSHARGS_6 PUSHARGS_5 REG_S a5, STKOFF_A5(sp);
-
-# define POPARGS_0 /* nothing to do */
-# define POPARGS_1 POPARGS_0 REG_L a0, STKOFF_A0(sp);
-# define POPARGS_2 POPARGS_1 REG_L a1, STKOFF_A1(sp);
-# define POPARGS_3 POPARGS_2 REG_L a2, STKOFF_A2(sp);
-# define POPARGS_4 POPARGS_3 REG_L a3, STKOFF_A3(sp);
-# define POPARGS_5 POPARGS_4 REG_L a4, STKOFF_A4(sp);
-# define POPARGS_6 POPARGS_5 REG_L a5, STKOFF_A5(sp);
-
-/* Save an even number of slots. Should be 0 if an even number of slots
- are used below, or SZREG if an odd number are used. */
-# define STK_PAD SZREG
-
-/* Place values that we are more likely to use later in this sequence, i.e.
- closer to the SP at function entry. If you do that, the are more
- likely to already be in your d-cache. */
-# define STKOFF_A5 (STK_PAD)
-# define STKOFF_A4 (STKOFF_A5 + SZREG)
-# define STKOFF_A3 (STKOFF_A4 + SZREG)
-# define STKOFF_A2 (STKOFF_A3 + SZREG) /* MT and more args. */
-# define STKOFF_A1 (STKOFF_A2 + SZREG) /* MT and 2 args. */
-# define STKOFF_A0 (STKOFF_A1 + SZREG) /* MT and 1 arg. */
-# define STKOFF_RA (STKOFF_A0 + SZREG) /* Used if MT. */
-# define STKOFF_SC_V0 (STKOFF_RA + SZREG) /* Used if MT. */
-# define STKOFF_SC_ERR (STKOFF_SC_V0 + SZREG) /* Used if MT. */
-# define STKOFF_SVMSK (STKOFF_SC_ERR + SZREG) /* Used if MT. */
-# define STKOFF_GP (STKOFF_SVMSK + SZREG) /* Always used. */
-
-# define STKSPACE (STKOFF_GP + SZREG)
-# define SAVESTK PTR_SUBU sp, STKSPACE
-# define RESTORESTK PTR_ADDU sp, STKSPACE
-
-# ifdef IS_IN_libpthread
-# define CENABLE PTR_LA t9, __pthread_enable_asynccancel; jalr t9;
-# define CDISABLE PTR_LA t9, __pthread_disable_asynccancel; jalr t9;
-# define __local_multiple_threads __pthread_multiple_threads
-# elif defined IS_IN_librt
-# define CENABLE PTR_LA t9, __librt_enable_asynccancel; jalr t9;
-# define CDISABLE PTR_LA t9, __librt_disable_asynccancel; jalr t9;
-# define __local_multiple_threads __librt_multiple_threads
-# else
-# define CENABLE PTR_LA t9, __libc_enable_asynccancel; jalr t9;
-# define CDISABLE PTR_LA t9, __libc_disable_asynccancel; jalr t9;
-# define __local_multiple_threads __libc_multiple_threads
-# endif
-
-# ifndef __ASSEMBLER__
-extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
-# else
-# define SINGLE_THREAD_P(reg) lw reg, __local_multiple_threads
-#endif
-
-#elif !defined __ASSEMBLER__
-
-/* This code should never be used but we define it anyhow. */
-# define SINGLE_THREAD_P (1)
-
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h
deleted file mode 100644
index 1fff782397..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Guido Guenther <agx@sigxcpu.org>, 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-#ifndef __ASSEMBLER__
-# include <linuxthreads/internals.h>
-#endif
-
-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-
-#ifdef __PIC__
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .align 2; \
- 99: la t9,__syscall_error; \
- jr t9; \
- ENTRY (name) \
- .set noreorder; \
- .cpload t9; \
- .set reorder; \
- SINGLE_THREAD_P(t0); \
- bne zero, t0, L(pseudo_cancel); \
- .set noreorder; \
- li v0, SYS_ify(syscall_name); \
- syscall; \
- .set reorder; \
- bne a3, zero, SYSCALL_ERROR_LABEL; \
- ret; \
- L(pseudo_cancel): \
- SAVESTK_##args; \
- sw ra, 28(sp); \
- sw gp, 32(sp); \
- PUSHARGS_##args; /* save syscall args */ \
- CENABLE; \
- lw gp, 32(sp); \
- sw v0, 44(sp); /* save mask */ \
- POPARGS_##args; /* restore syscall args */ \
- .set noreorder; \
- li v0, SYS_ify (syscall_name); \
- syscall; \
- .set reorder; \
- sw v0, 36(sp); /* save syscall result */ \
- sw a3, 40(sp); /* save syscall error flag */ \
- lw a0, 44(sp); /* pass mask as arg1 */ \
- CDISABLE; \
- lw gp, 32(sp); \
- lw v0, 36(sp); /* restore syscall result */ \
- lw a3, 40(sp); /* restore syscall error flag */ \
- lw ra, 28(sp); /* restore return address */ \
- RESTORESTK; \
- bne a3, zero, SYSCALL_ERROR_LABEL; \
- L(pseudo_end):
-#endif
-
-# define PUSHARGS_0 /* nothing to do */
-# define PUSHARGS_1 PUSHARGS_0 sw a0, 0(sp);
-# define PUSHARGS_2 PUSHARGS_1 sw a1, 4(sp);
-# define PUSHARGS_3 PUSHARGS_2 sw a2, 8(sp);
-# define PUSHARGS_4 PUSHARGS_3 sw a3, 12(sp);
-# define PUSHARGS_5 PUSHARGS_4 /* handeld by SAVESTK_## */
-# define PUSHARGS_6 PUSHARGS_5
-# define PUSHARGS_7 PUSHARGS_6
-
-# define POPARGS_0 /* nothing to do */
-# define POPARGS_1 POPARGS_0 lw a0, 0(sp);
-# define POPARGS_2 POPARGS_1 lw a1, 4(sp);
-# define POPARGS_3 POPARGS_2 lw a2, 8(sp);
-# define POPARGS_4 POPARGS_3 lw a3, 12(sp);
-# define POPARGS_5 POPARGS_4 /* args already in new stackframe */
-# define POPARGS_6 POPARGS_5
-# define POPARGS_7 POPARGS_6
-
-
-# define STKSPACE 48
-# define SAVESTK_0 subu sp, STKSPACE
-# define SAVESTK_1 SAVESTK_0
-# define SAVESTK_2 SAVESTK_1
-# define SAVESTK_3 SAVESTK_2
-# define SAVESTK_4 SAVESTK_3
-# define SAVESTK_5 lw t0, 16(sp); \
- subu sp, STKSPACE; \
- sw t0, 16(sp)
-
-# define SAVESTK_6 lw t0, 16(sp); \
- lw t1, 20(sp); \
- subu sp, STKSPACE; \
- sw t0, 16(sp); \
- sw t1, 20(sp)
-
-# define SAVESTK_7 lw t0, 16(sp); \
- lw t1, 20(sp); \
- lw t2, 24(sp); \
- subu sp, STKSPACE; \
- sw t0, 16(sp); \
- sw t1, 20(sp); \
- sw t2, 24(sp)
-
-# define RESTORESTK addu sp, STKSPACE
-
-
-# ifdef IS_IN_libpthread
-# define CENABLE la t9, __pthread_enable_asynccancel; jalr t9;
-# define CDISABLE la t9, __pthread_disable_asynccancel; jalr t9;
-# define __local_multiple_threads __pthread_multiple_threads
-# elif defined IS_IN_librt
-# define CENABLE la t9, __librt_enable_asynccancel; jalr t9;
-# define CDISABLE la t9, __librt_disable_asynccancel; jalr t9;
-# define __local_multiple_threads __librt_multiple_threads
-# else
-# define CENABLE la t9, __libc_enable_asynccancel; jalr t9;
-# define CDISABLE la t9, __libc_disable_asynccancel; jalr t9;
-# define __local_multiple_threads __libc_multiple_threads
-# endif
-
-# ifndef __ASSEMBLER__
-extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
-# else
-# define SINGLE_THREAD_P(reg) lw reg, __local_multiple_threads
-#endif
-
-#elif !defined __ASSEMBLER__
-
-/* This code should never be used but we define it anyhow. */
-# define SINGLE_THREAD_P (1)
-
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/mips/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/mips/vfork.S
deleted file mode 100644
index 7bbab5c59c..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/mips/vfork.S
+++ /dev/null
@@ -1,104 +0,0 @@
-/* Copyright (C) 2005 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-/* vfork() is just a special case of clone(). */
-
-#include <sys/asm.h>
-#include <sysdep.h>
-#include <asm/unistd.h>
-
-/* int vfork() */
-
- .text
-LOCALSZ= 1
-FRAMESZ= (((NARGSAVE+LOCALSZ)*SZREG)+ALSZ)&ALMASK
-GPOFF= FRAMESZ-(1*SZREG)
-NESTED(__vfork,FRAMESZ,sp)
-#ifdef __PIC__
- SETUP_GP
-#endif
- PTR_SUBU sp, FRAMESZ
- SETUP_GP64 (a5, __vfork)
-#ifdef __PIC__
- SAVE_GP (GPOFF)
-#endif
-#ifdef PROF
-# if (_MIPS_SIM != _ABIO32)
- PTR_S a5, GPOFF(sp)
-# endif
- .set noat
- move $1, ra
-# if (_MIPS_SIM == _ABIO32)
- subu sp,sp,8
-# endif
- jal _mcount
- .set at
-# if (_MIPS_SIM != _ABIO32)
- PTR_L a5, GPOFF(sp)
-# endif
-#endif
-
- /* If libpthread is loaded, we need to call fork instead. */
-#ifdef SHARED
- PTR_L a0, __libc_pthread_functions
-#else
- .weak pthread_create
- PTR_LA a0, pthread_create
-#endif
-
- PTR_ADDU sp, FRAMESZ
-
- bnez a0, L(call_fork)
-
- li a0, 0x4112 /* CLONE_VM | CLONE_VFORK | SIGCHLD */
- move a1, sp
-
- /* Do the system call */
- li v0,__NR_clone
- syscall
-
- bnez a3,L(error)
-
- /* Successful return from the parent or child. */
- RESTORE_GP64
- ret
-
- /* Something bad happened -- no child created. */
-L(error):
-#ifdef __PIC__
- PTR_LA t9, __syscall_error
- RESTORE_GP64
- jr t9
-#else
- RESTORE_GP64
- j __syscall_error
-#endif
-
-L(call_fork):
-#ifdef __PIC__
- PTR_LA t9, fork
- RESTORE_GP64
- jr t9
-#else
- RESTORE_GP64
- j fork
-#endif
- END(__vfork)
-
-libc_hidden_def(__vfork)
-weak_alias (__vfork, vfork)
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/mq_notify.c b/linuxthreads/sysdeps/unix/sysv/linux/mq_notify.c
deleted file mode 100644
index e9c2b6e79a..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/mq_notify.c
+++ /dev/null
@@ -1,287 +0,0 @@
-/* Copyright (C) 2004 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contribute 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <assert.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <mqueue.h>
-#include <pthread.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysdep.h>
-#include <unistd.h>
-#include <sys/socket.h>
-#include <not-cancel.h>
-
-
-#ifdef __NR_mq_notify
-
-/* Defined in the kernel headers: */
-#define NOTIFY_COOKIE_LEN 32 /* Length of the cookie used. */
-#define NOTIFY_WOKENUP 1 /* Code for notifcation. */
-#define NOTIFY_REMOVED 2 /* Code for closed message queue
- of de-notifcation. */
-
-
-/* Data structure for the queued notification requests. */
-union notify_data
-{
- struct
- {
- void (*fct) (union sigval); /* The function to run. */
- union sigval param; /* The parameter to pass. */
- pthread_attr_t *attr; /* Attributes to create the thread with. */
- /* NB: on 64-bit machines the struct as a size of 24 bytes. Which means
- byte 31 can still be used for returning the status. */
- };
- char raw[NOTIFY_COOKIE_LEN];
-};
-
-
-/* Keep track of the initialization. */
-static pthread_once_t once = PTHREAD_ONCE_INIT;
-
-
-/* The netlink socket. */
-static int netlink_socket = -1;
-
-
-/* Barrier used to make sure data passed to the new thread is not
- resused by the parent. */
-static pthread_barrier_t notify_barrier;
-
-
-/* Modify the signal mask. We move this into a separate function so
- that the stack space needed for sigset_t is not deducted from what
- the thread can use. */
-static int
-__attribute__ ((noinline))
-change_sigmask (int how, sigset_t *oss)
-{
- sigset_t ss;
- sigfillset (&ss);
- return pthread_sigmask (how, &ss, oss);
-}
-
-
-/* The function used for the notification. */
-static void *
-notification_function (void *arg)
-{
- /* Copy the function and parameter so that the parent thread can go
- on with its life. */
- volatile union notify_data *data = (volatile union notify_data *) arg;
- void (*fct) (union sigval) = data->fct;
- union sigval param = data->param;
-
- /* Let the parent go. */
- (void) pthread_barrier_wait (&notify_barrier);
-
- /* Make the thread detached. */
- (void) pthread_detach (pthread_self ());
-
- /* The parent thread has all signals blocked. This is probably a
- bit surprising for this thread. So we unblock all of them. */
- (void) change_sigmask (SIG_UNBLOCK, NULL);
-
- /* Now run the user code. */
- fct (param);
-
- /* And we are done. */
- return NULL;
-}
-
-
-/* Helper thread. */
-static void *
-helper_thread (void *arg)
-{
- while (1)
- {
- union notify_data data;
-
- ssize_t n = recv (netlink_socket, &data, sizeof (data),
- MSG_NOSIGNAL | MSG_WAITALL);
- if (n < NOTIFY_COOKIE_LEN)
- continue;
-
- if (data.raw[NOTIFY_COOKIE_LEN - 1] == NOTIFY_WOKENUP)
- {
- /* Just create the thread as instructed. There is no way to
- report a problem with creating a thread. */
- pthread_t th;
- if (__builtin_expect (pthread_create (&th, data.attr,
- notification_function, &data)
- == 0, 0))
- /* Since we passed a pointer to DATA to the new thread we have
- to wait until it is done with it. */
- (void) pthread_barrier_wait (&notify_barrier);
- }
- else if (data.raw[NOTIFY_COOKIE_LEN - 1] == NOTIFY_REMOVED)
- /* The only state we keep is the copy of the thread attributes. */
- free (data.attr);
- }
- return NULL;
-}
-
-
-static void
-reset_once (void)
-{
- once = PTHREAD_ONCE_INIT;
-}
-
-
-static void
-init_mq_netlink (void)
-{
- /* This code might be called a second time after fork(). The file
- descriptor is inherited from the parent. */
- if (netlink_socket == -1)
- {
- /* Just a normal netlink socket, not bound. */
- netlink_socket = socket (AF_NETLINK, SOCK_RAW, 0);
- /* No need to do more if we have no socket. */
- if (netlink_socket == -1)
- return;
-
- /* Make sure the descriptor is closed on exec. */
- if (fcntl (netlink_socket, F_SETFD, FD_CLOEXEC) != 0)
- goto errout;
- }
-
- int err = 1;
-
- /* Initialize the barrier. */
- if (__builtin_expect (pthread_barrier_init (&notify_barrier, NULL, 2) == 0,
- 0))
- {
- /* Create the helper thread. */
- pthread_attr_t attr;
- (void) pthread_attr_init (&attr);
- (void) pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
- /* We do not need much stack space, the bare minimum will be enough. */
- (void) pthread_attr_setstacksize (&attr, PTHREAD_STACK_MIN);
-
- /* Temporarily block all signals so that the newly created
- thread inherits the mask. */
- sigset_t oss;
- int have_no_oss = change_sigmask (SIG_BLOCK, &oss);
-
- pthread_t th;
- err = pthread_create (&th, &attr, helper_thread, NULL);
-
- /* Reset the signal mask. */
- if (!have_no_oss)
- pthread_sigmask (SIG_SETMASK, &oss, NULL);
-
- (void) pthread_attr_destroy (&attr);
-
- if (err == 0)
- {
- static int added_atfork;
-
- if (added_atfork == 0
- && pthread_atfork (NULL, NULL, reset_once) != 0)
- {
- /* The child thread will call recv() which is a
- cancellation point. */
- (void) pthread_cancel (th);
- err = 1;
- }
- else
- added_atfork = 1;
- }
- }
-
- if (err != 0)
- {
- errout:
- close_not_cancel_no_status (netlink_socket);
- netlink_socket = -1;
- }
-}
-
-
-/* Register notification upon message arrival to an empty message queue
- MQDES. */
-int
-mq_notify (mqd_t mqdes, const struct sigevent *notification)
-{
- /* Make sure the type is correctly defined. */
- assert (sizeof (union notify_data) == NOTIFY_COOKIE_LEN);
-
- /* Special treatment needed for SIGEV_THREAD. */
- if (notification == NULL || notification->sigev_notify != SIGEV_THREAD)
- return INLINE_SYSCALL (mq_notify, 2, mqdes, notification);
-
- /* The kernel cannot directly start threads. This will have to be
- done at userlevel. Since we cannot start threads from signal
- handlers we have to create a dedicated thread which waits for
- notifications for arriving messages and creates threads in
- response. */
-
- /* Initialize only once. */
- pthread_once (&once, init_mq_netlink);
-
- /* If we cannot create the netlink socket we cannot provide
- SIGEV_THREAD support. */
- if (__builtin_expect (netlink_socket == -1, 0))
- {
- __set_errno (ENOSYS);
- return -1;
- }
-
- /* Create the cookie. It will hold almost all the state. */
- union notify_data data;
- memset (&data, '\0', sizeof (data));
- data.fct = notification->sigev_notify_function;
- data.param = notification->sigev_value;
-
- if (notification->sigev_notify_attributes != NULL)
- {
- /* The thread attribute has to be allocated separately. */
- data.attr = (pthread_attr_t *) malloc (sizeof (pthread_attr_t));
- if (data.attr == NULL)
- return -1;
-
- memcpy (data.attr, notification->sigev_notify_attributes,
- sizeof (pthread_attr_t));
- }
-
- /* Construct the new request. */
- struct sigevent se;
- se.sigev_notify = SIGEV_THREAD;
- se.sigev_signo = netlink_socket;
- se.sigev_value.sival_ptr = &data;
-
- /* Tell the kernel. */
- int retval = INLINE_SYSCALL (mq_notify, 2, mqdes, &se);
-
- /* If it failed, free the allocated memory. */
- if (__builtin_expect (retval != 0, 0))
- free (data.attr);
-
- return retval;
-}
-
-#else
-# include <sysdeps/generic/mq_notify.c>
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/Makefile b/linuxthreads/sysdeps/unix/sysv/linux/powerpc/Makefile
deleted file mode 100644
index e98c9bd866..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/Makefile
+++ /dev/null
@@ -1,2 +0,0 @@
-# pull in __syscall_error routine
-libpthread-routines += sysdep
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/Versions b/linuxthreads/sysdeps/unix/sysv/linux/powerpc/Versions
deleted file mode 100644
index 326307c30c..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/Versions
+++ /dev/null
@@ -1,5 +0,0 @@
-libpthread {
- GLIBC_2.3.4 {
- longjmp; siglongjmp;
- }
-}
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h
deleted file mode 100644
index 865da8e8ca..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/* Copyright (C) 2003, 2005 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Franz Sirl <Franz.Sirl-kernel@lauterbach.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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <linuxthreads/internals.h>
-#endif
-
-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .section ".text"; \
- ENTRY (name) \
- SINGLE_THREAD_P; \
- bne- .Lpseudo_cancel; \
- DO_CALL (SYS_ify (syscall_name)); \
- PSEUDO_RET; \
- .Lpseudo_cancel: \
- stwu 1,-48(1); \
- mflr 9; \
- stw 9,52(1); \
- CGOTSETUP; \
- DOCARGS_##args; /* save syscall args around CENABLE. */ \
- CENABLE; \
- stw 3,16(1); /* store CENABLE return value (MASK). */ \
- UNDOCARGS_##args; /* restore syscall args. */ \
- DO_CALL (SYS_ify (syscall_name)); \
- mfcr 0; /* save CR/R3 around CDISABLE. */ \
- stw 3,8(1); \
- stw 0,12(1); \
- lwz 3,16(1); /* pass MASK to CDISABLE. */ \
- CDISABLE; \
- lwz 4,52(1); \
- lwz 0,12(1); /* restore CR/R3. */ \
- lwz 3,8(1); \
- CGOTRESTORE; \
- mtlr 4; \
- mtcr 0; \
- addi 1,1,48;
-
-# define DOCARGS_0
-# define UNDOCARGS_0
-
-# define DOCARGS_1 stw 3,20(1); DOCARGS_0
-# define UNDOCARGS_1 lwz 3,20(1); UNDOCARGS_0
-
-# define DOCARGS_2 stw 4,24(1); DOCARGS_1
-# define UNDOCARGS_2 lwz 4,24(1); UNDOCARGS_1
-
-# define DOCARGS_3 stw 5,28(1); DOCARGS_2
-# define UNDOCARGS_3 lwz 5,28(1); UNDOCARGS_2
-
-# define DOCARGS_4 stw 6,32(1); DOCARGS_3
-# define UNDOCARGS_4 lwz 6,32(1); UNDOCARGS_3
-
-# define DOCARGS_5 stw 7,36(1); DOCARGS_4
-# define UNDOCARGS_5 lwz 7,36(1); UNDOCARGS_4
-
-# define DOCARGS_6 stw 8,40(1); DOCARGS_5
-# define UNDOCARGS_6 lwz 8,40(1); UNDOCARGS_5
-
-# define CGOTSETUP
-# define CGOTRESTORE
-
-# ifdef IS_IN_libpthread
-# define CENABLE bl __pthread_enable_asynccancel@local
-# define CDISABLE bl __pthread_disable_asynccancel@local
-# elif !defined NOT_IN_libc
-# define CENABLE bl __libc_enable_asynccancel@local
-# define CDISABLE bl __libc_disable_asynccancel@local
-# else
-# define CENABLE bl JUMPTARGET(__librt_enable_asynccancel)
-# define CDISABLE bl JUMPTARGET(__librt_disable_asynccancel)
-# if defined HAVE_AS_REL16 && defined PIC
-# undef CGOTSETUP
-# define CGOTSETUP \
- bcl 20,31,1f; \
- 1: stw 30,44(1); \
- mflr 30; \
- addis 30,30,_GLOBAL_OFFSET_TABLE-1b@ha; \
- addi 30,30,_GLOBAL_OFFSET_TABLE-1b@l
-# undef CGOTRESTORE
-# define CGOTRESTORE \
- lwz 30,44(1)
-# endif
-# endif
-
-# ifdef HAVE_TLS_SUPPORT
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, p_multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- lwz 10,MULTIPLE_THREADS_OFFSET(2); \
- cmpwi 10,0
-# endif
-# else
-# if !defined NOT_IN_libc
-# define __local_multiple_threads __libc_multiple_threads
-# else
-# define __local_multiple_threads __librt_multiple_threads
-# endif
-# ifndef __ASSEMBLER__
-extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
-# else
-# if !defined PIC
-# define SINGLE_THREAD_P \
- lis 10,__local_multiple_threads@ha; \
- lwz 10,__local_multiple_threads@l(10); \
- cmpwi 10,0
-# else
-# ifdef HAVE_ASM_PPC_REL16
-# define SINGLE_THREAD_P \
- mflr 9; \
- bcl 20,31,1f; \
-1:mflr 10; \
- addis 10,10,__local_multiple_threads-1b@ha; \
- lwz 10,__local_multiple_threads-1b@l(10); \
- mtlr 9; \
- cmpwi 10,0
-# else
-# define SINGLE_THREAD_P \
- mflr 9; \
- bl _GLOBAL_OFFSET_TABLE_@local-4; \
- mflr 10; \
- mtlr 9; \
- lwz 10,__local_multiple_threads@got(10); \
- lwz 10,0(10); \
- cmpwi 10,0
-# endif
-# endif
-# endif
-# endif
-
-#elif !defined __ASSEMBLER__
-
-/* This code should never be used but we define it anyhow. */
-# define SINGLE_THREAD_P (1)
-
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S
deleted file mode 100644
index 724d4cc541..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S
+++ /dev/null
@@ -1,86 +0,0 @@
-/* Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep-cancel.h>
-#define _ERRNO_H 1
-#include <bits/errno.h>
-#include <kernel-features.h>
-
-/* Clone the calling process, but without copying the whole address space.
- The calling process is suspended until the new process exits or is
- replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
- and the process ID of the new process to the old process. */
-
-ENTRY (__vfork)
-
-#ifdef __NR_vfork
-# ifdef SHARED
- mflr 9
-# ifdef HAVE_ASM_PPC_REL16
- bcl 20,31,1f
-1: mflr 10
- addis 10,10,__libc_pthread_functions-1b@ha
- lwz 10,__libc_pthread_functions-1b@l(10)
- mtlr 9
-# else
- bl _GLOBAL_OFFSET_TABLE_@local-4
- mflr 10
- mtlr 9
- lwz 10,__libc_pthread_functions@got(10)
- lwz 10,0(10)
-# endif
-# else
- .weak pthread_create
- lis 10,pthread_create@ha
- la 10,pthread_create@l(10)
-# endif
-
- cmpwi 10,0
- bne- .Lhidden_fork
-
- DO_CALL (SYS_ify (vfork));
-
-# ifdef __ASSUME_VFORK_SYSCALL
- PSEUDO_RET
-# else
- bnslr+
- /* Check if vfork syscall is known at all. */
- cmpwi r3,ENOSYS
- bne- .Lsyscall_error
-
-# endif
-
-.Lhidden_fork:
- b HIDDEN_JUMPTARGET(__fork)
-
-#endif
-
-#ifndef __ASSUME_VFORK_SYSCALL
- /* If we don't have vfork, fork is close enough. */
-
- DO_CALL (SYS_ify (fork));
- bnslr+
-
-.Lsyscall_error:
- b __syscall_error@local
-#endif
-
-PSEUDO_END (__vfork)
-libc_hidden_def (__vfork)
-
-weak_alias (__vfork, vfork)
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
deleted file mode 100644
index 0c74676766..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/* Copyright (C) 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Franz Sirl <Franz.Sirl-kernel@lauterbach.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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <linuxthreads/internals.h>
-#endif
-
-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .section ".text"; \
- ENTRY (name) \
- SINGLE_THREAD_P; \
- bne- .Lpseudo_cancel; \
- DO_CALL (SYS_ify (syscall_name)); \
- PSEUDO_RET; \
- .Lpseudo_cancel: \
- stdu 1,-128(1); \
- mflr 9; \
- std 9,128+16(1); \
- DOCARGS_##args; /* save syscall args around CENABLE. */ \
- CENABLE; \
- std 3,72(1); /* store CENABLE return value (MASK). */ \
- UNDOCARGS_##args; /* restore syscall args. */ \
- DO_CALL (SYS_ify (syscall_name)); \
- mfcr 0; /* save CR/R3 around CDISABLE. */ \
- std 3,64(1); \
- std 0,8(1); \
- ld 3,72(1); /* pass MASK to CDISABLE. */ \
- CDISABLE; \
- ld 9,128+16(1); \
- ld 0,8(1); /* restore CR/R3. */ \
- ld 3,64(1); \
- mtlr 9; \
- mtcr 0; \
- addi 1,1,128;
-
-# define DOCARGS_0
-# define UNDOCARGS_0
-
-# define DOCARGS_1 std 3,80(1); DOCARGS_0
-# define UNDOCARGS_1 ld 3,80(1); UNDOCARGS_0
-
-# define DOCARGS_2 std 4,88(1); DOCARGS_1
-# define UNDOCARGS_2 ld 4,88(1); UNDOCARGS_1
-
-# define DOCARGS_3 std 5,96(1); DOCARGS_2
-# define UNDOCARGS_3 ld 5,96(1); UNDOCARGS_2
-
-# define DOCARGS_4 std 6,104(1); DOCARGS_3
-# define UNDOCARGS_4 ld 6,104(1); UNDOCARGS_3
-
-# define DOCARGS_5 std 7,112(1); DOCARGS_4
-# define UNDOCARGS_5 ld 7,112(1); UNDOCARGS_4
-
-# define DOCARGS_6 std 8,120(1); DOCARGS_5
-# define UNDOCARGS_6 ld 8,120(1); UNDOCARGS_5
-
-# ifdef IS_IN_libpthread
-# define CENABLE bl JUMPTARGET(__pthread_enable_asynccancel)
-# define CDISABLE bl JUMPTARGET(__pthread_disable_asynccancel)
-# define __local_multiple_threads __pthread_multiple_threads
-# elif !defined NOT_IN_libc
-# define CENABLE bl JUMPTARGET(__libc_enable_asynccancel)
-# define CDISABLE bl JUMPTARGET(__libc_disable_asynccancel)
-# define __local_multiple_threads __libc_multiple_threads
-# else
-# define CENABLE bl JUMPTARGET(__librt_enable_asynccancel); nop
-# define CDISABLE bl JUMPTARGET(__librt_disable_asynccancel); nop
-# define __local_multiple_threads __librt_multiple_threads
-# endif
-
-# ifdef HAVE_TLS_SUPPORT
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, p_multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- lwz 10,MULTIPLE_THREADS_OFFSET(13); \
- cmpwi 10,0
-# endif
-# else /* !HAVE_TLS_SUPPORT */
-# ifndef __ASSEMBLER__
-extern int __local_multiple_threads
-# if !defined NOT_IN_libc || defined IS_IN_libpthread
- attribute_hidden;
-# else
- ;
-# endif
-# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- .section ".toc","aw"; \
-.LC__local_multiple_threads:; \
- .tc __local_multiple_threads[TC],__local_multiple_threads; \
- .previous; \
- ld 10,.LC__local_multiple_threads@toc(2); \
- lwz 10,0(10); \
- cmpwi 10,0
-# endif
-# endif
-
-#elif !defined __ASSEMBLER__
-
-/* This code should never be used but we define it anyhow. */
-# define SINGLE_THREAD_P (1)
-
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S
deleted file mode 100644
index b408e31b7b..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep-cancel.h>
-#define _ERRNO_H 1
-#include <bits/errno.h>
-#include <kernel-features.h>
-
-/* Clone the calling process, but without copying the whole address space.
- The calling process is suspended until the new process exits or is
- replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
- and the process ID of the new process to the old process. */
-
-#ifdef SHARED
- .section ".toc","aw"
-.LC0:
- .tc __libc_pthread_functions[TC],__libc_pthread_functions
- .section ".text"
- .align 2
-#endif
-
-ENTRY (__vfork)
-
-#ifdef __NR_vfork
-
-# ifdef SHARED
- ld 10,.LC0@toc(2)
- ld 10,0(10)
- cmpwi 10,0
- bne- HIDDEN_JUMPTARGET(__fork)
-# else
- .weak pthread_create
- lis 10,pthread_create@highest
- ori 10,10,pthread_create@higher
- sldi 10,10,32
- oris 10,10,pthread_create@h
- ori 10,10,pthread_create@l
- cmpwi 10,0
- bne- .Lhidden_fork
-# endif
-
- DO_CALL (SYS_ify (vfork));
-
-# ifdef __ASSUME_VFORK_SYSCALL
- PSEUDO_RET
-# else
- bnslr+
- /* Check if vfork syscall is known at all. */
- cmpdi r3,ENOSYS
-# ifdef SHARED
- bne JUMPTARGET(__syscall_error)
-# else
- bne- .Lsyscall_error
-# endif
-
-# endif
-#endif
-
-#ifndef __ASSUME_VFORK_SYSCALL
- /* If we don't have vfork, fork is close enough. */
-
- DO_CALL (SYS_ify (fork));
- PSEUDO_RET
-#endif
-
-# ifndef SHARED
-.Lhidden_fork:
- b HIDDEN_JUMPTARGET(__fork)
-.Lsyscall_error:
- b JUMPTARGET(__syscall_error)
-# endif
-
-PSEUDO_END (__vfork)
-libc_hidden_def (__vfork)
-
-weak_alias (__vfork, vfork)
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/ptlongjmp.c b/linuxthreads/sysdeps/unix/sysv/linux/powerpc/ptlongjmp.c
deleted file mode 100644
index 177256c7fb..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/powerpc/ptlongjmp.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Linuxthreads - a simple clone()-based implementation of Posix */
-/* threads for Linux. */
-/* Copyright (C) 1998 Xavier Leroy (Xavier.Leroy@inria.fr) */
-/* */
-/* This program 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. */
-/* */
-/* This program is distributed in the hope that 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. */
-
-/* Redefine siglongjmp and longjmp so that they interact correctly
- with cleanup handlers */
-/* Derived from linuxthreads/ptlongjmp.c & added AltiVec/VMX versioning. */
-#include "pthread.h"
-#include <setjmp.h>
-#include <bits/wordsize.h>
-#include <shlib-compat.h>
-#if defined SHARED
-# if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_3_4)
-
-/* These functions are not declared anywhere since they shouldn't be
- used at another place but here. */
-extern void __novmx__libc_siglongjmp (sigjmp_buf env, int val)
- __attribute__ ((noreturn));
-extern void __novmx__libc_longjmp (sigjmp_buf env, int val)
- __attribute__ ((noreturn));
-
-
-void __novmx_siglongjmp (sigjmp_buf env, int val)
-{
- __novmx__libc_siglongjmp (env, val);
-}
-
-void __novmx_longjmp (jmp_buf env, int val)
-{
- __novmx__libc_longjmp (env, val);
-}
-
-# if __WORDSIZE == 64
-symbol_version (__novmx_longjmp,longjmp,GLIBC_2.3);
-symbol_version (__novmx_siglongjmp,siglongjmp,GLIBC_2.3);
-# else
-symbol_version (__novmx_longjmp,longjmp,GLIBC_2.0);
-symbol_version (__novmx_siglongjmp,siglongjmp,GLIBC_2.0);
-# endif
-# endif /* SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_3_4) ) */
-
-/* These functions are not declared anywhere since they shouldn't be
- used at another place but here. */
-extern void __vmx__libc_siglongjmp (sigjmp_buf env, int val)
- __attribute__ ((noreturn));
-extern void __vmx__libc_longjmp (sigjmp_buf env, int val)
- __attribute__ ((noreturn));
-
-void __vmx_siglongjmp (sigjmp_buf env, int val)
-{
- __vmx__libc_siglongjmp (env, val);
-}
-
-void __vmx_longjmp (jmp_buf env, int val)
-{
- __vmx__libc_longjmp (env, val);
-}
-default_symbol_version (__vmx_longjmp,longjmp,GLIBC_2.3.4);
-default_symbol_version (__vmx_siglongjmp,siglongjmp,GLIBC_2.3.4);
-#endif /* SHARED */
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/pt-sigsuspend.c b/linuxthreads/sysdeps/unix/sysv/linux/pt-sigsuspend.c
deleted file mode 100644
index 5528c55ca5..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/pt-sigsuspend.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Internal sigsuspend system call for LinuxThreads. Generic Linux version.
- Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <errno.h>
-#include <signal.h>
-#include <unistd.h>
-
-#include <sysdep.h>
-#include <sys/syscall.h>
-#include <linuxthreads/internals.h>
-
-#include "kernel-features.h"
-
-void
-__pthread_sigsuspend (const sigset_t *set)
-{
- INTERNAL_SYSCALL_DECL (err);
-#if !__ASSUME_REALTIME_SIGNALS
- static int __pthread_missing_rt_sigs;
-
-# ifdef __NR_rt_sigsuspend
- /* First try the RT signals. */
- if (!__pthread_missing_rt_sigs)
- {
- /* XXX The size argument hopefully will have to be changed to the
- real size of the user-level sigset_t. */
- int r;
- r = INTERNAL_SYSCALL (rt_sigsuspend, err, 2, set, _NSIG / 8);
- if (INTERNAL_SYSCALL_ERRNO (r, err) != ENOSYS)
- return;
-
- __pthread_missing_rt_sigs = 1;
- }
-# endif
-
- INTERNAL_SYSCALL (sigsuspend, err, 3, 0, 0, set->__val[0]);
-#else
- INTERNAL_SYSCALL (rt_sigsuspend, err, 2, set, _NSIG / 8);
-#endif
-}
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/raise.c b/linuxthreads/sysdeps/unix/sysv/linux/raise.c
deleted file mode 100644
index 9dad2b2697..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/raise.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Copyright (C) 1991, 1996, 2002, 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <signal.h>
-#include <unistd.h>
-#include <bits/libc-lock.h>
-
-#ifndef SHARED
-weak_extern (__pthread_raise)
-#endif
-
-/* Raise the signal SIG. */
-int
-raise (sig)
- int sig;
-{
- return __libc_maybe_call2 (pthread_raise, (sig),
- __kill (__getpid (), sig));
-}
-libc_hidden_def (raise)
-weak_alias (raise, gsignal)
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/register-atfork.c b/linuxthreads/sysdeps/unix/sysv/linux/register-atfork.c
deleted file mode 100644
index e4490e73e9..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/register-atfork.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <errno.h>
-#include <stdlib.h>
-#include "fork.h"
-
-
-int
-__register_atfork (prepare, parent, child, dso_handle)
- void (*prepare) (void);
- void (*parent) (void);
- void (*child) (void);
- void *dso_handle;
-{
- struct fork_handler *new_prepare = NULL;
- struct fork_handler *new_parent = NULL;
- struct fork_handler *new_child = NULL;
-
- if (prepare != NULL)
- {
- new_prepare = (struct fork_handler *) malloc (sizeof (*new_prepare));
- if (new_prepare == NULL)
- goto out1;
-
- new_prepare->handler = prepare;
- new_prepare->dso_handle = dso_handle;
- }
-
- if (parent != NULL)
- {
- new_parent = (struct fork_handler *) malloc (sizeof (*new_parent));
- if (new_parent == NULL)
- goto out2;
-
- new_parent->handler = parent;
- new_parent->dso_handle = dso_handle;
- }
-
- if (child != NULL)
- {
- new_child = (struct fork_handler *) malloc (sizeof (*new_child));
- if (new_child == NULL)
- {
- free (new_parent);
- out2:
- free (new_prepare);
- out1:
- return errno;
- }
-
- new_child->handler = child;
- new_child->dso_handle = dso_handle;
- }
-
- /* Get the lock to not conflict with running forks. */
- __libc_lock_lock (__fork_block.lock);
-
- /* Now that we have all the handlers allocate enqueue them. */
- if (new_prepare != NULL)
- list_add_tail (&new_prepare->list, &__fork_block.prepare_list);
- if (new_parent != NULL)
- list_add_tail (&new_parent->list, &__fork_block.parent_list);
- if (new_child != NULL)
- list_add_tail (&new_child->list, &__fork_block.child_list);
-
- /* Release the lock. */
- __libc_lock_unlock (__fork_block.lock);
-
- return 0;
-}
-libc_hidden_def (__register_atfork)
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/s390/bits/typesizes.h b/linuxthreads/sysdeps/unix/sysv/linux/s390/bits/typesizes.h
deleted file mode 100644
index bee7639f06..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/s390/bits/typesizes.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* bits/typesizes.h -- underlying types for *_t. Linux/s390 version.
- Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _BITS_TYPES_H
-# error "Never include <bits/typesizes.h> directly; use <sys/types.h> instead."
-#endif
-
-#ifndef _BITS_TYPESIZES_H
-#define _BITS_TYPESIZES_H 1
-
-/* See <bits/types.h> for the meaning of these macros. This file exists so
- that <bits/types.h> need not vary across different GNU platforms. */
-
-#define __DEV_T_TYPE __UQUAD_TYPE
-#define __UID_T_TYPE __U32_TYPE
-#define __GID_T_TYPE __U32_TYPE
-#define __INO_T_TYPE __ULONGWORD_TYPE
-#define __INO64_T_TYPE __UQUAD_TYPE
-#define __MODE_T_TYPE __U32_TYPE
-#define __NLINK_T_TYPE __UWORD_TYPE
-#define __OFF_T_TYPE __SLONGWORD_TYPE
-#define __OFF64_T_TYPE __SQUAD_TYPE
-#define __PID_T_TYPE __S32_TYPE
-#define __RLIM_T_TYPE __ULONGWORD_TYPE
-#define __RLIM64_T_TYPE __UQUAD_TYPE
-#define __BLKCNT_T_TYPE __SLONGWORD_TYPE
-#define __BLKCNT64_T_TYPE __SQUAD_TYPE
-#define __FSBLKCNT_T_TYPE __ULONGWORD_TYPE
-#define __FSBLKCNT64_T_TYPE __UQUAD_TYPE
-#define __FSFILCNT_T_TYPE __ULONGWORD_TYPE
-#define __FSFILCNT64_T_TYPE __UQUAD_TYPE
-#define __ID_T_TYPE __U32_TYPE
-#define __CLOCK_T_TYPE __SLONGWORD_TYPE
-#define __TIME_T_TYPE __SLONGWORD_TYPE
-#define __USECONDS_T_TYPE __U32_TYPE
-#define __SUSECONDS_T_TYPE __SLONGWORD_TYPE
-#define __DADDR_T_TYPE __S32_TYPE
-#define __SWBLK_T_TYPE __SLONGWORD_TYPE
-#define __KEY_T_TYPE __S32_TYPE
-#define __CLOCKID_T_TYPE __S32_TYPE
-#define __TIMER_T_TYPE __S32_TYPE
-#define __BLKSIZE_T_TYPE __SLONGWORD_TYPE
-#define __FSID_T_TYPE struct { int __val[2]; }
-#if defined __GNUC__ && __GNUC__ <= 2
-/* Compatibility with g++ 2.95.x. */
-#define __SSIZE_T_TYPE __SWORD_TYPE
-#else
-/* size_t is unsigned long int on s390 -m31. */
-#define __SSIZE_T_TYPE __SLONGWORD_TYPE
-#endif
-
-/* Number of descriptors that can fit in an `fd_set'. */
-#define __FD_SETSIZE 1024
-
-
-#endif /* bits/typesizes.h */
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/pt-initfini.c b/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/pt-initfini.c
deleted file mode 100644
index b7d901c4c6..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/pt-initfini.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/* Special .init and .fini section support for S/390.
- Copyright (C) 2000, 2001 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 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.)
-
- The GNU C Library is distributed in the hope that it will be
- useful, but WITHOUT ANY WARRANTY; without even the implied warranty
- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General 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,
- write to the Free Software Foundation, 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* This file is compiled into assembly code which is then munged by a sed
- script into two files: crti.s and crtn.s.
-
- * crti.s puts a function prologue at the beginning of the
- .init and .fini sections and defines global symbols for
- those addresses, so they can be called as functions.
-
- * crtn.s puts the corresponding function epilogues
- in the .init and .fini sections. */
-
-__asm__ ("\
-\n\
-#include \"defs.h\"\n\
-\n\
-/*@HEADER_ENDS*/\n\
-\n\
-/*@TESTS_BEGIN*/\n\
-\n\
-/*@TESTS_END*/\n\
-\n\
-/*@_init_PROLOG_BEGINS*/\n\
-\n\
- .section .init\n\
-#NO_APP\n\
- .align 4\n\
-.globl _init\n\
- .type _init,@function\n\
-_init:\n\
-# leaf function 0\n\
-# automatics 0\n\
-# outgoing args 0\n\
-# need frame pointer 0\n\
-# call alloca 0\n\
-# has varargs 0\n\
-# incoming args (stack) 0\n\
-# function length 36\n\
- STM 6,15,24(15)\n\
- BRAS 13,.LTN1_0\n\
-.LT1_0:\n\
-.LC13:\n\
- .long __pthread_initialize_minimal@PLT-.LT1_0\n\
-.LC14:\n\
- .long __gmon_start__@GOT\n\
-.LC15:\n\
- .long _GLOBAL_OFFSET_TABLE_-.LT1_0\n\
-.LTN1_0:\n\
- LR 1,15\n\
- AHI 15,-96\n\
- ST 1,0(15)\n\
- L 12,.LC15-.LT1_0(13)\n\
- AR 12,13\n\
- L 1,.LC13-.LT1_0(13)\n\
- LA 1,0(1,13)\n\
- BASR 14,1\n\
- L 1,.LC14-.LT1_0(13)\n\
- L 1,0(1,12)\n\
- LTR 1,1\n\
- JE .L22\n\
- BASR 14,1\n\
-.L22:\n\
-#APP\n\
- .align 4,0x07\n\
- END_INIT\n\
-\n\
-/*@_init_PROLOG_ENDS*/\n\
-\n\
-/*@_init_EPILOG_BEGINS*/\n\
- .align 4\n\
- .section .init\n\
-#NO_APP\n\
- .align 4\n\
- L 4,152(15)\n\
- LM 6,15,120(15)\n\
- BR 4\n\
-#APP\n\
- END_INIT\n\
-\n\
-/*@_init_EPILOG_ENDS*/\n\
-\n\
-/*@_fini_PROLOG_BEGINS*/\n\
- .section .fini\n\
-#NO_APP\n\
- .align 4\n\
-.globl _fini\n\
- .type _fini,@function\n\
-_fini:\n\
-# leaf function 0\n\
-# automatics 0\n\
-# outgoing args 0\n\
-# need frame pointer 0\n\
-# call alloca 0\n\
-# has varargs 0\n\
-# incoming args (stack) 0\n\
-# function length 30\n\
- STM 6,15,24(15)\n\
- BRAS 13,.LTN2_0\n\
-.LT2_0:\n\
-.LC17:\n\
- .long _GLOBAL_OFFSET_TABLE_-.LT2_0\n\
-.LTN2_0:\n\
- LR 1,15\n\
- AHI 15,-96\n\
- ST 1,0(15)\n\
- L 12,.LC17-.LT2_0(13)\n\
- AR 12,13\n\
-#APP\n\
- .align 4,0x07\n\
- END_FINI\n\
-\n\
-/*@_fini_PROLOG_ENDS*/\n\
-\n\
-/*@_fini_EPILOG_BEGINS*/\n\
- .align 4\n\
- .section .fini\n\
-#NO_APP\n\
- .align 4\n\
- L 4,152(15)\n\
- LM 6,15,120(15)\n\
- BR 4\n\
-#APP\n\
- END_FINI\n\
-\n\
-/*@_fini_EPILOG_ENDS*/\n\
-\n\
-/*@TRAILER_BEGINS*/\
-");
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h
deleted file mode 100644
index 06f7aed7dc..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/* Copyright (C) 2003, 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <linuxthreads/internals.h>
-#endif
-
-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-
-# if !defined NOT_IN_libc || defined IS_IN_libpthread
-
-# define PSEUDO_CANCEL(name, syscall_name, args) \
-L(pseudo_cancel): \
- STM_##args \
- stm %r12,%r15,48(%r15); \
- lr %r14,%r15; \
- ahi %r15,-96; \
- st %r14,0(%r15); \
- basr %r13,0; \
-0: l %r1,1f-0b(%r13); \
- bas %r14,0(%r1,%r13); \
- lr %r0,%r2; \
- LM_##args \
- DO_CALL(syscall_name, args); \
- l %r1,2f-0b(%r13); \
- lr %r12,%r2; \
- lr %r2,%r0; \
- bas %r14,0(%r1,%r13); \
- lr %r2,%r12; \
- lm %r12,%r15,48+96(%r15); \
- j L(pseudo_check); \
-1: .long CENABLE-0b; \
-2: .long CDISABLE-0b;
-
-# else /* !libc.so && !libpthread.so */
-
-# define PSEUDO_CANCEL(name, syscall_name, args) \
-L(pseudo_cancel): \
- STM_##args \
- stm %r11,%r15,44(%r15); \
- lr %r14,%r15; \
- ahi %r15,-96; \
- st %r14,0(%r15); \
- basr %r13,0; \
-0: l %r12,3f-0b(%r13); \
- l %r1,1f-0b(%r13); \
- la %r12,0(%r12,%r13); \
- bas %r14,0(%r1,%r13); \
- lr %r0,%r2; \
- LM_##args \
- DO_CALL(syscall_name, args); \
- l %r1,2f-0b(%r13); \
- lr %r11,%r2; \
- lr %r2,%r0; \
- bas %r14,0(%r1,%r13); \
- lr %r2,%r11; \
- lm %r11,%r15,44+96(%r15); \
- j L(pseudo_check); \
-1: .long CENABLE@PLT-0b; \
-2: .long CDISABLE@PLT-0b; \
-3: .long _GLOBAL_OFFSET_TABLE_-0b;
-
-# endif
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
-PSEUDO_CANCEL(name, syscall_name, args) \
-ENTRY(name) \
- SINGLE_THREAD_P(%r1) \
- jne L(pseudo_cancel); \
- DO_CALL(syscall_name, args); \
-L(pseudo_check): \
- lhi %r4,-4095; \
- clr %r2,%r4; \
- jnl SYSCALL_ERROR_LABEL; \
-L(pseudo_end):
-
-# ifdef IS_IN_libpthread
-# define CENABLE __pthread_enable_asynccancel
-# define CDISABLE __pthread_disable_asynccancel
-# elif !defined NOT_IN_libc
-# define CENABLE __libc_enable_asynccancel
-# define CDISABLE __libc_disable_asynccancel
-# else
-# define CENABLE __librt_enable_asynccancel
-# define CDISABLE __librt_disable_asynccancel
-# endif
-
-#define STM_0 /* Nothing */
-#define STM_1 st %r2,8(%r15);
-#define STM_2 stm %r2,%r3,8(%r15);
-#define STM_3 stm %r2,%r4,8(%r15);
-#define STM_4 stm %r2,%r5,8(%r15);
-#define STM_5 stm %r2,%r5,8(%r15);
-
-#define LM_0 /* Nothing */
-#define LM_1 l %r2,8+96(%r15);
-#define LM_2 lm %r2,%r3,8+96(%r15);
-#define LM_3 lm %r2,%r4,8+96(%r15);
-#define LM_4 lm %r2,%r5,8+96(%r15);
-#define LM_5 lm %r2,%r5,8+96(%r15);
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- p_header.data.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P(reg) \
- ear reg,%a0; \
- icm reg,15,MULTIPLE_THREADS_OFFSET(reg);
-# endif
-
-#elif !defined __ASSEMBLER__
-
-/* This code should never be used but we define it anyhow. */
-# define SINGLE_THREAD_P (1)
-
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/vfork.S
deleted file mode 100644
index 6dfeca86d4..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/vfork.S
+++ /dev/null
@@ -1,69 +0,0 @@
-/* Copyright (C) 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep-cancel.h>
-#define _ERRNO_H 1
-#include <bits/errno.h>
-
-/* Clone the calling process, but without copying the whole address space.
- The calling process is suspended until the new process exits or is
- replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
- and the process ID of the new process to the old process. */
-
-ENTRY (__vfork)
- basr %r1,0
-0:
-#ifdef SHARED
- al %r1,4f-0b(%r1)
- l %r1,0(%r1)
- ltr %r1,%r1
-#else
- icm %r1,15,4f-0b(%r1)
-#endif
- jne 1f
-
- /* Do vfork system call. */
- svc SYS_ify (vfork)
-
- /* Check for error. */
- lhi %r4,-4095
- clr %r2,%r4
- jnl SYSCALL_ERROR_LABEL
-
- /* Normal return. */
- br %r14
-1:
- basr %r1,0
-2:
- al %r1,3f-2b(%r1)
- br %r1
-3:
- .long HIDDEN_JUMPTARGET(__fork)-2b
-4:
-#ifdef SHARED
- .long __libc_pthread_functions-0b
-#else
- .weak pthread_create
- .long pthread_create
-#endif
-PSEUDO_END(__vfork)
-
-libc_hidden_def (__vfork)
-
-weak_alias (__vfork, vfork)
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-initfini.c b/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-initfini.c
deleted file mode 100644
index 540443e6a3..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-initfini.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/* Special .init and .fini section support for 64 bit S/390.
- Copyright (C) 2001 Free Software Foundation, Inc.
- Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
- 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 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.)
-
- The GNU C Library is distributed in the hope that it will be
- useful, but WITHOUT ANY WARRANTY; without even the implied warranty
- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General 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,
- write to the Free Software Foundation, 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* This file is compiled into assembly code which is then munged by a sed
- script into two files: crti.s and crtn.s.
-
- * crti.s puts a function prologue at the beginning of the
- .init and .fini sections and defines global symbols for
- those addresses, so they can be called as functions.
-
- * crtn.s puts the corresponding function epilogues
- in the .init and .fini sections. */
-
-__asm__ ("\
-\n\
-#include \"defs.h\"\n\
-\n\
-/*@HEADER_ENDS*/\n\
-\n\
-/*@TESTS_BEGIN*/\n\
-\n\
-/*@TESTS_END*/\n\
-\n\
-/*@_init_PROLOG_BEGINS*/\n\
-\n\
- .section .init\n\
-#NO_APP\n\
- .align 4\n\
-.globl _init\n\
- .type _init,@function\n\
-_init:\n\
-# leaf function 0\n\
-# automatics 0\n\
-# outgoing args 0\n\
-# need frame pointer 0\n\
-# call alloca 0\n\
-# has varargs 0\n\
-# incoming args (stack) 0\n\
-# function length 36\n\
- STMG 6,15,48(15)\n\
- LGR 1,15\n\
- AGHI 15,-160\n\
- STG 1,0(15)\n\
- LARL 12,_GLOBAL_OFFSET_TABLE_\n\
- BRASL 14,__pthread_initialize_minimal@PLT\n\
- LARL 1,__gmon_start__@GOTENT\n\
- LG 1,0(1)\n\
- LTGR 1,1\n\
- JE .L22\n\
- BASR 14,1\n\
-.L22:\n\
-#APP\n\
- .align 4,0x07\n\
- END_INIT\n\
-\n\
-/*@_init_PROLOG_ENDS*/\n\
-\n\
-/*@_init_EPILOG_BEGINS*/\n\
- .align 4\n\
- .section .init\n\
-#NO_APP\n\
- .align 4\n\
- LG 4,272(15)\n\
- LMG 6,15,208(15)\n\
- BR 4\n\
-#APP\n\
- END_INIT\n\
-\n\
-/*@_init_EPILOG_ENDS*/\n\
-\n\
-/*@_fini_PROLOG_BEGINS*/\n\
- .section .fini\n\
-#NO_APP\n\
- .align 4\n\
-.globl _fini\n\
- .type _fini,@function\n\
-_fini:\n\
-# leaf function 0\n\
-# automatics 0\n\
-# outgoing args 0\n\
-# need frame pointer 0\n\
-# call alloca 0\n\
-# has varargs 0\n\
-# incoming args (stack) 0\n\
-# function length 30\n\
- STMG 6,15,48(15)\n\
- LGR 1,15\n\
- AGHI 15,-160\n\
- STG 1,0(15)\n\
- LARL 12,_GLOBAL_OFFSET_TABLE_\n\
-#APP\n\
- .align 4,0x07\n\
- END_FINI\n\
-\n\
-/*@_fini_PROLOG_ENDS*/\n\
-\n\
-/*@_fini_EPILOG_BEGINS*/\n\
- .align 4\n\
- .section .fini\n\
-#NO_APP\n\
- .align 4\n\
- LG 4,272(15)\n\
- LMG 6,15,208(15)\n\
- BR 4\n\
-#APP\n\
- END_FINI\n\
-\n\
-/*@_fini_EPILOG_ENDS*/\n\
-\n\
-/*@TRAILER_BEGINS*/\n\
- ");
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-sigsuspend.c b/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-sigsuspend.c
deleted file mode 100644
index d57283ad23..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-sigsuspend.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "../../ia64/pt-sigsuspend.c"
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h
deleted file mode 100644
index f71ef3f689..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/* Copyright (C) 2003, 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <linuxthreads/internals.h>
-#endif
-
-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
-L(pseudo_cancel): \
- STM_##args \
- stmg %r13,%r15,104(%r15); \
- lgr %r14,%r15; \
- aghi %r15,-160; \
- stg %r14,0(%r15); \
- brasl %r14,CENABLE; \
- lgr %r0,%r2; \
- LM_##args \
- DO_CALL(syscall_name, args); \
- lgr %r13,%r2; \
- lgr %r2,%r0; \
- brasl %r14,CDISABLE; \
- lgr %r2,%r13; \
- lmg %r13,%r15,104+160(%r15); \
- j L(pseudo_check); \
-ENTRY(name) \
- SINGLE_THREAD_P \
- jne L(pseudo_cancel); \
- DO_CALL(syscall_name, args); \
-L(pseudo_check): \
- lghi %r4,-4095; \
- clgr %r2,%r4; \
- jgnl SYSCALL_ERROR_LABEL; \
-L(pseudo_end):
-
-# ifdef IS_IN_libpthread
-# define CENABLE __pthread_enable_asynccancel
-# define CDISABLE __pthread_disable_asynccancel
-# define __local_multiple_threads __pthread_multiple_threads
-# elif !defined NOT_IN_libc
-# define CENABLE __libc_enable_asynccancel
-# define CDISABLE __libc_disable_asynccancel
-# define __local_multiple_threads __libc_multiple_threads
-# else
-# define CENABLE __librt_enable_asynccancel@PLT
-# define CDISABLE __librt_disable_asynccancel@PLT
-# endif
-
-#define STM_0 /* Nothing */
-#define STM_1 stg %r2,16(%r15);
-#define STM_2 stmg %r2,%r3,16(%r15);
-#define STM_3 stmg %r2,%r4,16(%r15);
-#define STM_4 stmg %r2,%r5,16(%r15);
-#define STM_5 stmg %r2,%r5,16(%r15);
-
-#define LM_0 /* Nothing */
-#define LM_1 lg %r2,16+160(%r15);
-#define LM_2 lmg %r2,%r3,16+160(%r15);
-#define LM_3 lmg %r2,%r4,16+160(%r15);
-#define LM_4 lmg %r2,%r5,16+160(%r15);
-#define LM_5 lmg %r2,%r5,16+160(%r15);
-
-# if !defined NOT_IN_libc || defined IS_IN_libpthread
-# ifndef __ASSEMBLER__
-extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P \
- __builtin_expect (__local_multiple_threads == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- larl %r1,__local_multiple_threads; \
- icm %r0,15,0(%r1);
-# endif
-
-# else
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- p_header.data.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- ear %r1,%a0; \
- sllg %r1,%r1,32; \
- ear %r1,%a1; \
- icm %r1,15,MULTIPLE_THREADS_OFFSET(%r1);
-# endif
-
-# endif
-
-#elif !defined __ASSEMBLER__
-
-/* This code should never be used but we define it anyhow. */
-# define SINGLE_THREAD_P (1)
-
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/vfork.S
deleted file mode 100644
index 199f0017ff..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/vfork.S
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright (C) 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep-cancel.h>
-#define _ERRNO_H 1
-#include <bits/errno.h>
-
-/* Clone the calling process, but without copying the whole address space.
- The calling process is suspended until the new process exits or is
- replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
- and the process ID of the new process to the old process. */
-
-ENTRY (__vfork)
-#ifdef SHARED
- larl %r1,__libc_pthread_functions
- lg %r1,0(%r1)
-#else
- .weak pthread_create
- larl %r1,pthread_create
-#endif
- ltgr %r1,%r1
- jgne HIDDEN_JUMPTARGET(__fork)
-
- /* Do vfork system call. */
- svc SYS_ify (vfork)
-
- /* Check for error. */
- lghi %r4,-4095
- clgr %r2,%r4
- jgnl SYSCALL_ERROR_LABEL
-
- /* Normal return. */
- br %r14
-PSEUDO_END(__vfork)
-
-libc_hidden_def (__vfork)
-
-weak_alias (__vfork, vfork)
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sh/pt-initfini.c b/linuxthreads/sysdeps/unix/sysv/linux/sh/pt-initfini.c
deleted file mode 100644
index 1cdb98f0f7..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/sh/pt-initfini.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/* Special .init and .fini section support for SH. Linuxthread version.
- Copyright (C) 2000, 2001, 2003 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 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.)
-
- The GNU C Library is distributed in the hope that it will be
- useful, but WITHOUT ANY WARRANTY; without even the implied warranty
- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General 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,
- write to the Free Software Foundation, 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* This file is compiled into assembly code which is then munged by a sed
- script into two files: crti.s and crtn.s.
-
- * crti.s puts a function prologue at the beginning of the
- .init and .fini sections and defines global symbols for
- those addresses, so they can be called as functions.
-
- * crtn.s puts the corresponding function epilogues
- in the .init and .fini sections. */
-
-__asm__ ("\n\
-\n\
-#include \"defs.h\"\n\
-\n\
-/*@HEADER_ENDS*/\n\
-\n\
-/*@TESTS_BEGIN*/\n\
-\n\
-/*@TESTS_END*/\n\
-\n\
-/*@_init_PROLOG_BEGINS*/\n\
- .section .init\n\
- .align 5\n\
- .global _init\n\
- .type _init,@function\n\
-_init:\n\
- mov.l r12,@-r15\n\
- mov.l r14,@-r15\n\
- sts.l pr,@-r15\n\
- mova .L22,r0\n\
- mov.l .L22,r12\n\
- add r0,r12\n\
- mova .L24,r0\n\
- mov.l .L24,r1\n\
- add r0,r1\n\
- jsr @r1\n\
- nop\n\
- mova .L23,r0\n\
- mov.l .L23,r1\n\
- add r0,r1\n\
- jsr @r1\n\
- mov r15,r14\n\
- bra 1f\n\
- nop\n\
- .align 2\n\
-.L22:\n\
- .long _GLOBAL_OFFSET_TABLE_\n\
-.L23:\n\
- .long __gmon_start__@PLT\n\
-.L24:\n\
- .long __pthread_initialize_minimal@PLT\n\
-1:\n\
- ALIGN\n\
- END_INIT\n\
-\n\
-/*@_init_PROLOG_ENDS*/\n\
-\n\
-/*@_init_EPILOG_BEGINS*/\n\
- .section .init\n\
- mov r14,r15\n\
- lds.l @r15+,pr\n\
- mov.l @r15+,r14\n\
- rts \n\
- mov.l @r15+,r12\n\
- END_INIT\n\
- .section .text\n\
- .align 5\n\
- .weak __gmon_start__\n\
- .type __gmon_start__,@function\n\
-__gmon_start__:\n\
- mov.l r14,@-r15\n\
- mov r15,r14\n\
- mov r14,r15\n\
- rts \n\
- mov.l @r15+,r14\n\
- \n\
-/*@_init_EPILOG_ENDS*/\n\
-\n\
-/*@_fini_PROLOG_BEGINS*/\n\
- .section .fini\n\
- .align 5\n\
- .global _fini\n\
- .type _fini,@function\n\
-_fini:\n\
- mov.l r12,@-r15\n\
- mov.l r14,@-r15\n\
- sts.l pr,@-r15\n\
- mova .L27,r0\n\
- mov.l .L27,r12\n\
- add r0,r12\n\
- mov r15,r14\n\
- ALIGN\n\
- END_FINI\n\
- bra 1f\n\
- nop\n\
- .align 2\n\
-.L27:\n\
- .long _GLOBAL_OFFSET_TABLE_\n\
-1:\n\
-/*@_fini_PROLOG_ENDS*/\n\
-\n\
-/*@_fini_EPILOG_BEGINS*/\n\
- .section .fini\n\
- mov r14,r15\n\
- lds.l @r15+,pr\n\
- mov.l @r15+,r14\n\
- rts \n\
- mov.l @r15+,r12\n\
-\n\
- END_FINI\n\
- \n\
-/*@_fini_EPILOG_ENDS*/\n\
-\n\
-/*@TRAILER_BEGINS*/\n\
-");
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sh/smp.h b/linuxthreads/sysdeps/unix/sysv/linux/sh/smp.h
deleted file mode 100644
index 2c0cbe99ac..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/sh/smp.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Determine whether the host has multiple processors. SH version.
- Copyright (C) 2002 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-static inline int
-is_smp_system (void)
-{
- return 0;
-}
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h
deleted file mode 100644
index 03c6fedbfe..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h
+++ /dev/null
@@ -1,227 +0,0 @@
-/* Copyright (C) 2003, 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-#include <tls.h>
-#include <pt-machine.h>
-#ifndef __ASSEMBLER__
-# include <linuxthreads/internals.h>
-#endif
-
-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-
-# define _IMM12 #-12
-# define _IMM16 #-16
-# define _IMP16 #16
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
- ENTRY (name); \
- SINGLE_THREAD_P; \
- bf .Lpseudo_cancel; \
- DO_CALL (syscall_name, args); \
- mov r0,r1; \
- mov _IMM12,r2; \
- shad r2,r1; \
- not r1,r1; \
- tst r1,r1; \
- bt .Lsyscall_error; \
- bra .Lpseudo_end; \
- nop; \
- .Lpseudo_cancel: \
- sts.l pr,@-r15; \
- add _IMM16,r15; \
- SAVE_ARGS_##args; \
- CENABLE; \
- LOAD_ARGS_##args; \
- add _IMP16,r15; \
- lds.l @r15+,pr; \
- DO_CALL(syscall_name, args); \
- SYSCALL_INST_PAD; \
- sts.l pr,@-r15; \
- mov.l r0,@-r15; \
- CDISABLE; \
- mov.l @r15+,r0; \
- lds.l @r15+,pr; \
- mov r0,r1; \
- mov _IMM12,r2; \
- shad r2,r1; \
- not r1,r1; \
- tst r1,r1; \
- bf .Lpseudo_end; \
- .Lsyscall_error: \
- SYSCALL_ERROR_HANDLER; \
- .Lpseudo_end:
-
-# undef PSEUDO_END
-# define PSEUDO_END(sym) \
- END (sym)
-
-# define SAVE_ARGS_0 /* Nothing. */
-# define SAVE_ARGS_1 SAVE_ARGS_0; mov.l r4,@(0,r15)
-# define SAVE_ARGS_2 SAVE_ARGS_1; mov.l r5,@(4,r15)
-# define SAVE_ARGS_3 SAVE_ARGS_2; mov.l r6,@(8,r15)
-# define SAVE_ARGS_4 SAVE_ARGS_3; mov.l r7,@(12,r15)
-# define SAVE_ARGS_5 SAVE_ARGS_4
-# define SAVE_ARGS_6 SAVE_ARGS_5
-
-# define LOAD_ARGS_0 /* Nothing. */
-# define LOAD_ARGS_1 LOAD_ARGS_0; mov.l @(0,r15),r4
-# define LOAD_ARGS_2 LOAD_ARGS_1; mov.l @(4,r15),r5
-# define LOAD_ARGS_3 LOAD_ARGS_2; mov.l @(8,r15),r6
-# define LOAD_ARGS_4 LOAD_ARGS_3; mov.l @(12,r15),r7
-# define LOAD_ARGS_5 LOAD_ARGS_4
-# define LOAD_ARGS_6 LOAD_ARGS_5
-
-# ifdef IS_IN_libpthread
-# define __local_enable_asynccancel __pthread_enable_asynccancel
-# define __local_disable_asynccancel __pthread_disable_asynccancel
-# define __local_multiple_threads __pthread_multiple_threads
-# elif !defined NOT_IN_libc
-# define __local_enable_asynccancel __libc_enable_asynccancel
-# define __local_disable_asynccancel __libc_disable_asynccancel
-# define __local_multiple_threads __libc_multiple_threads
-# else
-# define __local_enable_asynccancel __librt_enable_asynccancel
-# define __local_disable_asynccancel __librt_disable_asynccancel
-# define __local_multiple_threads __librt_multiple_threads
-# endif
-
-# if defined IS_IN_librt && defined PIC
-# define CENABLE \
- mov.l r12,@-r15; \
- mov.l 1f,r12; \
- mova 1f,r0; \
- add r0,r12; \
- mov.l 2f,r0; \
- bsrf r0; \
- nop; \
- 0: bra 3f; \
- mov r0,r2; \
- .align 2; \
- 1: .long _GLOBAL_OFFSET_TABLE_; \
- 2: .long __local_enable_asynccancel@PLT - (0b-.); \
- 3: mov.l @r15+,r12
-
-# define CDISABLE \
- mov.l r12,@-r15; \
- mov.l 1f,r12; \
- mova 1f,r0; \
- add r0,r12; \
- mov.l 2f,r0; \
- bsrf r0; \
- mov r2,r4; \
- 0: bra 3f; \
- nop; \
- .align 2; \
- 1: .long _GLOBAL_OFFSET_TABLE_; \
- 2: .long __local_disable_asynccancel@PLT - (0b-.); \
- 3: mov.l @r15+,r12
-# else
-# define CENABLE \
- mov.l 1f,r0; \
- bsrf r0; \
- nop; \
- 0: bra 2f; \
- mov r0,r2; \
- .align 2; \
- 1: .long __local_enable_asynccancel - 0b; \
- 2:
-
-# define CDISABLE \
- mov.l 1f,r0; \
- bsrf r0; \
- mov r2,r4; \
- 0: bra 2f; \
- nop; \
- .align 2; \
- 1: .long __local_disable_asynccancel - 0b; \
- 2:
-# endif
-
-# ifndef __ASSEMBLER__
-# if defined FLOATING_STACKS && USE___THREAD && defined PIC
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, p_multiple_threads) == 0, 1)
-# else
-extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
-# endif
-# else
-# if !defined PIC
-# define SINGLE_THREAD_P \
- mov.l 1f,r0; \
- mov.l @r0,r0; \
- bra 2f; \
- tst r0,r0; \
- .align 2; \
- 1: .long __local_multiple_threads; \
- 2:
-# elif defined FLOATING_STACKS && USE___THREAD
-# define SINGLE_THREAD_P \
- stc gbr,r0; \
- mov.w 0f,r1; \
- sub r1,r0; \
- mov.l @(MULTIPLE_THREADS_OFFSET,r0),r0; \
- bra 1f; \
- tst r0,r0; \
- 0: .word TLS_PRE_TCB_SIZE; \
- 1:
-
-# else
-# if !defined NOT_IN_libc || defined IS_IN_libpthread
-# define SINGLE_THREAD_P \
- mov r12,r2; \
- mov.l 0f,r12; \
- mova 0f,r0; \
- add r0,r12; \
- mov.l 1f,r0; \
- mov.l @(r0,r12),r0; \
- mov r2,r12; \
- bra 2f; \
- tst r0,r0; \
- .align 2; \
- 0: .long _GLOBAL_OFFSET_TABLE_; \
- 1: .long __local_multiple_threads@GOTOFF; \
- 2:
-# else
-# define SINGLE_THREAD_P \
- mov r12,r2; \
- mov.l 0f,r12; \
- mova 0f,r0; \
- add r0,r12; \
- mov.l 1f,r0; \
- mov.l @(r0,r12),r0; \
- mov.l @r0,r0; \
- mov r2,r12; \
- bra 2f; \
- tst r0,r0; \
- .align 2; \
- 0: .long _GLOBAL_OFFSET_TABLE_; \
- 1: .long __local_multiple_threads@GOT; \
- 2:
-# endif
-# endif
-# endif
-
-#elif !defined __ASSEMBLER__
-
-/* This code should never be used but we define it anyhow. */
-# define SINGLE_THREAD_P (1)
-
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sh/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/sh/vfork.S
deleted file mode 100644
index f230c01226..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/sh/vfork.S
+++ /dev/null
@@ -1,77 +0,0 @@
-/* Copyright (C) 2003, 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep-cancel.h>
-#define _ERRNO_H 1
-#include <bits/errno.h>
-
-/* Clone the calling process, but without copying the whole address space.
- The calling process is suspended until the new process exits or is
- replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
- and the process ID of the new process to the old process. */
-
-ENTRY (__vfork)
-#ifdef SHARED
- mov.l .Lgot, r1
- mova .Lgot, r0
- add r0, r1
- mov.l .Lpthread_func, r0
- mov.l @(r0,r1), r0
-#else
- mov.l .Lpthread_create, r0
-#endif
- tst r0, r0
- bf .Lhidden_fork
-
- mov.w .L1, r3
- trapa #0x10
- mov r0, r1
- mov #-12, r2
- shad r2, r1
- not r1, r1 // r1=0 means r0 = -1 to -4095
- tst r1, r1 // i.e. error in linux
- bf .Lpseudo_end
- SYSCALL_ERROR_HANDLER
-.Lpseudo_end:
- rts
- nop
-.L1: .word __NR_vfork
- .align 2
-#ifdef SHARED
-.Lgot:
- .long _GLOBAL_OFFSET_TABLE_
-.Lpthread_func:
- .long __libc_pthread_functions@GOTOFF
-#else
-.Lpthread_create:
- .weak pthread_create
- .long pthread_create
-#endif
-
-.Lhidden_fork:
- mov.l .L2, r1
- braf r1
- nop
-1:
- .align 2
-.L2: .long HIDDEN_JUMPTARGET(__fork)-1b
-
-PSEUDO_END (__vfork)
-libc_hidden_def (__vfork)
-
-weak_alias (__vfork, vfork)
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sigwait.c b/linuxthreads/sysdeps/unix/sysv/linux/sigwait.c
deleted file mode 100644
index fdec09455a..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/sigwait.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/* Copyright (C) 1997, 1998, 2000, 2002, 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <errno.h>
-#include <signal.h>
-#define __need_NULL
-#include <stddef.h>
-
-#include <sysdep-cancel.h>
-#include <sys/syscall.h>
-#include <bp-checks.h>
-#include <bits/libc-lock.h>
-
-extern int __syscall_rt_sigtimedwait (const sigset_t *__unbounded, siginfo_t *__unbounded,
- const struct timespec *__unbounded, size_t);
-
-
-/* Return any pending signal or wait for one for the given time. */
-static inline int
-do_sigwait (const sigset_t *set, int *sig)
-{
- int ret;
-
- /* XXX The size argument hopefully will have to be changed to the
- real size of the user-level sigset_t. */
-#ifdef INTERNAL_SYSCALL
- INTERNAL_SYSCALL_DECL (err);
- ret = INTERNAL_SYSCALL (rt_sigtimedwait, err, 4, CHECK_SIGSET (set),
- NULL, NULL, _NSIG / 8);
- if (! INTERNAL_SYSCALL_ERROR_P (ret, err))
- {
- *sig = ret;
- ret = 0;
- }
- else
- ret = INTERNAL_SYSCALL_ERRNO (ret, err);
-#else
- ret = INLINE_SYSCALL (rt_sigtimedwait, 4, CHECK_SIGSET (set),
- NULL, NULL, _NSIG / 8);
- if (ret != -1)
- {
- *sig = ret;
- ret = 0;
- }
- else
- ret = errno;
-#endif
-
- return ret;
-}
-
-#ifndef SHARED
-weak_extern (__pthread_sigwait)
-#endif
-
-int
-__sigwait (set, sig)
- const sigset_t *set;
- int *sig;
-{
-#ifndef NOT_IN_libc
- return __libc_maybe_call2 (pthread_sigwait, (set, sig),
- do_sigwait (set, sig));
-#else
- return do_sigwait (set, sig);
-#endif
-}
-libc_hidden_def (__sigwait)
-weak_alias (__sigwait, sigwait)
-strong_alias (__sigwait, __libc_sigwait)
-
-/* Cancellation is handled in __pthread_sigwait. */
-LIBC_CANCEL_HANDLED ();
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/smp.h b/linuxthreads/sysdeps/unix/sysv/linux/smp.h
deleted file mode 100644
index 81289294b4..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/smp.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Determine whether the host has multiple processors. Linux version.
- Copyright (C) 1996, 2002 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <sys/sysctl.h>
-
-/* 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)
-{
- static const int sysctl_args[] = { CTL_KERN, KERN_VERSION };
- char buf[512];
- size_t reslen = sizeof (buf);
-
- /* Try reading the number using `sysctl' first. */
- if (__sysctl ((int *) sysctl_args,
- sizeof (sysctl_args) / sizeof (sysctl_args[0]),
- buf, &reslen, NULL, 0) < 0)
- {
- /* This was not successful. Now try reading the /proc filesystem. */
- int fd = __open ("/proc/sys/kernel/version", O_RDONLY);
- if (__builtin_expect (fd, 0) == -1
- || (reslen = __read (fd, buf, sizeof (buf))) <= 0)
- /* This also didn't work. We give up and say it's a UP machine. */
- buf[0] = '\0';
-
- __close (fd);
- }
-
- return strstr (buf, "SMP") != NULL;
-}
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sparc/Versions b/linuxthreads/sysdeps/unix/sysv/linux/sparc/Versions
deleted file mode 100644
index d102772482..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/sparc/Versions
+++ /dev/null
@@ -1,6 +0,0 @@
-libpthread {
- GLIBC_2.3.3 {
- # Changed PTHREAD_STACK_MIN.
- pthread_attr_setstack; pthread_attr_setstacksize;
- }
-}
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sparc/aio_cancel.c b/linuxthreads/sysdeps/unix/sysv/linux/sparc/aio_cancel.c
deleted file mode 100644
index 0d6da82919..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/sparc/aio_cancel.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <shlib-compat.h>
-
-#define aio_cancel64 XXX
-#include <aio.h>
-#undef aio_cancel64
-#include <errno.h>
-
-extern __typeof (aio_cancel) __new_aio_cancel;
-extern __typeof (aio_cancel) __old_aio_cancel;
-
-#define aio_cancel __new_aio_cancel
-
-#include <sysdeps/pthread/aio_cancel.c>
-
-#undef aio_cancel
-strong_alias (__new_aio_cancel, __new_aio_cancel64);
-versioned_symbol (librt, __new_aio_cancel, aio_cancel, GLIBC_2_3);
-versioned_symbol (librt, __new_aio_cancel64, aio_cancel64, GLIBC_2_3);
-
-#if SHLIB_COMPAT (librt, GLIBC_2_1, GLIBC_2_3)
-
-#undef ECANCELED
-#define aio_cancel __old_aio_cancel
-#define ECANCELED 125
-
-#include <sysdeps/pthread/aio_cancel.c>
-
-#undef aio_cancel
-strong_alias (__old_aio_cancel, __old_aio_cancel64);
-compat_symbol (librt, __old_aio_cancel, aio_cancel, GLIBC_2_1);
-compat_symbol (librt, __old_aio_cancel64, aio_cancel64, GLIBC_2_1);
-
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h b/linuxthreads/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h
deleted file mode 100644
index 27ffa668f4..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Minimum guaranteed maximum values for system limits. Linux/SPARC version.
- Copyright (C) 1993-1998,2000,2002,2003,2004 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* The kernel header pollutes the namespace with the NR_OPEN symbol
- and defines LINK_MAX although filesystems have different maxima. A
- similar thing is true for OPEN_MAX: the limit can be changed at
- runtime and therefore the macro must not be defined. Remove this
- after including the header if necessary. */
-#ifndef NR_OPEN
-# define __undef_NR_OPEN
-#endif
-#ifndef LINK_MAX
-# define __undef_LINK_MAX
-#endif
-#ifndef OPEN_MAX
-# define __undef_OPEN_MAX
-#endif
-
-/* The kernel sources contain a file with all the needed information. */
-#include <linux/limits.h>
-
-/* Have to remove NR_OPEN? */
-#ifdef __undef_NR_OPEN
-# undef NR_OPEN
-# undef __undef_NR_OPEN
-#endif
-/* Have to remove LINK_MAX? */
-#ifdef __undef_LINK_MAX
-# undef LINK_MAX
-# undef __undef_LINK_MAX
-#endif
-/* Have to remove OPEN_MAX? */
-#ifdef __undef_OPEN_MAX
-# undef OPEN_MAX
-# undef __undef_OPEN_MAX
-#endif
-
-/* The number of data keys per process. */
-#define _POSIX_THREAD_KEYS_MAX 128
-/* This is the value this implementation supports. */
-#define PTHREAD_KEYS_MAX 1024
-
-/* Controlling the iterations of destructors for thread-specific data. */
-#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4
-/* Number of iterations this implementation does. */
-#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS
-
-/* The number of threads per process. */
-#define _POSIX_THREAD_THREADS_MAX 64
-/* This is the value this implementation supports. */
-#define PTHREAD_THREADS_MAX 16384
-
-/* Maximum amount by which a process can descrease its asynchronous I/O
- priority level. */
-#define AIO_PRIO_DELTA_MAX 20
-
-/* Minimum size for a thread. We are free to choose a reasonable value. */
-#define PTHREAD_STACK_MIN 24576
-
-/* Maximum number of POSIX timers available. */
-#define TIMER_MAX 256
-
-/* Maximum number of timer expiration overruns. */
-#define DELAYTIMER_MAX 2147483647
-
-/* Maximum tty name length. */
-#define TTY_NAME_MAX 32
-
-/* Maximum login name length. This is arbitrary. */
-#define LOGIN_NAME_MAX 256
-
-/* Maximum host name length. */
-#define HOST_NAME_MAX 64
-
-/* Maximum message queue priority level. */
-#define MQ_PRIO_MAX 32768
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h b/linuxthreads/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h
deleted file mode 100644
index 7e4253789c..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* bits/typesizes.h -- underlying types for *_t. Linux/SPARC version.
- Copyright (C) 2002, 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _BITS_TYPES_H
-# error "Never include <bits/typesizes.h> directly; use <sys/types.h> instead."
-#endif
-
-#ifndef _BITS_TYPESIZES_H
-#define _BITS_TYPESIZES_H 1
-
-/* See <bits/types.h> for the meaning of these macros. This file exists so
- that <bits/types.h> need not vary across different GNU platforms. */
-
-#define __DEV_T_TYPE __UQUAD_TYPE
-#define __UID_T_TYPE __U32_TYPE
-#define __GID_T_TYPE __U32_TYPE
-#define __INO_T_TYPE __ULONGWORD_TYPE
-#define __INO64_T_TYPE __UQUAD_TYPE
-#define __MODE_T_TYPE __U32_TYPE
-#define __NLINK_T_TYPE __U32_TYPE
-#define __OFF_T_TYPE __SLONGWORD_TYPE
-#define __OFF64_T_TYPE __SQUAD_TYPE
-#define __PID_T_TYPE __S32_TYPE
-#define __RLIM_T_TYPE __ULONGWORD_TYPE
-#define __RLIM64_T_TYPE __UQUAD_TYPE
-#define __BLKCNT_T_TYPE __SLONGWORD_TYPE
-#define __BLKCNT64_T_TYPE __SQUAD_TYPE
-#define __FSBLKCNT_T_TYPE __ULONGWORD_TYPE
-#define __FSBLKCNT64_T_TYPE __UQUAD_TYPE
-#define __FSFILCNT_T_TYPE __ULONGWORD_TYPE
-#define __FSFILCNT64_T_TYPE __UQUAD_TYPE
-#define __ID_T_TYPE __U32_TYPE
-#define __CLOCK_T_TYPE __SLONGWORD_TYPE
-#define __TIME_T_TYPE __SLONGWORD_TYPE
-#define __USECONDS_T_TYPE __U32_TYPE
-#define __SUSECONDS_T_TYPE __S32_TYPE
-#define __DADDR_T_TYPE __S32_TYPE
-#define __SWBLK_T_TYPE __SLONGWORD_TYPE
-#define __KEY_T_TYPE __S32_TYPE
-#define __CLOCKID_T_TYPE __S32_TYPE
-#define __TIMER_T_TYPE __S32_TYPE
-#define __BLKSIZE_T_TYPE __SLONGWORD_TYPE
-#define __FSID_T_TYPE struct { int __val[2]; }
-#define __SSIZE_T_TYPE __SWORD_TYPE
-
-/* Number of descriptors that can fit in an `fd_set'. */
-#define __FD_SETSIZE 1024
-
-
-#endif /* bits/typesizes.h */
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sparc/fork.h b/linuxthreads/sysdeps/unix/sysv/linux/sparc/fork.h
deleted file mode 100644
index 793cb1d5f9..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/sparc/fork.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Copyright (C) 2002 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-
-#define ARCH_FORK() \
-({ \
- register long __o0 __asm__ ("o0"); \
- register long __o1 __asm__ ("o1"); \
- register long __g1 __asm__ ("g1") = __NR_fork; \
- __asm __volatile (__SYSCALL_STRING \
- : "=r" (__g1), "=r" (__o0), "=r" (__o1) \
- : "0" (__g1) \
- : __SYSCALL_CLOBBERS); \
- __o0 == -1 ? __o0 : (__o0 & (__o1 - 1)); \
-})
-
-#include_next <fork.h>
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
deleted file mode 100644
index dd3f52a989..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/* Copyright (C) 2002, 2003, 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <linuxthreads/internals.h>
-#endif
-
-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
-ENTRY(name) \
- ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1; \
- cmp %g1, 0; \
- bne 1f; \
- mov SYS_ify(syscall_name), %g1; \
- ta 0x10; \
- bcs __syscall_error_handler; \
- nop; \
- .subsection 2; \
-1: save %sp, -96, %sp; \
- CENABLE; \
- nop; \
- mov %o0, %l0; \
- COPY_ARGS_##args \
- mov SYS_ify(syscall_name), %g1; \
- ta 0x10; \
- bcs __syscall_error_handler2; \
- mov %o0, %l1; \
- CDISABLE; \
- mov %l0, %o0; \
- jmpl %i7 + 8, %g0; \
- restore %g0, %l1, %o0; \
- .previous; \
- SYSCALL_ERROR_HANDLER \
- SYSCALL_ERROR_HANDLER2
-
-#define SYSCALL_ERROR_HANDLER2 \
-SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler2) \
- .global __errno_location; \
- .type __errno_location,@function; \
- CDISABLE; \
- mov %l0, %o0; \
- call __errno_location; \
- nop; \
- st %l1, [%o0]; \
- jmpl %i7 + 8, %g0; \
- restore %g0, -1, %o0; \
- .previous;
-
-# ifdef IS_IN_libpthread
-# define CENABLE call __pthread_enable_asynccancel
-# define CDISABLE call __pthread_disable_asynccancel
-# elif !defined NOT_IN_libc
-# define CENABLE call __libc_enable_asynccancel
-# define CDISABLE call __libc_disable_asynccancel
-# else
-# define CENABLE call __librt_enable_asynccancel
-# define CDISABLE call __librt_disable_asynccancel
-# endif
-
-#define COPY_ARGS_0 /* Nothing */
-#define COPY_ARGS_1 COPY_ARGS_0 mov %i0, %o0;
-#define COPY_ARGS_2 COPY_ARGS_1 mov %i1, %o1;
-#define COPY_ARGS_3 COPY_ARGS_2 mov %i2, %o2;
-#define COPY_ARGS_4 COPY_ARGS_3 mov %i3, %o3;
-#define COPY_ARGS_5 COPY_ARGS_4 mov %i4, %o4;
-#define COPY_ARGS_6 COPY_ARGS_5 mov %i5, %o5;
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- p_header.data.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
-# endif
-
-#elif !defined __ASSEMBLER__
-
-/* This code should never be used but we define it anyhow. */
-# define SINGLE_THREAD_P (1)
-
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
deleted file mode 100644
index 132da67a14..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep-cancel.h>
-
- .text
-#ifdef SHARED
-.LLGETPC0:
- retl
- add %o7, %o0, %o0
-#endif
-ENTRY(__vfork)
-#ifdef SHARED
- mov %o7, %o1
- sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %o0
- call .LLGETPC0
- add %o0, %lo(_GLOBAL_OFFSET_TABLE_+4), %o0
- sethi %hi(__libc_pthread_functions), %o2
- mov %o1, %o7
- or %o2, %lo(__libc_pthread_functions), %o2
- ld [%o0 + %o2], %o2
- ld [%o2], %o2
- cmp %o2, 0
-#else
- .weak pthread_create
- sethi %hi(pthread_create), %o0
- orcc %o0, %lo(pthread_create), %o0
-#endif
-#if defined SHARED && !defined BROKEN_SPARC_WDISP22
- bne HIDDEN_JUMPTARGET(__fork)
-#else
- bne 1f
-#endif
- mov __NR_vfork, %g1
- ta 0x10
- bcs __syscall_error_handler
- nop
- sub %o1, 1, %o1
- retl
- and %o0, %o1, %o0
-#if !defined SHARED || defined BROKEN_SPARC_WDISP22
-1: mov %o7, %g1
- call HIDDEN_JUMPTARGET(__fork)
- mov %g1, %o7
-#endif
- SYSCALL_ERROR_HANDLER
-PSEUDO_END (__vfork)
-libc_hidden_def (__vfork)
-weak_alias (__vfork, vfork)
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile
deleted file mode 100644
index 90203051ae..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# glibc makefile fragment for linuxthreads on sparc/sparc64.
-
-ifeq ($(subdir),linuxthreads)
-libpthread-routines += ptw-sigprocmask
-endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/pt-sigsuspend.c b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/pt-sigsuspend.c
deleted file mode 100644
index d57283ad23..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/pt-sigsuspend.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "../../ia64/pt-sigsuspend.c"
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
deleted file mode 100644
index 80834292e5..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/* Copyright (C) 2002, 2003, 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <linuxthreads/internals.h>
-#endif
-
-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
-ENTRY(name) \
- ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1; \
- brnz,pn %g1, 1f; \
- mov SYS_ify(syscall_name), %g1; \
- ta 0x6d; \
- bcs,pn %xcc, __syscall_error_handler; \
- nop; \
- .subsection 2; \
-1: save %sp, -192, %sp; \
- CENABLE; \
- nop; \
- mov %o0, %l0; \
- COPY_ARGS_##args \
- mov SYS_ify(syscall_name), %g1; \
- ta 0x6d; \
- bcs,pn %xcc, __syscall_error_handler2; \
- mov %o0, %l1; \
- CDISABLE; \
- mov %l0, %o0; \
- jmpl %i7 + 8, %g0; \
- restore %g0, %l1, %o0; \
- .previous; \
- SYSCALL_ERROR_HANDLER \
- SYSCALL_ERROR_HANDLER2
-
-#define SYSCALL_ERROR_HANDLER2 \
-SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler2) \
- .global __errno_location; \
- .type __errno_location,@function; \
- CDISABLE; \
- mov %l0, %o0; \
- call __errno_location; \
- nop; \
- st %l1, [%o0]; \
- jmpl %i7 + 8, %g0; \
- restore %g0, -1, %o0; \
- .previous;
-
-# ifdef IS_IN_libpthread
-# define CENABLE call __pthread_enable_asynccancel
-# define CDISABLE call __pthread_disable_asynccancel
-# elif !defined NOT_IN_libc
-# define CENABLE call __libc_enable_asynccancel
-# define CDISABLE call __libc_disable_asynccancel
-# else
-# define CENABLE call __librt_enable_asynccancel
-# define CDISABLE call __librt_disable_asynccancel
-# endif
-
-#define COPY_ARGS_0 /* Nothing */
-#define COPY_ARGS_1 COPY_ARGS_0 mov %i0, %o0;
-#define COPY_ARGS_2 COPY_ARGS_1 mov %i1, %o1;
-#define COPY_ARGS_3 COPY_ARGS_2 mov %i2, %o2;
-#define COPY_ARGS_4 COPY_ARGS_3 mov %i3, %o3;
-#define COPY_ARGS_5 COPY_ARGS_4 mov %i4, %o4;
-#define COPY_ARGS_6 COPY_ARGS_5 mov %i5, %o5;
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- p_header.data.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
-# endif
-
-#elif !defined __ASSEMBLER__
-
-/* This code should never be used but we define it anyhow. */
-# define SINGLE_THREAD_P (1)
-
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S
deleted file mode 100644
index 8a6d2771e8..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep-cancel.h>
-
-#ifdef SHARED
-.LLGETPC0:
- retl
- add %o7, %o0, %o0
-#endif
-ENTRY(__vfork)
-#ifdef SHARED
- mov %o7, %o1
- sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %o0
- call .LLGETPC0
- add %o0, %lo(_GLOBAL_OFFSET_TABLE_+4), %o0
- sethi %hi(__libc_pthread_functions), %o2
- mov %o1, %o7
- or %o2, %lo(__libc_pthread_functions), %o2
- ldx [%o0 + %o2], %o2
- ldx [%o2], %o0
-#else
- .weak pthread_create
- sethi %hi(pthread_create), %o0
- or %o0, %lo(pthread_create), %o0
-#endif
-#if defined SHARED && !defined BROKEN_SPARC_WDISP22
- cmp %o0, 0
- bne HIDDEN_JUMPTARGET(__fork)
-#else
- brnz,pn %o0, 1f
-#endif
- mov __NR_vfork, %g1
- ta 0x6d
- bcs,pn %xcc, __syscall_error_handler
- nop
- sub %o1, 1, %o1
- retl
- and %o0, %o1, %o0
-#if !defined SHARED || defined BROKEN_SPARC_WDISP22
-1: mov %o7, %g1
- call HIDDEN_JUMPTARGET(__fork)
- mov %g1, %o7
-#endif
- SYSCALL_ERROR_HANDLER
-PSEUDO_END (__vfork)
-libc_hidden_def (__vfork)
-weak_alias (__vfork, vfork)
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/unregister-atfork.c b/linuxthreads/sysdeps/unix/sysv/linux/unregister-atfork.c
deleted file mode 100644
index dad273fdf5..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/unregister-atfork.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <errno.h>
-#include <stdlib.h>
-#include "fork.h"
-
-
-void
-__unregister_atfork (dso_handle)
- void *dso_handle;
-{
- /* Get the lock to not conflict with running forks. */
- __libc_lock_lock (__fork_block.lock);
-
- list_t *runp;
- list_t *prevp;
-
- list_for_each_prev_safe (runp, prevp, &__fork_block.prepare_list)
- if (list_entry (runp, struct fork_handler, list)->dso_handle == dso_handle)
- list_del (runp);
-
- list_for_each_prev_safe (runp, prevp, &__fork_block.parent_list)
- if (list_entry (runp, struct fork_handler, list)->dso_handle == dso_handle)
- list_del (runp);
-
- list_for_each_prev_safe (runp, prevp, &__fork_block.child_list)
- if (list_entry (runp, struct fork_handler, list)->dso_handle == dso_handle)
- list_del (runp);
-
- /* Release the lock. */
- __libc_lock_unlock (__fork_block.lock);
-}
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/x86_64/Makefile b/linuxthreads/sysdeps/unix/sysv/linux/x86_64/Makefile
deleted file mode 100644
index b5e5d5d480..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/x86_64/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-ifeq ($(subdir),linuxthreads)
-CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions \
- -fno-asynchronous-unwind-tables $(fno-unit-at-a-time)
-endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/x86_64/pt-sigsuspend.c b/linuxthreads/sysdeps/unix/sysv/linux/x86_64/pt-sigsuspend.c
deleted file mode 100644
index 3a0c2afc0f..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/x86_64/pt-sigsuspend.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "../ia64/pt-sigsuspend.c"
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
deleted file mode 100644
index e82e6dfdd8..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/* Copyright (C) 2002, 2003, 2005 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-#include <tls.h>
-#include <pt-machine.h>
-#ifndef __ASSEMBLER__
-# include <linuxthreads/internals.h>
-#endif
-
-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text; \
- ENTRY (name) \
- SINGLE_THREAD_P; \
- jne L(pseudo_cancel); \
- DO_CALL (syscall_name, args); \
- cmpq $-4095, %rax; \
- jae SYSCALL_ERROR_LABEL; \
- ret; \
- L(pseudo_cancel): \
- /* Save registers that might get destroyed. */ \
- SAVESTK_##args \
- PUSHARGS_##args \
- CENABLE \
- /* Restore registers. */ \
- POPARGS_##args \
- /* The return value from CENABLE is argument for CDISABLE. */ \
- movq %rax, (%rsp); \
- movl $SYS_ify (syscall_name), %eax; \
- syscall; \
- movq (%rsp), %rdi; \
- /* Save %rax since it's the error code from the syscall. */ \
- movq %rax, 8(%rsp); \
- CDISABLE \
- movq 8(%rsp), %rax; \
- RESTSTK_##args \
- cmpq $-4095, %rax; \
- jae SYSCALL_ERROR_LABEL; \
- L(pseudo_end):
-
-# define PUSHARGS_0 /* Nothing. */
-# define PUSHARGS_1 PUSHARGS_0 movq %rdi, 8(%rsp);
-# define PUSHARGS_2 PUSHARGS_1 movq %rsi, 16(%rsp);
-# define PUSHARGS_3 PUSHARGS_2 movq %rdx, 24(%rsp);
-# define PUSHARGS_4 PUSHARGS_3 movq %rcx, 32(%rsp);
-# define PUSHARGS_5 PUSHARGS_4 movq %r8, 40(%rsp);
-# define PUSHARGS_6 PUSHARGS_5 movq %r9, 48(%rsp);
-
-# define POPARGS_0 /* Nothing. */
-# define POPARGS_1 POPARGS_0 movq 8(%rsp), %rdi;
-# define POPARGS_2 POPARGS_1 movq 16(%rsp), %rsi;
-# define POPARGS_3 POPARGS_2 movq 24(%rsp), %rdx;
-# define POPARGS_4 POPARGS_3 movq 32(%rsp), %r10;
-# define POPARGS_5 POPARGS_4 movq 40(%rsp), %r8;
-# define POPARGS_6 POPARGS_5 movq 48(%rsp), %r9;
-
-/* We always have to align the stack before calling a function. */
-# define SAVESTK_0 subq $24, %rsp;cfi_adjust_cfa_offset(24);
-# define SAVESTK_1 SAVESTK_0
-# define SAVESTK_2 SAVESTK_1
-# define SAVESTK_3 subq $40, %rsp;cfi_adjust_cfa_offset(40);
-# define SAVESTK_4 SAVESTK_3
-# define SAVESTK_5 subq $56, %rsp;cfi_adjust_cfa_offset(56);
-# define SAVESTK_6 SAVESTK_5
-
-# define RESTSTK_0 addq $24,%rsp;cfi_adjust_cfa_offset(-24);
-# define RESTSTK_1 RESTSTK_0
-# define RESTSTK_2 RESTSTK_1
-# define RESTSTK_3 addq $40, %rsp;cfi_adjust_cfa_offset(-40);
-# define RESTSTK_4 RESTSTK_3
-# define RESTSTK_5 addq $56, %rsp;cfi_adjust_cfa_offset(-56);
-# define RESTSTK_6 RESTSTK_5
-
-# ifdef IS_IN_libpthread
-# define CENABLE call __pthread_enable_asynccancel;
-# define CDISABLE call __pthread_disable_asynccancel;
-# define __local_multiple_threads __pthread_multiple_threads
-# elif !defined NOT_IN_libc
-# define CENABLE call __libc_enable_asynccancel;
-# define CDISABLE call __libc_disable_asynccancel;
-# define __local_multiple_threads __libc_multiple_threads
-# else
-# define CENABLE call __librt_enable_asynccancel@plt;
-# define CDISABLE call __librt_disable_asynccancel@plt;
-# endif
-
-# if defined IS_IN_libpthread || !defined NOT_IN_libc
-# ifndef __ASSEMBLER__
-extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P \
- __builtin_expect (__local_multiple_threads == 0, 1)
-# else
-# define SINGLE_THREAD_P cmpl $0, __local_multiple_threads(%rip)
-# endif
-
-# else
-
-# ifndef __ASSEMBLER__
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- p_header.data.multiple_threads) == 0, 1)
-# else
-# define SINGLE_THREAD_P cmpl $0, %fs:MULTIPLE_THREADS_OFFSET
-# endif
-
-# endif
-
-#elif !defined __ASSEMBLER__
-
-/* This code should never be used but we define it anyhow. */
-# define SINGLE_THREAD_P (1)
-
-#endif
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/x86_64/vfork.S b/linuxthreads/sysdeps/unix/sysv/linux/x86_64/vfork.S
deleted file mode 100644
index 25d1d3f96a..0000000000
--- a/linuxthreads/sysdeps/unix/sysv/linux/x86_64/vfork.S
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Copyright (C) 2001, 2002, 2003, 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep-cancel.h>
-#define _ERRNO_H 1
-#include <bits/errno.h>
-
-/* Clone the calling process, but without copying the whole address space.
- The calling process is suspended until the new process exits or is
- replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
- and the process ID of the new process to the old process. */
-
-ENTRY (__vfork)
-
-#ifdef SHARED
- cmpq $0, __libc_pthread_functions(%rip)
-#else
- .weak pthread_create
- movq $pthread_create, %rax
- testq %rax, %rax
-#endif
- jne HIDDEN_JUMPTARGET (__fork)
-
- /* Pop the return PC value into RDI. We need a register that
- is preserved by the syscall and that we're allowed to destroy. */
- popq %rdi
- cfi_adjust_cfa_offset(-8)
-
- /* Stuff the syscall number in RAX and enter into the kernel. */
- movl $SYS_ify (vfork), %eax
- syscall
-
- /* Push back the return PC. */
- pushq %rdi
- cfi_adjust_cfa_offset(8)
-
- cmpl $-4095, %eax
- jae SYSCALL_ERROR_LABEL /* Branch forward if it failed. */
-
- /* Normal return. */
-.Lpseudo_end:
- ret
-
-PSEUDO_END (__vfork)
-libc_hidden_def (__vfork)
-
-weak_alias (__vfork, vfork)
diff --git a/linuxthreads/sysdeps/x86_64/Makefile b/linuxthreads/sysdeps/x86_64/Makefile
deleted file mode 100644
index 81bddf688c..0000000000
--- a/linuxthreads/sysdeps/x86_64/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-ifeq ($(subdir),csu)
-gen-as-const-headers += tcb-offsets.sym
-endif
diff --git a/linuxthreads/sysdeps/x86_64/Versions b/linuxthreads/sysdeps/x86_64/Versions
deleted file mode 100644
index 32da57080d..0000000000
--- a/linuxthreads/sysdeps/x86_64/Versions
+++ /dev/null
@@ -1,5 +0,0 @@
-libpthread {
- GLIBC_PRIVATE {
- __pthread_clock_gettime; __pthread_clock_settime;
- }
-}
diff --git a/linuxthreads/sysdeps/x86_64/pspinlock.c b/linuxthreads/sysdeps/x86_64/pspinlock.c
deleted file mode 100644
index e1b2a66841..0000000000
--- a/linuxthreads/sysdeps/x86_64/pspinlock.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/* POSIX spinlock implementation. x86-64 version.
- Copyright (C) 2001 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <errno.h>
-#include <pthread.h>
-#include "internals.h"
-
-/* This implementation is similar to the one used in the Linux kernel.
- But the kernel is byte instructions for the memory access. This is
- faster but unusable here. The problem is that only 128
- threads/processes could use the spinlock at the same time. If (by
- a design error in the program) a thread/process would hold the
- spinlock for a time long enough to accumulate 128 waiting
- processes, the next one will find a positive value in the spinlock
- and assume it is unlocked. We cannot accept that. */
-
-int
-__pthread_spin_lock (pthread_spinlock_t *lock)
-{
- asm volatile
- ("\n"
- "1:\n\t"
- "lock; decl %0\n\t"
- "js 2f\n\t"
- ".section .text.spinlock,\"ax\"\n"
- "2:\n\t"
- "cmpl $0,%0\n\t"
- "rep; nop\n\t"
- "jle 2b\n\t"
- "jmp 1b\n\t"
- ".previous"
- : "=m" (*lock));
- return 0;
-}
-weak_alias (__pthread_spin_lock, pthread_spin_lock)
-
-
-int
-__pthread_spin_trylock (pthread_spinlock_t *lock)
-{
- int oldval;
-
- asm volatile
- ("xchgl %0,%1"
- : "=r" (oldval), "=m" (*lock)
- : "0" (0));
- return oldval > 0 ? 0 : EBUSY;
-}
-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
-
-
-int
-__pthread_spin_unlock (pthread_spinlock_t *lock)
-{
- asm volatile
- ("movl $1,%0"
- : "=m" (*lock));
- return 0;
-}
-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
-
-
-int
-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
-{
- /* We can ignore the `pshared' parameter. Since we are busy-waiting
- all processes which can access the memory location `lock' points
- to can use the spinlock. */
- *lock = 1;
- return 0;
-}
-weak_alias (__pthread_spin_init, pthread_spin_init)
-
-
-int
-__pthread_spin_destroy (pthread_spinlock_t *lock)
-{
- /* Nothing to do. */
- return 0;
-}
-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --git a/linuxthreads/sysdeps/x86_64/pt-machine.h b/linuxthreads/sysdeps/x86_64/pt-machine.h
deleted file mode 100644
index df187a7c03..0000000000
--- a/linuxthreads/sysdeps/x86_64/pt-machine.h
+++ /dev/null
@@ -1,225 +0,0 @@
-/* Machine-dependent pthreads configuration and inline functions.
- x86-64 version.
- Copyright (C) 2001, 2002, 2003, 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _PT_MACHINE_H
-#define _PT_MACHINE_H 1
-
-#ifndef __ASSEMBLER__
-# include <stddef.h> /* For offsetof. */
-# include <stdlib.h> /* For abort(). */
-# include <asm/prctl.h>
-
-
-# ifndef PT_EI
-# define PT_EI extern inline __attribute__ ((always_inline))
-# endif
-
-extern long int testandset (int *spinlock);
-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
-
-/* Get some notion of the current stack. Need not be exactly the top
- of the stack, just something somewhere in the current frame. */
-# define CURRENT_STACK_FRAME stack_pointer
-register char * stack_pointer __asm__ ("%rsp") __attribute_used__;
-
-
-/* Spinlock implementation; required. */
-PT_EI long int
-testandset (int *spinlock)
-{
- long int ret;
-
- __asm__ __volatile__ (
- "xchgl %k0, %1"
- : "=r"(ret), "=m"(*spinlock)
- : "0"(1), "m"(*spinlock)
- : "memory");
-
- return ret;
-}
-
-
-/* Compare-and-swap for semaphores. */
-# define HAS_COMPARE_AND_SWAP
-
-PT_EI int
-__compare_and_swap (long int *p, long int oldval, long int newval)
-{
- char ret;
- long int readval;
-
- __asm__ __volatile__ ("lock; cmpxchgq %3, %1; sete %0"
- : "=q" (ret), "=m" (*p), "=a" (readval)
- : "r" (newval), "m" (*p), "a" (oldval)
- : "memory");
- return ret;
-}
-
-/* Return the thread descriptor for the current thread.
-
- The contained asm must *not* be marked volatile since otherwise
- assignments like
- pthread_descr self = thread_self();
- do not get optimized away. */
-# define THREAD_SELF \
-({ \
- register pthread_descr __self; \
- __asm__ ("movq %%fs:%c1,%0" : "=r" (__self) \
- : "i" (offsetof (struct _pthread_descr_struct, \
- p_header.data.self))); \
- __self; \
-})
-
-/* Prototype for the system call. */
-extern int __arch_prctl (int __code, unsigned long __addr);
-
-/* Initialize the thread-unique value. */
-# define INIT_THREAD_SELF(descr, nr) \
-{ \
- if (__arch_prctl (ARCH_SET_FS, (unsigned long)descr) != 0) \
- abort (); \
-}
-
-/* Read member of the thread descriptor directly. */
-# define THREAD_GETMEM(descr, member) \
-({ \
- __typeof__ (descr->member) __value; \
- if (sizeof (__value) == 1) \
- __asm__ __volatile__ ("movb %%fs:%P2,%b0" \
- : "=q" (__value) \
- : "0" (0), \
- "i" (offsetof (struct _pthread_descr_struct, \
- member))); \
- else if (sizeof (__value) == 4) \
- __asm__ __volatile__ ("movl %%fs:%P2,%k0" \
- : "=r" (__value) \
- : "0" (0), \
- "i" (offsetof (struct _pthread_descr_struct, \
- member))); \
- else \
- { \
- if (sizeof (__value) != 8) \
- /* There should not be any value with a size other than 1, 4 or 8. */\
- abort (); \
- \
- __asm__ __volatile__ ("movq %%fs:%P1,%0" \
- : "=r" (__value) \
- : "i" (offsetof (struct _pthread_descr_struct, \
- member))); \
- } \
- __value; \
-})
-
-/* Same as THREAD_GETMEM, but the member offset can be non-constant. */
-# define THREAD_GETMEM_NC(descr, member) \
-({ \
- __typeof__ (descr->member) __value; \
- if (sizeof (__value) == 1) \
- __asm__ __volatile__ ("movb %%fs:(%2),%b0" \
- : "=q" (__value) \
- : "0" (0), \
- "r" (offsetof (struct _pthread_descr_struct, \
- member))); \
- else if (sizeof (__value) == 4) \
- __asm__ __volatile__ ("movl %%fs:(%2),%k0" \
- : "=r" (__value) \
- : "0" (0), \
- "r" (offsetof (struct _pthread_descr_struct, \
- member))); \
- else \
- { \
- if (sizeof (__value) != 8) \
- /* There should not be any value with a size other than 1, 4 or 8. */\
- abort (); \
- \
- __asm__ __volatile__ ("movq %%fs:(%1),%0" \
- : "=r" (__value) \
- : "r" (offsetof (struct _pthread_descr_struct, \
- member))); \
- } \
- __value; \
-})
-
-/* Set member of the thread descriptor directly. */
-# define THREAD_SETMEM(descr, member, value) \
-({ \
- __typeof__ (descr->member) __value = (value); \
- if (sizeof (__value) == 1) \
- __asm__ __volatile__ ("movb %0,%%fs:%P1" : \
- : "q" (__value), \
- "i" (offsetof (struct _pthread_descr_struct, \
- member))); \
- else if (sizeof (__value) == 4) \
- __asm__ __volatile__ ("movl %k0,%%fs:%P1" : \
- : "r" (__value), \
- "i" (offsetof (struct _pthread_descr_struct, \
- member))); \
- else \
- { \
- if (sizeof (__value) != 8) \
- /* There should not be any value with a size other than 1, 4 or 8. */\
- abort (); \
- \
- __asm__ __volatile__ ("movq %0,%%fs:%P1" : \
- : "r" (__value), \
- "i" (offsetof (struct _pthread_descr_struct, \
- member))); \
- } \
-})
-
-/* Same as THREAD_SETMEM, but the member offset can be non-constant. */
-# define THREAD_SETMEM_NC(descr, member, value) \
-({ \
- __typeof__ (descr->member) __value = (value); \
- if (sizeof (__value) == 1) \
- __asm__ __volatile__ ("movb %0,%%fs:(%1)" : \
- : "q" (__value), \
- "r" (offsetof (struct _pthread_descr_struct, \
- member))); \
- else if (sizeof (__value) == 4) \
- __asm__ __volatile__ ("movl %k0,%%fs:(%1)" : \
- : "r" (__value), \
- "r" (offsetof (struct _pthread_descr_struct, \
- member))); \
- else \
- { \
- if (sizeof (__value) != 8) \
- /* There should not be any value with a size other than 1, 4 or 8. */\
- abort (); \
- \
- __asm__ __volatile__ ("movq %0,%%fs:(%1)" : \
- : "r" (__value), \
- "r" (offsetof (struct _pthread_descr_struct, \
- member))); \
- } \
-})
-
-#endif /* !__ASSEMBLER__ */
-
-/* We want the OS to assign stack addresses. */
-#define FLOATING_STACKS 1
-
-/* Maximum size of the stack if the rlimit is unlimited. */
-#define ARCH_STACK_MAX_SIZE 32*1024*1024
-
-/* The ia32e really want some help to prevent overheating. */
-#define BUSY_WAIT_NOP __asm__ ("rep; nop")
-
-#endif /* pt-machine.h */
diff --git a/linuxthreads/sysdeps/x86_64/tcb-offsets.sym b/linuxthreads/sysdeps/x86_64/tcb-offsets.sym
deleted file mode 100644
index aee6be2570..0000000000
--- a/linuxthreads/sysdeps/x86_64/tcb-offsets.sym
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <sysdep.h>
-#include <tls.h>
-
-MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads)
diff --git a/linuxthreads/sysdeps/x86_64/tls.h b/linuxthreads/sysdeps/x86_64/tls.h
deleted file mode 100644
index 67d80b28d9..0000000000
--- a/linuxthreads/sysdeps/x86_64/tls.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/* Definitions for thread-local data handling. linuxthreads/x86-64 version.
- Copyright (C) 2002, 2005 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _TLS_H
-#define _TLS_H
-
-#ifndef __ASSEMBLER__
-
-# include <pt-machine.h>
-# include <stdbool.h>
-# include <stddef.h>
-
-/* Type for the dtv. */
-typedef union dtv
-{
- size_t counter;
- struct
- {
- void *val;
- bool is_static;
- } pointer;
-} dtv_t;
-
-
-typedef struct
-{
- void *tcb; /* Pointer to the TCB. Not necessary the
- thread descriptor used by libpthread. */
- dtv_t *dtv;
- void *self; /* Pointer to the thread descriptor. */
- int multiple_threads;
-} tcbhead_t;
-
-#else /* __ASSEMBLER__ */
-# include <tcb-offsets.h>
-#endif
-
-
-#ifdef HAVE_TLS_SUPPORT
-
-/* Signal that TLS support is available. */
-# define USE_TLS 1
-
-# ifndef __ASSEMBLER__
-/* Get system call information. */
-# include <sysdep.h>
-
-/* Get the thread descriptor definition. */
-# include <linuxthreads/descr.h>
-
-/* This is the size of the initial TCB. */
-# define TLS_INIT_TCB_SIZE sizeof (tcbhead_t)
-
-/* Alignment requirements for the initial TCB. */
-# define TLS_INIT_TCB_ALIGN __alignof__ (tcbhead_t)
-
-/* This is the size of the TCB. */
-# ifndef IS_IN_rtld
-# define TLS_TCB_SIZE sizeof (struct _pthread_descr_struct)
-# else
-# include <nptl-struct-pthread.h>
-# define TLS_TCB_SIZE \
- (sizeof (struct _pthread_descr_struct) > NPTL_STRUCT_PTHREAD_SIZE \
- ? sizeof (struct _pthread_descr_struct) : NPTL_STRUCT_PTHREAD_SIZE)
-# endif
-
-/* Alignment requirements for the TCB. */
-# define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct)
-
-/* The TCB can have any size and the memory following the address the
- thread pointer points to is unspecified. Allocate the TCB there. */
-# define TLS_TCB_AT_TP 1
-
-
-/* Install the dtv pointer. The pointer passed is to the element with
- index -1 which contain the length. */
-# define INSTALL_DTV(descr, dtvp) \
- ((tcbhead_t *) (descr))->dtv = (dtvp) + 1
-
-/* Install new dtv for current thread. */
-# define INSTALL_NEW_DTV(dtv) \
- ({ struct _pthread_descr_struct *__descr; \
- THREAD_SETMEM (__descr, p_header.data.dtvp, (dtv)); })
-
-/* Return dtv of given thread descriptor. */
-# define GET_DTV(descr) \
- (((tcbhead_t *) (descr))->dtv)
-
-/* Code to initially initialize the thread pointer. This might need
- special attention since 'errno' is not yet available and if the
- operation can cause a failure 'errno' must not be touched. */
-# define TLS_INIT_TP(descr, secondcall) \
- ({ \
- void *_descr = (descr); \
- tcbhead_t *head = _descr; \
- long int _result; \
- \
- head->tcb = _descr; \
- /* For now the thread descriptor is at the same address. */ \
- head->self = _descr; \
- \
- asm volatile ("syscall" \
- : "=a" (_result) \
- : "0" ((unsigned long int) __NR_arch_prctl), \
- "D" ((unsigned long int) ARCH_SET_FS), \
- "S" (_descr) \
- : "memory", "cc", "r11", "cx"); \
- \
- _result ? "cannot set %fs base address for thread-local storage" : 0; \
- })
-
-/* Indicate that dynamic linker shouldn't try to initialize TLS even
- when no PT_TLS segments are found in the program and libraries
- it is linked against. */
-# define TLS_INIT_TP_EXPENSIVE 1
-
-/* Return the address of the dtv for the current thread. */
-# define THREAD_DTV() \
- ({ struct _pthread_descr_struct *__descr; \
- THREAD_GETMEM (__descr, p_header.data.dtvp); })
-
-# endif /* HAVE_TLS_SUPPORT */
-#endif /* __ASSEMBLER__ */
-
-#endif /* tls.h */
diff --git a/linuxthreads/tst-_res1.c b/linuxthreads/tst-_res1.c
deleted file mode 100644
index 651e3cc40d..0000000000
--- a/linuxthreads/tst-_res1.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/* Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-/* 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/linuxthreads/tst-_res1mod1.c b/linuxthreads/tst-_res1mod1.c
deleted file mode 100644
index 73b190e6ba..0000000000
--- a/linuxthreads/tst-_res1mod1.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <resolv.h>
-#undef _res
-
-struct __res_state _res;
diff --git a/linuxthreads/tst-_res1mod2.c b/linuxthreads/tst-_res1mod2.c
deleted file mode 100644
index d2a3509c6d..0000000000
--- a/linuxthreads/tst-_res1mod2.c
+++ /dev/null
@@ -1 +0,0 @@
-/* Nothing. */
diff --git a/linuxthreads/tst-align.c b/linuxthreads/tst-align.c
deleted file mode 100644
index 2de9d7a107..0000000000
--- a/linuxthreads/tst-align.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#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/linuxthreads/tst-attr1.c b/linuxthreads/tst-attr1.c
deleted file mode 100644
index 7960cf930a..0000000000
--- a/linuxthreads/tst-attr1.c
+++ /dev/null
@@ -1,358 +0,0 @@
-/* pthread_getattr_np test.
- Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#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;
- }
- }
-
- 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;
-
- int err = pthread_attr_init (&a);
- if (err)
- {
- error (0, err, "pthread_attr_init 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_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/linuxthreads/tst-cancel-static.c b/linuxthreads/tst-cancel-static.c
deleted file mode 100644
index 1c879eba8b..0000000000
--- a/linuxthreads/tst-cancel-static.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "tst-cancel4.c"
diff --git a/linuxthreads/tst-cancel-wrappers.sh b/linuxthreads/tst-cancel-wrappers.sh
deleted file mode 100644
index d6f16d1ed2..0000000000
--- a/linuxthreads/tst-cancel-wrappers.sh
+++ /dev/null
@@ -1,92 +0,0 @@
-#! /bin/sh
-# Test whether all cancelable functions are cancelable.
-# Copyright (C) 2002, 2003 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, write to the Free
-# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-# 02111-1307 USA.
-
-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["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["system"]=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","",$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/linuxthreads/tst-cancel.c b/linuxthreads/tst-cancel.c
deleted file mode 100644
index 59c6f1f511..0000000000
--- a/linuxthreads/tst-cancel.c
+++ /dev/null
@@ -1,214 +0,0 @@
-/* Tests for cancelation handling. */
-
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/stat.h>
-
-int fd;
-
-pthread_barrier_t bar;
-
-
-#ifdef NOT_YET
-static void
-cleanup (void *arg)
-{
- int nr = (int) (long int) arg;
- char s[30];
- char *cp = stpcpy (s, "cleanup ");
- *cp++ = '0' + nr;
- *cp++ = '\n';
- __libc_lseek (fd, 0, SEEK_END);
- __libc_write (fd, s, cp - s);
-}
-
-
-static void *
-t1 (void *arg)
-{
- pthread_cleanup_push (cleanup, (void *) (long int) 1);
- return NULL;
- pthread_cleanup_pop (0);
-}
-
-
-static void
-inner (int a)
-{
- pthread_cleanup_push (cleanup, (void *) (long int) a);
- if (a)
- return;
- pthread_cleanup_pop (0);
-}
-
-
-static void *
-t2 (void *arg)
-{
- pthread_cleanup_push (cleanup, (void *) (long int) 2);
- inner ((int) (long int) arg);
- return NULL;
- pthread_cleanup_pop (0);
-}
-#endif
-
-/* This does not work yet. */
-volatile int cleanupokcnt;
-
-static void
-cleanupok (void *arg)
-{
- ++cleanupokcnt;
-}
-
-#ifdef NOT_YET
-static void *
-t3 (void *arg)
-{
- pthread_cleanup_push (cleanupok, (void *) (long int) 4);
- inner ((int) (long int) arg);
- pthread_exit (NULL);
- pthread_cleanup_pop (0);
-}
-#endif
-
-static void
-innerok (int a)
-{
- pthread_cleanup_push (cleanupok, (void *) (long int) a);
- pthread_exit (NULL);
- pthread_cleanup_pop (0);
-}
-
-
-static void *
-t4 (void *arg)
-{
- pthread_cleanup_push (cleanupok, (void *) (long int) 6);
- innerok ((int) (long int) arg);
- pthread_cleanup_pop (0);
- return NULL;
-}
-
-
-int
-main (int argc, char *argv[])
-{
- pthread_t td;
- int err;
- char *tmp;
- const char *prefix;
- const char template[] = "thtstXXXXXX";
- struct stat64 st;
- int result = 0;
-
- prefix = argc > 1 ? argv[1] : "";
- tmp = (char *) alloca (strlen (prefix) + sizeof template);
- strcpy (stpcpy (tmp, prefix), template);
-
- fd = mkstemp (tmp);
- if (fd == -1)
- {
- printf ("cannot create temporary file: %m");
- exit (1);
- }
- unlink (tmp);
-
- err = pthread_barrier_init (&bar, NULL, 2);
- if (err != 0 )
- {
- printf ("cannot create barrier: %s\n", strerror (err));
- exit (1);
- }
-
-#ifdef NOT_YET
- err = pthread_create (&td, NULL, t1, NULL);
- if (err != 0)
- {
- printf ("cannot create thread t1: %s\n", strerror (err));
- exit (1);
- }
-
- err = pthread_join (td, NULL);
- if (err != 0)
- {
- printf ("cannot join thread: %s\n", strerror (err));
- exit (1);
- }
-
- err = pthread_create (&td, NULL, t2, (void *) 3);
- if (err != 0)
- {
- printf ("cannot create thread t2: %s\n", strerror (err));
- exit (1);
- }
-
- err = pthread_join (td, NULL);
- if (err != 0)
- {
- printf ("cannot join thread: %s\n", strerror (err));
- exit (1);
- }
-
- err = pthread_create (&td, NULL, t3, (void *) 5);
- if (err != 0)
- {
- printf ("cannot create thread t3: %s\n", strerror (err));
- exit (1);
- }
-
- err = pthread_join (td, NULL);
- if (err != 0)
- {
- printf ("cannot join thread: %s\n", strerror (err));
- exit (1);
- }
-#endif
-
- err = pthread_create (&td, NULL, t4, (void *) 7);
- if (err != 0)
- {
- printf ("cannot create thread t4: %s\n", strerror (err));
- exit (1);
- }
-
- err = pthread_join (td, NULL);
- if (err != 0)
- {
- printf ("cannot join thread: %s\n", strerror (err));
- exit (1);
- }
-
- if (fstat64 (fd, &st) < 0)
- {
- printf ("cannot stat temporary file: %m\n");
- result = 1;
- }
- else if (st.st_size != 0)
- {
- char buf[512];
- puts ("some cleanup handlers ran:");
- fflush (stdout);
- __lseek (fd, 0, SEEK_SET);
- while (1)
- {
- ssize_t n = read (fd, buf, sizeof buf);
- if (n <= 0)
- break;
- write (STDOUT_FILENO, buf, n);
- }
- result = 1;
- }
-
- // if (cleanupokcnt != 3) will be three once t3 runs
- if (cleanupokcnt != 2)
- {
- printf ("cleanupokcnt = %d\n", cleanupokcnt);
- result = 1;
- }
-
- return result;
-}
diff --git a/linuxthreads/tst-cancel1.c b/linuxthreads/tst-cancel1.c
deleted file mode 100644
index 99a8339f0c..0000000000
--- a/linuxthreads/tst-cancel1.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <pthread.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)
-{
- int err;
-
- pthread_cleanup_push (cleanup, (void *) 42l);
-
- err = pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
- if (err != 0)
- {
- printf ("setcanceltype failed: %s\n", strerror (err));
- exit (1);
- }
-
- 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/linuxthreads/tst-cancel2.c b/linuxthreads/tst-cancel2.c
deleted file mode 100644
index 6d80f8ae5e..0000000000
--- a/linuxthreads/tst-cancel2.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#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];
-
- if (write (fd[1], buf, sizeof (buf)) == sizeof (buf))
- {
- puts ("write succeeded");
- return (void *) 1l;
- }
-
- 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/linuxthreads/tst-cancel3.c b/linuxthreads/tst-cancel3.c
deleted file mode 100644
index 86c482bcc1..0000000000
--- a/linuxthreads/tst-cancel3.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#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/linuxthreads/tst-cancel4.c b/linuxthreads/tst-cancel4.c
deleted file mode 100644
index 03f6bfe056..0000000000
--- a/linuxthreads/tst-cancel4.c
+++ /dev/null
@@ -1,469 +0,0 @@
-/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-/* NOTE: this tests functionality beyond POSIX. POSIX does not allow
- exit to be called more than once. */
-
-#include <errno.h>
-#include <limits.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/poll.h>
-#include <sys/select.h>
-#include <sys/uio.h>
-#include <sys/wait.h>
-
-/* The following interfaces are defined to be cancellation points but
- tests are not yet implemented:
-
- accept() aio_suspend() clock_nanosleep()
- close() connect() creat()
- fcntl() fsync() getmsg()
- getpmsg() lockf() mq_receive()
- mq_send() mq_timedreceive() mq_timedsend()
- msgrcv() msgsnd() msync()
- open() pause()
- pread() pthread_cond_timedwait()
- pthread_cond_wait() pthread_join() pthread_testcancel()
- putmsg() putpmsg() pwrite()
- recv()
- recvfrom() recvmsg()
- sem_timedwait() sem_wait() send()
- sendmsg() sendto() sigpause()
- sigsuspend() sigtimedwait() sigwait()
- sigwaitinfo() system()
- tcdrain()
-
- Since STREAMS are not supported in the standard Linux kernel there
- is no need to test the STREAMS related functions.
-*/
-
-/* Pipe descriptors. */
-static int fds[2];
-
-/* Often used barrier for two threads. */
-static pthread_barrier_t b2;
-
-
-static void *
-tf_read (void *arg)
-{
- int r = pthread_barrier_wait (&b2);
- if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
- {
- printf ("%s: barrier_wait failed\n", __FUNCTION__);
- exit (1);
- }
-
- char buf[100];
- ssize_t s = read (fds[0], buf, sizeof (buf));
-
- printf ("%s: read returns with %zd\n", __FUNCTION__, s);
-
- exit (1);
-}
-
-
-static void *
-tf_readv (void *arg)
-{
- int r = pthread_barrier_wait (&b2);
- if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
- {
- printf ("%s: barrier_wait failed\n", __FUNCTION__);
- exit (1);
- }
-
- char buf[100];
- struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } };
- ssize_t s = readv (fds[0], iov, 1);
-
- printf ("%s: readv returns with %zd\n", __FUNCTION__, s);
-
- exit (1);
-}
-
-
-static void *
-tf_write (void *arg)
-{
- int r = pthread_barrier_wait (&b2);
- if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
- {
- printf ("%s: barrier_wait failed\n", __FUNCTION__);
- exit (1);
- }
-
- char buf[100000];
- memset (buf, '\0', sizeof (buf));
- ssize_t s = write (fds[1], buf, sizeof (buf));
-
- printf ("%s: write returns with %zd\n", __FUNCTION__, s);
-
- exit (1);
-}
-
-
-static void *
-tf_writev (void *arg)
-{
- int r = pthread_barrier_wait (&b2);
- if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
- {
- printf ("%s: barrier_wait failed\n", __FUNCTION__);
- exit (1);
- }
-
- char buf[100000];
- memset (buf, '\0', sizeof (buf));
- struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } };
- ssize_t s = writev (fds[1], iov, 1);
-
- printf ("%s: writev returns with %zd\n", __FUNCTION__, s);
-
- exit (1);
-}
-
-
-static void *
-tf_sleep (void *arg)
-{
- int r = pthread_barrier_wait (&b2);
- if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
- {
- printf ("%s: barrier_wait failed\n", __FUNCTION__);
- exit (1);
- }
-
- sleep (1000000);
-
- printf ("%s: sleep returns\n", __FUNCTION__);
-
- exit (1);
-}
-
-
-static void *
-tf_usleep (void *arg)
-{
- int r = pthread_barrier_wait (&b2);
- if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
- {
- printf ("%s: barrier_wait failed\n", __FUNCTION__);
- exit (1);
- }
-
- usleep ((useconds_t) ULONG_MAX);
-
- printf ("%s: usleep returns\n", __FUNCTION__);
-
- exit (1);
-}
-
-
-static void *
-tf_nanosleep (void *arg)
-{
- int r = pthread_barrier_wait (&b2);
- if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
- {
- printf ("%s: barrier_wait failed\n", __FUNCTION__);
- exit (1);
- }
-
- struct timespec ts = { .tv_sec = 10000000, .tv_nsec = 0 };
- while (nanosleep (&ts, &ts) != 0)
- continue;
-
- printf ("%s: nanosleep returns\n", __FUNCTION__);
-
- exit (1);
-}
-
-
-static void *
-tf_select (void *arg)
-{
- int r = pthread_barrier_wait (&b2);
- if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
- {
- printf ("%s: barrier_wait failed\n", __FUNCTION__);
- exit (1);
- }
-
- fd_set rfs;
- FD_ZERO (&rfs);
- FD_SET (fds[0], &rfs);
-
- int s = select (fds[0] + 1, &rfs, NULL, NULL, NULL);
-
- printf ("%s: select returns with %d (%s)\n", __FUNCTION__, s,
- strerror (errno));
-
- exit (1);
-}
-
-
-static void *
-tf_pselect (void *arg)
-{
- int r = pthread_barrier_wait (&b2);
- if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
- {
- printf ("%s: barrier_wait failed\n", __FUNCTION__);
- exit (1);
- }
-
- fd_set rfs;
- FD_ZERO (&rfs);
- FD_SET (fds[0], &rfs);
-
- int s = pselect (fds[0] + 1, &rfs, NULL, NULL, NULL, NULL);
-
- printf ("%s: pselect returns with %d (%s)\n", __FUNCTION__, s,
- strerror (errno));
-
- exit (1);
-}
-
-
-static void *
-tf_poll (void *arg)
-{
- int r = pthread_barrier_wait (&b2);
- if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
- {
- printf ("%s: barrier_wait failed\n", __FUNCTION__);
- exit (1);
- }
-
- struct pollfd rfs[1] = { [0] = { .fd = fds[0], .events = POLLIN } };
-
- int s = poll (rfs, 1, -1);
-
- printf ("%s: poll returns with %d (%s)\n", __FUNCTION__, s,
- strerror (errno));
-
- exit (1);
-}
-
-
-static void *
-tf_wait (void *arg)
-{
- int r = pthread_barrier_wait (&b2);
- if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
- {
- printf ("%s: barrier_wait failed\n", __FUNCTION__);
- exit (1);
- }
-
- pid_t pid = fork ();
- if (pid == -1)
- {
- puts ("fork failed");
- exit (1);
- }
-
- if (pid == 0)
- {
- /* Make the program disappear after a while. */
- sleep (10);
- exit (0);
- }
-
- int s = wait (NULL);
-
- printf ("%s: wait returns with %d (%s)\n", __FUNCTION__, s,
- strerror (errno));
-
- exit (1);
-}
-
-
-static void *
-tf_waitpid (void *arg)
-{
- int r = pthread_barrier_wait (&b2);
- if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
- {
- printf ("%s: barrier_wait failed\n", __FUNCTION__);
- exit (1);
- }
-
- pid_t pid = fork ();
- if (pid == -1)
- {
- puts ("fork failed");
- exit (1);
- }
-
- if (pid == 0)
- {
- /* Make the program disappear after a while. */
- sleep (10);
- exit (0);
- }
-
- int s = waitpid (-1, NULL, 0);
-
- printf ("%s: waitpid returns with %d (%s)\n", __FUNCTION__, s,
- strerror (errno));
-
- exit (1);
-}
-
-
-static void *
-tf_waitid (void *arg)
-{
- int r = pthread_barrier_wait (&b2);
- if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
- {
- printf ("%s: barrier_wait failed\n", __FUNCTION__);
- exit (1);
- }
-
- pid_t pid = fork ();
- if (pid == -1)
- {
- puts ("fork failed");
- exit (1);
- }
-
- if (pid == 0)
- {
- /* Make the program disappear after a while. */
- sleep (10);
- exit (0);
- }
-
-#ifndef WEXITED
-# define WEXITED 0
-#endif
- siginfo_t si;
- int s = waitid (P_PID, pid, &si, WEXITED);
-
- printf ("%s: waitid returns with %d (%s)\n", __FUNCTION__, s,
- strerror (errno));
-
- exit (1);
-}
-
-
-static struct
-{
- void *(*tf) (void *);
- int nb;
-} tests[] =
-{
- { tf_read, 2 },
- { tf_readv, 2 },
- { tf_select, 2 },
- { tf_pselect, 2 },
- { tf_poll, 2 },
- { tf_write, 2 },
- { tf_writev, 2},
- { tf_sleep, 2 },
- { tf_usleep, 2 },
- { tf_nanosleep, 2 },
- { tf_wait, 2 },
- { tf_waitid, 2 },
- { tf_waitpid, 2 },
-};
-#define ntest_tf (sizeof (tests) / sizeof (tests[0]))
-
-
-static int
-do_test (void)
-{
- if (pipe (fds) != 0)
- {
- puts ("pipe failed");
- exit (1);
- }
-
- int cnt;
- for (cnt = 0; cnt < ntest_tf; ++cnt)
- {
- printf ("round %d\n", cnt);
-
- if (pthread_barrier_init (&b2, NULL, tests[cnt].nb) != 0)
- {
- puts ("b2 init failed");
- exit (1);
- }
-
- pthread_t th;
- if (pthread_create (&th, NULL, tests[cnt].tf, NULL) != 0)
- {
- printf ("create for round %d test failed\n", cnt);
- exit (1);
- }
-
- puts ("barrier waits");
-
- int r = pthread_barrier_wait (&b2);
- if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
- {
- printf ("%s: barrier_wait failed\n", __FUNCTION__);
- exit (1);
- }
-
- puts ("nanosleep delay");
-
- struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 };
- while (nanosleep (&ts, &ts) != 0)
- continue;
-
- if (pthread_cancel (th) != 0)
- {
- printf ("cancel in round %d failed\n", cnt);
- exit (1);
- }
-
- void *status;
- if (pthread_join (th, &status) != 0)
- {
- printf ("join in round %d failed\n", cnt);
- exit (1);
- }
- if (status != PTHREAD_CANCELED)
- {
- printf ("thread in round %d not canceled\n", cnt);
- exit (1);
- }
- printf ("test %d successful\n", cnt);
-
- if (pthread_barrier_destroy (&b2) != 0)
- {
- puts ("barrier_destroy failed");
- exit (1);
- }
- }
-
- return 0;
-}
-
-#define TIMEOUT 60
-#define TEST_FUNCTION do_test ()
-#include "../test-skeleton.c"
diff --git a/linuxthreads/tst-cancel5.c b/linuxthreads/tst-cancel5.c
deleted file mode 100644
index 1c879eba8b..0000000000
--- a/linuxthreads/tst-cancel5.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "tst-cancel4.c"
diff --git a/linuxthreads/tst-cancel6.c b/linuxthreads/tst-cancel6.c
deleted file mode 100644
index 94de85830b..0000000000
--- a/linuxthreads/tst-cancel6.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#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/linuxthreads/tst-cancel7.c b/linuxthreads/tst-cancel7.c
deleted file mode 100644
index 11298eae26..0000000000
--- a/linuxthreads/tst-cancel7.c
+++ /dev/null
@@ -1,111 +0,0 @@
-/* Test for pthread cancellation of mutex blocks.
- Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
-pthread_barrier_t b;
-int value = 0;
-
-static void *
-tf (void *arg)
-{
- int r = pthread_barrier_wait (&b);
- if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
- {
- printf ("%s: barrier_wait failed\n", __FUNCTION__);
- exit (1);
- }
-
- pthread_mutex_lock (&lock);
- ++value;
- pthread_testcancel ();
- ++value;
- pthread_mutex_unlock (&lock);
- return NULL;
-}
-
-
-static int
-do_test (void)
-{
- pthread_mutex_lock (&lock);
-
- 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 ("pthread_create failed");
- return 1;
- }
-
- int r = pthread_barrier_wait (&b);
- if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
- {
- printf ("%s: barrier_wait failed\n", __FUNCTION__);
- exit (1);
- }
-
- if (pthread_cancel (th) != 0)
- {
- puts ("pthread_cancel failed");
- return 1;
- }
-
- pthread_mutex_unlock (&lock);
-
- void *status;
- if (pthread_join (th, &status) != 0)
- {
- puts ("join failed");
- return 1;
- }
-
- if (status != PTHREAD_CANCELED)
- {
- puts ("thread not canceled");
- return 1;
- }
-
- if (value == 0)
- {
- puts ("thread cancelled in the pthread_mutex_lock call");
- return 1;
- }
-
- if (value != 1)
- {
- puts ("thread not cancelled in pthread_testcancel call");
- return 1;
- }
-
- return 0;
-}
-
-#define TEST_FUNCTION do_test ()
-#include "../test-skeleton.c"
diff --git a/linuxthreads/tst-cancel8.c b/linuxthreads/tst-cancel8.c
deleted file mode 100644
index 478d104fb3..0000000000
--- a/linuxthreads/tst-cancel8.c
+++ /dev/null
@@ -1,287 +0,0 @@
-/* Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#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-lt-cancel8-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/linuxthreads/tst-clock1.c b/linuxthreads/tst-clock1.c
deleted file mode 100644
index bca40956e2..0000000000
--- a/linuxthreads/tst-clock1.c
+++ /dev/null
@@ -1,202 +0,0 @@
-/* Copyright (C) 2003, 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#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/linuxthreads/tst-context.c b/linuxthreads/tst-context.c
deleted file mode 100644
index 2938a9f7fa..0000000000
--- a/linuxthreads/tst-context.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/* Ack, a hack! We need to get the proper definition, or lack thereof,
- for FLOATING_STACKS. But when !IS_IN_libpthread, this can get defined
- incidentally by <tls.h>. So kludge around it. */
-
-#define IS_IN_libpthread
-#include <tls.h>
-#undef IS_IN_libpthread
-#undef USE___THREAD
-
-#include <errno.h>
-#include <error.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <ucontext.h>
-
-
-#define N 4
-
-#ifdef FLOATING_STACKS
-static char stacks[N][8192];
-static ucontext_t ctx[N][2];
-static volatile int failures;
-
-static void
-fct (long int n)
-{
- /* Just to use the thread local descriptor. */
- printf ("%ld: in %s now\n", n, __FUNCTION__);
- errno = 0;
-}
-
-static void *
-threadfct (void *arg)
-{
- int n = (int) (long int) arg;
-
- if (getcontext (&ctx[n][1]) != 0)
- {
- printf ("%d: cannot get context: %m\n", n);
- exit (1);
- }
-
- printf ("%d: %s: before makecontext\n", n, __FUNCTION__);
-
- ctx[n][1].uc_stack.ss_sp = stacks[n];
- ctx[n][1].uc_stack.ss_size = 8192;
- ctx[n][1].uc_link = &ctx[n][0];
- makecontext (&ctx[n][1], (void (*) (void)) fct, 1, (long int) n);
-
- printf ("%d: %s: before swapcontext\n", n, __FUNCTION__);
-
- if (swapcontext (&ctx[n][0], &ctx[n][1]) != 0)
- {
- ++failures;
- printf ("%d: %s: swapcontext failed\n", n, __FUNCTION__);
- }
- else
- printf ("%d: back in %s\n", n, __FUNCTION__);
-
- return NULL;
-}
-#endif
-
-
-#ifdef FLOATING_STACKS
-static volatile int global;
-#endif
-
-int
-main (void)
-{
-#ifndef FLOATING_STACKS
- puts ("not supported");
- return 0;
-#else
- 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)
- {
- printf ("%s: setcontext: %m\n", __FUNCTION__);
- exit (1);
- }
- if (global != 2)
- {
- printf ("%s: 'global' not incremented twice\n", __FUNCTION__);
- exit (1);
- }
-
- for (n = 0; n < N; ++n)
- if (pthread_create (&th[n], NULL, threadfct, (void *) (long int) n) != 0)
- error (EXIT_FAILURE, errno, "cannot create all threads");
-
- for (n = 0; n < N; ++n)
- pthread_join (th[n], NULL);
-
- return failures;
-#endif
-}
diff --git a/linuxthreads/tst-popen.c b/linuxthreads/tst-popen.c
deleted file mode 100644
index f76a6e79e5..0000000000
--- a/linuxthreads/tst-popen.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#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;
-
- pthread_create (&p, NULL, dummy, NULL);
- 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");
- exit (0);
-}
-
-#define TEST_FUNCTION do_test ()
-#include "../test-skeleton.c"
diff --git a/linuxthreads/tst-popen2.c b/linuxthreads/tst-popen2.c
deleted file mode 100644
index 3ff69acd52..0000000000
--- a/linuxthreads/tst-popen2.c
+++ /dev/null
@@ -1,41 +0,0 @@
-#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/linuxthreads/tst-signal.c b/linuxthreads/tst-signal.c
deleted file mode 100644
index 5eb0170c6c..0000000000
--- a/linuxthreads/tst-signal.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Test sigaction wrapper. */
-/* Copyright (C) 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Andreas Schwab <schwab@suse.de>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-
-int
-main (int argc, char *argv[])
-{
- struct sigaction old_sa, new_sa;
-
- if (sigaction (SIGHUP, NULL, &old_sa) < 0)
- {
- printf ("cannot get signal action for SIGHUP: %m\n");
- exit (1);
- }
-
- if (old_sa.sa_handler != SIG_IGN)
- {
- printf ("SIGHUP action should be SIG_IGN, is %p\n",
- (void *) old_sa.sa_handler);
- exit (1);
- }
-
- new_sa.sa_handler = SIG_DFL;
- if (sigaction (SIGHUP, &new_sa, NULL) < 0)
- {
- printf ("cannot set signal action for SIGHUP: %m\n");
- exit (1);
- }
-
- if (sigaction (SIGHUP, NULL, &old_sa) < 0)
- {
- printf ("cannot get signal action for SIGHUP: %m\n");
- exit (1);
- }
-
- if (old_sa.sa_handler != SIG_DFL)
- {
- printf ("SIGHUP action should be SIG_DFL, is %p\n",
- (void *) old_sa.sa_handler);
- exit (1);
- }
-
- return 0;
-}
diff --git a/linuxthreads/tst-signal.sh b/linuxthreads/tst-signal.sh
deleted file mode 100644
index fb58193822..0000000000
--- a/linuxthreads/tst-signal.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#! /bin/sh
-# Testing the sigaction wrapper.
-# Copyright (C) 2002 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, write to the Free
-# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-# 02111-1307 USA.
-
-common_objpfx=$1; shift
-
-# set up to ignore SIGHUP
-trap '' 1
-
-exec ${common_objpfx}elf/ld.so --library-path $common_objpfx:${common_objpfx}linuxthreads \
- ${common_objpfx}linuxthreads/tst-signal
diff --git a/linuxthreads/tst-stack1.c b/linuxthreads/tst-stack1.c
deleted file mode 100644
index 057bfa3f9f..0000000000
--- a/linuxthreads/tst-stack1.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/* Copyright (C) 2003, 2004 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-/* Test pthread_create/pthread_join with user defined stacks. */
-
-#include <limits.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;
-}
-
-#define N 16
-
-static int
-do_test (void)
-{
- void *stack;
- int res = posix_memalign (&stack, getpagesize (), N * 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;
- for (int i = 0; i < N; ++i)
- {
- res = pthread_attr_setstack (&attr, stack + i * 4 * PTHREAD_STACK_MIN,
- 4 * PTHREAD_STACK_MIN);
- if (res)
- {
- printf ("pthread_attr_setstack failed %d\n", res);
- result = 1;
- continue;
- }
-
- /* 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 != N)
- {
- printf ("seen %d != %d\n", seen, N);
- result = 1;
- }
-
- return result;
-}
-
-#define TEST_FUNCTION do_test ()
-#include "../test-skeleton.c"
diff --git a/linuxthreads/tst-static-locale.c b/linuxthreads/tst-static-locale.c
deleted file mode 100644
index 3c88e729ba..0000000000
--- a/linuxthreads/tst-static-locale.c
+++ /dev/null
@@ -1,13 +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>
-
-/* This is never called, just here to get pthreads linked in. */
-void
-useless (void)
-{
- pthread_create (0, 0, 0, 0);
-}
diff --git a/linuxthreads/tst-tls1.c b/linuxthreads/tst-tls1.c
deleted file mode 100644
index 3638b75455..0000000000
--- a/linuxthreads/tst-tls1.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Copyright (C) 2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-/* Check alignment, overlapping and layout of TLS variables. */
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <pthread.h>
-#include <sys/param.h>
-
-#include "tst-tls1.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);
-
- qsort (tls_registry, cnt, sizeof (struct tls_obj), tls_addr_cmp);
-
- for (i = 0; i < cnt; ++i)
- {
- printf ("%s = %p, size %zd, align %zd",
- tls_registry[i].name, (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 ("");
- 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)
- 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/linuxthreads/tst-tls1.h b/linuxthreads/tst-tls1.h
deleted file mode 100644
index 0060e5727b..0000000000
--- a/linuxthreads/tst-tls1.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <stdint.h>
-#include <stdlib.h>
-#include <tls.h>
-
-#if USE_TLS && (0 || HAVE___THREAD)
-
-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); \
-}
-
-#endif
diff --git a/linuxthreads/tst-tls1mod.c b/linuxthreads/tst-tls1mod.c
deleted file mode 100644
index a93d2cb9e6..0000000000
--- a/linuxthreads/tst-tls1mod.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <tst-tls1.h>
-
-#ifdef TLS_REGISTER
-/* Ensure tls_registry is exported from the binary. */
-void *tst_tls1mod attribute_hidden = tls_registry;
-#endif
diff --git a/linuxthreads/tst-tls1moda.c b/linuxthreads/tst-tls1moda.c
deleted file mode 100644
index a652ef981f..0000000000
--- a/linuxthreads/tst-tls1moda.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <tst-tls1.h>
-
-#ifdef TLS_REGISTER
-static __thread char a [32] __attribute__ ((aligned (64)));
-TLS_REGISTER (a)
-#endif
diff --git a/linuxthreads/tst-tls1modb.c b/linuxthreads/tst-tls1modb.c
deleted file mode 100644
index be8c95b486..0000000000
--- a/linuxthreads/tst-tls1modb.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <tst-tls1.h>
-
-#ifdef TLS_REGISTER
-static __thread int b;
-TLS_REGISTER (b)
-#endif
diff --git a/linuxthreads/tst-tls1modc.c b/linuxthreads/tst-tls1modc.c
deleted file mode 100644
index e1094bf7aa..0000000000
--- a/linuxthreads/tst-tls1modc.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <tst-tls1.h>
-
-#ifdef TLS_REGISTER
-static __thread int c;
-TLS_REGISTER (c)
-#endif
diff --git a/linuxthreads/tst-tls1modd.c b/linuxthreads/tst-tls1modd.c
deleted file mode 100644
index cd68e0c26a..0000000000
--- a/linuxthreads/tst-tls1modd.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <tst-tls1.h>
-
-#ifdef TLS_REGISTER
-static __thread int d;
-TLS_REGISTER (d)
-#endif
diff --git a/linuxthreads/tst-tls1mode.c b/linuxthreads/tst-tls1mode.c
deleted file mode 100644
index 845d31a4e4..0000000000
--- a/linuxthreads/tst-tls1mode.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <tst-tls1.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/linuxthreads/tst-tls1modf.c b/linuxthreads/tst-tls1modf.c
deleted file mode 100644
index a292e56c57..0000000000
--- a/linuxthreads/tst-tls1modf.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <tst-tls1.h>
-
-#ifdef TLS_REGISTER
-char tst_tls1modf[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/linuxthreads/tst-tls2.sh b/linuxthreads/tst-tls2.sh
deleted file mode 100644
index 0d13963d5e..0000000000
--- a/linuxthreads/tst-tls2.sh
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/bin/sh
-
-common_objpfx=$1; shift
-elf_objpfx=$1; shift
-rtld_installed_name=$1; shift
-logfile=$common_objpfx/linuxthreads/tst-tls2.out
-
-# We have to find libc and linuxthreads
-library_path=${common_objpfx}:${common_objpfx}linuxthreads
-tst_tls1="${elf_objpfx}${rtld_installed_name} --library-path ${library_path} \
- ${common_objpfx}/linuxthreads/tst-tls1"
-
-LC_ALL=C
-export LC_ALL
-LANG=C
-export LANG
-
-> $logfile
-fail=0
-
-for aligned in a e f; do
- echo "preload tst-tls1mod{$aligned,b,c,d}.so" >> $logfile
- echo "===============" >> $logfile
- LD_PRELOAD=`echo ${common_objpfx}linuxthreads/tst-tls1mod{$aligned,b,c,d}.so \
- | sed 's/:$//;s/: /:/g'` ${tst_tls1} >> $logfile || fail=1
- echo >> $logfile
-
- echo "preload tst-tls1mod{b,$aligned,c,d}.so" >> $logfile
- echo "===============" >> $logfile
- LD_PRELOAD=`echo ${common_objpfx}linuxthreads/tst-tls1mod{b,$aligned,c,d}.so \
- | sed 's/:$//;s/: /:/g'` ${tst_tls1} >> $logfile || fail=1
- echo >> $logfile
-
- echo "preload tst-tls1mod{b,c,d,$aligned}.so" >> $logfile
- echo "===============" >> $logfile
- LD_PRELOAD=`echo ${common_objpfx}linuxthreads/tst-tls1mod{b,c,d,$aligned}.so \
- | sed 's/:$//;s/: /:/g'` ${tst_tls1} >> $logfile || fail=1
- echo >> $logfile
-done
-
-echo "preload tst-tls1mod{d,a,b,c,e}" >> $logfile
-echo "===============" >> $logfile
-LD_PRELOAD=`echo ${common_objpfx}linuxthreads/tst-tls1mod{d,a,b,c,e}.so \
- | sed 's/:$//;s/: /:/g'` ${tst_tls1} >> $logfile || fail=1
-echo >> $logfile
-
-echo "preload tst-tls1mod{d,a,b,e,f}" >> $logfile
-echo "===============" >> $logfile
-LD_PRELOAD=`echo ${common_objpfx}linuxthreads/tst-tls1mod{d,a,b,e,f}.so \
- | sed 's/:$//;s/: /:/g'` ${tst_tls1} >> $logfile || fail=1
-echo >> $logfile
-
-exit $fail
diff --git a/linuxthreads/tst-tsd1.c b/linuxthreads/tst-tsd1.c
deleted file mode 100644
index ba7973f1c4..0000000000
--- a/linuxthreads/tst-tsd1.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/* Copyright (C) 2002, 2005 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#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/linuxthreads/tststack.c b/linuxthreads/tststack.c
deleted file mode 100644
index 02b15cb8bc..0000000000
--- a/linuxthreads/tststack.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* Tests for variable stack size handling.
- Copyright (C) 2000, 2003 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <pthread.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <limits.h>
-#include <sys/param.h>
-
-static void *f1 (void *);
-static void *f2 (void *);
-
-int
-main (void)
-{
- pthread_attr_t attr;
- pthread_t th1 = 0;
- pthread_t th2 = 0;
- void *res1;
- void *res2;
-
- pthread_attr_init (&attr);
- if (pthread_attr_setstacksize (&attr, MAX (70*1024, PTHREAD_STACK_MIN)) != 0)
- {
- puts ("invalid stack size");
- return 1;
- }
-
- pthread_create (&th1, NULL, f1, NULL);
- pthread_create (&th2, &attr, f2, NULL);
-
- pthread_join (th1, &res1);
- pthread_join (th2, &res2);
-
- printf ("res1 = %p\n", res1);
- printf ("res2 = %p\n", res2);
-
- return res1 != (void *) 1 || res2 != (void *) 2;
-}
-
-static void *
-f1 (void *parm)
-{
- printf ("This is `%s'\n", __FUNCTION__);
- fflush (stdout);
-
- return (void *) 1;
-}
-
-static void *
-f2 (void *parm)
-{
- printf ("This is `%s'\n", __FUNCTION__);
- fflush (stdout);
- sleep (1);
-
- return (void *) 2;
-}
diff --git a/linuxthreads/unload.c b/linuxthreads/unload.c
deleted file mode 100644
index 234d27f904..0000000000
--- a/linuxthreads/unload.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Tests for non-unloading of libpthread.
- Copyright (C) 2000, 2002 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,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <gnu/lib-names.h>
-
-int
-main (void)
-{
- void *p = dlopen (PREFIX LIBPTHREAD_SO, RTLD_LAZY);
-
- if (p == NULL)
- {
- printf ("failed to load %s: %s\n", LIBPTHREAD_SO, dlerror ());
- exit (1);
- }
-
- if (dlclose (p) != 0)
- {
- printf ("dlclose (%s) failed: %s\n", LIBPTHREAD_SO, dlerror ());
- exit (1);
- }
-
- puts ("seems to work");
-
- exit (0);
-}
diff --git a/linuxthreads_db/Banner b/linuxthreads_db/Banner
deleted file mode 100644
index 6f4f3f8189..0000000000
--- a/linuxthreads_db/Banner
+++ /dev/null
@@ -1 +0,0 @@
-libthread_db work sponsored by Alpha Processor Inc
diff --git a/linuxthreads_db/ChangeLog b/linuxthreads_db/ChangeLog
deleted file mode 100644
index 4bda6fb47a..0000000000
--- a/linuxthreads_db/ChangeLog
+++ /dev/null
@@ -1,451 +0,0 @@
-2005-01-09 Andreas Jaeger <aj@suse.de>
-
- * td_thr_tlsbase.c (td_thr_tlsbase): Adjust for dtv change.
-
-2004-05-01 Jakub Jelinek <jakub@redhat.com>
-
- * thread_dbP.h (LOG): Use write instead of __libc_write.
-
-2004-03-13 Jakub Jelinek <jakub@redhat.com>
-
- * td_thr_tlsbase.c: Remove dl-tls.h include. Don't use
- TLS_TP_OFFSET in the #if, but TLS_TCB_SIZE == 0 ?:.
-
-2004-03-12 Roland McGrath <roland@redhat.com>
-
- * td_thr_tlsbase.c [TLS_DTV_AT_TP && TLS_TP_OFFSET > 0]: Handle this
- case (PowerPC) differently.
-
-2003-11-25 Roland McGrath <roland@redhat.com>
-
- * td_symbol_list.c (symbol_list_arr) [HAVE_ASM_GLOBAL_DOT_NAME]:
- Prepend "." to symbol names for functions.
-
-2003-08-18 Daniel Jacobowitz <drow@mvista.com>
-
- * td_thr_getfpregs.c (td_thr_getfpregs): Use the main thread if
- the descriptor is uninitialized.
- * td_thr_getgregs.c (td_thr_getgregs): Likewise.
-
-2003-03-15 Roland McGrath <roland@redhat.com>
-
- * thread_db.h (td_err_e): Add TD_NOTLS and TD_TLSDEFER.
- (td_thr_tlsbase): Declare it.
- * td_thr_tlsbase.c: New file.
- * Makefile (libthread_db-routines): Add it.
- * Versions (libthread_db: GLIBC_2.3.3): New set, add td_thr_tlsbase.
- * td_thr_tls_get_addr.c (td_thr_tls_get_addr): Use td_thr_tlsbase.
-
-2003-02-27 Roland McGrath <roland@redhat.com>
-
- * td_thr_tls_get_addr.c (td_thr_tls_get_addr): Handle TLS_DTV_AT_TP.
-
- * td_ta_thr_iter.c (handle_descr) [!defined USE_TLS || !TLS_DTV_AT_TP]:
- Conditionalize p_header use on this.
-
-2003-01-29 Roland McGrath <roland@redhat.com>
-
- * td_ta_new.c (td_ta_new): Cap the `sizeof_descr' value read from the
- inferior at `sizeof (struct _pthread_descr_struct)', since we use it
- as a length in copies to our own structures.
-
-2003-01-05 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile (libthread_db.so-no-z-defs): Define.
-
-2002-09-29 Ulrich Drepper <drepper@redhat.com>
-
- * td_thr_tsd.c (td_thr_tsd): Read correct entry from pthread_keys
- array.
-
-2002-09-28 Andreas Jaeger <aj@suse.de>
-
- * td_thr_tls_get_addr.c (td_thr_tls_get_addr): Fix reference to dtv.
-
-2002-09-24 Roland McGrath <roland@redhat.com>
-
- * td_thr_tls_get_addr.c (td_thr_tls_get_addr): Fetch just the
- individual members we need, not the whole structures.
-
-2002-09-24 Ulrich Drepper <drepper@redhat.com>
-
- * td_thr_tls_get_addr.c (td_thr_tls_get_addr): Change second
- parameter to be the address of the link map in the inferior process.
- * thread_db.h: Update prototype for td_thr_tls_get_addr.
-
-2002-08-23 Ulrich Drepper <drepper@redhat.com>
-
- * thread_dbP.h: Define LINUXTHREADS_VERSION.
- * td_symbol_list.c (symbol_list_arr): Add LINUXTHREADS_VERSION string.
- * td_ta_new.c (td_ta_new): After verifying the thread library is
- there check version.
- * thread_db.h: Add new error TD_VERSION.
-
-2002-08-21 Roland McGrath <roland@redhat.com>
-
- * td_thr_tls_get_addr.c (td_thr_tls_get_addr): __attribute_used__ ->
- __attribute__ ((unused)) for arguments.
-
-2002-08-07 Ulrich Drepper <drepper@redhat.com>
-
- * thread_dbP.h: Define LINUXTHREADS_INITIAL_REPORT_EVENTS.
- * td_thr_event_enable.c (td_thr_event_enable): If th->th_unique is
- null write to __linuxthreads_initial_report_events.
- * td_symbol_list.c (symbol_list_arr): Add
- __linuxthreads_initial_report_events.
-
-2002-07-16 Ulrich Drepper <drepper@redhat.com>
-
- * td_thr_clear_event.c: Yet more changes to help with TLS-enabled
- libpthread.
- * td_thr_event_enable.c: Likewise.
- * td_thr_event_getmsg.c: Likewise.
- * td_thr_set_event.c: Likewise.
- * td_thr_setfpregs.c: Likewise.
- * td_thr_setgregs.c: Likewise.
- * td_thr_tsd.c: Likewise.
- * td_thr_validate.c: Likewise.
-
-2002-07-15 Ulrich Drepper <drepper@redhat.com>
-
- * td_ta_thr_iter.c: Some more changes to enable using TLS-enabled
- libpthread.
- * td_thr_event_enable.c: Likewise.
- * td_thr_getfpregs.c: Likewise.
- * td_thr_getgregs.c: Likewise.
-
-2002-07-14 Ulrich Drepper <drepper@redhat.com>
-
- * td_ta_map_id2thr.c: Begin fixing implementation for libpthread with
- TLS support.
- * td_ta_map_lwp2thr.c: Likewise.
- * td_ta_thr_iter.c: Likewise.
- * td_thr_get_info.c: Likewise.
-
-2002-07-10 Ulrich Drepper <drepper@redhat.com>
-
- * Versions [libthread_db] (GLIBC_2.3): Add td_thr_tls_get_addr.
-
-2002-06-14 H.J. Lu <hjl@gnu.org>
-
- * td_thr_tls_get_addr.c (td_thr_tls_get_addr): Don't include
- "tls.h". Return TD_ERR if USE_TLS is not defined.
-
-2002-06-12 Ulrich Drepper <drepper@redhat.com>
-
- * td_thr_tls_get_addr.c: New file.
- * thread_db.h: Add prototype for td_thr_tls_get_addr.
- * Makefile (libthread_db-routines): Add td_thr_tls_get_addr.
-
-2002-03-03 Andreas Jaeger <aj@suse.de>
-
- * thread_dbP.h: Include <unistd.h> for prototypes of __libc_write.
-
-2002-02-04 Ulrich Drepper <drepper@redhat.com>
-
- * thread_dbP.h: Include descr.h instead of internals.h.
- * td_ta_event_getmsg.c: Also include <linuxthreads/internals.h>.
- * td_ta_map_id2thr.c: Likewise.
- * td_ta_map_lwp2thr.c: Likewise.
- * td_ta_thr_iter.c: Likewise.
- * td_ta_tsd_iter.c: Likewise.
- * td_thr_tsd.c: Likewise.
- * td_thr_validate.c: Likewise.
-
-2001-12-28 Andreas Jaeger <aj@suse.de>
-
- * td_init.c (td_init): Don't use __FUNCTION__ as literal.
- * td_log.c (td_log): Likewise.
- * td_ta_delete.c (td_ta_delete): Likewise.
- * td_ta_get_nthreads.c (td_ta_get_nthreads): Likewise.
- * td_ta_get_ph.c (td_ta_get_ph): Likewise.
- * td_ta_map_id2thr.c (td_ta_map_id2thr): Likewise.
- * td_ta_map_lwp2thr.c (td_ta_map_lwp2thr): Likewise.
- * td_ta_new.c (td_ta_new): Likewise.
- * td_ta_clear_event.c (td_ta_clear_event): Likewise.
- * td_ta_enable_stats.c (td_ta_enable_stats): Likewise.
- * td_ta_event_addr.c (td_ta_event_addr): Likewise.
- * td_ta_event_getmsg.c (td_ta_event_getmsg): Likewise.
- * td_ta_get_stats.c (td_ta_get_stats): Likewise.
- * td_ta_reset_stats.c (td_ta_reset_stats): Likewise.
- * td_ta_set_event.c (td_ta_set_event): Likewise.
- * td_ta_setconcurrency.c (td_ta_setconcurrency): Likewise.
- * td_ta_thr_iter.c (td_ta_thr_iter): Likewise.
- * td_ta_tsd_iter.c (td_ta_tsd_iter): Likewise.
- * td_thr_clear_event.c (td_thr_clear_event): Likewise.
- * td_thr_dbresume.c (td_thr_dbresume): Likewise.
- * td_thr_dbsuspend.c (td_thr_dbsuspend): Likewise.
- * td_thr_event_enable.c (td_thr_event_enable): Likewise.
- * td_thr_event_getmsg.c (td_thr_event_getmsg): Likewise.
- * td_thr_get_info.c (td_thr_get_info): Likewise.
- * td_thr_getfpregs.c (td_thr_getfpregs): Likewise.
- * td_thr_getgregs.c (td_thr_getgregs): Likewise.
- * td_thr_getxregs.c (td_thr_getxregs): Likewise.
- * td_thr_getxregsize.c (td_thr_getxregsize): Likewise.
- * td_thr_set_event.c (td_thr_set_event): Likewise.
- * td_thr_setfpregs.c (td_thr_setfpregs): Likewise.
- * td_thr_setgregs.c (td_thr_setgregs): Likewise.
- * td_thr_setprio.c (td_thr_setprio): Likewise.
- * td_thr_setsigpending.c (td_thr_setsigpending): Likewise.
- * td_thr_setxregs.c (td_thr_setxregs): Likewise.
- * td_thr_sigsetmask.c (td_thr_sigsetmask): Likewise.
- * td_thr_tsd.c (td_thr_tsd): Likewise.
- * td_thr_validate.c (td_thr_validate): Likewise.
-
-2001-04-12 Ulrich Drepper <drepper@redhat.com>
-
- * td_ta_map_id2thr.c: If thread terminated return TD_NOTHR.
- * td_thr_validate.c: Likewise.
-
-2001-04-04 Ulrich Drepper <drepper@redhat.com>
-
- * td_thr_getfpregs.c: If p_pid is zero use ps_getpid().
- * td_thr_getgregs.c: Likewise.
- * td_thr_setfpregs.c: Likewise.
- * td_thr_setgregs.c: Likewise.
-
-2001-03-20 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile (libthread_db-routines): Add td_symbol_list.
- * Versions [libthread_db] (GLIBC_2.2.3): Add td_symbol_list.
- * td_symbol_list.c: New file.
- * thread_db.h: Add prototype for td_symbol_list.
- * thread_dbP.h: Define symbol name indices.
- Add prototype for td_lookup.
- * td_ta_event_addr.c: Use td_lookup instead of directly using
- ps_pglobal_lookup to find symbol address.
- * td_ta_get_nthreads.c: Likewise.
- * td_ta_new.c: Likewise.
-
-2001-03-18 Ulrich Drepper <drepper@redhat.com>
-
- * Makefile: When generating DSO link with libc_nonshared.a.
-
-2000-08-01 Andreas Jaeger <aj@suse.de>
-
- * Makefile (distribute): Add missing files.
-
-2000-04-24 Mark Kettenis <kettenis@gnu.org>
-
- * td_thr_get_info.c (td_thr_get_info): Set ti_state to
- TD_THR_ACTIVE instead of TD_THR_RUN. If the thread is no longer
- running but is still joinable, set it to TD_THR_ZOMBIE. Otherwise
- set it to TD_THR_UNKNOWN.
-
-2000-02-25 Andreas Jaeger <aj@suse.de>
-
- * td_ta_thr_iter.c: Include <alloca.h> for prototype declaration.
- * td_ta_tsd_iter.c: Likewise.
-
-2000-01-20 Andreas Jaeger <aj@suse.de>
-
- * td_thr_getgregs.c (td_thr_getgregs): Fix typo.
-
-2000-01-19 Ulrich Drepper <drepper@cygnus.com>
-
- * td_thr_getgregs.c: Correct size parameter of memset call.
-
-1999-12-02 Ulrich Drepper <drepper@cygnus.com>
-
- * proc_service.h: Fix typos in last added declaractions.
-
-1999-12-01 Ulrich Drepper <drepper@cygnus.com>
-
- * proc_service.h: Add ps_pstop, ps_pcontinue, ps_lstop, and
- ps_lcontinue prototypes.
-
-1999-11-23 Ulrich Drepper <drepper@cygnus.com>
-
- * Makefile: Correct dependency for shared object.
-
-1999-11-22 Ulrich Drepper <drepper@cygnus.com>
-
- * td_ta_map_lwp2thr.c: Add missing brace in comparison.
-
- * thread_dbP.h (LOG): Only print message if __td_debug is nonzero.
- * td_init.c: Add __td_debug.
-
-1999-11-12 Ulrich Drepper <drepper@cygnus.com>
-
- * td_ta_thr_iter.c: Start copying list of descriptors from right
- position in target process.
-
- * td_ta_thr_iter.c: Fix loop starting point over all but main and
- manager thread.
-
- * td_ta_thr_iter.c: Read descriptors for main and manager thread
- special since after this we can assume that no new threads will be
- created anymore (at least in the gdb implementation).
-
- * Makefile: Define version correctly.
-
-1999-11-10 Ulrich Drepper <drepper@cygnus.com>
-
- * td_ta_map_lwp2thr.c: If p_pid field is zero, this is before the
- thread library is initialized and we get the PID from the
- debugger.
-
-1999-11-08 Ulrich Drepper <drepper@cygnus.com>
-
- * td_thr_get_info.c: Make sure ti_lid is never zero.
-
- * proc_service.h: Add ps_getpid prototype.
-
-1999-11-03 Ulrich Drepper <drepper@cygnus.com>
-
- * thread_dbP.h (ta_ok): New function.
- * td_ta_new.c: Add new handle to list.
- * td_ta_delete.c: Remove handle from list.
- * td_ta_clear_event.c: Use ta_ok to check for correct ta parameter.
- * td_ta_enable_stats.c: Likewise.
- * td_ta_event_addr.c: Likewise.
- * td_ta_event_getmsg.c: Likewise.
- * td_ta_get_nthreads.c: Likewise.
- * td_ta_get_ph.c: Likewise.
- * td_ta_get_stats.c: Likewise.
- * td_ta_map_id2thr.c: Likewise.
- * td_ta_map_lwp2thr.c: Likewise.
- * td_ta_reset_stats.c: Likewise.
- * td_ta_set_event.c: Likewise.
- * td_ta_setconcurrency.c: Likewise.
- * td_ta_thr_iter.c: Likewise.
-
- * td_ta_tsd_iter.c: Optimize memory retrieving.
-
- * Versions: New file.
-
- * td_thr_get_info.c (td_thr_get_info): Initialize ti_traceme.
-
-1999-11-02 Ulrich Drepper <drepper@cygnus.com>
-
- * td_ta_thr_iter.c (td_ta_thr_iter): Optimize a bit. Read all
- handles at once.
-
- * thread_dbP.h (struct th_thragent): Add pthread_handle_num.
- * td_ta_new.c: Initialize pthread_handle_num.
- * td_ta_event_getmsg.c: If last event was already reported search
- for another unreported event.
-
- * td_thr_get_info.c (td_thr_get_info): Initialize ti_events.
-
- * Makefile (libthread_db-routines): Add td_ta_set_event,
- td_ta_event_getmsg, and td_ta_clear_event.
- * td_ta_clear_event.c: New file.
- * td_ta_event_getmsg.c: New file.
- * td_ta_new.c: Get address of __pthread_last_event in target.
- * td_ta_set_event.c: Don't overwrite old mask, set additional bits.
- * td_thr_set_event.c: Likewise.
- * td_thr_clear_event.c: Implement.
- * thread_db.h: Declare td_ta_clear_event and td_ta_event_getmsg.
- * thread_dbP.h (struct td_thragent): Add pthread_last_event.
-
- * td_ta_new.c: Don't test for __pthread_threads_debug. Get address
- of __pthread_threads_events and fail if this is not possible.
- * td_ta_event_addr.c: Implement.
- * td_thr_event_enable.c: Implement.
- * td_thr_event_getmsg.c: Implement.
- * td_thr_set_event.c: Implement.
- * td_ta_set_event.c: New file.
- * thread_db.h (td_eventbuf_t): Define.
- Declare td_ta_set_event.
- * thread_dbP.h (struct td_thragent): Add pthread_threads_eventsp.
-
- * td_thr_getfpregs.c: For terminated threads return empty structure.
- * td_thr_getgregs.c: Likewise.
- * td_thr_setfpregs.c: Likewise.
- * td_thr_setgregs.c: Likewise.
-
-1999-11-01 Ulrich Drepper <drepper@cygnus.com>
-
- * thread_db.h: Shuffle types around to make things work for gdb.
- * thread_dbP.h: Include proc_service.h before thread_db.h.
-
- * thread_db.h: It's TD_NOLIBTHREAD, not TD_LIBTHREAD.
- * td_ta_new.c: Likewise.
-
-1999-10-14 Ulrich Drepper <drepper@cygnus.com>
-
- * td_ta_new.c: p_startfct does not exist anymore.
-
- * td_thr_get_info.c: Always initialize start function.
-
- * td_ta_thr_iter.c: Don't return threads which exited (but are not
- joined).
-
- * td_thr_validate.c: Don't skip manager thread.
-
-1999-10-13 Ulrich Drepper <drepper@cygnus.com>
-
- * td_ta_thr_iter.c: Use size of descriptor from *TA.
- Don't return manager thread before it's actually running.
- Actually use state parameter to distingusih at least a few states.
-
- * td_thr_get_info.c: Handle manager thread special. Fill in ti_lid,
- ti_state, and ti_startfunc fields.
-
-1999-10-12 Andreas Jaeger <aj@suse.de>
-
- * thread_dbP.h: Include <string.h> for strlen declaration. Remove
- __libc_write prototype since this is already declared in
- linuxthreads/internals.h.
-
-1999-10-11 Ulrich Drepper <drepper@cygnus.com>
-
- * thread_db.h: Fix comment for ti_type.
-
- * td_thr_get_info.c: Initialize ti_type field.
-
- * td_ta_thr_iter.c: Also report the manager thread.
-
-1999-10-08 Andreas Jaeger <aj@suse.de>
-
- * thread_db.h: Fix typos in comments.
-
- * td_ta_get_nthreads.c (td_ta_get_nthreads): Don't hardcode
- libpthread library name, get it from <gnu/lib-names.h> instead.
- * td_ta_new.c (td_ta_new): Likewise.
-
-1999-10-08 Ulrich Drepper <drepper@cygnus.com>
-
- * shlib-versions: New file.
-
-1999-10-07 Ulrich Drepper <drepper@cygnus.com>
-
- * Makefile: New file.
- * proc_service.h: New file.
- * td_init.c: New file.
- * td_log.c: New file.
- * td_ta_delete.c: New file.
- * td_ta_enable_stats.c: New file.
- * td_ta_event_addr.c: New file.
- * td_ta_get_nthreads.c: New file.
- * td_ta_get_ph.c: New file.
- * td_ta_get_stats.c: New file.
- * td_ta_map_id2thr.c: New file.
- * td_ta_map_lwp2thr.c: New file.
- * td_ta_new.c: New file.
- * td_ta_reset_stats.c: New file.
- * td_ta_setconcurrency.c: New file.
- * td_ta_thr_iter.c: New file.
- * td_ta_tsd_iter.c: New file.
- * td_thr_clear_event.c: New file.
- * td_thr_dbresume.c: New file.
- * td_thr_dbsuspend.c: New file.
- * td_thr_event_enable.c: New file.
- * td_thr_event_getmsg.c: New file.
- * td_thr_get_info.c: New file.
- * td_thr_getfpregs.c: New file.
- * td_thr_getgregs.c: New file.
- * td_thr_getxregs.c: New file.
- * td_thr_getxregsize.c: New file.
- * td_thr_set_event.c: New file.
- * td_thr_setfpregs.c: New file.
- * td_thr_setgregs.c: New file.
- * td_thr_setprio.c: New file.
- * td_thr_setsigpending.c: New file.
- * td_thr_setxregs.c: New file.
- * td_thr_sigsetmask.c: New file.
- * td_thr_tsd.c: New file.
- * td_thr_validate.c: New file.
- * thread_db.h: New file.
- * thread_dbP.h: New file.
diff --git a/linuxthreads_db/Makefile b/linuxthreads_db/Makefile
deleted file mode 100644
index 53e46f7758..0000000000
--- a/linuxthreads_db/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright (C) 1999, 2000, 2001, 2002, 2003 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, write to the Free
-# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-# 02111-1307 USA.
-
-# Makefile for linuxthreads debug library subdirectory of GNU C Library.
-
-subdir := linuxthreads_db
-
-linuxthreads_db-version = 1.0
-
-extra-libs = libthread_db
-extra-libs-others := $(extra-libs)
-
-headers = thread_db.h
-libthread_db-routines = td_init td_log td_ta_delete td_ta_get_nthreads \
- td_ta_get_ph td_ta_map_id2thr td_ta_map_lwp2thr \
- td_ta_new td_ta_thr_iter td_ta_tsd_iter \
- td_thr_get_info td_thr_getfpregs td_thr_getgregs \
- td_thr_getxregs td_thr_getxregsize td_thr_setfpregs \
- td_thr_setgregs td_thr_setprio td_thr_setsigpending \
- td_thr_setxregs td_thr_sigsetmask td_thr_tsd \
- td_thr_validate td_thr_dbsuspend td_thr_dbresume \
- td_ta_setconcurrency td_ta_enable_stats \
- td_ta_reset_stats td_ta_get_stats td_ta_event_addr \
- td_thr_event_enable td_thr_set_event \
- td_thr_clear_event td_thr_event_getmsg \
- td_ta_set_event td_ta_event_getmsg \
- td_ta_clear_event td_symbol_list \
- td_thr_tlsbase td_thr_tls_get_addr
-
-libthread_db-inhibit-o = $(filter-out .os,$(object-suffixes))
-
-# The ps_* callback functions are not defined.
-libthread_db.so-no-z-defs = yes
-
-distribute = thread_dbP.h shlib-versions proc_service.h
-include ../Rules
-
-# Depend on libc.so so a DT_NEEDED is generated in the shared objects.
-# This ensures they will load libc.so for needed symbols if loaded by
-# a statically-linked program that hasn't already loaded it.
-$(objpfx)libthread_db.so: $(common-objpfx)libc.so \
- $(common-objpfx)libc_nonshared.a
diff --git a/linuxthreads_db/Versions b/linuxthreads_db/Versions
deleted file mode 100644
index 063493c676..0000000000
--- a/linuxthreads_db/Versions
+++ /dev/null
@@ -1,24 +0,0 @@
-libthread_db {
- GLIBC_2.1.3 {
- # t*
- td_init; td_log; td_ta_clear_event; td_ta_delete; td_ta_enable_stats;
- td_ta_event_addr; td_ta_event_getmsg; td_ta_get_nthreads; td_ta_get_ph;
- td_ta_get_stats; td_ta_map_id2thr; td_ta_map_lwp2thr; td_ta_new;
- td_ta_reset_stats; td_ta_set_event; td_ta_setconcurrency;
- td_ta_thr_iter; td_ta_tsd_iter; td_thr_clear_event; td_thr_dbresume;
- td_thr_dbsuspend; td_thr_event_enable; td_thr_event_getmsg;
- td_thr_get_info; td_thr_getfpregs; td_thr_getgregs; td_thr_getxregs;
- td_thr_getxregsize; td_thr_set_event; td_thr_setfpregs; td_thr_setgregs;
- td_thr_setprio; td_thr_setsigpending; td_thr_setxregs; td_thr_sigsetmask;
- td_thr_tsd; td_thr_validate;
- }
- GLIBC_2.2.3 {
- td_symbol_list;
- }
- GLIBC_2.3 {
- td_thr_tls_get_addr;
- }
- GLIBC_2.3.3 {
- td_thr_tlsbase;
- }
-}
diff --git a/linuxthreads_db/proc_service.h b/linuxthreads_db/proc_service.h
deleted file mode 100644
index 74136c03e1..0000000000
--- a/linuxthreads_db/proc_service.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Copyright (C) 1999 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-/* The definitions in this file must correspond to those in the debugger. */
-#include <sys/procfs.h>
-
-typedef enum
-{
- PS_OK, /* generic "call succeeded" */
- PS_ERR, /* generic. */
- PS_BADPID, /* bad process handle */
- PS_BADLID, /* bad lwp identifier */
- PS_BADADDR, /* bad address */
- PS_NOSYM, /* p_lookup() could not find given symbol */
- PS_NOFREGS
- /*
- * FPU register set not available for given
- * lwp
- */
-} ps_err_e;
-
-
-struct ps_prochandle; /* user defined. */
-
-
-extern ps_err_e ps_pdread(struct ps_prochandle *,
- psaddr_t, void *, size_t);
-extern ps_err_e ps_pdwrite(struct ps_prochandle *,
- psaddr_t, const void *, size_t);
-extern ps_err_e ps_ptread(struct ps_prochandle *,
- psaddr_t, void *, size_t);
-extern ps_err_e ps_ptwrite(struct ps_prochandle *,
- psaddr_t, const void *, size_t);
-
-extern ps_err_e ps_pglobal_lookup(struct ps_prochandle *,
- const char *object_name, const char *sym_name, psaddr_t *sym_addr);
-
-
-extern ps_err_e ps_lgetregs(struct ps_prochandle *,
- lwpid_t, prgregset_t);
-extern ps_err_e ps_lsetregs(struct ps_prochandle *,
- lwpid_t, const prgregset_t);
-extern ps_err_e ps_lgetfpregs(struct ps_prochandle *,
- lwpid_t, prfpregset_t *);
-extern ps_err_e ps_lsetfpregs(struct ps_prochandle *,
- lwpid_t, const prfpregset_t *);
-
-extern pid_t ps_getpid (struct ps_prochandle *);
-
-
-extern ps_err_e ps_pstop (const struct ps_prochandle *);
-extern ps_err_e ps_pcontinue (const struct ps_prochandle *);
-
-extern ps_err_e ps_lstop (const struct ps_prochandle *, lwpid_t);
-extern ps_err_e ps_lcontinue (const struct ps_prochandle *, lwpid_t);
diff --git a/linuxthreads_db/shlib-versions b/linuxthreads_db/shlib-versions
deleted file mode 100644
index 592f7fa284..0000000000
--- a/linuxthreads_db/shlib-versions
+++ /dev/null
@@ -1,2 +0,0 @@
-# The thread debug library
-.*-.*-linux.* libthread_db=1
diff --git a/linuxthreads_db/td_init.c b/linuxthreads_db/td_init.c
deleted file mode 100644
index d714f1ba03..0000000000
--- a/linuxthreads_db/td_init.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Initialization function of thread debugger support library.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-int __td_debug;
-
-
-td_err_e
-td_init (void)
-{
- /* XXX We have to figure out what has to be done. */
- LOG ("td_init");
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_log.c b/linuxthreads_db/td_log.c
deleted file mode 100644
index 025273a634..0000000000
--- a/linuxthreads_db/td_log.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Noop, left for historical reasons.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_log (void)
-{
- /* This interface is deprecated in the Sun interface. We provide it
- for compatibility but don't do anything ourself. We might in
- future do some logging if this seems reasonable. */
- LOG ("td_log");
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_symbol_list.c b/linuxthreads_db/td_symbol_list.c
deleted file mode 100644
index 2f7b2bd4d0..0000000000
--- a/linuxthreads_db/td_symbol_list.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Return list of symbols the library can request.
- Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 2001.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <assert.h>
-#include <gnu/lib-names.h>
-#include "thread_dbP.h"
-
-#ifdef HAVE_ASM_GLOBAL_DOT_NAME
-# define DOT "." /* PPC64 requires . prefix on code symbols. */
-#else
-# define DOT /* No prefix. */
-#endif
-
-static const char *symbol_list_arr[] =
-{
- [PTHREAD_THREADS_EVENTS] = "__pthread_threads_events",
- [PTHREAD_LAST_EVENT] = "__pthread_last_event",
- [PTHREAD_HANDLES_NUM] = "__pthread_handles_num",
- [PTHREAD_HANDLES] = "__pthread_handles",
- [PTHREAD_KEYS] = "pthread_keys",
- [LINUXTHREADS_PTHREAD_THREADS_MAX] = "__linuxthreads_pthread_threads_max",
- [LINUXTHREADS_PTHREAD_KEYS_MAX] = "__linuxthreads_pthread_keys_max",
- [LINUXTHREADS_PTHREAD_SIZEOF_DESCR] = "__linuxthreads_pthread_sizeof_descr",
- [LINUXTHREADS_CREATE_EVENT] = DOT "__linuxthreads_create_event",
- [LINUXTHREADS_DEATH_EVENT] = DOT "__linuxthreads_death_event",
- [LINUXTHREADS_REAP_EVENT] = DOT "__linuxthreads_reap_event",
- [LINUXTHREADS_INITIAL_REPORT_EVENTS] = "__linuxthreads_initial_report_events",
- [LINUXTHREADS_VERSION] = "__linuxthreads_version",
- [NUM_MESSAGES] = NULL
-};
-
-
-const char **
-td_symbol_list (void)
-{
- return symbol_list_arr;
-}
-
-
-int
-td_lookup (struct ps_prochandle *ps, int idx, psaddr_t *sym_addr)
-{
- assert (idx >= 0 && idx < NUM_MESSAGES);
- return ps_pglobal_lookup (ps, LIBPTHREAD_SO, symbol_list_arr[idx], sym_addr);
-}
diff --git a/linuxthreads_db/td_ta_clear_event.c b/linuxthreads_db/td_ta_clear_event.c
deleted file mode 100644
index bdbcf47aac..0000000000
--- a/linuxthreads_db/td_ta_clear_event.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Globally disable events.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_ta_clear_event (ta, event)
- const td_thragent_t *ta;
- td_thr_events_t *event;
-{
- td_thr_events_t old_event;
- int i;
-
- LOG ("td_ta_clear_event");
-
- /* Test whether the TA parameter is ok. */
- if (! ta_ok (ta))
- return TD_BADTA;
-
- /* Write the new value into the thread data structure. */
- if (ps_pdread (ta->ph, ta->pthread_threads_eventsp,
- &old_event, sizeof (td_thrhandle_t)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* Remove the set bits in. */
- for (i = 0; i < TD_EVENTSIZE; ++i)
- old_event.event_bits[i] &= ~event->event_bits[i];
-
- /* Write the new value into the thread data structure. */
- if (ps_pdwrite (ta->ph, ta->pthread_threads_eventsp,
- &old_event, sizeof (td_thrhandle_t)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_ta_delete.c b/linuxthreads_db/td_ta_delete.c
deleted file mode 100644
index 0e6ec17d01..0000000000
--- a/linuxthreads_db/td_ta_delete.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Detach to target process.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <stdlib.h>
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_ta_delete (td_thragent_t *ta)
-{
- LOG ("td_ta_delete");
-
- /* Safety check. */
- if (ta == NULL || __td_agent_list == NULL)
- return TD_BADTA;
-
- /* Remove the handle from the list. */
- if (ta == __td_agent_list->ta)
- /* It's the first element of the list. */
- __td_agent_list = __td_agent_list->next;
- else
- {
- /* We have to search for it. */
- struct agent_list *runp = __td_agent_list;
-
- while (runp->next != NULL && runp->next->ta != ta)
- runp = runp->next;
-
- if (runp->next == NULL)
- /* It's not a valid decriptor since it is not in the list. */
- return TD_BADTA;
-
- runp->next = runp->next->next;
- }
-
- /* The handle was allocated in `td_ta_new'. */
- free (ta);
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_ta_enable_stats.c b/linuxthreads_db/td_ta_enable_stats.c
deleted file mode 100644
index 1d4c34a8d7..0000000000
--- a/linuxthreads_db/td_ta_enable_stats.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Enable collection of statistics for process.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_ta_enable_stats (const td_thragent_t *ta, int enable)
-{
- /* XXX We have to figure out what has to be done. */
- LOG ("td_ta_enable_stats");
-
- /* Test whether the TA parameter is ok. */
- if (! ta_ok (ta))
- return TD_BADTA;
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_ta_event_addr.c b/linuxthreads_db/td_ta_event_addr.c
deleted file mode 100644
index 8bce35ae86..0000000000
--- a/linuxthreads_db/td_ta_event_addr.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/* Get event address.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_ta_event_addr (const td_thragent_t *ta, td_event_e event, td_notify_t *addr)
-{
- td_err_e res = TD_NOEVENT;
- int idx = -1;
-
- LOG ("td_ta_event_addr");
-
- /* Test whether the TA parameter is ok. */
- if (! ta_ok (ta))
- return TD_BADTA;
-
- switch (event)
- {
- case TD_CREATE:
- idx = LINUXTHREADS_CREATE_EVENT;
- break;
-
- case TD_DEATH:
- idx = LINUXTHREADS_DEATH_EVENT;
- break;
-
- case TD_REAP:
- idx = LINUXTHREADS_REAP_EVENT;
- break;
-
- default:
- /* Event cannot be handled. */
- break;
- }
-
- /* Now get the address. */
- if (idx != -1)
- {
- psaddr_t taddr;
-
- if (td_lookup (ta->ph, idx, &taddr) == PS_OK)
- {
- /* Success, we got the address. */
- addr->type = NOTIFY_BPT;
- addr->u.bptaddr = taddr;
-
- res = TD_OK;
- }
- else
- res = TD_ERR;
- }
-
- return res;
-}
diff --git a/linuxthreads_db/td_ta_event_getmsg.c b/linuxthreads_db/td_ta_event_getmsg.c
deleted file mode 100644
index c3a4492a12..0000000000
--- a/linuxthreads_db/td_ta_event_getmsg.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Retrieve event.
- Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <stddef.h>
-#include <string.h>
-
-#include "thread_dbP.h"
-#include <linuxthreads/internals.h>
-
-
-td_err_e
-td_ta_event_getmsg (const td_thragent_t *ta, td_event_msg_t *msg)
-{
- /* XXX I cannot think of another way but using a static variable. */
- static td_thrhandle_t th;
- td_eventbuf_t event;
- psaddr_t addr;
-
- LOG ("td_ta_event_getmsg");
-
- /* Test whether the TA parameter is ok. */
- if (! ta_ok (ta))
- return TD_BADTA;
-
- /* Get the pointer to the thread descriptor with the last event. */
- if (ps_pdread (ta->ph, ta->pthread_last_event,
- &addr, sizeof (void *)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* If the pointer is NULL no event occurred. */
- if (addr == 0)
- return TD_NOMSG;
-
- /* Read the even structure from the target. */
- if (ps_pdread (ta->ph,
- ((char *) addr
- + offsetof (struct _pthread_descr_struct, p_eventbuf)),
- &event, sizeof (td_eventbuf_t)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* Check whether an event occurred. */
- if (event.eventnum == TD_EVENT_NONE)
- {
- /* Oh well, this means the last event was already read. So
- we have to look for any other event. */
- struct pthread_handle_struct handles[ta->pthread_threads_max];
- int num;
- int i;
-
- /* Read the number of currently active threads. */
- if (ps_pdread (ta->ph, ta->pthread_handles_num, &num, sizeof (int))
- != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* Now read the handles. */
- if (ps_pdread (ta->ph, ta->handles, handles,
- ta->pthread_threads_max * sizeof (handles[0])) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- for (i = 0; i < ta->pthread_threads_max && num > 0; ++i)
- {
- if (handles[i].h_descr == NULL)
- /* No entry here. */
- continue;
-
- /* First count this active thread. */
- --num;
-
- if (handles[i].h_descr == addr)
- /* We already handled this. */
- continue;
-
- /* Read the event data for this thread. */
- if (ps_pdread (ta->ph,
- ((char *) handles[i].h_descr
- + offsetof (struct _pthread_descr_struct,
- p_eventbuf)),
- &event, sizeof (td_eventbuf_t)) != PS_OK)
- return TD_ERR;
-
- if (event.eventnum != TD_EVENT_NONE)
- {
- /* We found a thread with an unreported event. */
- addr = handles[i].h_descr;
- break;
- }
- }
-
- /* If we haven't found any other event signal this to the user. */
- if (event.eventnum == TD_EVENT_NONE)
- return TD_NOMSG;
- }
-
- /* Generate the thread descriptor. */
- th.th_ta_p = (td_thragent_t *) ta;
- th.th_unique = addr;
-
- /* Fill the user's data structure. */
- msg->event = event.eventnum;
- msg->th_p = &th;
- msg->msg.data = (uintptr_t) event.eventdata;
-
- /* And clear the event message in the target. */
- memset (&event, '\0', sizeof (td_eventbuf_t));
- if (ps_pdwrite (ta->ph,
- ((char *) addr
- + offsetof (struct _pthread_descr_struct, p_eventbuf)),
- &event, sizeof (td_eventbuf_t)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_ta_get_nthreads.c b/linuxthreads_db/td_ta_get_nthreads.c
deleted file mode 100644
index 839b56be59..0000000000
--- a/linuxthreads_db/td_ta_get_nthreads.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Get the number of threads in the process.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-td_err_e
-td_ta_get_nthreads (const td_thragent_t *ta, int *np)
-{
- psaddr_t addr;
-
- LOG ("td_ta_get_nthreads");
-
- /* Test whether the TA parameter is ok. */
- if (! ta_ok (ta))
- return TD_BADTA;
-
- /* Access the variable `__pthread_handles_num'. */
- if (td_lookup (ta->ph, PTHREAD_HANDLES_NUM, &addr) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- if (ps_pdread (ta->ph, addr, np, sizeof (int)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_ta_get_ph.c b/linuxthreads_db/td_ta_get_ph.c
deleted file mode 100644
index 23d3285084..0000000000
--- a/linuxthreads_db/td_ta_get_ph.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Get external process handle.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_ta_get_ph (const td_thragent_t *ta, struct ps_prochandle **ph)
-{
- LOG ("td_ta_get_ph");
-
- /* Test whether the TA parameter is ok. */
- if (! ta_ok (ta))
- return TD_BADTA;
-
- *ph = ta->ph;
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_ta_get_stats.c b/linuxthreads_db/td_ta_get_stats.c
deleted file mode 100644
index 6bf2f53527..0000000000
--- a/linuxthreads_db/td_ta_get_stats.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Retrieve statistics for process.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_ta_get_stats (const td_thragent_t *ta, td_ta_stats_t *statsp)
-{
- /* XXX We have to figure out what has to be done. */
- LOG ("td_ta_get_stats");
-
- /* Test whether the TA parameter is ok. */
- if (! ta_ok (ta))
- return TD_BADTA;
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_ta_map_id2thr.c b/linuxthreads_db/td_ta_map_id2thr.c
deleted file mode 100644
index ddeb2d3c4a..0000000000
--- a/linuxthreads_db/td_ta_map_id2thr.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Map thread ID to thread handle.
- Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-#include <linuxthreads/internals.h>
-
-
-td_err_e
-td_ta_map_id2thr (const td_thragent_t *ta, pthread_t pt, td_thrhandle_t *th)
-{
- struct pthread_handle_struct phc;
- struct _pthread_descr_struct pds;
- int pthread_threads_max;
-
- LOG ("td_ta_map_id2thr");
-
- /* Test whether the TA parameter is ok. */
- if (! ta_ok (ta))
- return TD_BADTA;
-
- /* Make the following expression a bit smaller. */
- pthread_threads_max = ta->pthread_threads_max;
-
- /* We can compute the entry in the handle array we want. */
- if (ps_pdread (ta->ph, ta->handles + pt % pthread_threads_max, &phc,
- sizeof (struct pthread_handle_struct)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* Test whether this entry is in use. */
- if (phc.h_descr == NULL)
- {
- if (pt % pthread_threads_max == 0)
- {
- /* The initial thread always exists but the thread library
- might not yet be initialized. */
- th->th_ta_p = (td_thragent_t *) ta;
- th->th_unique = NULL;
-
- return TD_OK;
- }
-
- return TD_BADTH;
- }
-
- /* Next test: get the descriptor to see whether this is not an old
- thread handle. */
- if (ps_pdread (ta->ph, phc.h_descr, &pds,
- sizeof (struct _pthread_descr_struct)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- if (pds.p_tid != pt)
- return TD_BADTH;
-
- if (pds.p_terminated != 0)
- return TD_NOTHR;
-
- /* Create the `td_thrhandle_t' object. */
- th->th_ta_p = (td_thragent_t *) ta;
- th->th_unique = phc.h_descr;
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_ta_map_lwp2thr.c b/linuxthreads_db/td_ta_map_lwp2thr.c
deleted file mode 100644
index dd2fcbfe4e..0000000000
--- a/linuxthreads_db/td_ta_map_lwp2thr.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Which thread is running on an lwp?
- Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-#include <linuxthreads/internals.h>
-
-
-td_err_e
-td_ta_map_lwp2thr (const td_thragent_t *ta, lwpid_t lwpid, td_thrhandle_t *th)
-{
- int pthread_threads_max = ta->pthread_threads_max;
- size_t sizeof_descr = ta->sizeof_descr;
- struct pthread_handle_struct phc[pthread_threads_max];
- size_t cnt;
-#ifdef ALL_THREADS_STOPPED
- int num;
-#else
-# define num 1
-#endif
-
- LOG ("td_ta_map_lwp2thr");
-
- /* Test whether the TA parameter is ok. */
- if (! ta_ok (ta))
- return TD_BADTA;
-
- /* Read all the descriptors. */
- if (ps_pdread (ta->ph, ta->handles, phc,
- sizeof (struct pthread_handle_struct) * pthread_threads_max)
- != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
-#ifdef ALL_THREADS_STOPPED
- /* Read the number of currently active threads. */
- if (ps_pdread (ta->ph, ta->pthread_handles_num, &num, sizeof (int)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-#endif
-
- /* Get the entries one after the other and find out whether the ID
- matches. */
- for (cnt = 0; cnt < pthread_threads_max && num > 0; ++cnt)
- if (phc[cnt].h_descr != NULL)
- {
- struct _pthread_descr_struct pds;
-
-#ifdef ALL_THREADS_STOPPED
- /* First count this active thread. */
- --num;
-#endif
-
- if (ps_pdread (ta->ph, phc[cnt].h_descr, &pds, sizeof_descr) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- if ((pds.p_pid ?: ps_getpid (ta->ph)) == lwpid)
- {
- /* Found it. Now fill in the `td_thrhandle_t' object. */
- th->th_ta_p = (td_thragent_t *) ta;
- th->th_unique = phc[cnt].h_descr;
-
- return TD_OK;
- }
- }
- else if (cnt == 0)
- {
- /* The initial thread always exists. But it might not yet be
- initialized. Construct a value. */
- th->th_ta_p = (td_thragent_t *) ta;
- th->th_unique = NULL;
-
- return TD_OK;
- }
-
- return TD_NOLWP;
-}
diff --git a/linuxthreads_db/td_ta_new.c b/linuxthreads_db/td_ta_new.c
deleted file mode 100644
index e93d8b4c50..0000000000
--- a/linuxthreads_db/td_ta_new.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/* Attach to target process.
- Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-#include <version.h>
-
-#include "thread_dbP.h"
-
-
-/* Datatype for the list of known thread agents. Normally there will
- be exactly one so we don't spend much though on making it fast. */
-struct agent_list *__td_agent_list;
-
-
-td_err_e
-td_ta_new (struct ps_prochandle *ps, td_thragent_t **ta)
-{
- psaddr_t addr;
- psaddr_t versaddr;
- char versbuf[sizeof (VERSION)];
- struct agent_list *elemp;
-
- LOG ("td_ta_new");
-
- /* Get the global event mask. This is one of the variables which
- are new in the thread library to enable debugging. If it is
- not available we cannot debug. */
- if (td_lookup (ps, PTHREAD_THREADS_EVENTS, &addr) != PS_OK)
- return TD_NOLIBTHREAD;
-
- /* Check whether the versions match. */
- if (td_lookup (ps, LINUXTHREADS_VERSION, &versaddr) != PS_OK)
- return TD_VERSION;
- if (ps_pdread (ps, versaddr, versbuf, sizeof (versbuf)) != PS_OK)
- return TD_ERR;
-
- versbuf[sizeof (versbuf) - 1] = '\0';
- if (strcmp (versbuf, VERSION) != 0)
- /* Not the right version. */
- return TD_VERSION;
-
- /* Fill in the appropriate information. */
- *ta = (td_thragent_t *) malloc (sizeof (td_thragent_t));
- if (*ta == NULL)
- return TD_MALLOC;
-
- /* Store the proc handle which we will pass to the callback functions
- back into the debugger. */
- (*ta)->ph = ps;
-
- /* Remember the address. */
- (*ta)->pthread_threads_eventsp = (td_thr_events_t *) addr;
-
- /* Get the pointer to the variable pointing to the thread descriptor
- with the last event. */
- if (td_lookup (ps, PTHREAD_LAST_EVENT, &(*ta)->pthread_last_event) != PS_OK)
- {
- free_return:
- free (*ta);
- return TD_ERR;
- }
-
- /* Get the pointer to the variable containing the number of active
- threads. */
- if (td_lookup (ps, PTHREAD_HANDLES_NUM, &(*ta)->pthread_handles_num)
- != PS_OK)
- goto free_return;
-
- /* See whether the library contains the necessary symbols. */
- if (td_lookup (ps, PTHREAD_HANDLES, &addr) != PS_OK)
- goto free_return;
-
- (*ta)->handles = (struct pthread_handle_struct *) addr;
-
-
- if (td_lookup (ps, PTHREAD_KEYS, &addr) != PS_OK)
- goto free_return;
-
- /* Cast to the right type. */
- (*ta)->keys = (struct pthread_key_struct *) addr;
-
- /* Find out about the maximum number of threads. Old implementations
- don't provide this information. In this case we assume that the
- debug library is compiled with the same values. */
- if (td_lookup (ps, LINUXTHREADS_PTHREAD_THREADS_MAX, &addr) != PS_OK)
- (*ta)->pthread_threads_max = PTHREAD_THREADS_MAX;
- else
- {
- if (ps_pdread (ps, addr, &(*ta)->pthread_threads_max, sizeof (int))
- != PS_OK)
- goto free_return;
- }
-
- /* Similar for the maximum number of thread local data keys. */
- if (td_lookup (ps, LINUXTHREADS_PTHREAD_KEYS_MAX, &addr) != PS_OK)
- (*ta)->pthread_keys_max = PTHREAD_KEYS_MAX;
- else
- {
- if (ps_pdread (ps, addr, &(*ta)->pthread_keys_max, sizeof (int))
- != PS_OK)
- goto free_return;
- }
-
- /* And for the size of the second level arrays for the keys. */
- if (td_lookup (ps, LINUXTHREADS_PTHREAD_SIZEOF_DESCR, &addr) != PS_OK)
- (*ta)->sizeof_descr = sizeof (struct _pthread_descr_struct);
- else
- {
- if (ps_pdread (ps, addr, &(*ta)->sizeof_descr, sizeof (int)) != PS_OK)
- goto free_return;
- /* Don't let bogons in the inferior make us mess ourselves. */
- if ((*ta)->sizeof_descr > sizeof (struct _pthread_descr_struct))
- (*ta)->sizeof_descr = sizeof (struct _pthread_descr_struct);
- }
-
- /* Now add the new agent descriptor to the list. */
- elemp = (struct agent_list *) malloc (sizeof (struct agent_list));
- if (elemp == NULL)
- {
- /* Argh, now that everything else worked... */
- free (*ta);
- return TD_MALLOC;
- }
-
- /* We don't care for thread-safety here. */
- elemp->ta = *ta;
- elemp->next = __td_agent_list;
- __td_agent_list = elemp;
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_ta_reset_stats.c b/linuxthreads_db/td_ta_reset_stats.c
deleted file mode 100644
index b3ddbd07b3..0000000000
--- a/linuxthreads_db/td_ta_reset_stats.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Reset statistics.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_ta_reset_stats (const td_thragent_t *ta)
-{
- /* XXX We have to figure out what has to be done. */
- LOG ("td_ta_reset_stats");
-
- /* Test whether the TA parameter is ok. */
- if (! ta_ok (ta))
- return TD_BADTA;
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_ta_set_event.c b/linuxthreads_db/td_ta_set_event.c
deleted file mode 100644
index 73cf9f4051..0000000000
--- a/linuxthreads_db/td_ta_set_event.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Globally enable events.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_ta_set_event (ta, event)
- const td_thragent_t *ta;
- td_thr_events_t *event;
-{
- td_thr_events_t old_event;
- int i;
-
- LOG ("td_ta_set_event");
-
- /* Test whether the TA parameter is ok. */
- if (! ta_ok (ta))
- return TD_BADTA;
-
- /* Write the new value into the thread data structure. */
- if (ps_pdread (ta->ph, ta->pthread_threads_eventsp,
- &old_event, sizeof (td_thrhandle_t)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* Or the new bits in. */
- for (i = 0; i < TD_EVENTSIZE; ++i)
- old_event.event_bits[i] |= event->event_bits[i];
-
- /* Write the new value into the thread data structure. */
- if (ps_pdwrite (ta->ph, ta->pthread_threads_eventsp,
- &old_event, sizeof (td_thrhandle_t)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_ta_setconcurrency.c b/linuxthreads_db/td_ta_setconcurrency.c
deleted file mode 100644
index 408e763094..0000000000
--- a/linuxthreads_db/td_ta_setconcurrency.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Set suggested concurrency level for process.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_ta_setconcurrency (const td_thragent_t *ta, int level)
-{
- /* This is something LinuxThreads does not support. */
- LOG ("td_ta_setconcurrency");
-
- /* Test whether the TA parameter is ok. */
- if (! ta_ok (ta))
- return TD_BADTA;
-
- return TD_NOCAPAB;
-}
diff --git a/linuxthreads_db/td_ta_thr_iter.c b/linuxthreads_db/td_ta_thr_iter.c
deleted file mode 100644
index 9ab04e14e3..0000000000
--- a/linuxthreads_db/td_ta_thr_iter.c
+++ /dev/null
@@ -1,176 +0,0 @@
-/* Iterate over a process's threads.
- Copyright (C) 1999,2000,2001,2002,2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-#include <linuxthreads/internals.h>
-#include <alloca.h>
-
-static int
-handle_descr (const td_thragent_t *ta, td_thr_iter_f *callback,
- void *cbdata_p, td_thr_state_e state, int ti_pri,
- size_t cnt, pthread_descr descr)
-{
- struct _pthread_descr_struct pds;
- size_t sizeof_descr = ta->sizeof_descr;
- td_thrhandle_t th;
-
- if (descr == NULL)
- {
- /* No descriptor (yet). */
- if (cnt == 0)
- {
- /* This is the main thread. Create a fake descriptor. */
- memset (&pds, '\0', sizeof (pds));
-
- /* Empty thread descriptor the thread library would create. */
-#if !defined USE_TLS || !TLS_DTV_AT_TP
- pds.p_header.data.self = &pds;
-#endif
- pds.p_nextlive = pds.p_prevlive = &pds;
- pds.p_tid = PTHREAD_THREADS_MAX;
- /* The init code also sets up p_lock, p_errnop, p_herrnop, and
- p_userstack but this should not be necessary here. */
-
- th.th_ta_p = (td_thragent_t *) ta;
- th.th_unique = NULL;
- if (callback (&th, cbdata_p) != 0)
- return TD_DBERR;
-
- /* All done successfully. */
- return TD_OK;
- }
- else if (cnt == 1)
- /* The manager is not yet started. No big deal. */
- return TD_OK;
- else
- /* For every other thread this should not happen. */
- return TD_ERR;
- }
-
- if (ps_pdread (ta->ph, descr, &pds, sizeof_descr) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* The manager thread must be handled special. The descriptor
- exists but the thread only gets created when the first
- `pthread_create' call is issued. A clear indication that this
- happened is when the p_pid field is non-zero. */
- if (cnt == 1 && pds.p_pid == 0)
- return TD_OK;
-
- /* Now test whether this thread matches the specified
- conditions. */
-
- /* Only if the priority level is as high or higher. */
- if (pds.p_priority < ti_pri)
- return TD_OK;
-
- /* Test the state.
- XXX This is incomplete. */
- if (state != TD_THR_ANY_STATE)
- return TD_OK;
-
- /* XXX For now we ignore threads which are not running anymore.
- The reason is that gdb tries to get the registers and fails.
- In future we should have a special mode of the thread library
- in which we keep the process around until the actual join
- operation happened. */
- if (pds.p_exited != 0)
- return TD_OK;
-
- /* Yep, it matches. Call the callback function. */
- th.th_ta_p = (td_thragent_t *) ta;
- th.th_unique = descr;
- if (callback (&th, cbdata_p) != 0)
- return TD_DBERR;
-
- /* All done successfully. */
- return TD_OK;
-}
-
-
-td_err_e
-td_ta_thr_iter (const td_thragent_t *ta, td_thr_iter_f *callback,
- void *cbdata_p, td_thr_state_e state, int ti_pri,
- sigset_t *ti_sigmask_p, unsigned int ti_user_flags)
-{
- int pthread_threads_max;
- struct pthread_handle_struct *phc;
- td_err_e result = TD_OK;
- int cnt;
-#ifdef ALL_THREADS_STOPPED
- int num;
-#else
-# define num 1
-#endif
-
- LOG ("td_ta_thr_iter");
-
- /* Test whether the TA parameter is ok. */
- if (! ta_ok (ta))
- return TD_BADTA;
-
- pthread_threads_max = ta->pthread_threads_max;
- phc = (struct pthread_handle_struct *) alloca (sizeof (phc[0])
- * pthread_threads_max);
-
- /* First read only the main thread and manager thread information. */
- if (ps_pdread (ta->ph, ta->handles, phc,
- sizeof (struct pthread_handle_struct) * 2) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* Now handle these descriptors. */
- result = handle_descr (ta, callback, cbdata_p, state, ti_pri, 0,
- phc[0].h_descr);
- if (result != TD_OK)
- return result;
- result = handle_descr (ta, callback, cbdata_p, state, ti_pri, 1,
- phc[1].h_descr);
- if (result != TD_OK)
- return result;
-
- /* Read all the descriptors. */
- if (ps_pdread (ta->ph, ta->handles + 2, &phc[2],
- (sizeof (struct pthread_handle_struct)
- * (pthread_threads_max - 2))) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
-#ifdef ALL_THREADS_STOPPED
- /* Read the number of currently active threads. */
- if (ps_pdread (ta->ph, ta->pthread_handles_num, &num, sizeof (int)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-#endif
-
- /* Now get all descriptors, one after the other. */
- for (cnt = 2; cnt < pthread_threads_max && num > 0; ++cnt)
- if (phc[cnt].h_descr != NULL)
- {
-#ifdef ALL_THREADS_STOPPED
- /* First count this active thread. */
- --num;
-#endif
-
- result = handle_descr (ta, callback, cbdata_p, state, ti_pri, cnt,
- phc[cnt].h_descr);
- if (result != TD_OK)
- break;
- }
-
- return result;
-}
diff --git a/linuxthreads_db/td_ta_tsd_iter.c b/linuxthreads_db/td_ta_tsd_iter.c
deleted file mode 100644
index 2eb41f6a15..0000000000
--- a/linuxthreads_db/td_ta_tsd_iter.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Iterate over a process's thread-specific data.
- Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-#include <linuxthreads/internals.h>
-#include <alloca.h>
-
-td_err_e
-td_ta_tsd_iter (const td_thragent_t *ta, td_key_iter_f *callback,
- void *cbdata_p)
-{
- struct pthread_key_struct *keys;
- int pthread_keys_max;
- int cnt;
-
- LOG ("td_ta_tsd_iter");
-
- /* Test whether the TA parameter is ok. */
- if (! ta_ok (ta))
- return TD_BADTA;
-
- pthread_keys_max = ta->pthread_keys_max;
- keys = (struct pthread_key_struct *) alloca (sizeof (keys[0])
- * pthread_keys_max);
-
- /* Read all the information about the keys. */
- if (ps_pdread (ta->ph, ta->keys, keys,
- sizeof (keys[0]) * pthread_keys_max) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* Now get all descriptors, one after the other. */
- for (cnt = 0; cnt < pthread_keys_max; ++cnt)
- if (keys[cnt].in_use
- /* Return with an error if the callback returns a nonzero value. */
- && callback (cnt, keys[cnt].destr, cbdata_p) != 0)
- return TD_DBERR;
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_thr_clear_event.c b/linuxthreads_db/td_thr_clear_event.c
deleted file mode 100644
index c027fc09fd..0000000000
--- a/linuxthreads_db/td_thr_clear_event.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Disable specific event for thread.
- Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <stddef.h>
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_thr_clear_event (th, event)
- const td_thrhandle_t *th;
- td_thr_events_t *event;
-{
- td_thr_events_t old_event;
- int i;
-
- LOG ("td_thr_clear_event");
-
- /* If the thread descriptor has not yet been constructed do not do
- anything. */
- if (th->th_unique == NULL)
- return TD_OK;
-
- /* Write the new value into the thread data structure. */
- if (ps_pdread (th->th_ta_p->ph,
- ((char *) th->th_unique
- + offsetof (struct _pthread_descr_struct,
- p_eventbuf.eventmask)),
- &old_event, sizeof (td_thrhandle_t)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* Remove the set bits in. */
- for (i = 0; i < TD_EVENTSIZE; ++i)
- old_event.event_bits[i] &= ~event->event_bits[i];
-
- /* Write the new value into the thread data structure. */
- if (ps_pdwrite (th->th_ta_p->ph,
- ((char *) th->th_unique
- + offsetof (struct _pthread_descr_struct,
- p_eventbuf.eventmask)),
- &old_event, sizeof (td_thrhandle_t)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_thr_dbresume.c b/linuxthreads_db/td_thr_dbresume.c
deleted file mode 100644
index 7b7f6eef9f..0000000000
--- a/linuxthreads_db/td_thr_dbresume.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Resume execution of given thread.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_thr_dbresume (const td_thrhandle_t *th)
-{
- /* XXX We have to figure out what has to be done. */
- LOG ("td_thr_dbresume");
- return TD_NOCAPAB;
-}
diff --git a/linuxthreads_db/td_thr_dbsuspend.c b/linuxthreads_db/td_thr_dbsuspend.c
deleted file mode 100644
index ef668023de..0000000000
--- a/linuxthreads_db/td_thr_dbsuspend.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Suspend execution of given thread.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_thr_dbsuspend (const td_thrhandle_t *th)
-{
- /* XXX We have to figure out what has to be done. */
- LOG ("td_thr_dbsuspend");
- return TD_NOCAPAB;
-}
diff --git a/linuxthreads_db/td_thr_event_enable.c b/linuxthreads_db/td_thr_event_enable.c
deleted file mode 100644
index 407f3fc44a..0000000000
--- a/linuxthreads_db/td_thr_event_enable.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Enable event process-wide.
- Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <stddef.h>
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_thr_event_enable (th, onoff)
- const td_thrhandle_t *th;
- int onoff;
-{
- LOG ("td_thr_event_enable");
-
- /* Write the new value into the thread data structure. */
- if (th->th_unique == NULL)
- {
- psaddr_t addr;
-
- if (td_lookup (th->th_ta_p->ph, LINUXTHREADS_INITIAL_REPORT_EVENTS,
- &addr) != PS_OK)
- /* Cannot read the symbol. This should not happen. */
- return TD_ERR;
-
- if (ps_pdwrite (th->th_ta_p->ph, addr, &onoff, sizeof (int)) != PS_OK)
- return TD_ERR;
-
- return TD_OK;
- }
-
- if (ps_pdwrite (th->th_ta_p->ph,
- ((char *) th->th_unique
- + offsetof (struct _pthread_descr_struct,
- p_report_events)),
- &onoff, sizeof (int)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_thr_event_getmsg.c b/linuxthreads_db/td_thr_event_getmsg.c
deleted file mode 100644
index bf4ddd4ade..0000000000
--- a/linuxthreads_db/td_thr_event_getmsg.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Retrieve event.
- Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <stddef.h>
-#include <string.h>
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_thr_event_getmsg (const td_thrhandle_t *th, td_event_msg_t *msg)
-{
- td_eventbuf_t event;
-
- LOG ("td_thr_event_getmsg");
-
- /* If the thread descriptor has not yet been created there cannot be
- any event. */
- if (th->th_unique == NULL)
- return TD_NOMSG;
-
- /* Read the even structure from the target. */
- if (ps_pdread (th->th_ta_p->ph,
- ((char *) th->th_unique
- + offsetof (struct _pthread_descr_struct, p_eventbuf)),
- &event, sizeof (td_eventbuf_t)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* Check whether an event occurred. */
- if (event.eventnum == TD_EVENT_NONE)
- /* Nothing. */
- return TD_NOMSG;
-
- /* Fill the user's data structure. */
- msg->event = event.eventnum;
- msg->th_p = th;
- msg->msg.data = (uintptr_t) event.eventdata;
-
- /* And clear the event message in the target. */
- memset (&event, '\0', sizeof (td_eventbuf_t));
- if (ps_pdwrite (th->th_ta_p->ph,
- ((char *) th->th_unique
- + offsetof (struct _pthread_descr_struct, p_eventbuf)),
- &event, sizeof (td_eventbuf_t)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_thr_get_info.c b/linuxthreads_db/td_thr_get_info.c
deleted file mode 100644
index 4666bda976..0000000000
--- a/linuxthreads_db/td_thr_get_info.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Get thread information.
- Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <stddef.h>
-#include <string.h>
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_thr_get_info (const td_thrhandle_t *th, td_thrinfo_t *infop)
-{
- struct _pthread_descr_struct pds;
-
- LOG ("td_thr_get_info");
-
- /* Handle the case when the thread library is not yet initialized. */
- if (th->th_unique == NULL)
- {
- memset (&pds, '\0', sizeof (pds));
- pds.p_tid = PTHREAD_THREADS_MAX;
- }
- else
- /* Get the thread descriptor. */
- if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
- th->th_ta_p->sizeof_descr) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* Fill in information. Clear first to provide reproducable
- results for the fields we do not fill in. */
- memset (infop, '\0', sizeof (td_thrinfo_t));
-
- /* We have to handle the manager thread special since the thread
- descriptor in older versions is not fully initialized. */
- if (pds.p_nr == 1)
- {
- infop->ti_tid = th->th_ta_p->pthread_threads_max * 2 + 1;
- infop->ti_type = TD_THR_SYSTEM;
- infop->ti_state = TD_THR_ACTIVE;
- }
- else
- {
- infop->ti_tid = pds.p_tid;
- infop->ti_tls = (char *) pds.p_specific;
- infop->ti_pri = pds.p_priority;
- infop->ti_type = TD_THR_USER;
-
- if (! pds.p_terminated)
- /* XXX For now there is no way to get more information. */
- infop->ti_state = TD_THR_ACTIVE;
- else if (! pds.p_detached)
- infop->ti_state = TD_THR_ZOMBIE;
- else
- infop->ti_state = TD_THR_UNKNOWN;
- }
-
- /* Initialization which are the same in both cases. */
- infop->ti_lid = pds.p_pid ?: ps_getpid (th->th_ta_p->ph);
- infop->ti_ta_p = th->th_ta_p;
- infop->ti_startfunc = pds.p_start_args.start_routine;
- memcpy (&infop->ti_events, &pds.p_eventbuf.eventmask,
- sizeof (td_thr_events_t));
- infop->ti_traceme = pds.p_report_events != 0;
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_thr_getfpregs.c b/linuxthreads_db/td_thr_getfpregs.c
deleted file mode 100644
index 31c55c8765..0000000000
--- a/linuxthreads_db/td_thr_getfpregs.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Get a thread's floating-point register set.
- Copyright (C) 1999, 2001, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_thr_getfpregs (const td_thrhandle_t *th, prfpregset_t *regset)
-{
- struct _pthread_descr_struct pds;
-
- LOG ("td_thr_getfpregs");
-
- if (th->th_unique == NULL)
- {
- /* No data yet. Use the main thread. */
- pid_t pid = ps_getpid (th->th_ta_p->ph);
- if (ps_lgetfpregs (th->th_ta_p->ph, pid, regset) != PS_OK)
- return TD_ERR;
- return TD_OK;
- }
-
- /* We have to get the state and the PID for this thread. */
- if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
- sizeof (struct _pthread_descr_struct)) != PS_OK)
- return TD_ERR;
-
- /* If the thread already terminated we return all zeroes. */
- if (pds.p_terminated)
- memset (regset, '\0', sizeof (*regset));
- /* Otherwise get the register content through the callback. */
- else
- {
- pid_t pid = pds.p_pid ?: ps_getpid (th->th_ta_p->ph);
-
- if (ps_lgetfpregs (th->th_ta_p->ph, pid, regset) != PS_OK)
- return TD_ERR;
- }
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_thr_getgregs.c b/linuxthreads_db/td_thr_getgregs.c
deleted file mode 100644
index a9ec6a37da..0000000000
--- a/linuxthreads_db/td_thr_getgregs.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Get a thread's general register set.
- Copyright (C) 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_thr_getgregs (const td_thrhandle_t *th, prgregset_t gregs)
-{
- struct _pthread_descr_struct pds;
-
- LOG ("td_thr_getgregs");
-
- if (th->th_unique == NULL)
- {
- /* No data yet. Use the main thread. */
- pid_t pid = ps_getpid (th->th_ta_p->ph);
- if (ps_lgetregs (th->th_ta_p->ph, pid, gregs) != PS_OK)
- return TD_ERR;
- return TD_OK;
- }
-
- /* We have to get the state and the PID for this thread. */
- if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
- sizeof (struct _pthread_descr_struct)) != PS_OK)
- return TD_ERR;
-
- /* If the thread already terminated we return all zeroes. */
- if (pds.p_terminated)
- memset (gregs, '\0', sizeof (prgregset_t));
- /* Otherwise get the register content through the callback. */
- else
- {
- pid_t pid = pds.p_pid ?: ps_getpid (th->th_ta_p->ph);
-
- if (ps_lgetregs (th->th_ta_p->ph, pid, gregs) != PS_OK)
- return TD_ERR;
- }
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_thr_getxregs.c b/linuxthreads_db/td_thr_getxregs.c
deleted file mode 100644
index 39cd73cf1d..0000000000
--- a/linuxthreads_db/td_thr_getxregs.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Get a thread's extra state register set.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_thr_getxregs (const td_thrhandle_t *th, void *xregs)
-{
- /* XXX This might be platform specific. */
- LOG ("td_thr_getxregs");
- return TD_NOXREGS;
-}
diff --git a/linuxthreads_db/td_thr_getxregsize.c b/linuxthreads_db/td_thr_getxregsize.c
deleted file mode 100644
index 5d8ac288e4..0000000000
--- a/linuxthreads_db/td_thr_getxregsize.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Get the size of the extra state register set for this architecture.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_thr_getxregsize (const td_thrhandle_t *th, int *sizep)
-{
- /* XXX This might be platform specific. */
- LOG ("td_thr_getxregsize");
- return TD_NOXREGS;
-}
diff --git a/linuxthreads_db/td_thr_set_event.c b/linuxthreads_db/td_thr_set_event.c
deleted file mode 100644
index 205b445c79..0000000000
--- a/linuxthreads_db/td_thr_set_event.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Enable specific event for thread.
- Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <stddef.h>
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_thr_set_event (th, event)
- const td_thrhandle_t *th;
- td_thr_events_t *event;
-{
- td_thr_events_t old_event;
- int i;
-
- LOG ("td_thr_set_event");
-
- /* What shall we do if no thread descriptor exists but the user
- wants to set an event? */
- if (th->th_unique == NULL)
- return TD_NOTALLOC;
-
- /* Write the new value into the thread data structure. */
- if (ps_pdread (th->th_ta_p->ph,
- ((char *) th->th_unique
- + offsetof (struct _pthread_descr_struct,
- p_eventbuf.eventmask)),
- &old_event, sizeof (td_thrhandle_t)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* Or the new bits in. */
- for (i = 0; i < TD_EVENTSIZE; ++i)
- old_event.event_bits[i] |= event->event_bits[i];
-
- /* Write the new value into the thread data structure. */
- if (ps_pdwrite (th->th_ta_p->ph,
- ((char *) th->th_unique
- + offsetof (struct _pthread_descr_struct,
- p_eventbuf.eventmask)),
- &old_event, sizeof (td_thrhandle_t)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_thr_setfpregs.c b/linuxthreads_db/td_thr_setfpregs.c
deleted file mode 100644
index e4d9ec65e7..0000000000
--- a/linuxthreads_db/td_thr_setfpregs.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Set a thread's floating-point register set.
- Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_thr_setfpregs (const td_thrhandle_t *th, const prfpregset_t *fpregs)
-{
- struct _pthread_descr_struct pds = { .p_terminated = 0, .p_pid = 0 };
-
- LOG ("td_thr_setfpregs");
-
- /* We have to get the state and the PID for this thread. */
- if (th->th_unique != NULL
- && ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
- sizeof (struct _pthread_descr_struct)) != PS_OK)
- return TD_ERR;
-
- /* Only set the registers if the thread hasn't yet terminated. */
- if (pds.p_terminated == 0)
- {
- pid_t pid = pds.p_pid ?: ps_getpid (th->th_ta_p->ph);
-
- if (ps_lsetfpregs (th->th_ta_p->ph, pid, fpregs) != PS_OK)
- return TD_ERR;
- }
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_thr_setgregs.c b/linuxthreads_db/td_thr_setgregs.c
deleted file mode 100644
index 8c021a4738..0000000000
--- a/linuxthreads_db/td_thr_setgregs.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Set a thread's general register set.
- Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_thr_setgregs (const td_thrhandle_t *th, prgregset_t gregs)
-{
- struct _pthread_descr_struct pds = { .p_terminated = 0, .p_pid = 0 };
-
- LOG ("td_thr_setgregs");
-
- /* We have to get the state and the PID for this thread. */
- if (th->th_unique != NULL
- && ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
- sizeof (struct _pthread_descr_struct)) != PS_OK)
- return TD_ERR;
-
- /* Only set the registers if the thread hasn't yet terminated. */
- if (pds.p_terminated == 0)
- {
- pid_t pid = pds.p_pid ?: ps_getpid (th->th_ta_p->ph);
-
- if (ps_lsetregs (th->th_ta_p->ph, pid, gregs) != PS_OK)
- return TD_ERR;
- }
-
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_thr_setprio.c b/linuxthreads_db/td_thr_setprio.c
deleted file mode 100644
index 98d202dfe0..0000000000
--- a/linuxthreads_db/td_thr_setprio.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Set a thread's priority.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_thr_setprio (const td_thrhandle_t *th, int prio)
-{
- /* XXX We have to figure out what has to be done. */
- LOG ("td_thr_setprio");
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_thr_setsigpending.c b/linuxthreads_db/td_thr_setsigpending.c
deleted file mode 100644
index 98e30140eb..0000000000
--- a/linuxthreads_db/td_thr_setsigpending.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Raise a signal for a thread.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_thr_setsigpending (const td_thrhandle_t *th, unsigned char n,
- const sigset_t *ss)
-{
- /* XXX We have to figure out what has to be done. */
- LOG ("td_thr_setsigpending");
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_thr_setxregs.c b/linuxthreads_db/td_thr_setxregs.c
deleted file mode 100644
index da77ab3b43..0000000000
--- a/linuxthreads_db/td_thr_setxregs.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Set a thread's extra state register set.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_thr_setxregs (const td_thrhandle_t *ta, const void *addr)
-{
- /* XXX This might have to be platform specific. */
- LOG ("td_thr_setxregs");
- return TD_NOXREGS;
-}
diff --git a/linuxthreads_db/td_thr_sigsetmask.c b/linuxthreads_db/td_thr_sigsetmask.c
deleted file mode 100644
index 8b0eb81859..0000000000
--- a/linuxthreads_db/td_thr_sigsetmask.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Set a thread's signal mask.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-
-td_err_e
-td_thr_sigsetmask (const td_thrhandle_t *th, const sigset_t *ss)
-{
- /* XXX We have to figure out what has to be done. */
- LOG ("td_thr_sigsetmask");
- return TD_OK;
-}
diff --git a/linuxthreads_db/td_thr_tls_get_addr.c b/linuxthreads_db/td_thr_tls_get_addr.c
deleted file mode 100644
index c900cac8e0..0000000000
--- a/linuxthreads_db/td_thr_tls_get_addr.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Get address of thread local variable.
- Copyright (C) 2002,2003 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <link.h>
-#include "thread_dbP.h"
-
-td_err_e
-td_thr_tls_get_addr (const td_thrhandle_t *th __attribute__ ((unused)),
- void *map_address __attribute__ ((unused)),
- size_t offset __attribute__ ((unused)),
- void **address __attribute__ ((unused)))
-{
-#if USE_TLS
- /* Read the module ID from the link_map. */
- size_t modid;
- if (ps_pdread (th->th_ta_p->ph,
- &((struct link_map *) map_address)->l_tls_modid,
- &modid, sizeof modid) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- td_err_e result = td_thr_tlsbase (th, modid, address);
- if (result == TD_OK)
- *address += offset;
- return result;
-#else
- return TD_ERR;
-#endif
-}
diff --git a/linuxthreads_db/td_thr_tlsbase.c b/linuxthreads_db/td_thr_tlsbase.c
deleted file mode 100644
index 5a7e31b9e1..0000000000
--- a/linuxthreads_db/td_thr_tlsbase.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Locate TLS data for a thread.
- Copyright (C) 2003, 2004, 2005 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-
-/* Value used for dtv entries for which the allocation is delayed. */
-# define TLS_DTV_UNALLOCATED ((void *) -1l)
-
-td_err_e
-td_thr_tlsbase (const td_thrhandle_t *th,
- unsigned long int modid,
- psaddr_t *base)
-{
- if (modid < 1)
- return TD_NOTLS;
-
-#if USE_TLS
- union dtv pdtv, *dtvp;
-
- LOG ("td_thr_tlsbase");
-
- psaddr_t dtvpp = th->th_unique;
-#if TLS_TCB_AT_TP
- dtvpp += offsetof (struct _pthread_descr_struct, p_header.data.dtvp);
-#elif TLS_DTV_AT_TP
-/* Special case hack. If TLS_TCB_SIZE == 0 (on PowerPC), there is no TCB
- containing the DTV at the TP, but actually the TCB lies behind the TP,
- i.e. at the very end of the area covered by TLS_PRE_TCB_SIZE. */
- dtvpp += TLS_PRE_TCB_SIZE + offsetof (tcbhead_t, dtv)
- - (TLS_TCB_SIZE == 0 ? sizeof (tcbhead_t) : 0);
-#else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined."
-#endif
-
- /* Get the DTV pointer from the thread descriptor. */
- if (ps_pdread (th->th_ta_p->ph, dtvpp, &dtvp, sizeof dtvp) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* Get the corresponding entry in the DTV. */
- if (ps_pdread (th->th_ta_p->ph, dtvp + modid,
- &pdtv, sizeof (union dtv)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* It could be that the memory for this module is not allocated for
- the given thread. */
- if (pdtv.pointer.val == TLS_DTV_UNALLOCATED)
- return TD_TLSDEFER;
-
- *base = (char *) pdtv.pointer.val;
-
- return TD_OK;
-#else
- return TD_ERR;
-#endif
-}
diff --git a/linuxthreads_db/td_thr_tsd.c b/linuxthreads_db/td_thr_tsd.c
deleted file mode 100644
index 978dc5e524..0000000000
--- a/linuxthreads_db/td_thr_tsd.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/* Get a thread-specific data pointer for a thread.
- Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-#include <linuxthreads/internals.h>
-
-
-td_err_e
-td_thr_tsd (const td_thrhandle_t *th, const thread_key_t tk, void **data)
-{
- struct _pthread_descr_struct pds;
- struct pthread_key_struct *keys = th->th_ta_p->keys;
- struct pthread_key_struct key;
- int pthread_keys_max = th->th_ta_p->pthread_keys_max;
- int pthread_key_2ndlevel_size = th->th_ta_p->pthread_key_2ndlevel_size;
- unsigned int idx1st;
- unsigned int idx2nd;
- void *p;
-
- LOG ("td_thr_tsd");
-
- /* If there is no thread descriptor there cannot be any thread
- specific data. */
- if (th->th_unique == NULL)
- return TD_BADKEY;
-
- /* Get the thread descriptor. */
- if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
- sizeof (struct _pthread_descr_struct)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* Check correct value of key. */
- if (tk >= pthread_keys_max)
- return TD_BADKEY;
-
- /* Get the key entry. */
- if (ps_pdread (th->th_ta_p->ph, &keys[tk], &key,
- sizeof (struct pthread_key_struct)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* Fail if this key is not at all used. */
- if (! key.in_use)
- return TD_BADKEY;
-
- /* Compute the indeces. */
- idx1st = tk / pthread_key_2ndlevel_size;
- idx2nd = tk % pthread_key_2ndlevel_size;
-
- /* Check the pointer to the second level array. */
- if (pds.p_specific[idx1st] == NULL)
- return TD_NOTSD;
-
- /* Now get the real key.
- XXX I don't know whether it's correct but there is currently no
- easy way to determine whether a key was never set or the value
- is NULL. We return an error whenever the value is NULL. */
- if (ps_pdread (th->th_ta_p->ph, &pds.p_specific[idx1st][idx2nd], &p,
- sizeof (void *)) != PS_OK)
- return TD_ERR;
-
- if (p != NULL)
- *data = p;
-
- return p != NULL ? TD_OK : TD_NOTSD;
-}
diff --git a/linuxthreads_db/td_thr_validate.c b/linuxthreads_db/td_thr_validate.c
deleted file mode 100644
index 6f893d3f7f..0000000000
--- a/linuxthreads_db/td_thr_validate.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Validate a thread handle.
- Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include "thread_dbP.h"
-#include <linuxthreads/internals.h>
-
-
-td_err_e
-td_thr_validate (const td_thrhandle_t *th)
-{
- struct pthread_handle_struct *handles = th->th_ta_p->handles;
- int pthread_threads_max = th->th_ta_p->pthread_threads_max;
- int cnt;
- struct pthread_handle_struct phc;
-
- LOG ("td_thr_validate");
-
- /* A special case: if the program just starts up the handle is
- NULL. */
- if (th->th_unique == NULL)
- {
- /* Read the first handle. If the pointer to the thread
- descriptor is not NULL this is an error. */
- if (ps_pdread (th->th_ta_p->ph, handles, &phc,
- sizeof (struct pthread_handle_struct)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- return phc.h_descr == NULL ? TD_OK : TD_NOTHR;
- }
-
- /* Now get all descriptors, one after the other. */
- for (cnt = 0; cnt < pthread_threads_max; ++cnt, ++handles)
- {
- if (ps_pdread (th->th_ta_p->ph, handles, &phc,
- sizeof (struct pthread_handle_struct)) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- if (phc.h_descr != NULL && phc.h_descr == th->th_unique)
- {
- struct _pthread_descr_struct pds;
-
- if (ps_pdread (th->th_ta_p->ph, phc.h_descr, &pds,
- th->th_ta_p->sizeof_descr) != PS_OK)
- return TD_ERR; /* XXX Other error value? */
-
- /* XXX There should be another test using the TID but this is
- currently not available. */
- return pds.p_terminated != 0 ? TD_NOTHR : TD_OK;
- }
- }
-
- return TD_ERR;
-}
diff --git a/linuxthreads_db/thread_db.h b/linuxthreads_db/thread_db.h
deleted file mode 100644
index c115399a32..0000000000
--- a/linuxthreads_db/thread_db.h
+++ /dev/null
@@ -1,459 +0,0 @@
-/* thread_db.h -- interface to libthread_db.so library for debugging -lpthread
- Copyright (C) 1999,2001,2002,2003 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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#ifndef _THREAD_DB_H
-#define _THREAD_DB_H 1
-
-/* This is the debugger interface for the LinuxThreads library. It is
- modelled closely after the interface with same names in Solaris with
- the goal to share the same code in the debugger. */
-#include <pthread.h>
-#include <stdint.h>
-#include <sys/types.h>
-#include <sys/procfs.h>
-
-
-/* Error codes of the library. */
-typedef enum
-{
- TD_OK, /* No error. */
- TD_ERR, /* No further specified error. */
- TD_NOTHR, /* No matching thread found. */
- TD_NOSV, /* No matching synchronization handle found. */
- TD_NOLWP, /* No matching light-weighted process found. */
- TD_BADPH, /* Invalid process handle. */
- TD_BADTH, /* Invalid thread handle. */
- TD_BADSH, /* Invalid synchronization handle. */
- TD_BADTA, /* Invalid thread agent. */
- TD_BADKEY, /* Invalid key. */
- TD_NOMSG, /* No event available. */
- TD_NOFPREGS, /* No floating-point register content available. */
- TD_NOLIBTHREAD, /* Application not linked with thread library. */
- TD_NOEVENT, /* Requested event is not supported. */
- TD_NOCAPAB, /* Capability not available. */
- TD_DBERR, /* Internal debug library error. */
- TD_NOAPLIC, /* Operation is not applicable. */
- TD_NOTSD, /* No thread-specific data available. */
- TD_MALLOC, /* Out of memory. */
- TD_PARTIALREG, /* Not entire register set was read or written. */
- TD_NOXREGS, /* X register set not available for given thread. */
- TD_TLSDEFER, /* Thread has not yet allocated TLS for given module. */
- TD_NOTALLOC = TD_TLSDEFER,
- TD_VERSION, /* Version if libpthread and libthread_db do not match. */
- TD_NOTLS /* There is TLS segment in the given module. */
-} td_err_e;
-
-
-/* Possible thread states. TD_THR_ANY_STATE is a pseudo-state used to
- select threads regardless of state in td_ta_thr_iter(). */
-typedef enum
-{
- TD_THR_ANY_STATE,
- TD_THR_UNKNOWN,
- TD_THR_STOPPED,
- TD_THR_RUN,
- TD_THR_ACTIVE,
- TD_THR_ZOMBIE,
- TD_THR_SLEEP,
- TD_THR_STOPPED_ASLEEP
-} td_thr_state_e;
-
-/* Thread type: user or system. TD_THR_ANY_TYPE is a pseudo-type used
- to select threads regardless of type in td_ta_thr_iter(). */
-typedef enum
-{
- TD_THR_ANY_TYPE,
- TD_THR_USER,
- TD_THR_SYSTEM
-} td_thr_type_e;
-
-
-/* Types of the debugging library. */
-
-/* Handle for a process. This type is opaque. */
-typedef struct td_thragent td_thragent_t;
-
-/* The actual thread handle type. This is also opaque. */
-typedef struct td_thrhandle
-{
- td_thragent_t *th_ta_p;
- psaddr_t th_unique;
-} td_thrhandle_t;
-
-
-/* Forward declaration of a type defined by and for the dynamic linker. */
-struct link_map;
-
-
-/* Flags for `td_ta_thr_iter'. */
-#define TD_THR_ANY_USER_FLAGS 0xffffffff
-#define TD_THR_LOWEST_PRIORITY -20
-#define TD_SIGNO_MASK NULL
-
-
-#define TD_EVENTSIZE 2
-#define BT_UISHIFT 5 /* log base 2 of BT_NBIPUI, to extract word index */
-#define BT_NBIPUI (1 << BT_UISHIFT) /* n bits per uint */
-#define BT_UIMASK (BT_NBIPUI - 1) /* to extract bit index */
-
-/* Bitmask of enabled events. */
-typedef struct td_thr_events
-{
- uint32_t event_bits[TD_EVENTSIZE];
-} td_thr_events_t;
-
-/* Event set manipulation macros. */
-#define __td_eventmask(n) \
- (UINT32_C (1) << (((n) - 1) & BT_UIMASK))
-#define __td_eventword(n) \
- ((UINT32_C ((n) - 1)) >> BT_UISHIFT)
-
-#define td_event_emptyset(setp) \
- do { \
- int __i; \
- for (__i = TD_EVENTSIZE; __i > 0; --__i) \
- (setp)->event_bits[__i - 1] = 0; \
- } while (0)
-
-#define td_event_fillset(setp) \
- do { \
- int __i; \
- for (__i = TD_EVENTSIZE; __i > 0; --__i) \
- (setp)->event_bits[__i - 1] = UINT32_C (0xffffffff); \
- } while (0)
-
-#define td_event_addset(setp, n) \
- (((setp)->event_bits[__td_eventword (n)]) |= __td_eventmask (n))
-#define td_event_delset(setp, n) \
- (((setp)->event_bits[__td_eventword (n)]) &= ~__td_eventmask (n))
-#define td_eventismember(setp, n) \
- (__td_eventmask (n) & ((setp)->event_bits[__td_eventword (n)]))
-#if TD_EVENTSIZE == 2
-# define td_eventisempty(setp) \
- (!((setp)->event_bits[0]) && !((setp)->event_bits[1]))
-#else
-# error "td_eventisempty must be changed to match TD_EVENTSIZE"
-#endif
-
-/* Events reportable by the thread implementation. */
-typedef enum
-{
- TD_ALL_EVENTS, /* Pseudo-event number. */
- TD_EVENT_NONE = TD_ALL_EVENTS, /* Depends on context. */
- TD_READY, /* Is executable now. */
- TD_SLEEP, /* Blocked in a synchronization obj. */
- TD_SWITCHTO, /* Now assigned to a process. */
- TD_SWITCHFROM, /* Not anymore assigned to a process. */
- TD_LOCK_TRY, /* Trying to get an unavailable lock. */
- TD_CATCHSIG, /* Signal posted to the thread. */
- TD_IDLE, /* Process getting idle. */
- TD_CREATE, /* New thread created. */
- TD_DEATH, /* Thread terminated. */
- TD_PREEMPT, /* Preempted. */
- TD_PRI_INHERIT, /* Inherited elevated priority. */
- TD_REAP, /* Reaped. */
- TD_CONCURRENCY, /* Number of processes changing. */
- TD_TIMEOUT, /* Conditional variable wait timed out. */
- TD_MIN_EVENT_NUM = TD_READY,
- TD_MAX_EVENT_NUM = TD_TIMEOUT,
- TD_EVENTS_ENABLE = 31 /* Event reporting enabled. */
-} td_event_e;
-
-/* Values representing the different ways events are reported. */
-typedef enum
-{
- NOTIFY_BPT, /* User must insert breakpoint at u.bptaddr. */
- NOTIFY_AUTOBPT, /* Breakpoint at u.bptaddr is automatically
- inserted. */
- NOTIFY_SYSCALL /* System call u.syscallno will be invoked. */
-} td_notify_e;
-
-/* Description how event type is reported. */
-typedef struct td_notify
-{
- td_notify_e type; /* Way the event is reported. */
- union
- {
- psaddr_t bptaddr; /* Address of breakpoint. */
- int syscallno; /* Number of system call used. */
- } u;
-} td_notify_t;
-
-/* Structure used to report event. */
-typedef struct td_event_msg
-{
- td_event_e event; /* Event type being reported. */
- const td_thrhandle_t *th_p; /* Thread reporting the event. */
- union
- {
-# if 0
- td_synchandle_t *sh; /* Handle of synchronization object. */
-#endif
- uintptr_t data; /* Event specific data. */
- } msg;
-} td_event_msg_t;
-
-/* Structure containing event data available in each thread structure. */
-typedef struct
-{
- td_thr_events_t eventmask; /* Mask of enabled events. */
- td_event_e eventnum; /* Number of last event. */
- void *eventdata; /* Data associated with event. */
-} td_eventbuf_t;
-
-
-/* Gathered statistics about the process. */
-typedef struct td_ta_stats
-{
- int nthreads; /* Total number of threads in use. */
- int r_concurrency; /* Concurrency level requested by user. */
- int nrunnable_num; /* Average runnable threads, numerator. */
- int nrunnable_den; /* Average runnable threads, denominator. */
- int a_concurrency_num; /* Achieved concurrency level, numerator. */
- int a_concurrency_den; /* Achieved concurrency level, denominator. */
- int nlwps_num; /* Average number of processes in use,
- numerator. */
- int nlwps_den; /* Average number of processes in use,
- denominator. */
- int nidle_num; /* Average number of idling processes,
- numerator. */
- int nidle_den; /* Average number of idling processes,
- denominator. */
-} td_ta_stats_t;
-
-
-/* Since Sun's library is based on Solaris threads we have to define a few
- types to map them to POSIX threads. */
-typedef pthread_t thread_t;
-typedef pthread_key_t thread_key_t;
-
-
-/* Callback for iteration over threads. */
-typedef int td_thr_iter_f (const td_thrhandle_t *, void *);
-
-/* Callback for iteration over thread local data. */
-typedef int td_key_iter_f (thread_key_t, void (*) (void *), void *);
-
-
-
-/* Forward declaration. This has to be defined by the user. */
-struct ps_prochandle;
-
-
-/* Information about the thread. */
-typedef struct td_thrinfo
-{
- td_thragent_t *ti_ta_p; /* Process handle. */
- unsigned int ti_user_flags; /* Unused. */
- thread_t ti_tid; /* Thread ID returned by
- pthread_create(). */
- char *ti_tls; /* Pointer to thread-local data. */
- psaddr_t ti_startfunc; /* Start function passed to
- pthread_create(). */
- psaddr_t ti_stkbase; /* Base of thread's stack. */
- long int ti_stksize; /* Size of thread's stack. */
- psaddr_t ti_ro_area; /* Unused. */
- int ti_ro_size; /* Unused. */
- td_thr_state_e ti_state; /* Thread state. */
- unsigned char ti_db_suspended; /* Nonzero if suspended by debugger. */
- td_thr_type_e ti_type; /* Type of the thread (system vs
- user thread). */
- intptr_t ti_pc; /* Unused. */
- intptr_t ti_sp; /* Unused. */
- short int ti_flags; /* Unused. */
- int ti_pri; /* Thread priority. */
- lwpid_t ti_lid; /* Unused. */
- sigset_t ti_sigmask; /* Signal mask. */
- unsigned char ti_traceme; /* Nonzero if event reporting
- enabled. */
- unsigned char ti_preemptflag; /* Unused. */
- unsigned char ti_pirecflag; /* Unused. */
- sigset_t ti_pending; /* Set of pending signals. */
- td_thr_events_t ti_events; /* Set of enabled events. */
-} td_thrinfo_t;
-
-
-
-/* Prototypes for exported library functions. */
-
-/* Initialize the thread debug support library. */
-extern td_err_e td_init (void);
-
-/* Historical relict. Should not be used anymore. */
-extern td_err_e td_log (void);
-
-/* Return list of symbols the library can request. */
-extern const char **td_symbol_list (void);
-
-/* Generate new thread debug library handle for process PS. */
-extern td_err_e td_ta_new (struct ps_prochandle *__ps, td_thragent_t **__ta);
-
-/* Free resources allocated for TA. */
-extern td_err_e td_ta_delete (td_thragent_t *__ta);
-
-/* Get number of currently running threads in process associated with TA. */
-extern td_err_e td_ta_get_nthreads (const td_thragent_t *__ta, int *__np);
-
-/* Return process handle passed in `td_ta_new' for process associated with
- TA. */
-extern td_err_e td_ta_get_ph (const td_thragent_t *__ta,
- struct ps_prochandle **__ph);
-
-/* Map thread library handle PT to thread debug library handle for process
- associated with TA and store result in *TH. */
-extern td_err_e td_ta_map_id2thr (const td_thragent_t *__ta, pthread_t __pt,
- td_thrhandle_t *__th);
-
-/* Map process ID LWPID to thread debug library handle for process
- associated with TA and store result in *TH. */
-extern td_err_e td_ta_map_lwp2thr (const td_thragent_t *__ta, lwpid_t __lwpid,
- td_thrhandle_t *__th);
-
-
-/* Call for each thread in a process associated with TA the callback function
- CALLBACK. */
-extern td_err_e td_ta_thr_iter (const td_thragent_t *__ta,
- td_thr_iter_f *__callback, void *__cbdata_p,
- td_thr_state_e __state, int __ti_pri,
- sigset_t *__ti_sigmask_p,
- unsigned int __ti_user_flags);
-
-/* Call for each defined thread local data entry the callback function KI. */
-extern td_err_e td_ta_tsd_iter (const td_thragent_t *__ta, td_key_iter_f *__ki,
- void *__p);
-
-
-/* Get event address for EVENT. */
-extern td_err_e td_ta_event_addr (const td_thragent_t *__ta,
- td_event_e __event, td_notify_t *__ptr);
-
-/* Enable EVENT in global mask. */
-extern td_err_e td_ta_set_event (const td_thragent_t *__ta,
- td_thr_events_t *__event);
-
-/* Disable EVENT in global mask. */
-extern td_err_e td_ta_clear_event (const td_thragent_t *__ta,
- td_thr_events_t *__event);
-
-/* Return information about last event. */
-extern td_err_e td_ta_event_getmsg (const td_thragent_t *__ta,
- td_event_msg_t *__msg);
-
-
-/* Set suggested concurrency level for process associated with TA. */
-extern td_err_e td_ta_setconcurrency (const td_thragent_t *__ta, int __level);
-
-
-/* Enable collecting statistics for process associated with TA. */
-extern td_err_e td_ta_enable_stats (const td_thragent_t *__ta, int __enable);
-
-/* Reset statistics. */
-extern td_err_e td_ta_reset_stats (const td_thragent_t *__ta);
-
-/* Retrieve statistics from process associated with TA. */
-extern td_err_e td_ta_get_stats (const td_thragent_t *__ta,
- td_ta_stats_t *__statsp);
-
-
-/* Validate that TH is a thread handle. */
-extern td_err_e td_thr_validate (const td_thrhandle_t *__th);
-
-/* Return information about thread TH. */
-extern td_err_e td_thr_get_info (const td_thrhandle_t *__th,
- td_thrinfo_t *__infop);
-
-/* Retrieve floating-point register contents of process running thread TH. */
-extern td_err_e td_thr_getfpregs (const td_thrhandle_t *__th,
- prfpregset_t *__regset);
-
-/* Retrieve general register contents of process running thread TH. */
-extern td_err_e td_thr_getgregs (const td_thrhandle_t *__th,
- prgregset_t __gregs);
-
-/* Retrieve extended register contents of process running thread TH. */
-extern td_err_e td_thr_getxregs (const td_thrhandle_t *__th, void *__xregs);
-
-/* Get size of extended register set of process running thread TH. */
-extern td_err_e td_thr_getxregsize (const td_thrhandle_t *__th, int *__sizep);
-
-/* Set floating-point register contents of process running thread TH. */
-extern td_err_e td_thr_setfpregs (const td_thrhandle_t *__th,
- const prfpregset_t *__fpregs);
-
-/* Set general register contents of process running thread TH. */
-extern td_err_e td_thr_setgregs (const td_thrhandle_t *__th,
- prgregset_t __gregs);
-
-/* Set extended register contents of process running thread TH. */
-extern td_err_e td_thr_setxregs (const td_thrhandle_t *__th,
- const void *__addr);
-
-
-/* Get address of the given module's TLS storage area for the given thread. */
-extern td_err_e td_thr_tlsbase (const td_thrhandle_t *__th,
- unsigned long int __modid,
- psaddr_t *__base);
-
-/* Get address of thread local variable. */
-extern td_err_e td_thr_tls_get_addr (const td_thrhandle_t *__th,
- void *__map_address, size_t __offset,
- void **__address);
-
-
-/* Enable reporting for EVENT for thread TH. */
-extern td_err_e td_thr_event_enable (const td_thrhandle_t *__th, int __event);
-
-/* Enable EVENT for thread TH. */
-extern td_err_e td_thr_set_event (const td_thrhandle_t *__th,
- td_thr_events_t *__event);
-
-/* Disable EVENT for thread TH. */
-extern td_err_e td_thr_clear_event (const td_thrhandle_t *__th,
- td_thr_events_t *__event);
-
-/* Get event message for thread TH. */
-extern td_err_e td_thr_event_getmsg (const td_thrhandle_t *__th,
- td_event_msg_t *__msg);
-
-
-/* Set priority of thread TH. */
-extern td_err_e td_thr_setprio (const td_thrhandle_t *__th, int __prio);
-
-
-/* Set pending signals for thread TH. */
-extern td_err_e td_thr_setsigpending (const td_thrhandle_t *__th,
- unsigned char __n, const sigset_t *__ss);
-
-/* Set signal mask for thread TH. */
-extern td_err_e td_thr_sigsetmask (const td_thrhandle_t *__th,
- const sigset_t *__ss);
-
-
-/* Return thread local data associated with key TK in thread TH. */
-extern td_err_e td_thr_tsd (const td_thrhandle_t *__th,
- const thread_key_t __tk, void **__data);
-
-
-/* Suspend execution of thread TH. */
-extern td_err_e td_thr_dbsuspend (const td_thrhandle_t *__th);
-
-/* Resume execution of thread TH. */
-extern td_err_e td_thr_dbresume (const td_thrhandle_t *__th);
-
-#endif /* thread_db.h */
diff --git a/linuxthreads_db/thread_dbP.h b/linuxthreads_db/thread_dbP.h
deleted file mode 100644
index 63b408afc1..0000000000
--- a/linuxthreads_db/thread_dbP.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/* Private header for thread debug library. */
-#ifndef _THREAD_DBP_H
-#define _THREAD_DBP_H 1
-
-#include <string.h>
-#include <unistd.h>
-#include "proc_service.h"
-#include "thread_db.h"
-#include "../linuxthreads/descr.h"
-
-
-/* Indeces for the symbol names. */
-enum
- {
- PTHREAD_THREADS_EVENTS = 0,
- PTHREAD_LAST_EVENT,
- PTHREAD_HANDLES_NUM,
- PTHREAD_HANDLES,
- PTHREAD_KEYS,
- LINUXTHREADS_PTHREAD_THREADS_MAX,
- LINUXTHREADS_PTHREAD_KEYS_MAX,
- LINUXTHREADS_PTHREAD_SIZEOF_DESCR,
- LINUXTHREADS_CREATE_EVENT,
- LINUXTHREADS_DEATH_EVENT,
- LINUXTHREADS_REAP_EVENT,
- LINUXTHREADS_INITIAL_REPORT_EVENTS,
- LINUXTHREADS_VERSION,
- NUM_MESSAGES
- };
-
-
-/* Comment out the following for less verbose output. */
-#ifndef NDEBUG
-# define LOG(c) if (__td_debug) write (2, c "\n", strlen (c "\n"))
-extern int __td_debug;
-#else
-# define LOG(c)
-#endif
-
-
-/* Handle for a process. This type is opaque. */
-struct td_thragent
-{
- /* Delivered by the debugger and we have to pass it back in the
- proc callbacks. */
- struct ps_prochandle *ph;
-
- /* Some cached information. */
-
- /* Address of the `__pthread_handles' array. */
- struct pthread_handle_struct *handles;
-
- /* Address of the `pthread_kyes' array. */
- struct pthread_key_struct *keys;
-
- /* Maximum number of threads. */
- int pthread_threads_max;
-
- /* Maximum number of thread-local data keys. */
- int pthread_keys_max;
-
- /* Size of 2nd level array for thread-local data keys. */
- int pthread_key_2ndlevel_size;
-
- /* Sizeof struct _pthread_descr_struct. */
- int sizeof_descr;
-
- /* Pointer to the `__pthread_threads_events' variable in the target. */
- psaddr_t pthread_threads_eventsp;
-
- /* Pointer to the `__pthread_last_event' variable in the target. */
- psaddr_t pthread_last_event;
-
- /* Pointer to the `__pthread_handles_num' variable. */
- psaddr_t pthread_handles_num;
-};
-
-
-/* Type used internally to keep track of thread agent descriptors. */
-struct agent_list
-{
- td_thragent_t *ta;
- struct agent_list *next;
-};
-
-/* List of all known descriptors. */
-extern struct agent_list *__td_agent_list;
-
-/* Function used to test for correct thread agent pointer. */
-static inline int
-ta_ok (const td_thragent_t *ta)
-{
- struct agent_list *runp = __td_agent_list;
-
- if (ta == NULL)
- return 0;
-
- while (runp != NULL && runp->ta != ta)
- runp = runp->next;
-
- return runp != NULL;
-}
-
-
-/* Internal wrapper around ps_pglobal_lookup. */
-extern int td_lookup (struct ps_prochandle *ps, int idx, psaddr_t *sym_addr);
-
-#endif /* thread_dbP.h */
diff --git a/localedata/ChangeLog b/localedata/ChangeLog
index d375eb62d9..d80d6cef79 100644
--- a/localedata/ChangeLog
+++ b/localedata/ChangeLog
@@ -1,3 +1,7 @@
+2005-07-05 Ulrich Drepper <drepper@redhat.com>
+
+ * locales/en_US: Remove duplicate am_pn entry.
+
2005-05-28 Jakub Jelinek <jakub@redhat.com>
[BZ #622]
diff --git a/manual/install.texi b/manual/install.texi
index 15fe9a85b4..dee5c9b6b6 100644
--- a/manual/install.texi
+++ b/manual/install.texi
@@ -14,15 +14,7 @@ installation. It is updated more frequently than this manual.
Features can be added to GNU Libc via @dfn{add-on} bundles. These are
separate tar files, which you unpack into the top level of the source
tree. Then you give @code{configure} the @samp{--enable-add-ons} option
-to activate them, and they will be compiled into the library. As of the
-2.2 release, one important component of glibc is distributed as
-``official'' add-ons: the linuxthreads add-on. Unless you are doing an
-unusual installation, you should get this.
-
-Support for POSIX threads is maintained by someone else, so it's in a
-separate package. It is only available for GNU/Linux systems, but this will
-change in the future. Get it from the same place you got the main
-bundle; the file is @file{glibc-linuxthreads-@var{VERSION}.tar.gz}.
+to activate them, and they will be compiled into the library.
You will need recent versions of several GNU tools: definitely GCC and
GNU Make, and possibly others. @xref{Tools for Compilation}, below.
@@ -107,7 +99,7 @@ Enable add-on packages in your source tree. If this option is specified
with no list, it enables all the add-on packages it finds. If you do
not wish to use some add-on packages that you have present in your source
tree, give this option a list of the add-ons that you @emph{do} want
-used, like this: @samp{--enable-add-ons=linuxthreads}
+used, like this: @samp{--enable-add-ons=nptl}
@item --enable-kernel=@var{version}
This option is currently only useful on GNU/Linux systems. The
diff --git a/nis/nss_compat/compat-grp.c b/nis/nss_compat/compat-grp.c
index 08bf5d2f80..d51eb6d0f2 100644
--- a/nis/nss_compat/compat-grp.c
+++ b/nis/nss_compat/compat-grp.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996-1999,2001,2002,2003,2004 Free Software Foundation, Inc.
+/* Copyright (C) 1996-1999,2001-2004,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
@@ -229,9 +229,10 @@ getgrnam_plusgroup (const char *name, struct group *result, ent_t *ent,
if (!nss_getgrnam_r)
return NSS_STATUS_UNAVAIL;
- if (nss_getgrnam_r (name, result, buffer, buflen, errnop) !=
- NSS_STATUS_SUCCESS)
- return NSS_STATUS_NOTFOUND;
+ enum nss_status status = nss_getgrnam_r (name, result, buffer, buflen,
+ errnop);
+ if (status != NSS_STATUS_SUCCESS)
+ return status;
if (in_blacklist (result->gr_name, strlen (result->gr_name), ent))
return NSS_STATUS_NOTFOUND;
@@ -551,7 +552,7 @@ internal_getgrgid_r (gid_t gid, struct group *result, ent_t *ent,
!(parse_res = _nss_files_parse_grent (p, result, data, buflen,
errnop)));
- if (parse_res == -1)
+ if (__builtin_expect (parse_res == -1, 0))
/* The parser ran out of space. */
goto erange_reset;
@@ -589,9 +590,11 @@ internal_getgrgid_r (gid_t gid, struct group *result, ent_t *ent,
/* +:... */
if (result->gr_name[0] == '+' && result->gr_name[1] == '\0')
{
- enum nss_status status;
+ if (!nss_getgrgid_r)
+ return NSS_STATUS_UNAVAIL;
- status = nss_getgrgid_r (gid, result, buffer, buflen, errnop);
+ enum nss_status status = nss_getgrgid_r (gid, result, buffer, buflen,
+ errnop);
if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
return NSS_STATUS_NOTFOUND;
else
diff --git a/nis/nss_compat/compat-pwd.c b/nis/nss_compat/compat-pwd.c
index 89a6a7013e..43ccb27071 100644
--- a/nis/nss_compat/compat-pwd.c
+++ b/nis/nss_compat/compat-pwd.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996-1999,2001,2002,2003,2004 Free Software Foundation, Inc.
+/* Copyright (C) 1996-1999,2001-2004,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
@@ -453,29 +453,27 @@ static enum nss_status
getpwnam_plususer (const char *name, struct passwd *result, ent_t *ent,
char *buffer, size_t buflen, int *errnop)
{
- struct passwd pwd;
- char *p;
- size_t plen;
-
if (!nss_getpwnam_r)
return NSS_STATUS_UNAVAIL;
+ struct passwd pwd;
memset (&pwd, '\0', sizeof (struct passwd));
copy_pwd_changes (&pwd, result, NULL, 0);
- plen = pwd_need_buflen (&pwd);
+ size_t plen = pwd_need_buflen (&pwd);
if (plen > buflen)
{
*errnop = ERANGE;
return NSS_STATUS_TRYAGAIN;
}
- p = buffer + (buflen - plen);
+ char *p = buffer + (buflen - plen);
buflen -= plen;
- if (nss_getpwnam_r (name, result, buffer, buflen, errnop) !=
- NSS_STATUS_SUCCESS)
- return NSS_STATUS_NOTFOUND;
+ enum nss_status status = nss_getpwnam_r (name, result, buffer, buflen,
+ errnop);
+ if (status != NSS_STATUS_SUCCESS)
+ return status;
if (in_blacklist (result->pw_name, strlen (result->pw_name), ent))
return NSS_STATUS_NOTFOUND;
diff --git a/nis/nss_compat/compat-spwd.c b/nis/nss_compat/compat-spwd.c
index 4ca6368139..120e3bd38d 100644
--- a/nis/nss_compat/compat-spwd.c
+++ b/nis/nss_compat/compat-spwd.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996-1999,2001,2002,2003,2004 Free Software Foundation, Inc.
+/* Copyright (C) 1996-1999,2001-2004,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
@@ -401,13 +401,10 @@ static enum nss_status
getspnam_plususer (const char *name, struct spwd *result, ent_t *ent,
char *buffer, size_t buflen, int *errnop)
{
- struct spwd pwd;
- char *p;
- size_t plen;
-
if (!nss_getspnam_r)
return NSS_STATUS_UNAVAIL;
+ struct spwd pwd;
memset (&pwd, '\0', sizeof (struct spwd));
pwd.sp_warn = -1;
pwd.sp_inact = -1;
@@ -416,18 +413,19 @@ getspnam_plususer (const char *name, struct spwd *result, ent_t *ent,
copy_spwd_changes (&pwd, result, NULL, 0);
- plen = spwd_need_buflen (&pwd);
+ size_t plen = spwd_need_buflen (&pwd);
if (plen > buflen)
{
*errnop = ERANGE;
return NSS_STATUS_TRYAGAIN;
}
- p = buffer + (buflen - plen);
+ char *p = buffer + (buflen - plen);
buflen -= plen;
- if (nss_getspnam_r (name, result, buffer, buflen, errnop) !=
- NSS_STATUS_SUCCESS)
- return NSS_STATUS_NOTFOUND;
+ enum nss_status status = nss_getspnam_r (name, result, buffer, buflen,
+ errnop);
+ if (status != NSS_STATUS_SUCCESS)
+ return status;
if (in_blacklist (result->sp_namp, strlen (result->sp_namp), ent))
return NSS_STATUS_NOTFOUND;
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 1c53e5e505..aa5874a243 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,20 @@
+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.
diff --git a/nptl/Makeconfig b/nptl/Makeconfig
index e7beea0ede..681d76f61f 100644
--- a/nptl/Makeconfig
+++ b/nptl/Makeconfig
@@ -1,4 +1,4 @@
-# Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -17,7 +17,7 @@
# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
# 02111-1307 USA.
-# Makeconfig fragment for linuxthreads add-on.
+# Makeconfig fragment for NPTL add-on.
# This gets included at the end of the main glibc Makeconfig.
have-thread-library = yes
diff --git a/nptl/descr.h b/nptl/descr.h
index 454bb2a547..77251d5e45 100644
--- a/nptl/descr.h
+++ b/nptl/descr.h
@@ -254,6 +254,13 @@ struct pthread
/* Resolver state. */
struct __res_state res;
+
+ /* If you add fields after the res field above, please adjust
+ the following macro. */
+#define PTHREAD_STRUCT_END_PADDING \
+ (sizeof (struct pthread) - offsetof (struct pthread, res) \
+ - sizeof (((struct pthread *) 0)->res))
+
} __attribute ((aligned (TCB_ALIGNMENT)));
diff --git a/nptl/sysdeps/ia64/tcb-offsets.sym b/nptl/sysdeps/ia64/tcb-offsets.sym
index f5108e0a9e..3bc367082d 100644
--- a/nptl/sysdeps/ia64/tcb-offsets.sym
+++ b/nptl/sysdeps/ia64/tcb-offsets.sym
@@ -1,7 +1,7 @@
#include <sysdep.h>
#include <tls.h>
-PID offsetof (struct pthread, pid) - sizeof (struct pthread)
-TID offsetof (struct pthread, tid) - sizeof (struct pthread)
-MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads) - sizeof (struct pthread)
+PID offsetof (struct pthread, pid) - TLS_PRE_TCB_SIZE
+TID offsetof (struct pthread, tid) - TLS_PRE_TCB_SIZE
+MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads) - TLS_PRE_TCB_SIZE
SYSINFO_OFFSET offsetof (tcbhead_t, private)
diff --git a/nptl/sysdeps/ia64/tls.h b/nptl/sysdeps/ia64/tls.h
index a435f966ca..e3ad0681d6 100644
--- a/nptl/sysdeps/ia64/tls.h
+++ b/nptl/sysdeps/ia64/tls.h
@@ -80,8 +80,15 @@ register struct pthread *__thread_self __asm__("r13");
/* This is the size of the TCB. */
# define TLS_TCB_SIZE sizeof (tcbhead_t)
-/* This is the size we need before TCB. */
-# define TLS_PRE_TCB_SIZE sizeof (struct pthread)
+/* This is the size we need before TCB.
+ If there is not any room for uintptr_t stack_guard in struct pthread's
+ final padding, we need to put struct pthread 16 byte slower. */
+# define TLS_PRE_TCB_SIZE \
+ (sizeof (struct pthread) \
+ + (PTHREAD_STRUCT_END_PADDING < sizeof (uintptr_t) \
+ ? ((sizeof (uintptr_t) + __alignof__ (struct pthread) - 1)\
+ & ~(__alignof__ (struct pthread) - 1)) \
+ : 0))
/* Alignment requirements for the TCB. */
# define TLS_TCB_ALIGN __alignof__ (struct pthread)
@@ -106,7 +113,8 @@ register struct pthread *__thread_self __asm__("r13");
(((tcbhead_t *) (descr))->dtv)
#define THREAD_SELF_SYSINFO (((tcbhead_t *) __thread_self)->private)
-#define THREAD_SYSINFO(pd) (((tcbhead_t *) ((pd) + 1))->private)
+#define THREAD_SYSINFO(pd) \
+ (((tcbhead_t *) ((char *) (pd) + TLS_PRE_TCB_SIZE))->private)
#if defined NEED_DL_SYSINFO
# define INIT_SYSINFO THREAD_SELF_SYSINFO = (void *) GLRO(dl_sysinfo)
@@ -125,10 +133,11 @@ register struct pthread *__thread_self __asm__("r13");
(((tcbhead_t *)__thread_self)->dtv)
/* Return the thread descriptor for the current thread. */
-# define THREAD_SELF (__thread_self - 1)
+# define THREAD_SELF \
+ ((struct pthread *) ((char *) __thread_self - TLS_PRE_TCB_SIZE))
/* Magic for libthread_db to know how to do THREAD_SELF. */
-# define DB_THREAD_SELF REGISTER (64, 64, 13 * 8, -sizeof (struct pthread))
+# define DB_THREAD_SELF REGISTER (64, 64, 13 * 8, -TLS_PRE_TCB_SIZE)
/* Access to data in the thread descriptor is easy. */
#define THREAD_GETMEM(descr, member) \
@@ -140,6 +149,13 @@ register struct pthread *__thread_self __asm__("r13");
#define THREAD_SETMEM_NC(descr, member, idx, value) \
descr->member[idx] = (value)
+/* Set the stack guard field in TCB head. */
+#define THREAD_SET_STACK_GUARD(value) \
+ (((uintptr_t *) __thread_self)[-1] = (value))
+#define THREAD_COPY_STACK_GUARD(descr) \
+ (((uintptr_t *) ((char *) (descr) + TLS_PRE_TCB_SIZE))[-1] \
+ = ((uintptr_t *) __thread_self)[-1])
+
#endif /* __ASSEMBLER__ */
#endif /* tls.h */
diff --git a/nptl/sysdeps/unix/sysv/linux/ia64/createthread.c b/nptl/sysdeps/unix/sysv/linux/ia64/createthread.c
index 8ac06e8101..cd5f8137d5 100644
--- a/nptl/sysdeps/unix/sysv/linux/ia64/createthread.c
+++ b/nptl/sysdeps/unix/sysv/linux/ia64/createthread.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2003, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>.
@@ -18,7 +18,7 @@
02111-1307 USA. */
/* Value passed to 'clone' for initialization of the thread register. */
-#define TLS_VALUE (pd + 1)
+#define TLS_VALUE ((char *) pd + TLS_PRE_TCB_SIZE)
#define ARCH_CLONE __clone2
diff --git a/posix/regex_internal.c b/posix/regex_internal.c
index b3d44c368d..baa58443ac 100644
--- a/posix/regex_internal.c
+++ b/posix/regex_internal.c
@@ -214,8 +214,8 @@ build_wcs_buffer (pstr)
re_string_t *pstr;
{
#ifdef _LIBC
- unsigned char buf[MB_CUR_MAX];
- assert (MB_CUR_MAX >= pstr->mb_cur_max);
+ unsigned char buf[MB_LEN_MAX];
+ assert (MB_LEN_MAX >= pstr->mb_cur_max);
#else
unsigned char buf[64];
#endif
@@ -285,8 +285,8 @@ build_wcs_upper_buffer (pstr)
int src_idx, byte_idx, end_idx, remain_len;
size_t mbclen;
#ifdef _LIBC
- char buf[MB_CUR_MAX];
- assert (MB_CUR_MAX >= pstr->mb_cur_max);
+ char buf[MB_LEN_MAX];
+ assert (MB_LEN_MAX >= pstr->mb_cur_max);
#else
char buf[64];
#endif
diff --git a/resolv/Depend b/resolv/Depend
index fe673ba5ec..8d2587bbc1 100644
--- a/resolv/Depend
+++ b/resolv/Depend
@@ -1 +1,2 @@
linuxthreads
+nptl
diff --git a/resolv/res_send.c b/resolv/res_send.c
index 1a53e5be9e..6f12b88d6f 100644
--- a/resolv/res_send.c
+++ b/resolv/res_send.c
@@ -1008,11 +1008,19 @@ send_dg(res_state statp,
DprintQ(statp->options & RES_DEBUG,
(stdout, "server rejected query:\n"),
ans, (resplen > anssiz) ? anssiz : resplen);
+ next_ns:
res_nclose(statp);
/* don't retry if called from dig */
if (!statp->pfcode)
return (0);
}
+ if (anhp->rcode == NOERROR && anhp->ancount == 0
+ && anhp->aa == 0 && anhp->ra == 0 && anhp->arcount == 0) {
+ DprintQ(statp->options & RES_DEBUG,
+ (stdout, "referred query:\n"),
+ ans, (resplen > anssiz) ? anssiz : resplen);
+ goto next_ns;
+ }
if (!(statp->options & RES_IGNTC) && anhp->tc) {
/*
* To get the rest of answer,
diff --git a/rt/Depend b/rt/Depend
index fe673ba5ec..8d2587bbc1 100644
--- a/rt/Depend
+++ b/rt/Depend
@@ -1 +1,2 @@
linuxthreads
+nptl
diff --git a/sysdeps/generic/libc-start.c b/sysdeps/generic/libc-start.c
index 3fcadcf19f..194db6b1ec 100644
--- a/sysdeps/generic/libc-start.c
+++ b/sysdeps/generic/libc-start.c
@@ -75,11 +75,7 @@ STATIC int LIBC_START_MAIN (int (*main) (int, char **, char **
#ifdef LIBC_START_MAIN_AUXVEC_ARG
ElfW(auxv_t) *__unbounded auxvec,
#endif
-#ifdef INIT_MAIN_ARGS
__typeof (main) init,
-#else
- void (*init) (void),
-#endif
void (*fini) (void),
void (*rtld_fini) (void),
void *__unbounded stack_end)
@@ -95,11 +91,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
#ifdef LIBC_START_MAIN_AUXVEC_ARG
ElfW(auxv_t) *__unbounded auxvec,
#endif
-#ifdef INIT_MAIN_ARGS
__typeof (main) init,
-#else
- void (*init) (void),
-#endif
void (*fini) (void),
void (*rtld_fini) (void), void *__unbounded stack_end)
{
@@ -195,11 +187,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
GLRO(dl_debug_printf) ("\ninitialize program: %s\n\n", argv[0]);
#endif
if (init)
- (*init) (
-#ifdef INIT_MAIN_ARGS
- argc, argv, __environ MAIN_AUXVEC_PARAM
-#endif
- );
+ (*init) (argc, argv, __environ MAIN_AUXVEC_PARAM);
#ifdef SHARED
/* Auditing checkpoint: we have a new object. */
diff --git a/sysdeps/generic/s_ctan.c b/sysdeps/generic/s_ctan.c
index 6a09fe465b..0464ab86d5 100644
--- a/sysdeps/generic/s_ctan.c
+++ b/sysdeps/generic/s_ctan.c
@@ -1,5 +1,5 @@
/* Complex tangent function for double.
- Copyright (C) 1997 Free Software Foundation, Inc.
+ Copyright (C) 1997, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -61,8 +61,18 @@ __ctan (__complex__ double x)
den = cos2rx + __ieee754_cosh (2.0 * __imag__ x);
- __real__ res = sin2rx / den;
- __imag__ res = __ieee754_sinh (2.0 * __imag__ x) / den;
+ if (den == 0.0)
+ {
+ __complex__ double ez = __cexp (1.0i * x);
+ __complex__ double emz = __cexp (-1.0i * x);
+
+ res = (ez - emz) / (ez + emz) * -1.0i;
+ }
+ else
+ {
+ __real__ res = sin2rx / den;
+ __imag__ res = __ieee754_sinh (2.0 * __imag__ x) / den;
+ }
}
return res;
diff --git a/sysdeps/generic/s_ctanf.c b/sysdeps/generic/s_ctanf.c
index e02971dd44..58d9d13298 100644
--- a/sysdeps/generic/s_ctanf.c
+++ b/sysdeps/generic/s_ctanf.c
@@ -1,5 +1,5 @@
/* Complex tangent function for float.
- Copyright (C) 1997 Free Software Foundation, Inc.
+ Copyright (C) 1997, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -61,8 +61,19 @@ __ctanf (__complex__ float x)
den = cos2rx + __ieee754_coshf (2.0 * __imag__ x);
- __real__ res = sin2rx / den;
- __imag__ res = __ieee754_sinhf (2.0 * __imag__ x) / den;
+
+ if (den == 0.0)
+ {
+ __complex__ float ez = __cexpf (1.0i * x);
+ __complex__ float emz = __cexpf (-1.0i * x);
+
+ res = (ez - emz) / (ez + emz) * -1.0i;
+ }
+ else
+ {
+ __real__ res = sin2rx / den;
+ __imag__ res = __ieee754_sinhf (2.0 * __imag__ x) / den;
+ }
}
return res;
diff --git a/sysdeps/generic/s_ctanh.c b/sysdeps/generic/s_ctanh.c
index 971cd9040c..fe38dae291 100644
--- a/sysdeps/generic/s_ctanh.c
+++ b/sysdeps/generic/s_ctanh.c
@@ -1,5 +1,5 @@
/* Complex hyperbole tangent for double.
- Copyright (C) 1997 Free Software Foundation, Inc.
+ Copyright (C) 1997, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -61,8 +61,18 @@ __ctanh (__complex__ double x)
den = (__ieee754_cosh (2.0 * __real__ x) + cos2ix);
- __real__ res = __ieee754_sinh (2.0 * __real__ x) / den;
- __imag__ res = sin2ix / den;
+ if (den == 0.0)
+ {
+ __complex__ double ez = __cexp (x);
+ __complex__ double emz = __cexp (-x);
+
+ res = (ez - emz) / (ez + emz);
+ }
+ else
+ {
+ __real__ res = __ieee754_sinh (2.0 * __real__ x) / den;
+ __imag__ res = sin2ix / den;
+ }
}
return res;
diff --git a/sysdeps/generic/s_ctanhf.c b/sysdeps/generic/s_ctanhf.c
index cfcabab36a..c331dbaabb 100644
--- a/sysdeps/generic/s_ctanhf.c
+++ b/sysdeps/generic/s_ctanhf.c
@@ -1,5 +1,5 @@
/* Complex hyperbole tangent for float.
- Copyright (C) 1997 Free Software Foundation, Inc.
+ Copyright (C) 1997, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -61,8 +61,18 @@ __ctanhf (__complex__ float x)
den = (__ieee754_coshf (2.0 * __real__ x) + cos2ix);
- __real__ res = __ieee754_sinhf (2.0 * __real__ x) / den;
- __imag__ res = sin2ix / den;
+ if (den == 0.0f)
+ {
+ __complex__ float ez = __cexpf (x);
+ __complex__ float emz = __cexpf (-x);
+
+ res = (ez - emz) / (ez + emz);
+ }
+ else
+ {
+ __real__ res = __ieee754_sinhf (2.0 * __real__ x) / den;
+ __imag__ res = sin2ix / den;
+ }
}
return res;
diff --git a/sysdeps/generic/s_ctanhl.c b/sysdeps/generic/s_ctanhl.c
index 7bf6b39199..77ca8f8717 100644
--- a/sysdeps/generic/s_ctanhl.c
+++ b/sysdeps/generic/s_ctanhl.c
@@ -1,5 +1,5 @@
/* Complex hyperbole tangent for long double.
- Copyright (C) 1997 Free Software Foundation, Inc.
+ Copyright (C) 1997, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -61,8 +61,18 @@ __ctanhl (__complex__ long double x)
den = (__ieee754_coshl (2.0 * __real__ x) + cos2ix);
- __real__ res = __ieee754_sinhl (2.0 * __real__ x) / den;
- __imag__ res = sin2ix / den;
+ if (den == 0.0L)
+ {
+ __complex__ long double ez = __cexpl (x);
+ __complex__ long double emz = __cexpl (-x);
+
+ res = (ez - emz) / (ez + emz);
+ }
+ else
+ {
+ __real__ res = __ieee754_sinhl (2.0 * __real__ x) / den;
+ __imag__ res = sin2ix / den;
+ }
}
return res;
diff --git a/sysdeps/generic/s_ctanl.c b/sysdeps/generic/s_ctanl.c
index fa153e9b35..89379a5ff9 100644
--- a/sysdeps/generic/s_ctanl.c
+++ b/sysdeps/generic/s_ctanl.c
@@ -1,5 +1,5 @@
/* Complex tangent function for long double.
- Copyright (C) 1997 Free Software Foundation, Inc.
+ Copyright (C) 1997, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -61,8 +61,19 @@ __ctanl (__complex__ long double x)
den = cos2rx + __ieee754_coshl (2.0 * __imag__ x);
- __real__ res = sin2rx / den;
- __imag__ res = __ieee754_sinhl (2.0 * __imag__ x) / den;
+
+ if (den == 0.0)
+ {
+ __complex__ long double ez = __cexpl (1.0i * x);
+ __complex__ long double emz = __cexpl (-1.0i * x);
+
+ res = (ez - emz) / (ez + emz) * -1.0i;
+ }
+ else
+ {
+ __real__ res = sin2rx / den;
+ __imag__ res = __ieee754_sinhl (2.0 * __imag__ x) / den;
+ }
}
return res;
diff --git a/sysdeps/hppa/add_n.s b/sysdeps/hppa/add_n.s
index aaabd72e20..a396b3471c 100644
--- a/sysdeps/hppa/add_n.s
+++ b/sysdeps/hppa/add_n.s
@@ -38,19 +38,19 @@ __mpn_add_n:
.callinfo frame=0,no_calls
.entry
- ldws,ma 4(0,%r25),%r21
- ldws,ma 4(0,%r24),%r20
+ ldws,ma 4(%r25),%r21
+ ldws,ma 4(%r24),%r20
addib,= -1,%r23,L$end ;! check for (SIZE == 1)
add %r21,%r20,%r28 ;! add first limbs ignoring cy
-L$loop: ldws,ma 4(0,%r25),%r21
- ldws,ma 4(0,%r24),%r20
- stws,ma %r28,4(0,%r26)
+L$loop: ldws,ma 4(%r25),%r21
+ ldws,ma 4(%r24),%r20
+ stws,ma %r28,4(%r26)
addib,<> -1,%r23,L$loop
addc %r21,%r20,%r28
-L$end: stws %r28,0(0,%r26)
+L$end: stws %r28,0(%r26)
bv 0(%r2)
addc %r0,%r0,%r28
diff --git a/sysdeps/hppa/hppa1.1/udiv_qrnnd.s b/sysdeps/hppa/hppa1.1/udiv_qrnnd.s
index fdc63e59e5..7b83619c7d 100644
--- a/sysdeps/hppa/hppa1.1/udiv_qrnnd.s
+++ b/sysdeps/hppa/hppa1.1/udiv_qrnnd.s
@@ -38,20 +38,20 @@ __udiv_qrnnd:
.entry
ldo 64(%r30),%r30
- stws %r25,-16(0,%r30) ;! n_hi
- stws %r24,-12(0,%r30) ;! n_lo
+ stws %r25,-16(%r30) ;! n_hi
+ stws %r24,-12(%r30) ;! n_lo
b,l L$0,%r1
ldo L$0000-L$0(%r1),%r1
L$0:
- fldds -16(0,%r30),%fr5
- stws %r23,-12(0,%r30)
+ fldds -16(%r30),%fr5
+ stws %r23,-12(%r30)
comib,<= 0,%r25,L$1
fcnvxf,dbl,dbl %fr5,%fr5
- fldds 0(0,%r1),%fr4
+ fldds 0(%r1),%fr4
fadd,dbl %fr4,%fr5,%fr5
L$1:
fcpy,sgl %fr0,%fr6L
- fldws -12(0,%r30),%fr6R
+ fldws -12(%r30),%fr6R
fcnvxf,dbl,dbl %fr6,%fr4
fdiv,dbl %fr5,%fr4,%fr5
@@ -60,9 +60,9 @@ L$1:
fstws %fr4R,-16(%r30)
xmpyu %fr4R,%fr6R,%fr6
ldws -16(%r30),%r28
- fstds %fr6,-16(0,%r30)
- ldws -12(0,%r30),%r21
- ldws -16(0,%r30),%r20
+ fstds %fr6,-16(%r30)
+ ldws -12(%r30),%r21
+ ldws -16(%r30),%r20
sub %r24,%r21,%r22
subb %r25,%r20,%r1
comib,= 0,%r1,L$2
@@ -72,7 +72,7 @@ L$1:
ldo -1(%r28),%r28
L$2:
bv 0(%r2)
- stws %r22,0(0,%r26)
+ stws %r22,0(%r26)
.exit
.procend
diff --git a/sysdeps/hppa/lshift.s b/sysdeps/hppa/lshift.s
index 400fbcf6dd..151b283e57 100644
--- a/sysdeps/hppa/lshift.s
+++ b/sysdeps/hppa/lshift.s
@@ -35,32 +35,32 @@ __mpn_lshift:
sh2add %r24,%r25,%r25
sh2add %r24,%r26,%r26
- ldws,mb -4(0,%r25),%r22
+ ldws,mb -4(%r25),%r22
subi 32,%r23,%r1
mtsar %r1
addib,= -1,%r24,L$0004
vshd %r0,%r22,%r28 ;! compute carry out limb
- ldws,mb -4(0,%r25),%r29
+ ldws,mb -4(%r25),%r29
addib,= -1,%r24,L$0002
vshd %r22,%r29,%r20
-L$loop: ldws,mb -4(0,%r25),%r22
- stws,mb %r20,-4(0,%r26)
+L$loop: ldws,mb -4(%r25),%r22
+ stws,mb %r20,-4(%r26)
addib,= -1,%r24,L$0003
vshd %r29,%r22,%r20
- ldws,mb -4(0,%r25),%r29
- stws,mb %r20,-4(0,%r26)
+ ldws,mb -4(%r25),%r29
+ stws,mb %r20,-4(%r26)
addib,<> -1,%r24,L$loop
vshd %r22,%r29,%r20
-L$0002: stws,mb %r20,-4(0,%r26)
+L$0002: stws,mb %r20,-4(%r26)
vshd %r29,%r0,%r20
bv 0(%r2)
- stw %r20,-4(0,%r26)
-L$0003: stws,mb %r20,-4(0,%r26)
+ stw %r20,-4(%r26)
+L$0003: stws,mb %r20,-4(%r26)
L$0004: vshd %r22,%r0,%r20
bv 0(%r2)
- stw %r20,-4(0,%r26)
+ stw %r20,-4(%r26)
.exit
.procend
diff --git a/sysdeps/hppa/rshift.s b/sysdeps/hppa/rshift.s
index acb772f523..dff189dc48 100644
--- a/sysdeps/hppa/rshift.s
+++ b/sysdeps/hppa/rshift.s
@@ -33,31 +33,31 @@ __mpn_rshift:
.callinfo frame=64,no_calls
.entry
- ldws,ma 4(0,%r25),%r22
+ ldws,ma 4(%r25),%r22
mtsar %r23
addib,= -1,%r24,L$0004
vshd %r22,%r0,%r28 ;! compute carry out limb
- ldws,ma 4(0,%r25),%r29
+ ldws,ma 4(%r25),%r29
addib,= -1,%r24,L$0002
vshd %r29,%r22,%r20
-L$loop: ldws,ma 4(0,%r25),%r22
- stws,ma %r20,4(0,%r26)
+L$loop: ldws,ma 4(%r25),%r22
+ stws,ma %r20,4(%r26)
addib,= -1,%r24,L$0003
vshd %r22,%r29,%r20
- ldws,ma 4(0,%r25),%r29
- stws,ma %r20,4(0,%r26)
+ ldws,ma 4(%r25),%r29
+ stws,ma %r20,4(%r26)
addib,<> -1,%r24,L$loop
vshd %r29,%r22,%r20
-L$0002: stws,ma %r20,4(0,%r26)
+L$0002: stws,ma %r20,4(%r26)
vshd %r0,%r29,%r20
bv 0(%r2)
- stw %r20,0(0,%r26)
-L$0003: stws,ma %r20,4(0,%r26)
+ stw %r20,0(%r26)
+L$0003: stws,ma %r20,4(%r26)
L$0004: vshd %r0,%r22,%r20
bv 0(%r2)
- stw %r20,0(0,%r26)
+ stw %r20,0(%r26)
.exit
.procend
diff --git a/sysdeps/hppa/setjmp.S b/sysdeps/hppa/setjmp.S
index f10a7a304d..0da34db6f1 100644
--- a/sysdeps/hppa/setjmp.S
+++ b/sysdeps/hppa/setjmp.S
@@ -53,17 +53,17 @@ __sigsetjmp:
stw %rp, 80(%r26)
- ldo 88(%r26),%r19
- fstds,ma %fr12, 8(%r19) /* 88 */
- fstds,ma %fr13, 8(%r19) /* 96 */
- fstds,ma %fr14, 8(%r19) /* 104 */
- fstds,ma %fr15, 8(%r19) /* 112 */
- fstds,ma %fr16, 8(%r19) /* 120 */
- fstds,ma %fr17, 8(%r19) /* 128 */
- fstds,ma %fr18, 8(%r19) /* 136 */
- fstds,ma %fr19, 8(%r19) /* 144 */
- fstds,ma %fr20, 8(%r19) /* 152 */
- fstds %fr21, 0(%r19) /* 160 */
+ ldo 88(%r26),%r1
+ fstds,ma %fr12, 8(%r1) /* 88 */
+ fstds,ma %fr13, 8(%r1) /* 96 */
+ fstds,ma %fr14, 8(%r1) /* 104 */
+ fstds,ma %fr15, 8(%r1) /* 112 */
+ fstds,ma %fr16, 8(%r1) /* 120 */
+ fstds,ma %fr17, 8(%r1) /* 128 */
+ fstds,ma %fr18, 8(%r1) /* 136 */
+ fstds,ma %fr19, 8(%r1) /* 144 */
+ fstds,ma %fr20, 8(%r1) /* 152 */
+ fstds %fr21, 0(%r1) /* 160 */
b __sigjmp_save
nop
.procend
diff --git a/sysdeps/hppa/sub_n.s b/sysdeps/hppa/sub_n.s
index 34f196826d..7764961a2d 100644
--- a/sysdeps/hppa/sub_n.s
+++ b/sysdeps/hppa/sub_n.s
@@ -38,19 +38,19 @@ __mpn_sub_n:
.callinfo frame=0,no_calls
.entry
- ldws,ma 4(0,%r25),%r21
- ldws,ma 4(0,%r24),%r20
+ ldws,ma 4(%r25),%r21
+ ldws,ma 4(%r24),%r20
addib,= -1,%r23,L$end ;! check for (SIZE == 1)
sub %r21,%r20,%r28 ;! subtract first limbs ignoring cy
-L$loop: ldws,ma 4(0,%r25),%r21
- ldws,ma 4(0,%r24),%r20
- stws,ma %r28,4(0,%r26)
+L$loop: ldws,ma 4(%r25),%r21
+ ldws,ma 4(%r24),%r20
+ stws,ma %r28,4(%r26)
addib,<> -1,%r23,L$loop
subb %r21,%r20,%r28
-L$end: stws %r28,0(0,%r26)
+L$end: stws %r28,0(%r26)
addc %r0,%r0,%r28
bv 0(%r2)
subi 1,%r28,%r28
diff --git a/sysdeps/hppa/udiv_qrnnd.s b/sysdeps/hppa/udiv_qrnnd.s
index cd2b58ddec..8e9c07a205 100644
--- a/sysdeps/hppa/udiv_qrnnd.s
+++ b/sysdeps/hppa/udiv_qrnnd.s
@@ -38,7 +38,7 @@ __udiv_qrnnd:
.callinfo frame=0,no_calls
.entry
- comb,< %r23,0,L$largedivisor
+ comb,< %r23,%r0,L$largedivisor
sub %r0,%r23,%r1 ;! clear cy as side-effect
ds %r0,%r1,%r0
addc %r24,%r24,%r24
@@ -107,7 +107,7 @@ __udiv_qrnnd:
ds %r25,%r23,%r25
comclr,>= %r25,%r0,%r0
addl %r25,%r23,%r25
- stws %r25,0(0,%r26)
+ stws %r25,0(%r26)
bv 0(%r2)
addc %r28,%r28,%r28
@@ -186,7 +186,7 @@ L$largedivisor:
comclr,>= %r25,%r0,%r0
addl %r25,%r22,%r25
sh1addl %r25,%r20,%r25
- stws %r25,0(0,%r26)
+ stws %r25,0(%r26)
bv 0(%r2)
addc %r24,%r24,%r28
@@ -269,7 +269,7 @@ L$odd: addib,sv,n 1,%r22,L$FF.. ;! r22 = (d / 2 + 1)
addc %r0,%r28,%r28
sub,<< %r25,%r23,%r0
addl %r25,%r1,%r25
- stws %r25,0(0,%r26)
+ stws %r25,0(%r26)
bv 0(%r2)
addc %r0,%r28,%r28
@@ -278,7 +278,7 @@ L$odd: addib,sv,n 1,%r22,L$FF.. ;! r22 = (d / 2 + 1)
L$FF..: add,uv %r25,%r24,%r24
sub,<< %r24,%r23,%r0
ldo 1(%r24),%r24
- stws %r24,0(0,%r26)
+ stws %r24,0(%r26)
bv 0(%r2)
addc %r0,%r25,%r28
diff --git a/sysdeps/i386/dl-trampoline.S b/sysdeps/i386/dl-trampoline.S
index 80dd300e86..fd87eb711d 100644
--- a/sysdeps/i386/dl-trampoline.S
+++ b/sysdeps/i386/dl-trampoline.S
@@ -45,6 +45,7 @@ _dl_runtime_resolve:
.size _dl_runtime_resolve, .-_dl_runtime_resolve
+#ifndef PROF
.globl _dl_runtime_profile
.type _dl_runtime_profile, @function
cfi_startproc
@@ -180,3 +181,4 @@ _dl_runtime_profile:
ret
cfi_endproc
.size _dl_runtime_profile, .-_dl_runtime_profile
+#endif
diff --git a/sysdeps/ia64/dl-trampoline.S b/sysdeps/ia64/dl-trampoline.S
index b7969a6cf0..1b31dc7c9c 100644
--- a/sysdeps/ia64/dl-trampoline.S
+++ b/sysdeps/ia64/dl-trampoline.S
@@ -175,7 +175,7 @@ END(_dl_runtime_resolve)
16byte f13
16byte f14
16byte f15
-
+
Since stack has to be 16 byte aligned, the stack allocation is in
16byte increment. Before calling _dl_profile_fixup, the stack will
look like
@@ -189,6 +189,7 @@ END(_dl_runtime_resolve)
#define PLTENTER_FRAME_SIZE (4*8 + 8*8 + 8*16 + 2*8 + 16)
#define PLTEXIT_FRAME_SIZE (PLTENTER_FRAME_SIZE + 4*8 + 8*16)
+#ifndef PROF
ENTRY(_dl_runtime_profile)
{ .mii
.prologue
@@ -535,3 +536,4 @@ ENTRY(_dl_runtime_profile)
;;
}
END(_dl_runtime_profile)
+#endif
diff --git a/sysdeps/powerpc/elf/libc-start.c b/sysdeps/powerpc/elf/libc-start.c
index eed3e06c8a..af67a39a29 100644
--- a/sysdeps/powerpc/elf/libc-start.c
+++ b/sysdeps/powerpc/elf/libc-start.c
@@ -30,7 +30,6 @@ weak_extern (__cache_line_size)
#define LIBC_START_DISABLE_INLINE
#define LIBC_START_MAIN_AUXVEC_ARG
#define MAIN_AUXVEC_ARG
-#define INIT_MAIN_ARGS
#include <sysdeps/generic/libc-start.c>
diff --git a/sysdeps/powerpc/powerpc32/dl-trampoline.S b/sysdeps/powerpc/powerpc32/dl-trampoline.S
index ea5ce7b45a..506e8022b9 100644
--- a/sysdeps/powerpc/powerpc32/dl-trampoline.S
+++ b/sysdeps/powerpc/powerpc32/dl-trampoline.S
@@ -66,6 +66,7 @@ _dl_runtime_resolve:
bctr
.size _dl_runtime_resolve,.-_dl_runtime_resolve
+#ifndef PROF
.align 2
.globl _dl_prof_resolve
.type _dl_prof_resolve,@function
@@ -172,3 +173,4 @@ _dl_prof_resolve:
addi r1,r1,320
bctr
.size _dl_prof_resolve,.-_dl_prof_resolve
+#endif
diff --git a/sysdeps/powerpc/powerpc64/dl-trampoline.S b/sysdeps/powerpc/powerpc64/dl-trampoline.S
index 0c617063c9..c90f961615 100644
--- a/sysdeps/powerpc/powerpc64/dl-trampoline.S
+++ b/sysdeps/powerpc/powerpc64/dl-trampoline.S
@@ -26,7 +26,7 @@
and r11 contains the link_map (from PLT0+16). The link_map becomes
parm1 (r3) and the index (r0) need to be converted to an offset
(index * 24) in parm2 (r4). */
-
+
EALIGN(_dl_runtime_resolve, 4, 0)
/* We need to save the registers used to pass parameters, ie. r3 thru
r10; the registers are saved in a stack frame. */
@@ -139,8 +139,8 @@ END(_dl_runtime_resolve)
* Parameter save area, Allocated by the call, at least 8 double words
+40 TOC save area
+32 Reserved for linker
- +24 Reserved for compiler
- +16 LR save area
+ +24 Reserved for compiler
+ +16 LR save area
+8 CR save area
r1+0 stack back chain
*/
@@ -169,7 +169,7 @@ END(_dl_runtime_resolve)
and r11 contains the link_map (from PLT0+16). The link_map becomes
parm1 (r3) and the index (r0) needs to be converted to an offset
(index * 24) in parm2 (r4). */
-
+#ifndef PROF
EALIGN(_dl_profile_resolve, 4, 0)
/* Spill r30, r31 to preserve the link_map* and reloc_addr, in case we
need to call _dl_call_pltexit. */
@@ -215,23 +215,23 @@ EALIGN(_dl_profile_resolve, 4, 0)
li r12,64
stvx v2,0,r10
stvx v3,0,r9
-
+
stvx v4,r11,r10
stvx v5,r11,r9
addi r11,r11,64
-
+
stvx v6,r12,r10
stvx v7,r12,r9
addi r12,r12,64
-
+
stvx v8,r11,r10
stvx v9,r11,r9
addi r11,r11,64
-
+
stvx v10,r12,r10
stvx v11,r12,r9
mfspr r0,VRSAVE
-
+
stvx v12,r11,r10
stvx v13,r11,r9
L(saveFP):
@@ -262,7 +262,7 @@ L(saveFP):
nop
/* Test *framesizep > 0 to see if need to do pltexit processing. */
ld r0,STACK_FRAME(r1)
-/* Put the registers back. */
+/* Put the registers back. */
lwz r12,VR_VRSAVE(r1)
cmpdi cr1,r0,0
cmpdi cr0,r12,0
@@ -275,22 +275,22 @@ L(saveFP):
li r12,64
lvx v2,0,r10
lvx v3,0,r9
-
+
lvx v4,r11,r10
lvx v5,r11,r9
addi r11,r11,64
-
+
lvx v6,r12,r10
lvx v7,r12,r9
addi r12,r12,64
-
+
lvx v8,r11,r10
lvx v9,r11,r9
addi r11,r11,64
-
+
lvx v10,r12,r10
lvx v11,r12,r9
-
+
lvx v12,r11,r10
lvx v13,r11,r9
L(restoreFXR):
@@ -339,22 +339,22 @@ L(do_pltexit):
li r12,64
lvx v2,0,r10
lvx v3,0,r9
-
+
lvx v4,r11,r10
lvx v5,r11,r9
addi r11,r11,64
-
+
lvx v6,r12,r10
lvx v7,r12,r9
addi r12,r12,64
-
+
lvx v8,r11,r10
lvx v9,r11,r9
addi r11,r11,64
-
+
lvx v10,r12,r10
lvx v11,r12,r9
-
+
lvx v12,r11,r10
lvx v13,r11,r9
L(restoreFXR2):
@@ -393,7 +393,7 @@ L(restoreFXR2):
lfd fp13,FPR_PARMS+96(r1)
/* Call the target function. */
bctrl
- ld r2,40(r1)
+ ld r2,40(r1)
lwz r12,VR_VRSAVE(r1)
/* But return here and store the return values. */
std r3,INT_RTN(r1)
@@ -413,7 +413,7 @@ L(callpltexit):
addi r6,r1,INT_RTN
bl JUMPTARGET(_dl_call_pltexit)
nop
-/* Restore the return values from target function. */
+/* Restore the return values from target function. */
lwz r12,VR_VRSAVE(r1)
ld r3,INT_RTN(r1)
ld r4,INT_RTN+8(r1)
@@ -433,3 +433,4 @@ L(pltexitreturn):
ld r1,0(r1)
blr
END(_dl_profile_resolve)
+#endif
diff --git a/sysdeps/s390/s390-32/dl-trampoline.S b/sysdeps/s390/s390-32/dl-trampoline.S
index 4ee2295b89..fbbbc189db 100644
--- a/sysdeps/s390/s390-32/dl-trampoline.S
+++ b/sysdeps/s390/s390-32/dl-trampoline.S
@@ -64,6 +64,7 @@ _dl_runtime_resolve:
.size _dl_runtime_resolve, .-_dl_runtime_resolve
+#ifndef PROF
.globl _dl_runtime_profile
.type _dl_runtime_profile, @function
cfi_startproc
@@ -124,10 +125,10 @@ _dl_runtime_profile:
5: l %r14,7f-5b(%r1)
la %r4,32(%r12) # pointer to struct La_s390_32_regs
la %r5,72(%r12) # pointer to struct La_s390_32_retval
- basr %r14,%r1 # call _dl_call_pltexit
+ basr %r14,%r1 # call _dl_call_pltexit
j 1b
6: .long _dl_profile_fixup - 0b
7: .long _dl_call_pltexit - 5b
cfi_endproc
.size _dl_runtime_profile, .-_dl_runtime_profile
-
+#endif
diff --git a/sysdeps/s390/s390-64/dl-trampoline.S b/sysdeps/s390/s390-64/dl-trampoline.S
index 215d869803..8093582163 100644
--- a/sysdeps/s390/s390-64/dl-trampoline.S
+++ b/sysdeps/s390/s390-64/dl-trampoline.S
@@ -58,6 +58,7 @@ _dl_runtime_resolve:
.size _dl_runtime_resolve, .-_dl_runtime_resolve
+#ifndef PROF
.globl _dl_runtime_profile
.type _dl_runtime_profile, @function
cfi_startproc
@@ -124,3 +125,4 @@ _dl_runtime_profile:
j 0b
cfi_endproc
.size _dl_runtime_profile, .-_dl_runtime_profile
+#endif
diff --git a/sysdeps/unix/sysv/linux/bits/sched.h b/sysdeps/unix/sysv/linux/bits/sched.h
index 24495e2b34..69462bf61c 100644
--- a/sysdeps/unix/sysv/linux/bits/sched.h
+++ b/sysdeps/unix/sysv/linux/bits/sched.h
@@ -1,6 +1,6 @@
/* Definitions of constants and data structure for POSIX 1003.1b-1993
scheduling interface.
- Copyright (C) 1996-1999,2001,2002,2003 Free Software Foundation, Inc.
+ Copyright (C) 1996-1999,2001-2003,2005 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
@@ -69,7 +69,7 @@ __BEGIN_DECLS
/* Clone current process. */
#ifdef __USE_MISC
extern int clone (int (*__fn) (void *__arg), void *__child_stack,
- int __flags, void *__arg) __THROW;
+ int __flags, void *__arg, ...) __THROW;
#endif
__END_DECLS
diff --git a/sysdeps/unix/sysv/linux/configure b/sysdeps/unix/sysv/linux/configure
index 325073c62c..06683089ad 100644
--- a/sysdeps/unix/sysv/linux/configure
+++ b/sysdeps/unix/sysv/linux/configure
@@ -261,38 +261,29 @@ case "$prefix" in
;;
esac
-# Under Linux the LinuxThreads or NPTL add-on should be available.
+# Under Linux the NPTL add-on should be available.
case $add_ons in
- # Only one of the add-ons should be available.
- *linuxthreads*nptl*|*nptl*linuxthreads*)
- echo "\
-*** LinuxThreads and NPTL add-ons are both available. Only one must be used."
- exit 1
- ;;
# It is available. Good.
- *linuxthreads*)
- linuxthreads_missing=
- ;;
*nptl*)
- linuxthreads_missing=
+ nptl_missing=
;;
*)
- linuxthreads_missing=yes
+ nptl_missing=yes
;;
esac
-if test "$linuxthreads_missing"; then
+if test "$nptl_missing"; then
if test $enable_sanity = yes; then
echo "\
*** On GNU/Linux systems it is normal to compile GNU libc with the
-*** \`linuxthreads' add-on. Without that, the library will be
+*** \`nptl' add-on. Without that, the library will be
*** incompatible with normal GNU/Linux systems.
*** If you really mean to not use this add-on, run configure again
*** using the extra parameter \`--disable-sanity-checks'."
exit 1
else
echo "\
-*** WARNING: Are you sure you do not want to use the \`linuxthreads'
+*** WARNING: Are you sure you do not want to use the \`nptl'
*** add-on?"
fi
fi
diff --git a/sysdeps/unix/sysv/linux/configure.in b/sysdeps/unix/sysv/linux/configure.in
index 88feb868fe..b90de065af 100644
--- a/sysdeps/unix/sysv/linux/configure.in
+++ b/sysdeps/unix/sysv/linux/configure.in
@@ -196,38 +196,29 @@ case "$prefix" in
;;
esac
-# Under Linux the LinuxThreads or NPTL add-on should be available.
+# Under Linux the NPTL add-on should be available.
case $add_ons in
- # Only one of the add-ons should be available.
- *linuxthreads*nptl*|*nptl*linuxthreads*)
- echo "\
-*** LinuxThreads and NPTL add-ons are both available. Only one must be used."
- exit 1
- ;;
# It is available. Good.
- *linuxthreads*)
- linuxthreads_missing=
- ;;
*nptl*)
- linuxthreads_missing=
+ nptl_missing=
;;
*)
- linuxthreads_missing=yes
+ nptl_missing=yes
;;
esac
-if test "$linuxthreads_missing"; then
+if test "$nptl_missing"; then
if test $enable_sanity = yes; then
echo "\
*** On GNU/Linux systems it is normal to compile GNU libc with the
-*** \`linuxthreads' add-on. Without that, the library will be
+*** \`nptl' add-on. Without that, the library will be
*** incompatible with normal GNU/Linux systems.
*** If you really mean to not use this add-on, run configure again
*** using the extra parameter \`--disable-sanity-checks'."
exit 1
else
echo "\
-*** WARNING: Are you sure you do not want to use the \`linuxthreads'
+*** WARNING: Are you sure you do not want to use the \`nptl'
*** add-on?"
fi
fi
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile b/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile
index 05fd8523b7..e051f54637 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile
@@ -4,7 +4,7 @@ LD += -melf32_sparc
# When I get this to work, this is the right thing
ifeq ($(subdir),elf)
-CFLAGS-rtld.c += -mv8
+CFLAGS-rtld.c += -mcpu=v8
#rtld-routines += dl-sysdepsparc
sysdep-others += lddlibc4
install-bin += lddlibc4
diff --git a/sysdeps/x86_64/dl-trampoline.S b/sysdeps/x86_64/dl-trampoline.S
index eb46f29cf2..c1686dae10 100644
--- a/sysdeps/x86_64/dl-trampoline.S
+++ b/sysdeps/x86_64/dl-trampoline.S
@@ -56,7 +56,7 @@ _dl_runtime_resolve:
.size _dl_runtime_resolve, .-_dl_runtime_resolve
-
+#ifndef PROF
.globl _dl_runtime_profile
.type _dl_runtime_profile, @function
.align 16
@@ -186,3 +186,4 @@ _dl_runtime_profile:
retq
cfi_endproc
.size _dl_runtime_profile, .-_dl_runtime_profile
+#endif