* 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.
This commit is contained in:
Roland McGrath 2003-03-22 23:01:01 +00:00
parent 38ed16cf88
commit d15851ec24
11 changed files with 464 additions and 58 deletions

View File

@ -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> 2003-03-22 Andreas Schwab <schwab@suse.de>
* sysdeps/m68k/fpu/libm-test-ulps: Update. * sysdeps/m68k/fpu/libm-test-ulps: Update.

View File

@ -25,7 +25,19 @@
up with real definitions. */ up with real definitions. */
/* The only basic operation needed is compare and exchange. */ /* The only basic operation needed is compare and exchange. */
#define arch_compare_and_exchange_acq(mem, newval, oldval) \ #define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \
({ *(mem) == (oldval) ? 1 : (*(mem) = (newval), 0); }) ({ __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 */ #endif /* bits/atomic.h */

View File

@ -1,5 +1,5 @@
# Makefile for csu code for GNU C library. # 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. # This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or # 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 generated = version-info.h
before-compile = $(objpfx)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. all: # Make this the default target; it will be defined in Rules.
include ../Makeconfig include ../Makeconfig

28
csu/tst-atomic-long.c Normal file
View File

@ -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"

277
csu/tst-atomic.c Normal file
View File

@ -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"

View 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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@ -25,7 +26,10 @@
#include <bits/atomic.h> #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) \ # define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \
({ __typeof (*mem) __result; \ ({ __typeof (*mem) __result; \
if (sizeof (*mem) == 1) \ if (sizeof (*mem) == 1) \
@ -48,6 +52,8 @@
#endif #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 #ifndef atomic_compare_and_exchange_bool_acq
# ifdef __arch_compare_and_exchange_bool_32_acq # ifdef __arch_compare_and_exchange_bool_32_acq
# define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \ # define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \
@ -69,8 +75,10 @@
__result; }) __result; })
# else # else
# define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \ # define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \
({ __typeof (oldval) __oldval = (oldval); \ ({ /* Cannot use __oldval here, because macros later in this file might \
atomic_compare_and_exchange_val_acq (mem, newval, __oldval) != __oldval; \ call this macro with __oldval argument. */ \
__typeof (oldval) __old = (oldval); \
atomic_compare_and_exchange_val_acq (mem, newval, __old) != __old; \
}) })
# endif # endif
#endif #endif
@ -129,9 +137,10 @@
#endif #endif
/* Add one to *MEM and return true iff it's now nonzero. */
#ifndef atomic_increment_and_test #ifndef atomic_increment_and_test
# define atomic_increment_and_test(mem) \ # define atomic_increment_and_test(mem) \
(atomic_exchange_and_add (mem, 1) == 0) (atomic_exchange_and_add (mem, 1) != 0)
#endif #endif
@ -140,6 +149,7 @@
#endif #endif
/* Subtract 1 from *MEM and return true iff it's now zero. */
#ifndef atomic_decrement_and_test #ifndef atomic_decrement_and_test
# define atomic_decrement_and_test(mem) \ # define atomic_decrement_and_test(mem) \
(atomic_exchange_and_add (mem, -1) == 0) (atomic_exchange_and_add (mem, -1) == 0)
@ -150,9 +160,8 @@
#ifndef atomic_decrement_if_positive #ifndef atomic_decrement_if_positive
# define atomic_decrement_if_positive(mem) \ # define atomic_decrement_if_positive(mem) \
({ __typeof (*mem) __oldval; \ ({ __typeof (*mem) __oldval; \
__typeof (mem) __memp; \ __typeof (mem) __memp = (mem); \
\ \
__val = *__memp; \
do \ do \
{ \ { \
__oldval = *__memp; \ __oldval = *__memp; \
@ -190,7 +199,7 @@
# define atomic_bit_test_set(mem, bit) \ # define atomic_bit_test_set(mem, bit) \
({ __typeof (*mem) __oldval; \ ({ __typeof (*mem) __oldval; \
__typeof (mem) __memp = (mem); \ __typeof (mem) __memp = (mem); \
__typeof (*mem) __mask = (1 << (bit)); \ __typeof (*mem) __mask = ((__typeof (*mem)) 1 << (bit)); \
\ \
do \ do \
__oldval = (*__memp); \ __oldval = (*__memp); \

View 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); gdImageString (im_out, gdFontSmall, xsize - 50, ysize - 14, buf, blue);
if (!time_based) if (!time_based)

View File

@ -25,7 +25,19 @@
up with real definitions. */ up with real definitions. */
/* The only basic operation needed is compare and exchange. */ /* The only basic operation needed is compare and exchange. */
#define arch_compare_and_exchange_acq(mem, newval, oldval) \ #define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \
({ *(mem) == (oldval) ? 1 : (*(mem) = (newval), 0); }) ({ __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 */ #endif /* bits/atomic.h */

View File

@ -78,30 +78,49 @@ typedef uintmax_t uatomic_max_t;
__sync_lock_test_and_set_si (mem, value) __sync_lock_test_and_set_si (mem, value)
#define atomic_exchange_and_add(mem, value) \ #define atomic_exchange_and_add(mem, value) \
({ \ ({ __typeof (*mem) __oldval, __val; \
__typeof (*mem) __oldval, __val; \ __typeof (mem) __memp = (mem); \
__typeof (mem) __memp = (mem); \ __typeof (*mem) __value = (value); \
__typeof (*mem) __value = (value); \
\ \
__val = *__memp; \ __val = (*__memp); \
if (sizeof (*mem) == 4) \ do \
do \ { \
{ \ __oldval = __val; \
__oldval = __val; \ __val = atomic_compare_and_exchange_val_acq (__memp, \
__val = __arch_compare_and_exchange_32_val_acq (__memp, \ __oldval + __value, \
__oldval + __value, \ __oldval); \
__oldval); \ } \
} \ while (__builtin_expect (__val != __oldval, 0)); \
while (__builtin_expect (__val != __oldval, 0)); \ __oldval; })
else if (sizeof (*mem) == 8) \
do \ #define atomic_decrement_if_positive(mem) \
{ \ ({ __typeof (*mem) __oldval, __val; \
__oldval = __val; \ __typeof (mem) __memp = (mem); \
__val = __arch_compare_and_exchange_64_val_acq (__memp, \ \
__oldval + __value, \ __val = (*__memp); \
__oldval); \ do \
} \ { \
while (__builtin_expect (__val != __oldval, 0)); \ __oldval = __val; \
else \ if (__builtin_expect (__val <= 0, 0)) \
abort (); \ break; \
__oldval + __value; }) __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; })

View File

@ -45,34 +45,32 @@ typedef intmax_t atomic_max_t;
typedef uintmax_t uatomic_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) (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) (abort (), 0)
#define __arch_compare_and_exchange_bool_32_acq(mem, newval, oldval) \ #define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \
({ unsigned int *__mem = (unsigned int *) (mem); \ ({ __typeof (mem) __archmem = (mem); \
unsigned int __old = (unsigned int) (oldval); \ __typeof (*mem) __archold = (oldval); \
unsigned int __cmp = __old; \
__asm __volatile ("cs %0,%2,%1" \ __asm __volatile ("cs %0,%2,%1" \
: "+d" (__old), "=Q" (*__mem) \ : "+d" (__archold), "=Q" (*__archmem) \
: "d" (newval), "m" (*__mem) : "cc" ); \ : "d" (newval), "m" (*__archmem) : "cc" ); \
__cmp != __old; }) __archold; })
#ifdef __s390x__ #ifdef __s390x__
# define __arch_compare_and_exchange_bool_64_acq(mem, newval, oldval) \ # define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \
({ unsigned long int *__mem = (unsigned long int *) (mem); \ ({ __typeof (mem) __archmem = (mem); \
unsigned long int __old = (unsigned long int) (oldval); \ __typeof (*mem) __archold = (oldval); \
unsigned long int __cmp = __old; \
__asm __volatile ("csg %0,%2,%1" \ __asm __volatile ("csg %0,%2,%1" \
: "+d" (__old), "=Q" (*__mem) \ : "+d" (__archold), "=Q" (*__archmem) \
: "d" (newval), "m" (*__mem) : "cc" ); \ : "d" (newval), "m" (*__archmem) : "cc" ); \
__cmp != __old; }) __archold; })
#else #else
/* For 31 bit we do not really need 64-bit compare-and-exchange. We can /* 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 implement them by use of the csd instruction. The straightforward
implementation causes warnings so we skip the definition for now. */ 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) (abort (), 0)
#endif #endif

View File

@ -40,7 +40,8 @@ __sysconf (int name)
{ {
struct timespec ts; struct timespec ts;
INTERNAL_SYSCALL_DECL (err); 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; return INTERNAL_SYSCALL_ERROR_P (r, err) ? 0 : 1;
} }
#endif #endif