mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 19:00:07 +00:00
Update.
2003-03-20 Ulrich Drepper <drepper@redhat.com> * sysdeps/unix/sysv/linux/ia64/lowlevellock.h: Include <atomic.h>. Remove __lll_add, __lll_dev_if_positive, and __lll_test_and_set definitions. Replace uses with calls to atomic_* functions. * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Likewise. * sysdeps/unix/sysv/linux/lowlevellock.c: Replace __lll_add and __lll_test_and_set calls with atomic_exchange_and_add and atomic_exchange calls respectively. * sysdeps/unix/sysv/linux/sem_post.c: Likewise. * sysdeps/unix/sysv/linux/sem_timedwait.c: Likewise. * sysdeps/unix/sysv/linux/sem_trywait.c: Likewise. * sysdeps/unix/sysv/linux/sem_wait.c: Likewise. * sysdeps/unix/sysv/linux/ia64/pthread_once.c: Likewise. * sysdeps/unix/sysv/linux/ia64/sem_port.c: Likewise. * sysdeps/unix/sysv/linux/powerpc/pthread_once.c: Likewise. * allocatestack.c (allocate_stack): Assume atomic_exchange_and_add returns the old value.
This commit is contained in:
parent
9daba4f4b9
commit
b1aea0989d
@ -1,3 +1,23 @@
|
|||||||
|
2003-03-20 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/lowlevellock.h: Include <atomic.h>.
|
||||||
|
Remove __lll_add, __lll_dev_if_positive, and __lll_test_and_set
|
||||||
|
definitions. Replace uses with calls to atomic_* functions.
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/lowlevellock.c: Replace __lll_add and
|
||||||
|
__lll_test_and_set calls with atomic_exchange_and_add and
|
||||||
|
atomic_exchange calls respectively.
|
||||||
|
* sysdeps/unix/sysv/linux/sem_post.c: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sem_timedwait.c: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sem_trywait.c: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sem_wait.c: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/pthread_once.c: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/sem_port.c: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/pthread_once.c: Likewise.
|
||||||
|
|
||||||
|
* allocatestack.c (allocate_stack): Assume atomic_exchange_and_add
|
||||||
|
returns the old value.
|
||||||
|
|
||||||
2003-03-20 Martin Schwidefsky <sky@mschwid3.boeblingen.de.ibm.com>
|
2003-03-20 Martin Schwidefsky <sky@mschwid3.boeblingen.de.ibm.com>
|
||||||
|
|
||||||
* sysdeps/s390/pthread_spin_lock.c (pthread_spin_lock): Use type
|
* sysdeps/s390/pthread_spin_lock.c (pthread_spin_lock): Use type
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <bits/pthreadtypes.h>
|
#include <bits/pthreadtypes.h>
|
||||||
#include <ia64intrin.h>
|
#include <ia64intrin.h>
|
||||||
|
#include <atomic.h>
|
||||||
|
|
||||||
#define SYS_futex 1230
|
#define SYS_futex 1230
|
||||||
#define FUTEX_WAIT 0
|
#define FUTEX_WAIT 0
|
||||||
@ -89,45 +90,6 @@
|
|||||||
#define __lll_compare_and_swap(futex, oldval, newval) \
|
#define __lll_compare_and_swap(futex, oldval, newval) \
|
||||||
__sync_val_compare_and_swap_si ((futex), (oldval), (newval))
|
__sync_val_compare_and_swap_si ((futex), (oldval), (newval))
|
||||||
|
|
||||||
/* Add inc to *futex atomically and return the old value. */
|
|
||||||
#define __lll_add(futex, inc) \
|
|
||||||
({ \
|
|
||||||
int __val, __oldval; \
|
|
||||||
int *__futex = (futex); \
|
|
||||||
int __inc = inc; \
|
|
||||||
\
|
|
||||||
__val = *__futex; \
|
|
||||||
do \
|
|
||||||
{ \
|
|
||||||
__oldval = __val; \
|
|
||||||
__val = __lll_compare_and_swap (__futex, __oldval, __oldval + __inc); \
|
|
||||||
} \
|
|
||||||
while (__builtin_expect (__val != __oldval, 0)); \
|
|
||||||
__val; \
|
|
||||||
})
|
|
||||||
|
|
||||||
/* Decrement *futex if it is > 0, and return the old value. */
|
|
||||||
#define __lll_dec_if_positive(futex) \
|
|
||||||
({ \
|
|
||||||
int __val, __oldval; \
|
|
||||||
int *__futex = (futex); \
|
|
||||||
\
|
|
||||||
__val = *__futex; \
|
|
||||||
do \
|
|
||||||
{ \
|
|
||||||
if (__builtin_expect (__val <= 0, 0)) \
|
|
||||||
break; \
|
|
||||||
__oldval = __val; \
|
|
||||||
__val = __lll_compare_and_swap (__futex, __oldval, __oldval - 1); \
|
|
||||||
} \
|
|
||||||
while (__builtin_expect (__val != __oldval, 0)); \
|
|
||||||
__val; \
|
|
||||||
})
|
|
||||||
|
|
||||||
/* Atomically store newval and return the old value. */
|
|
||||||
#define __lll_test_and_set(futex, newval) \
|
|
||||||
__sync_lock_test_and_set_si ((futex), (newval))
|
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
__attribute__ ((always_inline))
|
__attribute__ ((always_inline))
|
||||||
__lll_mutex_trylock (int *futex)
|
__lll_mutex_trylock (int *futex)
|
||||||
@ -176,7 +138,7 @@ static inline void
|
|||||||
__attribute__ ((always_inline))
|
__attribute__ ((always_inline))
|
||||||
__lll_mutex_unlock (int *futex)
|
__lll_mutex_unlock (int *futex)
|
||||||
{
|
{
|
||||||
int val = __lll_test_and_set (futex, 0);
|
int val = atomic_exchange (futex, 0);
|
||||||
|
|
||||||
if (__builtin_expect (val > 1, 0))
|
if (__builtin_expect (val > 1, 0))
|
||||||
lll_futex_wake (futex, 1);
|
lll_futex_wake (futex, 1);
|
||||||
|
@ -23,6 +23,8 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <bits/pthreadtypes.h>
|
#include <bits/pthreadtypes.h>
|
||||||
|
#include <atomic.h>
|
||||||
|
|
||||||
|
|
||||||
#define __NR_futex 221
|
#define __NR_futex 221
|
||||||
#define FUTEX_WAIT 0
|
#define FUTEX_WAIT 0
|
||||||
@ -84,32 +86,7 @@
|
|||||||
__val; \
|
__val; \
|
||||||
})
|
})
|
||||||
|
|
||||||
#define lll_mutex_trylock(lock) __lll_trylock(&(lock))
|
#define lll_mutex_trylock(lock) __lll_trylock (&(lock))
|
||||||
|
|
||||||
/* Add inc to *futex atomically and return the old value. */
|
|
||||||
#define __lll_add(futex, inc) \
|
|
||||||
({ int __val, __tmp; \
|
|
||||||
__asm __volatile ("1: lwarx %0,0,%3\n" \
|
|
||||||
" addi %1,%0,%4\n" \
|
|
||||||
" stwcx. %1,0,%3\n" \
|
|
||||||
" bne- 1b" \
|
|
||||||
: "=&b" (__val), "=&r" (__tmp), "=m" (*futex) \
|
|
||||||
: "r" (futex), "I" (inc), "2" (*futex) \
|
|
||||||
: "cr0"); \
|
|
||||||
__val; \
|
|
||||||
})
|
|
||||||
|
|
||||||
/* Atomically store newval and return the old value. */
|
|
||||||
#define __lll_test_and_set(futex, newval) \
|
|
||||||
({ int __val; \
|
|
||||||
__asm __volatile (__lll_rel_instr "\n" \
|
|
||||||
"1: lwarx %0,0,%2\n" \
|
|
||||||
" stwcx. %3,0,%2\n" \
|
|
||||||
" bne- 1b" \
|
|
||||||
: "=&r" (__val), "=m" (*futex) \
|
|
||||||
: "r" (futex), "r" (newval), "1" (*futex) \
|
|
||||||
: "cr0", "memory"); \
|
|
||||||
__val; })
|
|
||||||
|
|
||||||
|
|
||||||
extern void __lll_lock_wait (int *futex, int val) attribute_hidden;
|
extern void __lll_lock_wait (int *futex, int val) attribute_hidden;
|
||||||
@ -117,7 +94,7 @@ extern void __lll_lock_wait (int *futex, int val) attribute_hidden;
|
|||||||
#define lll_mutex_lock(lock) \
|
#define lll_mutex_lock(lock) \
|
||||||
(void) ({ \
|
(void) ({ \
|
||||||
int *__futex = &(lock); \
|
int *__futex = &(lock); \
|
||||||
int __val = __lll_add (__futex, 1); \
|
int __val = atomic_exchange_and_add (__futex, 1); \
|
||||||
__asm __volatile (__lll_acq_instr ::: "memory"); \
|
__asm __volatile (__lll_acq_instr ::: "memory"); \
|
||||||
if (__builtin_expect (__val != 0, 0)) \
|
if (__builtin_expect (__val != 0, 0)) \
|
||||||
__lll_lock_wait (__futex, __val); \
|
__lll_lock_wait (__futex, __val); \
|
||||||
@ -128,7 +105,7 @@ extern int __lll_timedlock_wait
|
|||||||
|
|
||||||
#define lll_mutex_timedlock(lock, abstime) \
|
#define lll_mutex_timedlock(lock, abstime) \
|
||||||
({ int *__futex = &(lock); \
|
({ int *__futex = &(lock); \
|
||||||
int __val = __lll_add (__futex, 1); \
|
int __val = atomic_exchange_and_add (__futex, 1); \
|
||||||
__asm __volatile (__lll_acq_instr ::: "memory"); \
|
__asm __volatile (__lll_acq_instr ::: "memory"); \
|
||||||
if (__builtin_expect (__val != 0, 0)) \
|
if (__builtin_expect (__val != 0, 0)) \
|
||||||
__val = __lll_timedlock_wait (__futex, __val, (abstime)); \
|
__val = __lll_timedlock_wait (__futex, __val, (abstime)); \
|
||||||
@ -138,7 +115,7 @@ extern int __lll_timedlock_wait
|
|||||||
#define lll_mutex_unlock(lock) \
|
#define lll_mutex_unlock(lock) \
|
||||||
((void) ({ \
|
((void) ({ \
|
||||||
int *__futex = &(lock); \
|
int *__futex = &(lock); \
|
||||||
int __val = __lll_test_and_set (__futex, 0); \
|
int __val = atomic_exchange (__futex, 0); \
|
||||||
if (__builtin_expect (__val > 1, 0)) \
|
if (__builtin_expect (__val > 1, 0)) \
|
||||||
lll_futex_wake (__futex, 1); \
|
lll_futex_wake (__futex, 1); \
|
||||||
}))
|
}))
|
||||||
@ -192,23 +169,6 @@ extern int __lll_timedwait_tid (int *, const struct timespec *)
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
/* Decrement *futex if it is > 0, and return the old value */
|
|
||||||
#define __lll_dec_if_positive(futex) \
|
|
||||||
({ int __val, __tmp; \
|
|
||||||
__asm __volatile ("1: lwarx %0,0,%3\n" \
|
|
||||||
" cmpwi 0,%0,0\n" \
|
|
||||||
" addi %1,%0,-1\n" \
|
|
||||||
" ble 2f\n" \
|
|
||||||
" stwcx. %1,0,%3\n" \
|
|
||||||
" bne- 1b\n" \
|
|
||||||
"2: " __lll_acq_instr \
|
|
||||||
: "=&b" (__val), "=&r" (__tmp), "=m" (*futex) \
|
|
||||||
: "r" (futex), "2" (*futex) \
|
|
||||||
: "cr0"); \
|
|
||||||
__val; \
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
/* Conditional variable handling. */
|
/* Conditional variable handling. */
|
||||||
|
|
||||||
extern void __lll_cond_wait (pthread_cond_t *cond)
|
extern void __lll_cond_wait (pthread_cond_t *cond)
|
||||||
|
Loading…
Reference in New Issue
Block a user