mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 04:50:07 +00:00
Update.
2003-03-21 Ulrich Drepper <drepper@redhat.com> * cancellation.c: Adjust for new form of compare&exchange macros. * cleanup_defer.c: Likewise. * init.c: Likewise. * libc-cancellation.c: Likewise. * old_pthread_cond_broadcast.c: Likewise. * old_pthread_cond_signal.c: Likewise. * old_pthread_cond_timedwait.c: Likewise. * old_pthread_cond_wait.c: Likewise. * pthread_cancel.c: Likewise. * pthread_create.c: Likewise. * pthread_detach.c: Likewise. * pthread_join.c: Likewise. * pthread_key_delete.c: Likewise. * pthread_setcancelstate.c: Likewise. * pthread_setcanceltype.c: Likewise. * pthread_timedjoin.c: Likewise. * pthread_tryjoin.c: Likewise. * sysdeps/pthread/createthread.c: Likewise.
This commit is contained in:
parent
18627f615b
commit
5a3ab2fc18
@ -69,7 +69,7 @@ _MCOUNT_DECL(frompc, selfpc) /* _mcount; may be static, inline, etc */
|
||||
* check that we are profiling
|
||||
* and that we aren't recursively invoked.
|
||||
*/
|
||||
if (atomic_compare_and_exchange_acq (&p->state, GMON_PROF_BUSY,
|
||||
if (atomic_compare_and_exchange_bool_acq (&p->state, GMON_PROF_BUSY,
|
||||
GMON_PROF_ON))
|
||||
return;
|
||||
|
||||
|
@ -36,7 +36,7 @@ __libc_freeres (void)
|
||||
protect for multiple executions since these are fatal. */
|
||||
static long int already_called;
|
||||
|
||||
if (! atomic_compare_and_exchange_acq (&already_called, 1, 0))
|
||||
if (! atomic_compare_and_exchange_bool_acq (&already_called, 1, 0))
|
||||
{
|
||||
void * const *p;
|
||||
|
||||
|
@ -1,3 +1,24 @@
|
||||
2003-03-21 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* cancellation.c: Adjust for new form of compare&exchange macros.
|
||||
* cleanup_defer.c: Likewise.
|
||||
* init.c: Likewise.
|
||||
* libc-cancellation.c: Likewise.
|
||||
* old_pthread_cond_broadcast.c: Likewise.
|
||||
* old_pthread_cond_signal.c: Likewise.
|
||||
* old_pthread_cond_timedwait.c: Likewise.
|
||||
* old_pthread_cond_wait.c: Likewise.
|
||||
* pthread_cancel.c: Likewise.
|
||||
* pthread_create.c: Likewise.
|
||||
* pthread_detach.c: Likewise.
|
||||
* pthread_join.c: Likewise.
|
||||
* pthread_key_delete.c: Likewise.
|
||||
* pthread_setcancelstate.c: Likewise.
|
||||
* pthread_setcanceltype.c: Likewise.
|
||||
* pthread_timedjoin.c: Likewise.
|
||||
* pthread_tryjoin.c: Likewise.
|
||||
* sysdeps/pthread/createthread.c: Likewise.
|
||||
|
||||
2003-03-20 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/ia64/lowlevellock.h: Include <atomic.h>.
|
||||
|
@ -41,8 +41,8 @@ __pthread_enable_asynccancel (void)
|
||||
if (newval == oldval)
|
||||
break;
|
||||
|
||||
if (atomic_compare_and_exchange_acq (&self->cancelhandling, newval,
|
||||
oldval) == 0)
|
||||
if (! atomic_compare_and_exchange_bool_acq (&self->cancelhandling,
|
||||
newval, oldval))
|
||||
{
|
||||
if (CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS (newval))
|
||||
{
|
||||
@ -72,8 +72,8 @@ __pthread_enable_asynccancel_2 (int *oldvalp)
|
||||
if (newval == oldval)
|
||||
break;
|
||||
|
||||
if (atomic_compare_and_exchange_acq (&self->cancelhandling, newval,
|
||||
oldval) == 0)
|
||||
if (! atomic_compare_and_exchange_bool_acq (&self->cancelhandling,
|
||||
newval, oldval))
|
||||
{
|
||||
if (CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS (newval))
|
||||
{
|
||||
@ -106,8 +106,8 @@ __pthread_disable_asynccancel (int oldtype)
|
||||
if (newval == oldval)
|
||||
break;
|
||||
|
||||
if (atomic_compare_and_exchange_acq (&self->cancelhandling, newval,
|
||||
oldval) == 0)
|
||||
if (! atomic_compare_and_exchange_bool_acq (&self->cancelhandling,
|
||||
newval, oldval))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -41,10 +41,10 @@ _pthread_cleanup_push_defer (buffer, routine, arg)
|
||||
/* Disable asynchronous cancellation for now. */
|
||||
if (__builtin_expect (cancelhandling & CANCELTYPE_BITMASK, 0))
|
||||
{
|
||||
while (atomic_compare_and_exchange_acq (&self->cancelhandling,
|
||||
while (atomic_compare_and_exchange_bool_acq (&self->cancelhandling,
|
||||
cancelhandling
|
||||
& ~CANCELTYPE_BITMASK,
|
||||
cancelhandling) != 0)
|
||||
cancelhandling))
|
||||
cancelhandling = self->cancelhandling;
|
||||
}
|
||||
|
||||
@ -70,10 +70,10 @@ _pthread_cleanup_pop_restore (buffer, execute)
|
||||
&& ((cancelhandling = THREAD_GETMEM (self, cancelhandling))
|
||||
& CANCELTYPE_BITMASK) == 0)
|
||||
{
|
||||
while (atomic_compare_and_exchange_acq (&self->cancelhandling,
|
||||
while (atomic_compare_and_exchange_bool_acq (&self->cancelhandling,
|
||||
cancelhandling
|
||||
| CANCELTYPE_BITMASK,
|
||||
cancelhandling) != 0)
|
||||
cancelhandling))
|
||||
cancelhandling = self->cancelhandling;
|
||||
|
||||
CANCELLATION_P (self);
|
||||
|
@ -147,8 +147,8 @@ sigcancel_handler (int sig __attribute ((unused)))
|
||||
/* Already canceled or exiting. */
|
||||
break;
|
||||
|
||||
if (atomic_compare_and_exchange_acq (&self->cancelhandling, newval,
|
||||
oldval) == 0)
|
||||
if (! atomic_compare_and_exchange_bool_acq (&self->cancelhandling,
|
||||
newval, oldval))
|
||||
{
|
||||
/* Set the return value. */
|
||||
THREAD_SETMEM (self, result, PTHREAD_CANCELED);
|
||||
|
@ -34,11 +34,12 @@ __libc_enable_asynccancel (void)
|
||||
{
|
||||
struct pthread *self = THREAD_SELF;
|
||||
int oldval;
|
||||
int newval;
|
||||
|
||||
while (1)
|
||||
do
|
||||
{
|
||||
oldval = THREAD_GETMEM (self, cancelhandling);
|
||||
int newval = oldval | CANCELTYPE_BITMASK;
|
||||
newval = oldval | CANCELTYPE_BITMASK;
|
||||
|
||||
if (__builtin_expect ((oldval & CANCELED_BITMASK) != 0, 0))
|
||||
{
|
||||
@ -46,8 +47,8 @@ __libc_enable_asynccancel (void)
|
||||
if ((oldval & EXITING_BITMASK) != 0)
|
||||
break;
|
||||
|
||||
if (atomic_compare_and_exchange_acq (&self->cancelhandling, newval,
|
||||
oldval) != 0)
|
||||
if (atomic_compare_and_exchange_bool_acq (&self->cancelhandling,
|
||||
newval, oldval))
|
||||
/* Somebody else modified the word, try again. */
|
||||
continue;
|
||||
|
||||
@ -60,11 +61,9 @@ __libc_enable_asynccancel (void)
|
||||
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
if (atomic_compare_and_exchange_acq (&self->cancelhandling, newval,
|
||||
oldval) == 0)
|
||||
break;
|
||||
}
|
||||
while (atomic_compare_and_exchange_bool_acq (&self->cancelhandling,
|
||||
newval, oldval));
|
||||
|
||||
return oldval;
|
||||
}
|
||||
@ -80,19 +79,19 @@ __libc_disable_asynccancel (int oldtype)
|
||||
return;
|
||||
|
||||
struct pthread *self = THREAD_SELF;
|
||||
int oldval;
|
||||
int newval;
|
||||
|
||||
while (1)
|
||||
do
|
||||
{
|
||||
int oldval = THREAD_GETMEM (self, cancelhandling);
|
||||
int newval = oldval & ~CANCELTYPE_BITMASK;
|
||||
oldval = THREAD_GETMEM (self, cancelhandling);
|
||||
newval = oldval & ~CANCELTYPE_BITMASK;
|
||||
|
||||
if (newval == oldval)
|
||||
break;
|
||||
|
||||
if (atomic_compare_and_exchange_acq (&self->cancelhandling, newval,
|
||||
oldval) == 0)
|
||||
break;
|
||||
}
|
||||
while (atomic_compare_and_exchange_bool_acq (&self->cancelhandling, newval,
|
||||
oldval));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -46,7 +46,7 @@ __pthread_cond_broadcast_2_0 (cond)
|
||||
(void) pthread_cond_init (newcond, NULL);
|
||||
#endif
|
||||
|
||||
if (atomic_compare_and_exchange_acq (&cond->cond, newcond, NULL) != 0)
|
||||
if (atomic_compare_and_exchange_bool_acq (&cond->cond, newcond, NULL))
|
||||
/* Somebody else just initialized the condvar. */
|
||||
free (newcond);
|
||||
}
|
||||
|
@ -46,7 +46,7 @@ __pthread_cond_signal_2_0 (cond)
|
||||
(void) pthread_cond_init (newcond, NULL);
|
||||
#endif
|
||||
|
||||
if (atomic_compare_and_exchange_acq (&cond->cond, newcond, NULL) != 0)
|
||||
if (atomic_compare_and_exchange_bool_acq (&cond->cond, newcond, NULL))
|
||||
/* Somebody else just initialized the condvar. */
|
||||
free (newcond);
|
||||
}
|
||||
|
@ -48,7 +48,7 @@ __pthread_cond_timedwait_2_0 (cond, mutex, abstime)
|
||||
(void) pthread_cond_init (newcond, NULL);
|
||||
#endif
|
||||
|
||||
if (atomic_compare_and_exchange_acq (&cond->cond, newcond, NULL) != 0)
|
||||
if (atomic_compare_and_exchange_bool_acq (&cond->cond, newcond, NULL))
|
||||
/* Somebody else just initialized the condvar. */
|
||||
free (newcond);
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ __pthread_cond_wait_2_0 (cond, mutex)
|
||||
(void) pthread_cond_init (newcond, NULL);
|
||||
#endif
|
||||
|
||||
if (atomic_compare_and_exchange_acq (&cond->cond, newcond, NULL) != 0)
|
||||
if (atomic_compare_and_exchange_bool_acq (&cond->cond, newcond, NULL))
|
||||
/* Somebody else just initialized the condvar. */
|
||||
free (newcond);
|
||||
}
|
||||
|
@ -36,10 +36,12 @@ pthread_cancel (th)
|
||||
return ESRCH;
|
||||
|
||||
int result = 0;
|
||||
while (1)
|
||||
int oldval;
|
||||
int newval;
|
||||
do
|
||||
{
|
||||
int oldval = pd->cancelhandling;
|
||||
int newval = oldval | CANCELING_BITMASK | CANCELED_BITMASK;
|
||||
oldval = pd->cancelhandling;
|
||||
newval = oldval | CANCELING_BITMASK | CANCELED_BITMASK;
|
||||
|
||||
/* Avoid doing unnecessary work. The atomic operation can
|
||||
potentially be expensive if the bug has to be locked and
|
||||
@ -66,13 +68,11 @@ pthread_cancel (th)
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
/* Mark the thread as canceled. This has to be done
|
||||
atomically since other bits could be modified as well. */
|
||||
if (atomic_compare_and_exchange_acq (&pd->cancelhandling, newval,
|
||||
oldval) == 0)
|
||||
break;
|
||||
}
|
||||
while (atomic_compare_and_exchange_bool_acq (&pd->cancelhandling, newval,
|
||||
oldval));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -260,8 +260,8 @@ start_thread (void *arg)
|
||||
|
||||
do
|
||||
pd->nextevent = __nptl_last_event;
|
||||
while (atomic_compare_and_exchange_acq (&__nptl_last_event, pd,
|
||||
pd->nextevent) != 0);
|
||||
while (atomic_compare_and_exchange_bool_acq (&__nptl_last_event,
|
||||
pd, pd->nextevent));
|
||||
}
|
||||
|
||||
/* Now call the function to signal the event. */
|
||||
|
@ -36,7 +36,7 @@ pthread_detach (th)
|
||||
int result = 0;
|
||||
|
||||
/* Mark the thread as detached. */
|
||||
if (atomic_compare_and_exchange_acq (&pd->joinid, pd, NULL) != 0)
|
||||
if (atomic_compare_and_exchange_bool_acq (&pd->joinid, pd, NULL))
|
||||
{
|
||||
/* There are two possibilities here. First, the thread might
|
||||
already be detached. In this case we return EINVAL.
|
||||
|
@ -66,8 +66,9 @@ pthread_join (threadid, thread_return)
|
||||
|
||||
/* Wait for the thread to finish. If it is already locked something
|
||||
is wrong. There can only be one waiter. */
|
||||
if (__builtin_expect (atomic_compare_and_exchange_acq (&pd->joinid, self,
|
||||
NULL) != 0, 0))
|
||||
if (__builtin_expect (atomic_compare_and_exchange_bool_acq (&pd->joinid,
|
||||
self,
|
||||
NULL), 0))
|
||||
/* There is already somebody waiting for the thread. */
|
||||
return EINVAL;
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2002 Free Software Foundation, Inc.
|
||||
/* 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.
|
||||
|
||||
@ -33,8 +33,8 @@ pthread_key_delete (key)
|
||||
unsigned int seq = __pthread_keys[key].seq;
|
||||
|
||||
if (__builtin_expect (! KEY_UNUSED (seq), 1)
|
||||
&& atomic_compare_and_exchange_acq (&__pthread_keys[key].seq,
|
||||
seq + 1, seq) == 0)
|
||||
&& ! atomic_compare_and_exchange_bool_acq (&__pthread_keys[key].seq,
|
||||
seq + 1, seq))
|
||||
/* We deleted a valid key. */
|
||||
result = 0;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2002 Free Software Foundation, Inc.
|
||||
/* 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.
|
||||
|
||||
@ -54,8 +54,8 @@ __pthread_setcancelstate (state, oldstate)
|
||||
|
||||
/* Update the cancel handling word. This has to be done
|
||||
atomically since other bits could be modified as well. */
|
||||
if (atomic_compare_and_exchange_acq (&self->cancelhandling, newval,
|
||||
oldval) == 0)
|
||||
if (! atomic_compare_and_exchange_bool_acq (&self->cancelhandling,
|
||||
newval, oldval))
|
||||
{
|
||||
if (CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS (newval))
|
||||
__do_cancel ();
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2002 Free Software Foundation, Inc.
|
||||
/* 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.
|
||||
|
||||
@ -54,8 +54,8 @@ __pthread_setcanceltype (type, oldtype)
|
||||
|
||||
/* Update the cancel handling word. This has to be done
|
||||
atomically since other bits could be modified as well. */
|
||||
if (atomic_compare_and_exchange_acq (&self->cancelhandling, newval,
|
||||
oldval) == 0)
|
||||
if (! atomic_compare_and_exchange_bool_acq (&self->cancelhandling,
|
||||
newval, oldval))
|
||||
{
|
||||
if (CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS (newval))
|
||||
{
|
||||
|
@ -63,8 +63,8 @@ pthread_timedjoin_np (threadid, thread_return, abstime)
|
||||
|
||||
/* Wait for the thread to finish. If it is already locked something
|
||||
is wrong. There can only be one waiter. */
|
||||
if (__builtin_expect (atomic_compare_and_exchange_acq (&pd->joinid, self,
|
||||
NULL) != 0, 0))
|
||||
if (__builtin_expect (atomic_compare_and_exchange_bool_acq (&pd->joinid,
|
||||
self, NULL), 0))
|
||||
/* There is already somebody waiting for the thread. */
|
||||
return EINVAL;
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2002 Free Software Foundation, Inc.
|
||||
/* 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.
|
||||
|
||||
@ -59,7 +59,7 @@ pthread_tryjoin_np (threadid, thread_return)
|
||||
|
||||
/* Wait for the thread to finish. If it is already locked something
|
||||
is wrong. There can only be one waiter. */
|
||||
if (atomic_compare_and_exchange_acq (&pd->joinid, self, NULL) != 0)
|
||||
if (atomic_compare_and_exchange_bool_acq (&pd->joinid, self, NULL))
|
||||
/* There is already somebody waiting for the thread. */
|
||||
return EINVAL;
|
||||
|
||||
|
@ -100,7 +100,7 @@ create_thread (struct pthread *pd, STACK_VARIABLES_PARMS)
|
||||
/* Enqueue the descriptor. */
|
||||
do
|
||||
pd->nextevent = __nptl_last_event;
|
||||
while (atomic_compare_and_exchange_acq (&__nptl_last_event, pd,
|
||||
while (atomic_compare_and_exchange_bool_acq (&__nptl_last_event, pd,
|
||||
pd->nextevent) != 0);
|
||||
|
||||
/* Now call the function which signals the event. */
|
||||
|
@ -101,7 +101,7 @@ cache_add (int type, void *key, size_t len, const void *packet, size_t total,
|
||||
/* Put the new entry in the first position. */
|
||||
do
|
||||
newp->next = table->array[hash];
|
||||
while (atomic_compare_and_exchange_acq (&table->array[hash], newp,
|
||||
while (atomic_compare_and_exchange_bool_acq (&table->array[hash], newp,
|
||||
newp->next));
|
||||
|
||||
/* Update the statistics. */
|
||||
|
@ -36,8 +36,8 @@ __cxa_finalize (void *d)
|
||||
for (f = &funcs->fns[funcs->idx - 1]; f >= &funcs->fns[0]; --f)
|
||||
if ((d == NULL || d == f->func.cxa.dso_handle)
|
||||
/* We don't want to run this cleanup more than once. */
|
||||
&& (atomic_compare_and_exchange_acq (&f->flavor, ef_free, ef_cxa)
|
||||
== 0))
|
||||
&& ! atomic_compare_and_exchange_bool_acq (&f->flavor, ef_free,
|
||||
ef_cxa))
|
||||
(*f->func.cxa.fn) (f->func.cxa.arg, 0);
|
||||
}
|
||||
|
||||
|
@ -55,23 +55,23 @@ typedef uintmax_t uatomic_max_t;
|
||||
#endif
|
||||
|
||||
|
||||
#define __arch_compare_and_exchange_8_acq(mem, newval, oldval) \
|
||||
({ unsigned char ret; \
|
||||
__asm __volatile (LOCK "cmpxchgb %b2, %1; setne %0" \
|
||||
#define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \
|
||||
({ __typeof (*mem) ret; \
|
||||
__asm __volatile (LOCK "cmpxchgb %b2, %1" \
|
||||
: "=a" (ret), "=m" (*mem) \
|
||||
: "q" (newval), "1" (*mem), "0" (oldval)); \
|
||||
ret; })
|
||||
|
||||
#define __arch_compare_and_exchange_16_acq(mem, newval, oldval) \
|
||||
({ unsigned char ret; \
|
||||
__asm __volatile (LOCK "cmpxchgw %w2, %1; setne %0" \
|
||||
#define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \
|
||||
({ __typeof (*mem) ret; \
|
||||
__asm __volatile (LOCK "cmpxchgw %w2, %1" \
|
||||
: "=a" (ret), "=m" (*mem) \
|
||||
: "r" (newval), "1" (*mem), "0" (oldval)); \
|
||||
ret; })
|
||||
|
||||
#define __arch_compare_and_exchange_32_acq(mem, newval, oldval) \
|
||||
({ unsigned char ret; \
|
||||
__asm __volatile (LOCK "cmpxchgl %2, %1; setne %0" \
|
||||
#define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \
|
||||
({ __typeof (*mem) ret; \
|
||||
__asm __volatile (LOCK "cmpxchgl %2, %1" \
|
||||
: "=a" (ret), "=m" (*mem) \
|
||||
: "r" (newval), "1" (*mem), "0" (oldval)); \
|
||||
ret; })
|
||||
@ -83,37 +83,34 @@ typedef uintmax_t uatomic_max_t;
|
||||
really going to be used the code below can be used on Intel Pentium
|
||||
and later, but NOT on i486. */
|
||||
#if 1
|
||||
# define __arch_compare_and_exchange_64_acq(mem, newval, oldval) \
|
||||
# define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \
|
||||
(abort (), 0)
|
||||
#else
|
||||
# ifdef __PIC__
|
||||
# define __arch_compare_and_exchange_64_acq(mem, newval, oldval) \
|
||||
({ unsigned char ret; \
|
||||
int ignore; \
|
||||
__asm __volatile ("xchgl %3, %%ebx\n\t" \
|
||||
LOCK "cmpxchg8b %2, %1\n\t" \
|
||||
"setne %0\n\t" \
|
||||
"xchgl %3, %%ebx" \
|
||||
: "=a" (ret), "=m" (*mem), "=d" (ignore) \
|
||||
# define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \
|
||||
({ __typeof (*mem) ret; \
|
||||
__asm __volatile ("xchgl %2, %%ebx\n\t" \
|
||||
LOCK "cmpxchg8b %1\n\t" \
|
||||
"xchgl %2, %%ebx" \
|
||||
: "=A" (ret), "=m" (*mem) \
|
||||
: "DS" (((unsigned long long int) (newval)) \
|
||||
& 0xffffffff), \
|
||||
"c" (((unsigned long long int) (newval)) >> 32), \
|
||||
"1" (*mem), "0" (((unsigned long long int) (oldval)) \
|
||||
"1" (*mem), "a" (((unsigned long long int) (oldval)) \
|
||||
& 0xffffffff), \
|
||||
"2" (((unsigned long long int) (oldval)) >> 32)); \
|
||||
"d" (((unsigned long long int) (oldval)) >> 32)); \
|
||||
ret; })
|
||||
# else
|
||||
# define __arch_compare_and_exchange_64_acq(mem, newval, oldval) \
|
||||
({ unsigned char ret; \
|
||||
int ignore; \
|
||||
__asm __volatile (LOCK "cmpxchg8b %2, %1; setne %0" \
|
||||
: "=a" (ret), "=m" (*mem), "=d" (ignore) \
|
||||
({ __typeof (*mem) ret; \
|
||||
__asm __volatile (LOCK "cmpxchg8b %1" \
|
||||
: "=A" (ret), "=m" (*mem) \
|
||||
: "b" (((unsigned long long int) (newval)) \
|
||||
& 0xffffffff), \
|
||||
"c" (((unsigned long long int) (newval)) >> 32), \
|
||||
"1" (*mem), "0" (((unsigned long long int) (oldval)) \
|
||||
"1" (*mem), "a" (((unsigned long long int) (oldval)) \
|
||||
& 0xffffffff), \
|
||||
"2" (((unsigned long long int) (oldval)) >> 32)); \
|
||||
"d" (((unsigned long long int) (oldval)) >> 32)); \
|
||||
ret; })
|
||||
# endif
|
||||
#endif
|
||||
|
@ -45,25 +45,31 @@ typedef intmax_t atomic_max_t;
|
||||
typedef uintmax_t uatomic_max_t;
|
||||
|
||||
|
||||
#define __arch_compare_and_exchange_8_acq(mem, newval, oldval) \
|
||||
#define __arch_compare_and_exchange_bool_8_acq(mem, newval, oldval) \
|
||||
(abort (), 0)
|
||||
|
||||
#define __arch_compare_and_exchange_16_acq(mem, newval, oldval) \
|
||||
#define __arch_compare_and_exchange_bool_16_acq(mem, newval, oldval) \
|
||||
(abort (), 0)
|
||||
|
||||
#define __arch_compare_and_exchange_32_acq(mem, newval, oldval) \
|
||||
#define __arch_compare_and_exchange_bool_32_acq(mem, newval, oldval) \
|
||||
(!__sync_bool_compare_and_swap_si ((int *) (mem), (int) (long) (oldval), \
|
||||
(int) (long) (newval)))
|
||||
|
||||
#define __arch_compare_and_exchange_64_acq(mem, newval, oldval) \
|
||||
#define __arch_compare_and_exchange_bool_64_acq(mem, newval, oldval) \
|
||||
(!__sync_bool_compare_and_swap_di ((long *) (mem), (long) (oldval), \
|
||||
(long) (newval)))
|
||||
|
||||
#define __arch_compare_and_exchange_32_val_acq(mem, newval, oldval) \
|
||||
#define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \
|
||||
(abort (), 0)
|
||||
|
||||
#define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \
|
||||
(abort (), 0)
|
||||
|
||||
#define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \
|
||||
__sync_val_compare_and_swap_si ((int *) (mem), (int) (long) (oldval), \
|
||||
(int) (long) (newval))
|
||||
|
||||
#define __arch_compare_and_exchange_64_val_acq(mem, newval, oldval) \
|
||||
#define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \
|
||||
__sync_val_compare_and_swap_di ((long *) (mem), (long) (oldval), \
|
||||
(long) (newval))
|
||||
|
||||
|
@ -46,10 +46,10 @@ typedef intmax_t atomic_max_t;
|
||||
typedef uintmax_t uatomic_max_t;
|
||||
|
||||
|
||||
#define __arch_compare_and_exchange_8_acq(mem, newval, oldval) \
|
||||
#define __arch_compare_and_exchange_bool_8_acq(mem, newval, oldval) \
|
||||
(abort (), 0)
|
||||
|
||||
#define __arch_compare_and_exchange_16_acq(mem, newval, oldval) \
|
||||
#define __arch_compare_and_exchange_bool_16_acq(mem, newval, oldval) \
|
||||
(abort (), 0)
|
||||
|
||||
#ifdef UP
|
||||
@ -69,7 +69,7 @@ typedef uintmax_t uatomic_max_t;
|
||||
* XXX this may not work properly on 64-bit if the register
|
||||
* containing oldval has the high half non-zero for some reason.
|
||||
*/
|
||||
#define __arch_compare_and_exchange_32_acq(mem, newval, oldval) \
|
||||
#define __arch_compare_and_exchange_bool_32_acq(mem, newval, oldval) \
|
||||
({ \
|
||||
unsigned int __tmp; \
|
||||
__asm __volatile (__ARCH_REL_INSTR "\n" \
|
||||
@ -86,7 +86,7 @@ typedef uintmax_t uatomic_max_t;
|
||||
})
|
||||
|
||||
#ifdef __powerpc64__
|
||||
# define __arch_compare_and_exchange_64_acq(mem, newval, oldval)\
|
||||
# define __arch_compare_and_exchange_bool_64_acq(mem, newval, oldval) \
|
||||
({ \
|
||||
unsigned long __tmp; \
|
||||
__asm __volatile (__ARCH_REL_INSTR "\n" \
|
||||
@ -103,7 +103,7 @@ typedef uintmax_t uatomic_max_t;
|
||||
})
|
||||
|
||||
#else /* powerpc32 */
|
||||
# define __arch_compare_and_exchange_64_acq(mem, newval, oldval) \
|
||||
# define __arch_compare_and_exchange_bool_64_acq(mem, newval, oldval) \
|
||||
(abort (), 0)
|
||||
#endif
|
||||
|
||||
|
@ -45,13 +45,13 @@ typedef intmax_t atomic_max_t;
|
||||
typedef uintmax_t uatomic_max_t;
|
||||
|
||||
|
||||
#define __arch_compare_and_exchange_8_acq(mem, newval, oldval) \
|
||||
#define __arch_compare_and_exchange_bool_8_acq(mem, newval, oldval) \
|
||||
(abort (), 0)
|
||||
|
||||
#define __arch_compare_and_exchange_16_acq(mem, newval, oldval) \
|
||||
#define __arch_compare_and_exchange_bool_16_acq(mem, newval, oldval) \
|
||||
(abort (), 0)
|
||||
|
||||
#define __arch_compare_and_exchange_32_acq(mem, newval, oldval) \
|
||||
#define __arch_compare_and_exchange_bool_32_acq(mem, newval, oldval) \
|
||||
({ unsigned int *__mem = (unsigned int *) (mem); \
|
||||
unsigned int __old = (unsigned int) (oldval); \
|
||||
unsigned int __cmp = __old; \
|
||||
@ -61,7 +61,7 @@ typedef uintmax_t uatomic_max_t;
|
||||
__cmp != __old; })
|
||||
|
||||
#ifdef __s390x__
|
||||
# define __arch_compare_and_exchange_64_acq(mem, newval, oldval) \
|
||||
# define __arch_compare_and_exchange_bool_64_acq(mem, newval, oldval) \
|
||||
({ unsigned long int *__mem = (unsigned long int *) (mem); \
|
||||
unsigned long int __old = (unsigned long int) (oldval); \
|
||||
unsigned long int __cmp = __old; \
|
||||
@ -73,6 +73,6 @@ typedef uintmax_t uatomic_max_t;
|
||||
/* For 31 bit we do not really need 64-bit compare-and-exchange. We can
|
||||
implement them by use of the csd instruction. The straightforward
|
||||
implementation causes warnings so we skip the definition for now. */
|
||||
# define __arch_compare_and_exchange_64_acq(mem, newval, oldval) \
|
||||
# define __arch_compare_and_exchange_bool_64_acq(mem, newval, oldval) \
|
||||
(abort (), 0)
|
||||
#endif
|
||||
|
@ -85,7 +85,7 @@ get_proc_path (char *buffer, size_t bufsize)
|
||||
|
||||
/* Now store the copied value. But do it atomically. */
|
||||
assert (sizeof (long int) == sizeof (void *__unbounded));
|
||||
if (atomic_compare_and_exchange_acq (&mount_proc, copy_result, NULL) == 0)
|
||||
if (! atomic_compare_and_exchange_bool_acq (&mount_proc, copy_result, NULL))
|
||||
/* Replacing the value failed. This means another thread was
|
||||
faster and we don't need the copy anymore. */
|
||||
free (copy_result);
|
||||
|
@ -55,29 +55,29 @@ typedef uintmax_t uatomic_max_t;
|
||||
#endif
|
||||
|
||||
|
||||
#define __arch_compare_and_exchange_8_acq(mem, newval, oldval) \
|
||||
({ unsigned char ret; \
|
||||
#define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \
|
||||
({ __typeof (*mem) ret; \
|
||||
__asm __volatile (LOCK "cmpxchgb %b2, %1; setne %0" \
|
||||
: "=a" (ret), "=m" (*mem) \
|
||||
: "q" (newval), "1" (*mem), "0" (oldval)); \
|
||||
ret; })
|
||||
|
||||
#define __arch_compare_and_exchange_16_acq(mem, newval, oldval) \
|
||||
({ unsigned char ret; \
|
||||
#define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \
|
||||
({ __typeof (*mem) ret; \
|
||||
__asm __volatile (LOCK "cmpxchgw %w2, %1; setne %0" \
|
||||
: "=a" (ret), "=m" (*mem) \
|
||||
: "r" (newval), "1" (*mem), "0" (oldval)); \
|
||||
ret; })
|
||||
|
||||
#define __arch_compare_and_exchange_32_acq(mem, newval, oldval) \
|
||||
({ unsigned char ret; \
|
||||
#define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \
|
||||
({ __typeof (*mem) ret; \
|
||||
__asm __volatile (LOCK "cmpxchgl %2, %1; setne %0" \
|
||||
: "=a" (ret), "=m" (*mem) \
|
||||
: "r" (newval), "1" (*mem), "0" (oldval)); \
|
||||
ret; })
|
||||
|
||||
#define __arch_compare_and_exchange_64_acq(mem, newval, oldval) \
|
||||
({ unsigned char ret; \
|
||||
#define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \
|
||||
({ __typeof (*mem) ret; \
|
||||
__asm __volatile (LOCK "cmpxchgq %q2, %1; setne %0" \
|
||||
: "=a" (ret), "=m" (*mem) \
|
||||
: "r" (newval), "1" (*mem), "0" (oldval)); \
|
||||
|
Loading…
Reference in New Issue
Block a user