From 043ad426e7927a49a872e915c3cde88b682aea71 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Wed, 19 Mar 2003 03:34:48 +0000 Subject: [PATCH] * Versions (libpthread: GLIBC_2.2): Remove pthread_barrierattr_getpshared, never really existed. (libpthread: GLIBC_2.0): Move __pthread_initialize to ... (libpthread: GLIBC_PRIVATE): ... here. --- linuxthreads/ChangeLog | 7 +++ linuxthreads/Versions | 5 ++- nptl/ChangeLog | 13 ++++++ nptl/sysdeps/pthread/pthread_cond_timedwait.c | 50 +++++++++++----------- .../sysdeps/unix/sysv/linux/powerpc/lowlevellock.h | 12 ++++++ 5 files changed, 61 insertions(+), 26 deletions(-) diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index 862c96e..ecd57bf 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,10 @@ +2003-03-18 Roland McGrath + + * 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 * sysdeps/unix/sysv/linux/sparc/sparc64/Makefile: New file. diff --git a/linuxthreads/Versions b/linuxthreads/Versions index 0facfbc..88668e6 100644 --- a/linuxthreads/Versions +++ b/linuxthreads/Versions @@ -80,7 +80,7 @@ libpthread { sigwait; # Protected names for functions used in other shared objects. - __pthread_atfork; __pthread_initialize; __pthread_getspecific; + __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; @@ -147,7 +147,7 @@ libpthread { pthread_getcpuclockid; pthread_barrier_destroy; pthread_barrier_init; pthread_barrier_wait; pthread_barrierattr_destroy; pthread_barrierattr_init; - pthread_barrierattr_getpshared; pthread_barrierattr_setpshared; + pthread_barrierattr_setpshared; pthread_mutex_timedlock; pthread_rwlock_timedrdlock; pthread_rwlock_timedwrlock; @@ -170,6 +170,7 @@ libpthread { } GLIBC_PRIVATE { # Internal libc interface to libpthread + __pthread_initialize; __pthread_kill_other_threads_np; } } diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 0150cad..3c9693a 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,16 @@ +2003-03-18 Roland McGrath + + * Versions (libpthread: GLIBC_2.3.2): Move pthread_tryjoin_np and + pthread_timedjoin_np to ... + (libpthread: GLIBC_2.3.3): ... here. + (libpthread: GLIBC_2.2): Move pthread_barrierattr_getpshared there too. + + * sysdeps/pthread/pthread_cond_timedwait.c (__pthread_cond_timedwait): + Avoid shadowing VAL variable. + + * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h (__lll_test_and_set): + New macro. + 2003-03-18 Ulrich Drepper * Makefile (tests): Add tst-cond11. diff --git a/nptl/sysdeps/pthread/pthread_cond_timedwait.c b/nptl/sysdeps/pthread/pthread_cond_timedwait.c index e0200b4..23cf0ac 100644 --- a/nptl/sysdeps/pthread/pthread_cond_timedwait.c +++ b/nptl/sysdeps/pthread/pthread_cond_timedwait.c @@ -93,36 +93,38 @@ __pthread_cond_timedwait (cond, mutex, abstime) while (1) { struct timespec rt; + { #ifdef __NR_clock_gettime - INTERNAL_SYSCALL_DECL (err); - int val = INTERNAL_SYSCALL (clock_gettime, err, 2, cond->__data.__clock, - &ts); + INTERNAL_SYSCALL_DECL (err); + int val = INTERNAL_SYSCALL (clock_gettime, err, 2, + cond->__data.__clock, &rt); # ifndef __ASSUME_POSIX_TIMERS - if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (val, err), 0)) - { - struct timeval tv; - (void) gettimeofday (&tv, NULL); - - /* Convert the absolute timeout value to a relative timeout. */ - rt.tv_sec = abstime->tv_sec - tv.tv_sec; - rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * 1000; - } - else + if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (val, err), 0)) + { + struct timeval tv; + (void) gettimeofday (&tv, NULL); + + /* Convert the absolute timeout value to a relative timeout. */ + rt.tv_sec = abstime->tv_sec - tv.tv_sec; + rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * 1000; + } + else # endif - { - /* Convert the absolute timeout value to a relative timeout. */ - rt.tv_sec = abstime->tv_sec - rt.tv_sec; - rt.tv_nsec = abstime->tv_nsec - rt.tv_nsec; - } + { + /* Convert the absolute timeout value to a relative timeout. */ + rt.tv_sec = abstime->tv_sec - rt.tv_sec; + rt.tv_nsec = abstime->tv_nsec - rt.tv_nsec; + } #else - /* Get the current time. So far we support only one clock. */ - struct timeval tv; - (void) gettimeofday (&tv, NULL); + /* Get the current time. So far we support only one clock. */ + struct timeval tv; + (void) gettimeofday (&tv, NULL); - /* Convert the absolute timeout value to a relative timeout. */ - rt.tv_sec = abstime->tv_sec - tv.tv_sec; - rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * 1000; + /* Convert the absolute timeout value to a relative timeout. */ + rt.tv_sec = abstime->tv_sec - tv.tv_sec; + rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * 1000; #endif + } if (rt.tv_nsec < 0) { rt.tv_nsec += 1000000000; diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h index bfd109f..2b58d2e 100644 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h +++ b/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h @@ -99,6 +99,18 @@ __val; \ }) +/* Atomically store newval and return the old value. */ +#define __lll_test_and_set(futex, newval) \ + ({ int __val; \ + __asm __volatile ("1: lwarx %0,0,%3\n" \ + " stwcx. %2,0,%3\n" \ + " bne- 1b" \ + : "=&r" (__val), "=m" (*futex) \ + : "r" (futex), "r" (newval), "1" (*futex) \ + : "cr0"); \ + __val; }) + + extern void __lll_lock_wait (int *futex, int val) attribute_hidden; #define lll_mutex_lock(lock) \ -- 2.7.4