From 043ad426e7927a49a872e915c3cde88b682aea71 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Wed, 19 Mar 2003 03:34:48 +0000 Subject: * Versions (libpthread: GLIBC_2.2): Remove pthread_barrierattr_getpshared, never really existed. (libpthread: GLIBC_2.0): Move __pthread_initialize to ... (libpthread: GLIBC_PRIVATE): ... here. --- nptl/ChangeLog | 13 ++++++ nptl/sysdeps/pthread/pthread_cond_timedwait.c | 50 +++++++++++----------- .../sysdeps/unix/sysv/linux/powerpc/lowlevellock.h | 12 ++++++ 3 files changed, 51 insertions(+), 24 deletions(-) (limited to 'nptl') diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 0150cadb70..3c9693abd0 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 e0200b4cd8..23cf0acb99 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 bfd109f080..2b58d2e63a 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) \ -- cgit 1.4.1