diff options
Diffstat (limited to 'linuxthreads')
-rw-r--r-- | linuxthreads/ChangeLog | 7 | ||||
-rw-r--r-- | linuxthreads/internals.h | 6 | ||||
-rw-r--r-- | linuxthreads/spinlock.c | 4 | ||||
-rw-r--r-- | linuxthreads/sysdeps/alpha/pt-machine.h | 4 | ||||
-rw-r--r-- | linuxthreads/sysdeps/sparc/sparc64/pt-machine.h | 5 |
5 files changed, 21 insertions, 5 deletions
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index 8bdc6094a0..50fa766fc6 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,5 +1,12 @@ 2000-04-15 Ulrich Drepper <drepper@redhat.com> + * internals.h (WRITE_MEMORY_BARRIER): Define as MEMORY_BARRIER if + undefined. + * spinlock.c: Use WRITE_MEMORY_BARRIER instead of MEMORY_BARRIER + where possible. + * sysdeps/alpha/pt-machine.h: Define WRITE_MEMORY_BARRIER. + * sysdeps/sparc/sparc64/pt-machine.h: Likewise. + * sysdeps/unix/sysv/linux/bits/posix_opt.h: Add _POSIX_SPAWN. * sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise. diff --git a/linuxthreads/internals.h b/linuxthreads/internals.h index 6b115beaa2..17c8e4d4d6 100644 --- a/linuxthreads/internals.h +++ b/linuxthreads/internals.h @@ -358,11 +358,15 @@ static inline pthread_descr thread_self (void) } /* If MEMORY_BARRIER isn't defined in pt-machine.h, assume the architecture - doesn't need a memory barrier instruction (e.g. Intel x86) */ + doesn't need a memory barrier instruction (e.g. Intel x86). Some + architectures distinguish between normal/read and write barriers. */ #ifndef MEMORY_BARRIER #define MEMORY_BARRIER() #endif +#ifndef WRITE_MEMORY_BARRIER +#define WRITE_MEMORY_BARRIER() MEMORY_BARRIER() +#endif /* Max number of times we must spin on a spinlock calling sched_yield(). After MAX_SPIN_COUNT iterations, we put the calling thread to sleep. */ diff --git a/linuxthreads/spinlock.c b/linuxthreads/spinlock.c index 6e7eb12e57..ac94001bda 100644 --- a/linuxthreads/spinlock.c +++ b/linuxthreads/spinlock.c @@ -56,7 +56,7 @@ void internal_function __pthread_lock(pthread_spinlock_t * lock, THREAD_SETMEM(self, p_nextlock, (pthread_descr) oldstatus); /* Make sure the store in p_nextlock completes before performing the compare-and-swap */ - MEMORY_BARRIER(); + WRITE_MEMORY_BARRIER(); } } while(! compare_and_swap(&lock->__status, oldstatus, newstatus, &lock->__spinlock)); @@ -198,7 +198,7 @@ int __pthread_compare_and_swap(long * ptr, long oldval, long newval, res = 0; } /* Prevent reordering of store to *ptr above and store to *spinlock below */ - MEMORY_BARRIER(); + WRITE_MEMORY_BARRIER(); *spinlock = 0; return res; } diff --git a/linuxthreads/sysdeps/alpha/pt-machine.h b/linuxthreads/sysdeps/alpha/pt-machine.h index 25ba634528..99c9bb6b28 100644 --- a/linuxthreads/sysdeps/alpha/pt-machine.h +++ b/linuxthreads/sysdeps/alpha/pt-machine.h @@ -1,6 +1,6 @@ /* Machine-dependent pthreads configuration and inline functions. Alpha version. - Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson <rth@tamu.edu>. @@ -34,6 +34,8 @@ register char *stack_pointer __asm__("$30"); /* Memory barrier; default is to do nothing */ #define MEMORY_BARRIER() __asm__ __volatile__("mb" : : : "memory") +/* Write barrier. */ +#define WRITE_MEMORY_BARRIER() __asm__ __volatile__("wmb" : : : "memory") /* Spinlock implementation; required. */ diff --git a/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h b/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h index 02167bd601..e22f4fed3c 100644 --- a/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h +++ b/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h @@ -1,6 +1,6 @@ /* Machine-dependent pthreads configuration and inline functions. Sparc v9 version. - Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson <rth@tamu.edu>. @@ -41,6 +41,9 @@ testandset (int *spinlock) /* FIXME: is stbar OK, or should we use the more general membar instruction? If so, which mode to pass to membar? */ #define MEMORY_BARRIER() __asm__ __volatile__("stbar" : : : "memory") +/* Write barrier. */ +#define WRITE_MEMORY_BARRIER() \ + __asm__ __volatile__("membar #StoreLoad | #StoreStore" : : : "memory") /* Get some notion of the current stack. Need not be exactly the top |