summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog30
-rw-r--r--Makefile1
-rw-r--r--bits/atomic.h (renamed from nptl/sysdeps/i386/i586/bits/atomic.h)17
-rw-r--r--elf/dl-profile.c16
-rw-r--r--gmon/mcount.c5
-rw-r--r--include/atomic.h (renamed from nptl/atomic.h)0
-rw-r--r--malloc/set-freeres.c6
-rw-r--r--nptl/ChangeLog10
-rw-r--r--nscd/cache.c6
-rw-r--r--stdlib/cxa_finalize.c7
-rw-r--r--sysdeps/generic/bits/atomic.h (renamed from nptl/sysdeps/i386/i686/bits/atomic.h)17
-rw-r--r--sysdeps/i386/i486/atomicity.h57
-rw-r--r--sysdeps/i386/i486/bits/atomic.h (renamed from nptl/sysdeps/i386/i486/bits/atomic.h)0
-rw-r--r--sysdeps/ia64/atomicity.h48
-rw-r--r--sysdeps/ia64/bits/atomic.h (renamed from nptl/sysdeps/ia64/bits/atomic.h)0
-rw-r--r--sysdeps/powerpc/bits/atomic.h (renamed from nptl/sysdeps/powerpc/bits/atomic.h)0
-rw-r--r--sysdeps/powerpc/powerpc32/atomicity.h98
-rw-r--r--sysdeps/powerpc/powerpc64/atomicity.h132
-rw-r--r--sysdeps/s390/bits/atomic.h (renamed from nptl/sysdeps/s390/bits/atomic.h)0
-rw-r--r--sysdeps/s390/s390-32/atomicity.h76
-rw-r--r--sysdeps/s390/s390-64/atomicity.h76
-rw-r--r--sysdeps/sh/bits/atomic.h (renamed from nptl/sysdeps/sh/bits/atomic.h)0
-rw-r--r--sysdeps/unix/sysv/linux/getsysstats.c7
-rw-r--r--sysdeps/x86_64/atomicity.h57
-rw-r--r--sysdeps/x86_64/bits/atomic.h (renamed from nptl/sysdeps/x86_64/bits/atomic.h)0
25 files changed, 91 insertions, 575 deletions
diff --git a/ChangeLog b/ChangeLog
index 1adf4cb4f5..6c0eb64d3c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,12 +1,38 @@
+2003-03-19  Ulrich Drepper  <drepper@redhat.com>
+
+	* Makefile (distribute): Add include/atomic.h and bits/atomic.h.
+	* include/atomic.h: New file.
+	* sysdeps/i386/i486/bits/atomic.h: New file.
+	* sysdeps/x86_64/bits/atomic.h: New file.
+	* sysdeps/s390/bits/atomic.h: New file.
+	* sysdeps/sh/bits/atomic.h: New file.
+	* sysdeps/ia64/bits/atomic.h: New file.
+	* sysdeps/powerpc/bits/atomic.h: New file.
+	* sysdeps/generic/bits/atomic.h: New file.
+	* sysdeps/i386/i486/atomicity.h: Removed.
+	* sysdeps/x86_64/atomicity.h: Removed.
+	* sysdeps/s390/s390-32/atomicity.h: Removed.
+	* sysdeps/s390/s390-64/atomicity.h: Removed.
+	* sysdeps/ia64/atomicity.h: Removed.
+	* sysdeps/powerpc/powerpc32/atomicity.h: Removed.
+	* sysdeps/powerpc/powerpc64/atomicity.h: Removed.
+	* elf/dl-profile.c: Use atomic.h instead of atomicity.h.  Adjust
+	use of macros from atomicity.h to new names and semantics.
+	* gmon_mcount.c: Likewise.
+	* malloc/set-freeres.c: Likewise.
+	* nscd/cache.c: Likewise.
+	* stdlib/cxa_finalize.c: Likewise.
+	* sysdeps/unix/sysv/linux/getsysstats.c: Likewise.
+
 2003-03-19  Alexandre Oliva  <aoliva@redhat.com>
 
-	* sysdeps/mips/ieee754.h: New file, suitable to replace both 
+	* sysdeps/mips/ieee754.h: New file, suitable to replace both
 	../ieee754/ieee754.h and ../ieee754/ldbl-128/ieee754.h, kept
 	mips-specific for now.
 
 2003-03-19  Ulrich Drepper  <drepper@redhat.com>
 
-	* stdlib/strtod.c (INTERNAL): While eating trailing zeros handling
+	* stdlib/strtod.c (INTERNAL): While eating trailing zeros handle
 	hexdigits correctly.  Reported by Fred Tydeman <tydeman@tybor.com>.
 	* stdlib/tst-strtod.c: Add test for the bug.
 
diff --git a/Makefile b/Makefile
index 3270a8019a..d09792c213 100644
--- a/Makefile
+++ b/Makefile
@@ -274,6 +274,7 @@ distribute  :=	README README.libm INSTALL FAQ FAQ.in NOTES NEWS BUGS	\
 		include/shlib-compat.h include/pthread.h Versions.def	\
 		cppflags-iterator.mk tls.make.c				\
 		include/stubs-prologue.h include/gnu/stubs.h		\
+		include/atomic.h bits/atomic.h				\
 		INTERFACE CONFORMANCE NAMESPACE LICENSES	        \
 		$(addprefix scripts/,					\
 			    rellns-sh config.sub config.guess		\
diff --git a/nptl/sysdeps/i386/i586/bits/atomic.h b/bits/atomic.h
index 9cb58d5f32..7595b407ca 100644
--- a/nptl/sysdeps/i386/i586/bits/atomic.h
+++ b/bits/atomic.h
@@ -1,6 +1,6 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
+   Contributed by Ulrich Drepper <drepper@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
@@ -17,4 +17,15 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include "../../i486/bits/atomic.h"
+#ifndef _BITS_ATOMIC_H
+#define _BITS_ATOMIC_H	1
+
+/* We have by default no support for atomic operations.  So define
+   them non-atomic.  If this is a problem somebody will have to come
+   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); })
+
+#endif	/* bits/atomic.h */
diff --git a/elf/dl-profile.c b/elf/dl-profile.c
index 3a18881d26..be706cefbf 100644
--- a/elf/dl-profile.c
+++ b/elf/dl-profile.c
@@ -1,5 +1,5 @@
 /* Profiling of shared libraries.
-   Copyright (C) 1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc.
+   Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
    Based on the BSD mcount implementation.
@@ -34,7 +34,7 @@
 #include <sys/mman.h>
 #include <sys/param.h>
 #include <sys/stat.h>
-#include <atomicity.h>
+#include <atomic.h>
 
 /* The LD_PROFILE feature has to be implemented different to the
    normal profiling using the gmon/ functions.  The problem is that an
@@ -516,24 +516,24 @@ _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc)
 	      size_t newfromidx;
 	      to_index = (data[narcs].self_pc
 			  / (hashfraction * sizeof (*tos)));
-	      newfromidx = exchange_and_add (&fromidx, 1) + 1;
+	      newfromidx = atomic_exchange_and_add (&fromidx, 1) + 1;
 	      froms[newfromidx].here = &data[narcs];
 	      froms[newfromidx].link = tos[to_index];
 	      tos[to_index] = newfromidx;
-	      atomic_add (&narcs, 1);
+	      atomic_increment (&narcs);
 	    }
 
 	  /* If we still have no entry stop searching and insert.  */
 	  if (*topcindex == 0)
 	    {
-	      uint_fast32_t newarc = exchange_and_add (narcsp, 1);
+	      uint_fast32_t newarc = atomic_exchange_and_add (narcsp, 1);
 
 	      /* In rare cases it could happen that all entries in FROMS are
 		 occupied.  So we cannot count this anymore.  */
 	      if (newarc >= fromlimit)
 		goto done;
 
-	      *topcindex = exchange_and_add (&fromidx, 1) + 1;
+	      *topcindex = atomic_exchange_and_add (&fromidx, 1) + 1;
 	      fromp = &froms[*topcindex];
 
 	      fromp->here = &data[newarc];
@@ -541,7 +541,7 @@ _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc)
 	      data[newarc].self_pc = selfpc;
 	      data[newarc].count = 0;
 	      fromp->link = 0;
-	      atomic_add (&narcs, 1);
+	      atomic_increment (&narcs);
 
 	      break;
 	    }
@@ -554,7 +554,7 @@ _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc)
     }
 
   /* Increment the counter.  */
-  atomic_add (&fromp->here->count, 1);
+  atomic_increment (&fromp->here->count);
 
  done:
   ;
diff --git a/gmon/mcount.c b/gmon/mcount.c
index 8e54812d75..c14665073d 100644
--- a/gmon/mcount.c
+++ b/gmon/mcount.c
@@ -39,7 +39,7 @@ static char sccsid[] = "@(#)mcount.c	8.1 (Berkeley) 6/4/93";
    and MCOUNT macros.  */
 #include "machine-gmon.h"
 
-#include <atomicity.h>
+#include <atomic.h>
 
 /*
  * mcount is called on entry to each function compiled with the profiling
@@ -69,7 +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 (! compare_and_swap (&p->state, GMON_PROF_ON, GMON_PROF_BUSY))
+	if (atomic_compare_and_exchange_acq (&p->state, GMON_PROF_BUSY,
+					     GMON_PROF_ON))
 	  return;
 
 	/*
diff --git a/nptl/atomic.h b/include/atomic.h
index 813fb80a03..813fb80a03 100644
--- a/nptl/atomic.h
+++ b/include/atomic.h
diff --git a/malloc/set-freeres.c b/malloc/set-freeres.c
index 67488a8214..1c0733ec19 100644
--- a/malloc/set-freeres.c
+++ b/malloc/set-freeres.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1997,1999,2000,2001,2002,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
@@ -16,7 +16,7 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <atomicity.h>
+#include <atomic.h>
 #include <stdlib.h>
 #include <set-hooks.h>
 #include <libc-internal.h>
@@ -36,7 +36,7 @@ __libc_freeres (void)
      protect for multiple executions since these are fatal.  */
   static long int already_called;
 
-  if (compare_and_swap (&already_called, 0, 1))
+  if (! atomic_compare_and_exchange_acq (&already_called, 1, 0))
     {
       void * const *p;
 
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 0ff78787a6..ccdc2dacb0 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,5 +1,15 @@
 2003-03-19  Ulrich Drepper  <drepper@redhat.com>
 
+	* sysdeps/i386/i686/bits/atomic.h: Removed.
+	* sysdeps/i386/i586/bits/atomic.h: Removed.
+	* sysdeps/i386/i486/bits/atomic.h: Removed.  Moved to glibc.
+	* sysdeps/x86_64/bits/atomic.h: Removed.  Moved to glibc.
+	* sysdeps/s390/bits/atomic.h: Removed.  Moved to glibc.
+	* sysdeps/sh/bits/atomic.h: Removed.  Moved to glibc.
+	* sysdeps/ia64/bits/atomic.h: Removed.  Moved to glibc.
+	* sysdeps/powerpc/bits/atomic.h: Removed.  Moved to glibc.
+	* atomic.h: Removed.  Moved to glibc.
+
 	* sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Add
 	support for clock selection.
 
diff --git a/nscd/cache.c b/nscd/cache.c
index d8339e915d..788d47bbd9 100644
--- a/nscd/cache.c
+++ b/nscd/cache.c
@@ -17,7 +17,7 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <atomicity.h>
+#include <atomic.h>
 #include <errno.h>
 #include <error.h>
 #include <limits.h>
@@ -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 (! compare_and_swap ((volatile long int *) &table->array[hash],
-			     (long int) newp->next, (long int) newp));
+  while (atomic_compare_and_exchange_acq (&table->array[hash], newp,
+					  newp->next));
 
   /* Update the statistics.  */
   if (data == (void *) -1)
diff --git a/stdlib/cxa_finalize.c b/stdlib/cxa_finalize.c
index 16f50286e1..19d65678c9 100644
--- a/stdlib/cxa_finalize.c
+++ b/stdlib/cxa_finalize.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2001, 2002, 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
@@ -18,7 +18,7 @@
 
 #include <assert.h>
 #include <stdlib.h>
-#include <atomicity.h>
+#include <atomic.h>
 #include "exit.h"
 #include <fork.h>
 
@@ -36,7 +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.  */
-	    && compare_and_swap (&f->flavor, ef_cxa, ef_free))
+	    && (atomic_compare_and_exchange_acq (&f->flavor, ef_free, ef_cxa)
+		== 0))
 	  (*f->func.cxa.fn) (f->func.cxa.arg, 0);
     }
 
diff --git a/nptl/sysdeps/i386/i686/bits/atomic.h b/sysdeps/generic/bits/atomic.h
index 9cb58d5f32..7595b407ca 100644
--- a/nptl/sysdeps/i386/i686/bits/atomic.h
+++ b/sysdeps/generic/bits/atomic.h
@@ -1,6 +1,6 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
+   Contributed by Ulrich Drepper <drepper@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
@@ -17,4 +17,15 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include "../../i486/bits/atomic.h"
+#ifndef _BITS_ATOMIC_H
+#define _BITS_ATOMIC_H	1
+
+/* We have by default no support for atomic operations.  So define
+   them non-atomic.  If this is a problem somebody will have to come
+   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); })
+
+#endif	/* bits/atomic.h */
diff --git a/sysdeps/i386/i486/atomicity.h b/sysdeps/i386/i486/atomicity.h
deleted file mode 100644
index df2fb81847..0000000000
--- a/sysdeps/i386/i486/atomicity.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Low-level functions for atomic operations.  ix86 version, x >= 4.
-   Copyright (C) 1997, 2000, 2001 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
-   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.  */
-
-#ifndef _ATOMICITY_H
-#define _ATOMICITY_H	1
-
-#include <inttypes.h>
-
-
-static inline uint32_t
-__attribute__ ((unused))
-exchange_and_add (volatile uint32_t *mem, uint32_t val)
-{
-  register uint32_t result;
-  __asm__ __volatile__ ("lock; xaddl %0,%1"
-			: "=r" (result), "=m" (*mem) : "0" (val), "1" (*mem));
-  return result;
-}
-
-static inline void
-__attribute__ ((unused))
-atomic_add (volatile uint32_t *mem, int val)
-{
-  __asm__ __volatile__ ("lock; addl %1,%0"
-			: "=m" (*mem) : "ir" (val), "0" (*mem));
-}
-
-static inline char
-__attribute__ ((unused))
-compare_and_swap (volatile long int *p, long int oldval, long int newval)
-{
-  char ret;
-  long int readval;
-
-  __asm__ __volatile__ ("lock; cmpxchgl %3, %1; sete %0"
-                        : "=q" (ret), "=m" (*p), "=a" (readval)
-                        : "r" (newval), "1" (*p), "a" (oldval));
-  return ret;
-}
-
-#endif /* atomicity.h */
diff --git a/nptl/sysdeps/i386/i486/bits/atomic.h b/sysdeps/i386/i486/bits/atomic.h
index 80a49872e1..80a49872e1 100644
--- a/nptl/sysdeps/i386/i486/bits/atomic.h
+++ b/sysdeps/i386/i486/bits/atomic.h
diff --git a/sysdeps/ia64/atomicity.h b/sysdeps/ia64/atomicity.h
deleted file mode 100644
index 615befd580..0000000000
--- a/sysdeps/ia64/atomicity.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Low-level functions for atomic operations.  IA-64 version.
-   Copyright (C) 2001 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
-   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.  */
-
-#ifndef _ATOMICITY_H
-#define _ATOMICITY_H	1
-
-#include <inttypes.h>
-#include <ia64intrin.h>
-
-
-static inline uint32_t
-__attribute__ ((unused))
-exchange_and_add (volatile uint32_t *mem, uint32_t val)
-{
-  return __sync_fetch_and_add (mem, val);
-}
-
-static inline void
-__attribute__ ((unused))
-atomic_add (volatile uint32_t *mem, int val)
-{
-  __sync_fetch_and_add (mem, val);
-}
-
-static inline int
-__attribute__ ((unused))
-compare_and_swap (volatile long int *p, long int oldval, long int newval)
-{
-  return __sync_bool_compare_and_swap (p, oldval, newval);
-}
-
-#endif /* atomicity.h */
diff --git a/nptl/sysdeps/ia64/bits/atomic.h b/sysdeps/ia64/bits/atomic.h
index fab23076cd..fab23076cd 100644
--- a/nptl/sysdeps/ia64/bits/atomic.h
+++ b/sysdeps/ia64/bits/atomic.h
diff --git a/nptl/sysdeps/powerpc/bits/atomic.h b/sysdeps/powerpc/bits/atomic.h
index af6156389f..af6156389f 100644
--- a/nptl/sysdeps/powerpc/bits/atomic.h
+++ b/sysdeps/powerpc/bits/atomic.h
diff --git a/sysdeps/powerpc/powerpc32/atomicity.h b/sysdeps/powerpc/powerpc32/atomicity.h
deleted file mode 100644
index 253bd32673..0000000000
--- a/sysdeps/powerpc/powerpc32/atomicity.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/* Low-level functions for atomic operations.  PowerPC version.
-   Copyright (C) 1997, 1998, 1999, 2000 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
-   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.  */
-
-#ifndef _ATOMICITY_H
-#define _ATOMICITY_H	1
-
-#include <inttypes.h>
-
-static inline int
-__attribute__ ((unused))
-exchange_and_add (volatile uint32_t *mem, int val)
-{
-  int tmp, result;
-  __asm__ ("\n\
-0:	lwarx	%0,0,%2	\n\
-	add%I3	%1,%0,%3	\n\
-	stwcx.	%1,0,%2	\n\
-	bne-	0b	\n\
-" : "=&b"(result), "=&r"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
-  return result;
-}
-
-static inline void
-__attribute__ ((unused))
-atomic_add (volatile uint32_t *mem, int val)
-{
-  int tmp;
-  __asm__ ("\n\
-0:	lwarx	%0,0,%1	\n\
-	add%I2	%0,%0,%2	\n\
-	stwcx.	%0,0,%1	\n\
-	bne-	0b	\n\
-" : "=&b"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
-}
-
-static inline int
-__attribute__ ((unused))
-compare_and_swap (volatile long int *p, long int oldval, long int newval)
-{
-  int result;
-  __asm__ ("\n\
-0:	lwarx	%0,0,%1	\n\
-	sub%I2c.	%0,%0,%2	\n\
-	cntlzw	%0,%0	\n\
-	bne-	1f	\n\
-	stwcx.	%3,0,%1	\n\
-	bne-	0b	\n\
-1:	\n\
-" : "=&b"(result) : "r"(p), "Ir"(oldval), "r"(newval) : "cr0", "memory");
-  return result >> 5;
-}
-
-static inline long int
-__attribute__ ((unused))
-always_swap (volatile long int *p, long int newval)
-{
-  long int result;
-  __asm__ ("\n\
-0:	lwarx	%0,0,%1	\n\
-	stwcx.	%2,0,%1	\n\
-	bne-	0b	\n\
-" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory");
-  return result;
-}
-
-static inline int
-__attribute__ ((unused))
-test_and_set (volatile long int *p, long int newval)
-{
-  int result;
-  __asm__ ("\n\
-0:	lwarx	%0,0,%1	\n\
-	cmpwi	%0,0	\n\
-	bne-	1f	\n\
-	stwcx.	%2,0,%1	\n\
-	bne-	0b	\n\
-1:	\n\
-" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory");
-  return result;
-}
-
-#endif /* atomicity.h */
diff --git a/sysdeps/powerpc/powerpc64/atomicity.h b/sysdeps/powerpc/powerpc64/atomicity.h
deleted file mode 100644
index b9d0de0ac5..0000000000
--- a/sysdeps/powerpc/powerpc64/atomicity.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/* Low-level functions for atomic operations.  PowerPC64 version.
-   Copyright (C) 1997, 1998, 1999, 2000, 2002 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
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 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
-   Library General Public License for more details.
-
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
-
-#ifndef _ATOMICITY_H
-#define _ATOMICITY_H	1
-
-#include <inttypes.h>
-
-#if BROKEN_PPC_ASM_CR0
-# define __ATOMICITY_INLINE /* nothing */
-#else
-# define __ATOMICITY_INLINE inline
-#endif
-
-static __ATOMICITY_INLINE int
-__attribute__ ((unused))
-exchange_and_add (volatile uint32_t *mem, int val)
-{
-  int tmp, result;
-  __asm__ ("\n\
-0:	lwarx	%0,0,%2	\n\
-	add%I3	%1,%0,%3	\n\
-	stwcx.	%1,0,%2	\n\
-	bne-	0b	\n\
-" : "=&b"(result), "=&r"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
-  return result;
-}
-
-static __ATOMICITY_INLINE void
-__attribute__ ((unused))
-atomic_add_long (volatile long *mem, int val)
-{
-  int tmp;
-  __asm__ ("\n\
-0:	ldarx	%0,0,%1	\n\
-	add%I2	%0,%0,%2	\n\
-	stdcx.	%0,0,%1	\n\
-	bne-	0b	\n\
-" : "=&b"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
-}
-
-
-static __ATOMICITY_INLINE int
-__attribute__ ((unused))
-exchange_and_add_long (volatile long *mem, int val)
-{
-  int tmp, result;
-  __asm__ ("\n\
-0:	ldarx	%0,0,%2	\n\
-	add%I3	%1,%0,%3	\n\
-	stdcx.	%1,0,%2	\n\
-	bne-	0b	\n\
-" : "=&b"(result), "=&r"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
-  return result;
-}
-
-static __ATOMICITY_INLINE void
-__attribute__ ((unused))
-atomic_add (volatile uint32_t *mem, int val)
-{
-  int tmp;
-  __asm__ ("\n\
-0:	lwarx	%0,0,%1	\n\
-	add%I2	%0,%0,%2	\n\
-	stwcx.	%0,0,%1	\n\
-	bne-	0b	\n\
-" : "=&b"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
-}
-
-static __ATOMICITY_INLINE int
-__attribute__ ((unused))
-compare_and_swap (volatile long int *p, long int oldval, long int newval)
-{
-  int result;
-  __asm__ ("\n\
-0:	ldarx	%0,0,%1	\n\
-	sub%I2c.	%0,%0,%2	\n\
-	cntlzw	%0,%0	\n\
-	bne-	1f	\n\
-	stdcx.	%3,0,%1	\n\
-	bne-	0b	\n\
-1:	\n\
-" : "=&b"(result) : "r"(p), "Ir"(oldval), "r"(newval) : "cr0", "memory");
-  return result >> 5;
-}
-
-static __ATOMICITY_INLINE long int
-__attribute__ ((unused))
-always_swap (volatile long int *p, long int newval)
-{
-  long int result;
-  __asm__ ("\n\
-0:	ldarx	%0,0,%1	\n\
-	stdcx.	%2,0,%1	\n\
-	bne-	0b	\n\
-" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory");
-  return result;
-}
-
-static __ATOMICITY_INLINE int
-__attribute__ ((unused))
-test_and_set (volatile long int *p, long int newval)
-{
-  int result;
-  __asm__ ("\n\
-0:	ldarx	%0,0,%1	\n\
-	cmpdi	%0,0	\n\
-	bne-	1f	\n\
-	stdcx.	%2,0,%1	\n\
-	bne-	0b	\n\
-1:	\n\
-" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory");
-  return result;
-}
-
-#endif /* atomicity.h */
diff --git a/nptl/sysdeps/s390/bits/atomic.h b/sysdeps/s390/bits/atomic.h
index 375ae0d5e7..375ae0d5e7 100644
--- a/nptl/sysdeps/s390/bits/atomic.h
+++ b/sysdeps/s390/bits/atomic.h
diff --git a/sysdeps/s390/s390-32/atomicity.h b/sysdeps/s390/s390-32/atomicity.h
deleted file mode 100644
index 32a7c0f06b..0000000000
--- a/sysdeps/s390/s390-32/atomicity.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* Low-level functions for atomic operations.  S390 version.
-   Copyright (C) 2000, 2001 Free Software Foundation, Inc.
-   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
-   This file is part of the GNU C Library.
-
-   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.  */
-
-#ifndef _ATOMICITY_H
-#define _ATOMICITY_H	1
-
-#include <inttypes.h>
-
-static inline int
-__attribute__ ((unused))
-exchange_and_add (volatile uint32_t *mem, int val)
-{
-  int result;
-  __asm__ __volatile__(
-        "       L     %0,%2\n"
-        "       LA    2,%1\n"
-        "0:     LR    0,%0\n"
-        "       AR    0,%3\n"
-        "       CS    %0,0,0(2)\n"
-        "       JL    0b"
-        : "=&d" (result), "=m" (*mem)
-        : "1" (*mem), "d" (val) : "0", "1", "2" );
-  return result;
-}
-
-static inline void
-__attribute__ ((unused))
-atomic_add (volatile uint32_t *mem, int val)
-{
-  __asm__ __volatile__(
-        "       LA    2,%0\n"
-	"0:     L     0,%1\n"
-        "       LR    1,0\n"
-        "       AR    1,%2\n"
-        "       CS    0,1,0(2)\n"
-        "       JL    0b"
-        : "=m" (*mem) : "0" (*mem), "d" (val) : "0", "1", "2" );
-}
-
-static inline int
-__attribute__ ((unused))
-compare_and_swap (volatile long int *p, long int oldval, long int newval)
-{
-  int retval;
-
-  __asm__ __volatile__(
-        "  la   1,%1\n"
-        "  lr   0,%2\n"
-        "  cs   0,%3,0(1)\n"
-        "  ipm  %0\n"
-        "  srl  %0,28\n"
-        "0:"
-        : "=&r" (retval), "+m" (*p)
-        : "d" (oldval) , "d" (newval)
-        : "memory", "0", "1", "cc");
-  return !retval;
-}
-
-#endif /* atomicity.h */
diff --git a/sysdeps/s390/s390-64/atomicity.h b/sysdeps/s390/s390-64/atomicity.h
deleted file mode 100644
index 11a5f7fa53..0000000000
--- a/sysdeps/s390/s390-64/atomicity.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* Low-level functions for atomic operations.  64 bit S/390 version.
-   Copyright (C) 2001 Free Software Foundation, Inc.
-   Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
-   This file is part of the GNU C Library.
-
-   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.  */
-
-#ifndef _ATOMICITY_H
-#define _ATOMICITY_H	1
-
-#include <inttypes.h>
-
-static inline int
-__attribute__ ((unused))
-exchange_and_add (volatile uint32_t *mem, int val)
-{
-  int result;
-  __asm__ __volatile__(
-        "       L     %0,%2\n"
-        "       LA    2,%1\n"
-        "0:     LR    0,%0\n"
-        "       AR    0,%3\n"
-        "       CS    %0,0,0(2)\n"
-        "       JL    0b"
-        : "=&d" (result), "=m" (*mem)
-        : "1" (*mem), "d" (val) : "0", "1", "2" );
-  return result;
-}
-
-static inline void
-__attribute__ ((unused))
-atomic_add (volatile uint32_t *mem, int val)
-{
-  __asm__ __volatile__(
-        "       LA    2,%0\n"
-	"0:     L     0,%1\n"
-        "       LR    1,0\n"
-        "       AR    1,%2\n"
-        "       CS    0,1,0(2)\n"
-        "       JL    0b"
-        : "=m" (*mem) : "0" (*mem), "d" (val) : "0", "1", "2" );
-}
-
-static inline int
-__attribute__ ((unused))
-compare_and_swap (volatile long int *p, long int oldval, long int newval)
-{
-  int retval;
-
-  __asm__ __volatile__(
-        "  la   1,%1\n"
-        "  lgr  0,%2\n"
-        "  csg  0,%3,0(1)\n"
-        "  ipm  %0\n"
-        "  srl  %0,28\n"
-        "0:"
-        : "=&r" (retval), "+m" (*p)
-        : "d" (oldval) , "d" (newval)
-        : "memory", "0", "1", "cc");
-  return !retval;
-}
-
-#endif /* atomicity.h */
diff --git a/nptl/sysdeps/sh/bits/atomic.h b/sysdeps/sh/bits/atomic.h
index de176ca2c5..de176ca2c5 100644
--- a/nptl/sysdeps/sh/bits/atomic.h
+++ b/sysdeps/sh/bits/atomic.h
diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c
index 55ef5b661a..c44e45ca6b 100644
--- a/sysdeps/unix/sysv/linux/getsysstats.c
+++ b/sysdeps/unix/sysv/linux/getsysstats.c
@@ -1,5 +1,5 @@
 /* Determine various system internal values, Linux version.
-   Copyright (C) 1996-2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1996-2001, 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -31,7 +31,7 @@
 #include <unistd.h>
 #include <sys/sysinfo.h>
 
-#include <atomicity.h>
+#include <atomic.h>
 
 
 /* The default value for the /proc filesystem mount point.  */
@@ -85,8 +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 (compare_and_swap ((long int *) &mount_proc, (long int) 0,
-			(long int) copy_result) == 0)
+  if (atomic_compare_and_exchange_acq (&mount_proc, copy_result, NULL) == 0)
     /* Replacing the value failed.  This means another thread was
        faster and we don't need the copy anymore.  */
     free (copy_result);
diff --git a/sysdeps/x86_64/atomicity.h b/sysdeps/x86_64/atomicity.h
deleted file mode 100644
index 925c9f9da5..0000000000
--- a/sysdeps/x86_64/atomicity.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Low-level functions for atomic operations.  x86-64 version.
-   Copyright (C) 1997, 2000, 2001 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
-   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.  */
-
-#ifndef _ATOMICITY_H
-#define _ATOMICITY_H	1
-
-#include <inttypes.h>
-
-
-static inline uint32_t
-__attribute__ ((unused))
-exchange_and_add (volatile uint32_t *mem, uint32_t val)
-{
-  register uint32_t result;
-  __asm__ __volatile__ ("lock; xaddl %0,%1"
-			: "=r" (result), "=m" (*mem) : "0" (val), "1" (*mem));
-  return result;
-}
-
-static inline void
-__attribute__ ((unused))
-atomic_add (volatile uint32_t *mem, int val)
-{
-  __asm__ __volatile__ ("lock; addl %1,%0"
-			: "=m" (*mem) : "er" (val), "0" (*mem));
-}
-
-static inline char
-__attribute__ ((unused))
-compare_and_swap (volatile long int *p, long int oldval, long int newval)
-{
-  char ret;
-  long int readval;
-
-  __asm__ __volatile__ ("lock; cmpxchgq %3, %1; sete %0"
-                        : "=q" (ret), "=m" (*p), "=a" (readval)
-                        : "r" (newval), "1" (*p), "a" (oldval));
-  return ret;
-}
-
-#endif /* atomicity.h */
diff --git a/nptl/sysdeps/x86_64/bits/atomic.h b/sysdeps/x86_64/bits/atomic.h
index f72f16c501..f72f16c501 100644
--- a/nptl/sysdeps/x86_64/bits/atomic.h
+++ b/sysdeps/x86_64/bits/atomic.h