]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
* include/atomic.h (atomic_increment_and_test): Invert sense of test.
authorRoland McGrath <roland@gnu.org>
Sat, 22 Mar 2003 23:01:01 +0000 (23:01 +0000)
committerRoland McGrath <roland@gnu.org>
Sat, 22 Mar 2003 23:01:01 +0000 (23:01 +0000)
Add comment.
(atomic_decrement_and_test): Add comment.

2003-03-22  Jakub Jelinek  <jakub@redhat.com>

* include/atomic.h (atomic_compare_and_exchange_val_acq): Add comment.
Don't define if __arch_compare_and_exchange_val_32_acq is not defined.
(atomic_compare_and_exchange_bool_acq): Add comment.  Don't use
__oldval variable in the macro, since it might be macro argument.
(atomic_decrement_if_positive): Initialize __memp, remove setting
of non-existent variable.
(atomic_bit_test_set): Cast 1 to __typeof (*mem) before shifting.
* sysdeps/ia64/bits/atomic.h (atomic_exchange_and_add): Implement
using atomic_compare_and_exchange_val_acq.
(atomic_decrement_if_positive, atomic_bit_test_set): Define.
* sysdeps/s390/bits/atomic.h (__arch_compare_and_exchange_val_8_acq):
Renamed from...
(__arch_compare_and_exchange_bool_8_acq): ... this.
(__arch_compare_and_exchange_val_16_acq): Renamed from...
(__arch_compare_and_exchange_bool_16_acq): ... this.
(__arch_compare_and_exchange_val_32_acq): Return old value.  Renamed
from...
(__arch_compare_and_exchange_bool_32_acq): ... this.
(__arch_compare_and_exchange_val_64_acq): Return old value.  Renamed
from...
(__arch_compare_and_exchange_bool_64_acq): ... this.
(__arch_compare_and_exchange_val_32_acq): Use __typeof for local
variables types instead of assuming int.
Change prefix of local variables to __arch.
* sysdeps/generic/bits/atomic.h (arch_compare_and_exchange_acq):
Remove.
(atomic_compare_and_exchange_val_acq,
atomic_compare_and_exchange_bool_acq): Define.

* csu/tst-atomic.c: New test.
* csu/tst-atomic-long.c: New test.
* csu/Makefile (tests): Add tst-atomic and tst-atomic-long.

* malloc/memusagestat.c (main): Kill warning if uint64_t is ulong.

* sysdeps/s390/Versions: Add trailing newline.

* sysdeps/unix/sysv/linux/sysconf.c (__sysconf): Kill warning
if INTERNAL_SYSCALL_ERROR_P doesn't use its first argument.

ChangeLog
bits/atomic.h
csu/Makefile
csu/tst-atomic-long.c [new file with mode: 0644]
csu/tst-atomic.c [new file with mode: 0644]
include/atomic.h
malloc/memusagestat.c
sysdeps/generic/bits/atomic.h
sysdeps/ia64/bits/atomic.h
sysdeps/s390/bits/atomic.h
sysdeps/unix/sysv/linux/sysconf.c

index 3cc578800baf2eca7255be32bc602dab63bf906d..860f8576866555e17a70919f8a8bca739e6d5f85 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,51 @@
+2003-03-22  Roland McGrath  <roland@redhat.com>
+
+       * include/atomic.h (atomic_increment_and_test): Invert sense of test.
+       Add comment.
+       (atomic_decrement_and_test): Add comment.
+
+2003-03-22  Jakub Jelinek  <jakub@redhat.com>
+
+       * include/atomic.h (atomic_compare_and_exchange_val_acq): Add comment.
+       Don't define if __arch_compare_and_exchange_val_32_acq is not defined.
+       (atomic_compare_and_exchange_bool_acq): Add comment.  Don't use
+       __oldval variable in the macro, since it might be macro argument.
+       (atomic_decrement_if_positive): Initialize __memp, remove setting
+       of non-existent variable.
+       (atomic_bit_test_set): Cast 1 to __typeof (*mem) before shifting.
+       * sysdeps/ia64/bits/atomic.h (atomic_exchange_and_add): Implement
+       using atomic_compare_and_exchange_val_acq.
+       (atomic_decrement_if_positive, atomic_bit_test_set): Define.
+       * sysdeps/s390/bits/atomic.h (__arch_compare_and_exchange_val_8_acq):
+       Renamed from...
+       (__arch_compare_and_exchange_bool_8_acq): ... this.
+       (__arch_compare_and_exchange_val_16_acq): Renamed from...
+       (__arch_compare_and_exchange_bool_16_acq): ... this.
+       (__arch_compare_and_exchange_val_32_acq): Return old value.  Renamed
+       from...
+       (__arch_compare_and_exchange_bool_32_acq): ... this.
+       (__arch_compare_and_exchange_val_64_acq): Return old value.  Renamed
+       from...
+       (__arch_compare_and_exchange_bool_64_acq): ... this.
+       (__arch_compare_and_exchange_val_32_acq): Use __typeof for local
+       variables types instead of assuming int.
+       Change prefix of local variables to __arch.
+       * sysdeps/generic/bits/atomic.h (arch_compare_and_exchange_acq):
+       Remove.
+       (atomic_compare_and_exchange_val_acq,
+       atomic_compare_and_exchange_bool_acq): Define.
+
+       * csu/tst-atomic.c: New test.
+       * csu/tst-atomic-long.c: New test.
+       * csu/Makefile (tests): Add tst-atomic and tst-atomic-long.
+
+       * malloc/memusagestat.c (main): Kill warning if uint64_t is ulong.
+
+       * sysdeps/s390/Versions: Add trailing newline.
+
+       * sysdeps/unix/sysv/linux/sysconf.c (__sysconf): Kill warning
+       if INTERNAL_SYSCALL_ERROR_P doesn't use its first argument.
+
 2003-03-22  Andreas Schwab  <schwab@suse.de>
 
        * sysdeps/m68k/fpu/libm-test-ulps: Update.
index 7595b407ca1c2faecfcfc8f1b697aa9aade75411..6245130a91bf8447d47abe0ef84f28d2f6c0aad1 100644 (file)
    up with real definitions.  */
 
 /* The only basic operation needed is compare and exchange.  */
-#define arch_compare_and_exchange_acq(mem, newval, oldval) \
-  ({ *(mem) == (oldval) ? 1 : (*(mem) = (newval), 0); })
+#define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \
+  ({ __typeof (mem) __gmemp = (mem);                                 \
+     __typeof (*mem) __gret = *__gmemp;                                      \
+     __typeof (*mem) __gnewval = (newval);                           \
+                                                                     \
+     if (__gret == (oldval))                                         \
+       *__gmemp = __gnewval;                                         \
+     __gret; })
+
+#define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \
+  ({ __typeof (mem) __gmemp = (mem);                                 \
+     __typeof (*mem) __gnewval = (newval);                           \
+                                                                     \
+     *__gmemp == (oldval) ? (*__gmemp = __gnewval, 0) : 1; })
 
 #endif /* bits/atomic.h */
index f4c162116a467f9c6fc1f1ce8ce9d4275140b771..a36550f8267eda04ec718aa0edfb5694c8fe8d08 100644 (file)
@@ -1,5 +1,5 @@
 # Makefile for csu code for GNU C library.
-# Copyright (C) 1995,96,97,98,99,2000,01,2002 Free Software Foundation, Inc.
+# Copyright (C) 1995,96,97,98,99,2000,01,02,2003 Free Software Foundation, Inc.
 # This file is part of the GNU C Library.
 
 # The GNU C Library is free software; you can redistribute it and/or
@@ -42,6 +42,8 @@ distribute = initfini.c gmon-start.c start.c defs.awk munch.awk \
 generated = version-info.h
 before-compile = $(objpfx)version-info.h
 
+tests := tst-atomic tst-atomic-long
+
 all: # Make this the default target; it will be defined in Rules.
 
 include ../Makeconfig
diff --git a/csu/tst-atomic-long.c b/csu/tst-atomic-long.c
new file mode 100644 (file)
index 0000000..75a71eb
--- /dev/null
@@ -0,0 +1,28 @@
+/* Tests for atomic.h macros.
+   Copyright (C) 2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <bits/wordsize.h>
+
+#define atomic_t long
+#if __WORDSIZE == 64
+# define TEST_ATOMIC64 1
+#endif
+
+#include "tst-atomic.c"
diff --git a/csu/tst-atomic.c b/csu/tst-atomic.c
new file mode 100644 (file)
index 0000000..727229e
--- /dev/null
@@ -0,0 +1,277 @@
+/* Tests for atomic.h macros.
+   Copyright (C) 2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <stdio.h>
+#include <atomic.h>
+
+#ifndef atomic_t
+# define atomic_t int
+#endif
+
+/* Test various atomic.h macros.  */
+static int
+do_test (void)
+{
+  atomic_t mem;
+  int ret = 0;
+
+#ifdef atomic_compare_and_exchange_val_acq
+  mem = 24;
+  if (atomic_compare_and_exchange_val_acq (&mem, 35, 24) != 24
+      || mem != 35)
+    {
+      puts ("atomic_compare_and_exchange_val_acq test 1 failed");
+      ret = 1;
+    }
+
+  mem = 12;
+  if (atomic_compare_and_exchange_val_acq (&mem, 10, 15) != 12
+      || mem != 12)
+    {
+      puts ("atomic_compare_and_exchange_val_acq test 2 failed");
+      ret = 1;
+    }
+#endif
+
+  mem = 24;
+  if (atomic_compare_and_exchange_bool_acq (&mem, 35, 24)
+      || mem != 35)
+    {
+      puts ("atomic_compare_and_exchange_bool_acq test 1 failed");
+      ret = 1;
+    }
+
+  mem = 12;
+  if (! atomic_compare_and_exchange_bool_acq (&mem, 10, 15)
+      || mem != 12)
+    {
+      puts ("atomic_compare_and_exchange_bool_acq test 2 failed");
+      ret = 1;
+    }
+
+  mem = 64;
+  if (atomic_exchange (&mem, 31) != 64
+      || mem != 31)
+    {
+      puts ("atomic_exchange test failed");
+      ret = 1;
+    }
+
+  mem = 2;
+  if (atomic_exchange_and_add (&mem, 11) != 2
+      || mem != 13)
+    {
+      puts ("atomic_exchange_and_add test failed");
+      ret = 1;
+    }
+
+  mem = -21;
+  atomic_add (&mem, 22);
+  if (mem != 1)
+    {
+      puts ("atomic_add test failed");
+      ret = 1;
+    }
+
+  mem = -1;
+  atomic_increment (&mem);
+  if (mem != 0)
+    {
+      puts ("atomic_increment test failed");
+      ret = 1;
+    }
+
+  mem = 0;
+  if (! atomic_increment_and_test (&mem)
+      || mem != 1)
+    {
+      puts ("atomic_increment_and_test test 1 failed");
+      ret = 1;
+    }
+
+  mem = 35;
+  if (atomic_increment_and_test (&mem)
+      || mem != 36)
+    {
+      puts ("atomic_increment_and_test test 2 failed");
+      ret = 1;
+    }
+
+  mem = 17;
+  atomic_decrement (&mem);
+  if (mem != 16)
+    {
+      puts ("atomic_decrement test failed");
+      ret = 1;
+    }
+
+  mem = 0;
+  if (! atomic_decrement_and_test (&mem)
+      || mem != -1)
+    {
+      puts ("atomic_decrement_and_test test 1 failed");
+      ret = 1;
+    }
+
+  mem = 15;
+  if (atomic_decrement_and_test (&mem)
+      || mem != 14)
+    {
+      puts ("atomic_decrement_and_test test 2 failed");
+      ret = 1;
+    }
+
+  mem = 1;
+  if (atomic_decrement_if_positive (&mem) != 1
+      || mem != 0)
+    {
+      puts ("atomic_decrement_if_positive test 1 failed");
+      ret = 1;
+    }
+
+  mem = 0;
+  if (atomic_decrement_if_positive (&mem) != 0
+      || mem != 0)
+    {
+      puts ("atomic_decrement_if_positive test 2 failed");
+      ret = 1;
+    }
+
+  mem = -1;
+  if (atomic_decrement_if_positive (&mem) != -1
+      || mem != -1)
+    {
+      puts ("atomic_decrement_if_positive test 3 failed");
+      ret = 1;
+    }
+
+  mem = -10;
+  if (! atomic_add_negative (&mem, 12)
+      || mem != 2)
+    {
+      puts ("atomic_add_negative test 1 failed");
+      ret = 1;
+    }
+
+  mem = 0;
+  if (atomic_add_negative (&mem, 100)
+      || mem != 100)
+    {
+      puts ("atomic_add_negative test 2 failed");
+      ret = 1;
+    }
+
+  mem = 15;
+  if (atomic_add_negative (&mem, -10)
+      || mem != 5)
+    {
+      puts ("atomic_add_negative test 3 failed");
+      ret = 1;
+    }
+
+  mem = -34;
+  if (atomic_add_zero (&mem, 31)
+      || mem != -3)
+    {
+      puts ("atomic_add_zero test 1 failed");
+      ret = 1;
+    }
+
+  mem = 0;
+  if (! atomic_add_zero (&mem, 36)
+      || mem != 36)
+    {
+      puts ("atomic_add_zero test 2 failed");
+      ret = 1;
+    }
+
+  mem = 113;
+  if (atomic_add_zero (&mem, -13)
+      || mem != 100)
+    {
+      puts ("atomic_add_zero test 3 failed");
+      ret = 1;
+    }
+
+  mem = 0;
+  atomic_bit_set (&mem, 1);
+  if (mem != 2)
+    {
+      puts ("atomic_bit_set test 1 failed");
+      ret = 1;
+    }
+
+  mem = 8;
+  atomic_bit_set (&mem, 3);
+  if (mem != 8)
+    {
+      puts ("atomic_bit_set test 2 failed");
+      ret = 1;
+    }
+
+#ifdef TEST_ATOMIC64
+  mem = 16;
+  atomic_bit_set (&mem, 35);
+  if (mem != 0x800000010LL)
+    {
+      puts ("atomic_bit_set test 3 failed");
+      ret = 1;
+    }
+#endif
+
+  mem = 0;
+  if (atomic_bit_test_set (&mem, 1)
+      || mem != 2)
+    {
+      puts ("atomic_bit_test_set test 1 failed");
+      ret = 1;
+    }
+
+  mem = 8;
+  if (! atomic_bit_test_set (&mem, 3)
+      || mem != 8)
+    {
+      puts ("atomic_bit_test_set test 2 failed");
+      ret = 1;
+    }
+
+#ifdef TEST_ATOMIC64
+  mem = 16;
+  if (atomic_bit_test_set (&mem, 35)
+      || mem != 0x800000010LL)
+    {
+      puts ("atomic_bit_test_set test 3 failed");
+      ret = 1;
+    }
+
+  mem = 0x100000000LL;
+  if (! atomic_bit_test_set (&mem, 32)
+      || mem != 0x100000000LL)
+    {
+      puts ("atomic_bit_test_set test 4 failed");
+      ret = 1;
+    }
+#endif
+
+  return ret;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
index 017a8455d75333c631f2512e3cbc8eb83703143b..9469866ebe0d6d9e7bb09458a582f8e41e349e20 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+/* Internal macros for atomic operations for GNU C Library.
+   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.
 
 #include <bits/atomic.h>
 
 
-#ifndef atomic_compare_and_exchange_val_acq
+/* Atomically store NEWVAL in *MEM if *MEM is equal to OLDVAL.
+   Return the old *MEM value.  */
+#if !defined atomic_compare_and_exchange_val_acq \
+    && defined __arch_compare_and_exchange_val_32_acq
 # define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \
   ({ __typeof (*mem) __result;                                               \
      if (sizeof (*mem) == 1)                                                 \
@@ -48,6 +52,8 @@
 #endif
 
 
+/* Atomically store NEWVAL in *MEM if *MEM is equal to OLDVAL.
+   Return zero if *MEM was changed or non-zero if no exchange happened.  */
 #ifndef atomic_compare_and_exchange_bool_acq
 # ifdef __arch_compare_and_exchange_bool_32_acq
 #  define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \
      __result; })
 # else
 #  define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \
-  ({ __typeof (oldval) __oldval = (oldval);                                  \
-     atomic_compare_and_exchange_val_acq (mem, newval, __oldval) != __oldval; \
+  ({ /* Cannot use __oldval here, because macros later in this file might     \
+       call this macro with __oldval argument.  */                           \
+     __typeof (oldval) __old = (oldval);                                     \
+     atomic_compare_and_exchange_val_acq (mem, newval, __old) != __old;              \
   })
 # endif
 #endif
 #endif
 
 
+/* Add one to *MEM and return true iff it's now nonzero.  */
 #ifndef atomic_increment_and_test
 # define atomic_increment_and_test(mem) \
-  (atomic_exchange_and_add (mem, 1) == 0)
+  (atomic_exchange_and_add (mem, 1) != 0)
 #endif
 
 
 #endif
 
 
+/* Subtract 1 from *MEM and return true iff it's now zero.  */
 #ifndef atomic_decrement_and_test
 # define atomic_decrement_and_test(mem) \
   (atomic_exchange_and_add (mem, -1) == 0)
 #ifndef atomic_decrement_if_positive
 # define atomic_decrement_if_positive(mem) \
   ({ __typeof (*mem) __oldval;                                               \
-     __typeof (mem) __memp;                                                  \
+     __typeof (mem) __memp = (mem);                                          \
                                                                              \
-     __val = *__memp;                                                        \
      do                                                                              \
        {                                                                     \
         __oldval = *__memp;                                                  \
 # define atomic_bit_test_set(mem, bit) \
   ({ __typeof (*mem) __oldval;                                               \
      __typeof (mem) __memp = (mem);                                          \
-     __typeof (*mem) __mask = (1 << (bit));                                  \
+     __typeof (*mem) __mask = ((__typeof (*mem)) 1 << (bit));                \
                                                                              \
      do                                                                              \
        __oldval = (*__memp);                                                 \
index cd14eb5997b029d0f18496f1e3e27060b9797335..2b16b01ded7dea4c36de263b160f2c98d76ce546 100644 (file)
@@ -405,7 +405,7 @@ main (int argc, char *argv[])
     }
 
 
-  snprintf (buf, sizeof (buf), "%llu", total);
+  snprintf (buf, sizeof (buf), "%llu", (unsigned long long) total);
   gdImageString (im_out, gdFontSmall, xsize - 50, ysize - 14, buf, blue);
 
   if (!time_based)
index 7595b407ca1c2faecfcfc8f1b697aa9aade75411..6245130a91bf8447d47abe0ef84f28d2f6c0aad1 100644 (file)
    up with real definitions.  */
 
 /* The only basic operation needed is compare and exchange.  */
-#define arch_compare_and_exchange_acq(mem, newval, oldval) \
-  ({ *(mem) == (oldval) ? 1 : (*(mem) = (newval), 0); })
+#define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \
+  ({ __typeof (mem) __gmemp = (mem);                                 \
+     __typeof (*mem) __gret = *__gmemp;                                      \
+     __typeof (*mem) __gnewval = (newval);                           \
+                                                                     \
+     if (__gret == (oldval))                                         \
+       *__gmemp = __gnewval;                                         \
+     __gret; })
+
+#define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \
+  ({ __typeof (mem) __gmemp = (mem);                                 \
+     __typeof (*mem) __gnewval = (newval);                           \
+                                                                     \
+     *__gmemp == (oldval) ? (*__gmemp = __gnewval, 0) : 1; })
 
 #endif /* bits/atomic.h */
index 27789c0a2eae527fabae845fc76c70af1fa0b486..68d79fa9ecc4ad155464c001d62be1ef012c0ff3 100644 (file)
@@ -78,30 +78,49 @@ typedef uintmax_t uatomic_max_t;
   __sync_lock_test_and_set_si (mem, value)
 
 #define atomic_exchange_and_add(mem, value) \
-  ({                                                                         \
-    __typeof (*mem) __oldval, __val;                                         \
-    __typeof (mem) __memp = (mem);                                           \
-    __typeof (*mem) __value = (value);                                       \
+  ({ __typeof (*mem) __oldval, __val;                                        \
+     __typeof (mem) __memp = (mem);                                          \
+     __typeof (*mem) __value = (value);                                              \
                                                                              \
-    __val = *__memp;                                                         \
-    if (sizeof (*mem) == 4)                                                  \
-      do                                                                     \
-       {                                                                     \
-         __oldval = __val;                                                   \
-         __val = __arch_compare_and_exchange_32_val_acq (__memp,             \
-                                                         __oldval + __value, \
-                                                         __oldval);          \
-       }                                                                     \
-      while (__builtin_expect (__val != __oldval, 0));                       \
-    else if (sizeof (*mem) == 8)                                             \
-      do                                                                     \
-       {                                                                     \
-         __oldval = __val;                                                   \
-         __val = __arch_compare_and_exchange_64_val_acq (__memp,             \
-                                                         __oldval + __value, \
-                                                         __oldval);          \
-       }                                                                     \
-      while (__builtin_expect (__val != __oldval, 0));                       \
-    else                                                                     \
-      abort ();                                                                      \
-    __oldval + __value; })
+     __val = (*__memp);                                                              \
+     do                                                                              \
+       {                                                                     \
+        __oldval = __val;                                                    \
+        __val = atomic_compare_and_exchange_val_acq (__memp,                 \
+                                                     __oldval + __value,     \
+                                                     __oldval);              \
+       }                                                                     \
+     while (__builtin_expect (__val != __oldval, 0));                        \
+     __oldval; })
+
+#define atomic_decrement_if_positive(mem) \
+  ({ __typeof (*mem) __oldval, __val;                                        \
+     __typeof (mem) __memp = (mem);                                          \
+                                                                             \
+     __val = (*__memp);                                                              \
+     do                                                                              \
+       {                                                                     \
+        __oldval = __val;                                                    \
+        if (__builtin_expect (__val <= 0, 0))                                \
+          break;                                                             \
+        __val = atomic_compare_and_exchange_val_acq (__memp,   __oldval - 1, \
+                                                     __oldval);              \
+       }                                                                     \
+     while (__builtin_expect (__val != __oldval, 0));                        \
+     __oldval; })
+
+#define atomic_bit_test_set(mem, bit) \
+  ({ __typeof (*mem) __oldval, __val;                                        \
+     __typeof (mem) __memp = (mem);                                          \
+     __typeof (*mem) __mask = ((__typeof (*mem)) 1 << (bit));                \
+                                                                             \
+     __val = (*__memp);                                                              \
+     do                                                                              \
+       {                                                                     \
+        __oldval = __val;                                                    \
+        __val = atomic_compare_and_exchange_val_acq (__memp,                 \
+                                                     __oldval | __mask,      \
+                                                     __oldval);              \
+       }                                                                     \
+     while (__builtin_expect (__val != __oldval, 0));                        \
+     __oldval & __mask; })
index 74321b62ae71255d29778ab8dd60a02ab542f653..8504458cc7da2b4232a6de5b046f7795ff483ed5 100644 (file)
@@ -45,34 +45,32 @@ typedef intmax_t atomic_max_t;
 typedef uintmax_t uatomic_max_t;
 
 
-#define __arch_compare_and_exchange_bool_8_acq(mem, newval, oldval) \
+#define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \
   (abort (), 0)
 
-#define __arch_compare_and_exchange_bool_16_acq(mem, newval, oldval) \
+#define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \
   (abort (), 0)
 
-#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;                                             \
+#define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \
+  ({ __typeof (mem) __archmem = (mem);                                       \
+     __typeof (*mem) __archold = (oldval);                                   \
      __asm __volatile ("cs %0,%2,%1"                                         \
-                      : "+d" (__old), "=Q" (*__mem)                          \
-                      : "d" (newval), "m" (*__mem) : "cc" );                 \
-     __cmp != __old; })
+                      : "+d" (__archold), "=Q" (*__archmem)                  \
+                      : "d" (newval), "m" (*__archmem) : "cc" );             \
+     __archold; })
 
 #ifdef __s390x__
-# 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;                                        \
+# define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \
+  ({ __typeof (mem) __archmem = (mem);                                       \
+     __typeof (*mem) __archold = (oldval);                                   \
      __asm __volatile ("csg %0,%2,%1"                                        \
-                      : "+d" (__old), "=Q" (*__mem)                          \
-                      : "d" (newval), "m" (*__mem) : "cc" );                 \
-     __cmp != __old; })
+                      : "+d" (__archold), "=Q" (*__archmem)                  \
+                      : "d" (newval), "m" (*__archmem) : "cc" );             \
+     __archold; })
 #else
 /* 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_bool_64_acq(mem, newval, oldval) \
+# define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \
   (abort (), 0)
 #endif
index 92b1e6678217e6730cbcb9f999f35b35790010aa..1ce24394881323c3f9613af2deb0f9734376df03 100644 (file)
@@ -40,7 +40,8 @@ __sysconf (int name)
       {
        struct timespec ts;
        INTERNAL_SYSCALL_DECL (err);
-       int r = INTERNAL_SYSCALL (clock_getres, err, 2, CLOCK_MONOTONIC, &ts);
+       int r;
+       r = INTERNAL_SYSCALL (clock_getres, err, 2, CLOCK_MONOTONIC, &ts);
        return INTERNAL_SYSCALL_ERROR_P (r, err) ? 0 : 1;
       }
 #endif