Update.
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. * sysdeps/mips/ieee754.h: New file, suitable to replace both * stdlib/strtod.c (INTERNAL): While eating trailing zeros handle
This commit is contained in:
parent
85b5767c57
commit
4009bf4044
28
ChangeLog
28
ChangeLog
@ -1,3 +1,29 @@
|
|||||||
|
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>
|
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
|
||||||
@ -6,7 +32,7 @@
|
|||||||
|
|
||||||
2003-03-19 Ulrich Drepper <drepper@redhat.com>
|
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>.
|
hexdigits correctly. Reported by Fred Tydeman <tydeman@tybor.com>.
|
||||||
* stdlib/tst-strtod.c: Add test for the bug.
|
* stdlib/tst-strtod.c: Add test for the bug.
|
||||||
|
|
||||||
|
1
Makefile
1
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 \
|
include/shlib-compat.h include/pthread.h Versions.def \
|
||||||
cppflags-iterator.mk tls.make.c \
|
cppflags-iterator.mk tls.make.c \
|
||||||
include/stubs-prologue.h include/gnu/stubs.h \
|
include/stubs-prologue.h include/gnu/stubs.h \
|
||||||
|
include/atomic.h bits/atomic.h \
|
||||||
INTERFACE CONFORMANCE NAMESPACE LICENSES \
|
INTERFACE CONFORMANCE NAMESPACE LICENSES \
|
||||||
$(addprefix scripts/, \
|
$(addprefix scripts/, \
|
||||||
rellns-sh config.sub config.guess \
|
rellns-sh config.sub config.guess \
|
||||||
|
@ -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.
|
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
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Lesser General Public
|
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
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
02111-1307 USA. */
|
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 */
|
@ -1,5 +1,5 @@
|
|||||||
/* Profiling of shared libraries.
|
/* 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.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||||
Based on the BSD mcount implementation.
|
Based on the BSD mcount implementation.
|
||||||
@ -34,7 +34,7 @@
|
|||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <atomicity.h>
|
#include <atomic.h>
|
||||||
|
|
||||||
/* The LD_PROFILE feature has to be implemented different to the
|
/* The LD_PROFILE feature has to be implemented different to the
|
||||||
normal profiling using the gmon/ functions. The problem is that an
|
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;
|
size_t newfromidx;
|
||||||
to_index = (data[narcs].self_pc
|
to_index = (data[narcs].self_pc
|
||||||
/ (hashfraction * sizeof (*tos)));
|
/ (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].here = &data[narcs];
|
||||||
froms[newfromidx].link = tos[to_index];
|
froms[newfromidx].link = tos[to_index];
|
||||||
tos[to_index] = newfromidx;
|
tos[to_index] = newfromidx;
|
||||||
atomic_add (&narcs, 1);
|
atomic_increment (&narcs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we still have no entry stop searching and insert. */
|
/* If we still have no entry stop searching and insert. */
|
||||||
if (*topcindex == 0)
|
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
|
/* In rare cases it could happen that all entries in FROMS are
|
||||||
occupied. So we cannot count this anymore. */
|
occupied. So we cannot count this anymore. */
|
||||||
if (newarc >= fromlimit)
|
if (newarc >= fromlimit)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
*topcindex = exchange_and_add (&fromidx, 1) + 1;
|
*topcindex = atomic_exchange_and_add (&fromidx, 1) + 1;
|
||||||
fromp = &froms[*topcindex];
|
fromp = &froms[*topcindex];
|
||||||
|
|
||||||
fromp->here = &data[newarc];
|
fromp->here = &data[newarc];
|
||||||
@ -541,7 +541,7 @@ _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc)
|
|||||||
data[newarc].self_pc = selfpc;
|
data[newarc].self_pc = selfpc;
|
||||||
data[newarc].count = 0;
|
data[newarc].count = 0;
|
||||||
fromp->link = 0;
|
fromp->link = 0;
|
||||||
atomic_add (&narcs, 1);
|
atomic_increment (&narcs);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -554,7 +554,7 @@ _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Increment the counter. */
|
/* Increment the counter. */
|
||||||
atomic_add (&fromp->here->count, 1);
|
atomic_increment (&fromp->here->count);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
;
|
;
|
||||||
|
@ -39,7 +39,7 @@ static char sccsid[] = "@(#)mcount.c 8.1 (Berkeley) 6/4/93";
|
|||||||
and MCOUNT macros. */
|
and MCOUNT macros. */
|
||||||
#include "machine-gmon.h"
|
#include "machine-gmon.h"
|
||||||
|
|
||||||
#include <atomicity.h>
|
#include <atomic.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mcount is called on entry to each function compiled with the profiling
|
* 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
|
* check that we are profiling
|
||||||
* and that we aren't recursively invoked.
|
* 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;
|
return;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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.
|
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
|
||||||
@ -16,7 +16,7 @@
|
|||||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
02111-1307 USA. */
|
02111-1307 USA. */
|
||||||
|
|
||||||
#include <atomicity.h>
|
#include <atomic.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <set-hooks.h>
|
#include <set-hooks.h>
|
||||||
#include <libc-internal.h>
|
#include <libc-internal.h>
|
||||||
@ -36,7 +36,7 @@ __libc_freeres (void)
|
|||||||
protect for multiple executions since these are fatal. */
|
protect for multiple executions since these are fatal. */
|
||||||
static long int already_called;
|
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;
|
void * const *p;
|
||||||
|
|
||||||
|
@ -1,5 +1,15 @@
|
|||||||
2003-03-19 Ulrich Drepper <drepper@redhat.com>
|
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
|
* sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Add
|
||||||
support for clock selection.
|
support for clock selection.
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
02111-1307 USA. */
|
02111-1307 USA. */
|
||||||
|
|
||||||
#include <atomicity.h>
|
#include <atomic.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <error.h>
|
#include <error.h>
|
||||||
#include <limits.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. */
|
/* Put the new entry in the first position. */
|
||||||
do
|
do
|
||||||
newp->next = table->array[hash];
|
newp->next = table->array[hash];
|
||||||
while (! compare_and_swap ((volatile long int *) &table->array[hash],
|
while (atomic_compare_and_exchange_acq (&table->array[hash], newp,
|
||||||
(long int) newp->next, (long int) newp));
|
newp->next));
|
||||||
|
|
||||||
/* Update the statistics. */
|
/* Update the statistics. */
|
||||||
if (data == (void *) -1)
|
if (data == (void *) -1)
|
||||||
|
@ -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.
|
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
|
||||||
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <atomicity.h>
|
#include <atomic.h>
|
||||||
#include "exit.h"
|
#include "exit.h"
|
||||||
#include <fork.h>
|
#include <fork.h>
|
||||||
|
|
||||||
@ -36,7 +36,8 @@ __cxa_finalize (void *d)
|
|||||||
for (f = &funcs->fns[funcs->idx - 1]; f >= &funcs->fns[0]; --f)
|
for (f = &funcs->fns[funcs->idx - 1]; f >= &funcs->fns[0]; --f)
|
||||||
if ((d == NULL || d == f->func.cxa.dso_handle)
|
if ((d == NULL || d == f->func.cxa.dso_handle)
|
||||||
/* We don't want to run this cleanup more than once. */
|
/* 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);
|
(*f->func.cxa.fn) (f->func.cxa.arg, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.
|
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
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Lesser General Public
|
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
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
02111-1307 USA. */
|
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 */
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -1,5 +1,5 @@
|
|||||||
/* Determine various system internal values, Linux version.
|
/* 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.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||||
|
|
||||||
@ -31,7 +31,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/sysinfo.h>
|
#include <sys/sysinfo.h>
|
||||||
|
|
||||||
#include <atomicity.h>
|
#include <atomic.h>
|
||||||
|
|
||||||
|
|
||||||
/* The default value for the /proc filesystem mount point. */
|
/* 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. */
|
/* Now store the copied value. But do it atomically. */
|
||||||
assert (sizeof (long int) == sizeof (void *__unbounded));
|
assert (sizeof (long int) == sizeof (void *__unbounded));
|
||||||
if (compare_and_swap ((long int *) &mount_proc, (long int) 0,
|
if (atomic_compare_and_exchange_acq (&mount_proc, copy_result, NULL) == 0)
|
||||||
(long int) copy_result) == 0)
|
|
||||||
/* Replacing the value failed. This means another thread was
|
/* Replacing the value failed. This means another thread was
|
||||||
faster and we don't need the copy anymore. */
|
faster and we don't need the copy anymore. */
|
||||||
free (copy_result);
|
free (copy_result);
|
||||||
|
@ -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 */
|
|
Loading…
Reference in New Issue
Block a user