Update.
authorUlrich Drepper <drepper@redhat.com>
Fri, 21 Mar 2003 08:03:25 +0000 (08:03 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 21 Mar 2003 08:03:25 +0000 (08:03 +0000)
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.

29 files changed:
gmon/mcount.c
malloc/set-freeres.c
nptl/ChangeLog
nptl/cancellation.c
nptl/cleanup_defer.c
nptl/init.c
nptl/libc-cancellation.c
nptl/old_pthread_cond_broadcast.c
nptl/old_pthread_cond_signal.c
nptl/old_pthread_cond_timedwait.c
nptl/old_pthread_cond_wait.c
nptl/pthread_cancel.c
nptl/pthread_create.c
nptl/pthread_detach.c
nptl/pthread_join.c
nptl/pthread_key_delete.c
nptl/pthread_setcancelstate.c
nptl/pthread_setcanceltype.c
nptl/pthread_timedjoin.c
nptl/pthread_tryjoin.c
nptl/sysdeps/pthread/createthread.c
nscd/cache.c
stdlib/cxa_finalize.c
sysdeps/i386/i486/bits/atomic.h
sysdeps/ia64/bits/atomic.h
sysdeps/powerpc/bits/atomic.h
sysdeps/s390/bits/atomic.h
sysdeps/unix/sysv/linux/getsysstats.c
sysdeps/x86_64/bits/atomic.h

index c146650..e18bf86 100644 (file)
@@ -69,8 +69,8 @@ _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,
-                                            GMON_PROF_ON))
+       if (atomic_compare_and_exchange_bool_acq (&p->state, GMON_PROF_BUSY,
+                                                 GMON_PROF_ON))
          return;
 
        /*
index 1c0733e..6123141 100644 (file)
@@ -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;
 
index c68ad8d..3029aaf 100644 (file)
@@ -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>.
index 1dfbe4b..d88cae3 100644 (file)
@@ -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;
     }
 }
index 084216e..b72553b 100644 (file)
@@ -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,
-                                             cancelhandling
-                                             & ~CANCELTYPE_BITMASK,
-                                             cancelhandling) != 0)
+      while (atomic_compare_and_exchange_bool_acq (&self->cancelhandling,
+                                                  cancelhandling
+                                                  & ~CANCELTYPE_BITMASK,
+                                                  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,
-                                             cancelhandling
-                                             | CANCELTYPE_BITMASK,
-                                             cancelhandling) != 0)
+      while (atomic_compare_and_exchange_bool_acq (&self->cancelhandling,
+                                                  cancelhandling
+                                                  | CANCELTYPE_BITMASK,
+                                                  cancelhandling))
        cancelhandling = self->cancelhandling;
 
       CANCELLATION_P (self);
index 7ad2971..4237c6e 100644 (file)
@@ -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);
index d9ad94f..0d584fb 100644 (file)
@@ -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
index 0db0aea..3852943 100644 (file)
@@ -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);
     }
index ae54209..65beb0b 100644 (file)
@@ -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);
     }
index b30e182..27c1093 100644 (file)
@@ -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);
     }
index 50505a2..0a503a1 100644 (file)
@@ -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);
     }
index f11a924..43b65b6 100644 (file)
@@ -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;
     }
+  /* Mark the thread as canceled.  This has to be done
+     atomically since other bits could be modified as well.  */
+  while (atomic_compare_and_exchange_bool_acq (&pd->cancelhandling, newval,
+                                              oldval));
 
   return result;
 }
index ea05747..4121874 100644 (file)
@@ -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.  */
index ff58e3b..ce13a2c 100644 (file)
@@ -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.
index 5a0ec95..f77c2c9 100644 (file)
@@ -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;
 
index a0145f8..ae7d7c4 100644 (file)
@@ -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;
     }
index 3f6ed86..a6af063 100644 (file)
@@ -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 ();
index bb4b249..5a04635 100644 (file)
@@ -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))
            {
index c83c0ef..1cc0721 100644 (file)
@@ -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;
 
index 88d2e8b..904cb52 100644 (file)
@@ -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;
 
index 797176d..fae744f 100644 (file)
@@ -100,8 +100,8 @@ 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,
-                                                 pd->nextevent) != 0);
+         while (atomic_compare_and_exchange_bool_acq (&__nptl_last_event, pd,
+                                                      pd->nextevent) != 0);
 
          /* Now call the function which signals the event.  */
          __nptl_create_event ();
index 788d47b..6492092 100644 (file)
@@ -101,8 +101,8 @@ 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,
-                                         newp->next));
+  while (atomic_compare_and_exchange_bool_acq (&table->array[hash], newp,
+                                              newp->next));
 
   /* Update the statistics.  */
   if (data == (void *) -1)
index 19d6567..792aeeb 100644 (file)
@@ -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);
     }
 
index e22e560..2255e19 100644 (file)
@@ -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
index 7c6ebf1..27789c0 100644 (file)
@@ -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))
 
index 956272c..49f1c14 100644 (file)
@@ -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,41 +69,41 @@ 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)        \
-({                                                             \
-  unsigned int __tmp;                                          \
-  __asm __volatile (__ARCH_REL_INSTR "\n"                      \
-                   "1: lwarx   %0,0,%1\n"                      \
-                   "   subf.   %0,%2,%0\n"                     \
-                   "   bne     2f\n"                           \
-                   "   stwcx.  %3,0,%1\n"                      \
-                   "   bne-    1b\n"                           \
-                   "2: " __ARCH_ACQ_INSTR                      \
-                   : "=&r" (__tmp)                             \
-                   : "r" (mem), "r" (oldval), "r" (newval)     \
-                   : "cr0", "memory");                         \
-  __tmp != 0;                                                  \
+#define __arch_compare_and_exchange_bool_32_acq(mem, newval, oldval) \
+({                                                                           \
+  unsigned int __tmp;                                                        \
+  __asm __volatile (__ARCH_REL_INSTR "\n"                                    \
+                   "1: lwarx   %0,0,%1\n"                                    \
+                   "   subf.   %0,%2,%0\n"                                   \
+                   "   bne     2f\n"                                         \
+                   "   stwcx.  %3,0,%1\n"                                    \
+                   "   bne-    1b\n"                                         \
+                   "2: " __ARCH_ACQ_INSTR                                    \
+                   : "=&r" (__tmp)                                           \
+                   : "r" (mem), "r" (oldval), "r" (newval)                   \
+                   : "cr0", "memory");                                       \
+  __tmp != 0;                                                                \
 })
 
 #ifdef __powerpc64__
-# define __arch_compare_and_exchange_64_acq(mem, newval, oldval)\
-({                                                             \
-  unsigned long        __tmp;                                          \
-  __asm __volatile (__ARCH_REL_INSTR "\n"                      \
-                   "1: ldarx   %0,0,%1\n"                      \
-                   "   subf.   %0,%2,%0\n"                     \
-                   "   bne     2f\n"                           \
-                   "   stdcx.  %3,0,%1\n"                      \
-                   "   bne-    1b\n"                           \
-                   "2: " __ARCH_ACQ_INSTR                      \
-                   : "=&r" (__tmp)                             \
-                   : "r" (mem), "r" (oldval), "r" (newval)     \
-                   : "cr0", "memory");                         \
-  __tmp != 0;                                                  \
+# define __arch_compare_and_exchange_bool_64_acq(mem, newval, oldval) \
+({                                                                           \
+  unsigned long        __tmp;                                                        \
+  __asm __volatile (__ARCH_REL_INSTR "\n"                                    \
+                   "1: ldarx   %0,0,%1\n"                                    \
+                   "   subf.   %0,%2,%0\n"                                   \
+                   "   bne     2f\n"                                         \
+                   "   stdcx.  %3,0,%1\n"                                    \
+                   "   bne-    1b\n"                                         \
+                   "2: " __ARCH_ACQ_INSTR                                    \
+                   : "=&r" (__tmp)                                           \
+                   : "r" (mem), "r" (oldval), "r" (newval)                   \
+                   : "cr0", "memory");                                       \
+  __tmp != 0;                                                                \
 })
 
 #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
 
index 375ae0d..74321b6 100644 (file)
@@ -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
index c44e45c..71e90fe 100644 (file)
@@ -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);
index 22d3ab0..742f8b1 100644 (file)
@@ -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));             \