about summary refs log tree commit diff
path: root/linuxthreads
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-04-15 16:51:16 +0000
committerUlrich Drepper <drepper@redhat.com>2000-04-15 16:51:16 +0000
commita5a6f9262eeffab9f78622258fae306d1bf99d04 (patch)
tree91ca75fd25219ba6b05beb0baf96b01ee60949fc /linuxthreads
parentb2d4446fd6d0d51f2c7f3c33805f658f9c7bb6c9 (diff)
downloadglibc-a5a6f9262eeffab9f78622258fae306d1bf99d04.tar.gz
glibc-a5a6f9262eeffab9f78622258fae306d1bf99d04.tar.xz
glibc-a5a6f9262eeffab9f78622258fae306d1bf99d04.zip
Update.
2000-04-15  Ulrich Drepper  <drepper@redhat.com>

	* posix/Makefile (headers): Add spawn.h.
	(distribute): Add spawn_int.h.
	(routines): Add spawn_faction_init, spawn_faction_destroy,
	spawn_faction_addclose, spawn_faction_addopen, spawn_faction_adddup2,
	spawnattr_init, spawnattr_destroy, spawnattr_getdefault,
	spawnattr_setdefault, spawnattr_getflags, spawnattr_setflags,
	spawnattr_getpgroup, spawnattr_setpgroup, spawn, spawnp, and spawni.
	* posix/Versions [libc] (GLIBC_2.2): Add posix_spawn_file_actions_init,
	posix_spawn_file_actions_destroy, posix_spawn_file_actions_addclose,
	posix_spawn_file_actions_addopen, posix_spawn_file_actions_adddup2,
	posix_spawnattr_init, posix_spawnattr_destroy,
	posix_spawnattr_getdefault, posix_spawnattr_setdefault,
	posix_spawnattr_getflags, posix_spawnattr_setflags,
	posix_spawnattr_getpgroup, posix_spawnattr_setpgroup, posix_spawn,
	and posix_spawnp.
	* posix/spawn.c: New file.
	* posix/spawn.h: New file.
	* posix/spawn_faction_addclose.c: New file.
	* posix/spawn_faction_adddup2.c: New file.
	* posix/spawn_faction_addopen.c: New file.
	* posix/spawn_faction_destroy.c: New file.
	* posix/spawn_faction_init.c: New file.
	* posix/spawn_int.h: New file.
	* posix/spawnattr_destroy.c: New file.
	* posix/spawnattr_getdefault.c: New file.
	* posix/spawnattr_getflags.c: New file.
	* posix/spawnattr_getpgroup.c: New file.
	* posix/spawnattr_getschedparam.c: New file.
	* posix/spawnattr_getschedpolicy.c: New file.
	* posix/spawnattr_getsigmask.c: New file.
	* posix/spawnattr_init.c: New file.
	* posix/spawnattr_setdefault.c: New file.
	* posix/spawnattr_setflags.c: New file.
	* posix/spawnattr_setpgroup.c: New file.
	* posix/spawnattr_setschedparam.c: New file.
	* posix/spawnattr_setschedpolicy.c: New file.
	* posix/spawnattr_setsigmask.c: New file.
	* posix/spawni.c: New file.
	* posix/spawnp.c: New file.

	* sysdeps/mach/hurd/bits/posix_opt.h: Add _POSIX_SPAWN.
	* sysdeps/unix/sysv/linux/bits/posix_opt.h: Likewise.
Diffstat (limited to 'linuxthreads')
-rw-r--r--linuxthreads/ChangeLog7
-rw-r--r--linuxthreads/internals.h6
-rw-r--r--linuxthreads/spinlock.c4
-rw-r--r--linuxthreads/sysdeps/alpha/pt-machine.h4
-rw-r--r--linuxthreads/sysdeps/sparc/sparc64/pt-machine.h5
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