From 4009bf404450e4ad7b72140d7bae3226fad3468c Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 20 Mar 2003 07:19:17 +0000 Subject: [PATCH] Update. 2003-03-19 Ulrich Drepper * 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. * sysdeps/mips/ieee754.h: New file, suitable to replace both * stdlib/strtod.c (INTERNAL): While eating trailing zeros handle --- ChangeLog | 30 +++- Makefile | 1 + .../sysdeps/i386/i586/bits => bits}/atomic.h | 17 ++- elf/dl-profile.c | 16 +-- gmon/mcount.c | 5 +- {nptl => include}/atomic.h | 0 malloc/set-freeres.c | 6 +- nptl/ChangeLog | 10 ++ nscd/cache.c | 6 +- stdlib/cxa_finalize.c | 7 +- .../i686 => sysdeps/generic}/bits/atomic.h | 17 ++- sysdeps/i386/i486/atomicity.h | 57 -------- .../i386/i486/bits/atomic.h | 0 sysdeps/ia64/atomicity.h | 48 ------- {nptl/sysdeps => sysdeps}/ia64/bits/atomic.h | 0 .../sysdeps => sysdeps}/powerpc/bits/atomic.h | 0 sysdeps/powerpc/powerpc32/atomicity.h | 98 ------------- sysdeps/powerpc/powerpc64/atomicity.h | 132 ------------------ {nptl/sysdeps => sysdeps}/s390/bits/atomic.h | 0 sysdeps/s390/s390-32/atomicity.h | 76 ---------- sysdeps/s390/s390-64/atomicity.h | 76 ---------- {nptl/sysdeps => sysdeps}/sh/bits/atomic.h | 0 sysdeps/unix/sysv/linux/getsysstats.c | 7 +- sysdeps/x86_64/atomicity.h | 57 -------- .../sysdeps => sysdeps}/x86_64/bits/atomic.h | 0 25 files changed, 91 insertions(+), 575 deletions(-) rename {nptl/sysdeps/i386/i586/bits => bits}/atomic.h (59%) rename {nptl => include}/atomic.h (100%) rename {nptl/sysdeps/i386/i686 => sysdeps/generic}/bits/atomic.h (59%) delete mode 100644 sysdeps/i386/i486/atomicity.h rename {nptl/sysdeps => sysdeps}/i386/i486/bits/atomic.h (100%) delete mode 100644 sysdeps/ia64/atomicity.h rename {nptl/sysdeps => sysdeps}/ia64/bits/atomic.h (100%) rename {nptl/sysdeps => sysdeps}/powerpc/bits/atomic.h (100%) delete mode 100644 sysdeps/powerpc/powerpc32/atomicity.h delete mode 100644 sysdeps/powerpc/powerpc64/atomicity.h rename {nptl/sysdeps => sysdeps}/s390/bits/atomic.h (100%) delete mode 100644 sysdeps/s390/s390-32/atomicity.h delete mode 100644 sysdeps/s390/s390-64/atomicity.h rename {nptl/sysdeps => sysdeps}/sh/bits/atomic.h (100%) delete mode 100644 sysdeps/x86_64/atomicity.h rename {nptl/sysdeps => sysdeps}/x86_64/bits/atomic.h (100%) diff --git a/ChangeLog b/ChangeLog index 1adf4cb4f5..6c0eb64d3c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,12 +1,38 @@ +2003-03-19 Ulrich Drepper + + * 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 - * 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 - * stdlib/strtod.c (INTERNAL): While eating trailing zeros handling + * stdlib/strtod.c (INTERNAL): While eating trailing zeros handle hexdigits correctly. Reported by Fred Tydeman . * 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 similarity index 59% rename from nptl/sysdeps/i386/i586/bits/atomic.h rename to 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 , 2002. + Contributed by Ulrich Drepper , 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 , 1997. Based on the BSD mcount implementation. @@ -34,7 +34,7 @@ #include #include #include -#include +#include /* 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 +#include /* * 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 similarity index 100% rename from nptl/atomic.h rename to 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 +#include #include #include #include @@ -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 + * 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 +#include #include #include #include @@ -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 #include -#include +#include #include "exit.h" #include @@ -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 similarity index 59% rename from nptl/sysdeps/i386/i686/bits/atomic.h rename to 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 , 2002. + Contributed by Ulrich Drepper , 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 - - -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 similarity index 100% rename from nptl/sysdeps/i386/i486/bits/atomic.h rename to 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 -#include - - -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 similarity index 100% rename from nptl/sysdeps/ia64/bits/atomic.h rename to sysdeps/ia64/bits/atomic.h diff --git a/nptl/sysdeps/powerpc/bits/atomic.h b/sysdeps/powerpc/bits/atomic.h similarity index 100% rename from nptl/sysdeps/powerpc/bits/atomic.h rename to 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 - -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 - -#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 similarity index 100% rename from nptl/sysdeps/s390/bits/atomic.h rename to 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 - -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 - -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 similarity index 100% rename from nptl/sysdeps/sh/bits/atomic.h rename to 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 , 1996. @@ -31,7 +31,7 @@ #include #include -#include +#include /* 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 - - -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 similarity index 100% rename from nptl/sysdeps/x86_64/bits/atomic.h rename to sysdeps/x86_64/bits/atomic.h