about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--linuxthreads/ChangeLog6
-rw-r--r--linuxthreads/manager.c46
-rw-r--r--linuxthreads/sysdeps/powerpc/pspinlock.c1
3 files changed, 37 insertions, 16 deletions
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog
index 2bb9371912..404d3fce80 100644
--- a/linuxthreads/ChangeLog
+++ b/linuxthreads/ChangeLog
@@ -1,3 +1,9 @@
+2000-12-31  Ulrich Drepper  <drepper@redhat.com>
+
+	* sysdeps/powerpc/pspinlock.c: Don't include pt-machine.h here.
+
+	* manager.c (pthread_allocate_stack): Prepare for removal of MAP_FIXED.
+
 2000-11-15  Wolfram Gloger  <wg@malloc.de>
 
 	* manager.c (pthread_free): [!FLOATING_STACKS]: Only remap the
diff --git a/linuxthreads/manager.c b/linuxthreads/manager.c
index 8442629c08..c48ce76c55 100644
--- a/linuxthreads/manager.c
+++ b/linuxthreads/manager.c
@@ -345,6 +345,8 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
 
       /* Allocate space for stack and thread descriptor at default address */
 #ifdef NEED_SEPARATE_REGISTER_STACK
+      void *res_addr;
+
       if (attr != NULL)
 	{
 	  guardsize = page_roundup (attr->__guardsize, granularity);
@@ -371,18 +373,26 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
       /* XXX Fix for floating stacks with variable sizes.  */
 
       /* First the main stack: */
-      if (mmap((caddr_t)((char *)(new_thread + 1) - stacksize / 2),
-	       stacksize / 2, PROT_READ | PROT_WRITE | PROT_EXEC,
-	       MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0)
-	  == MAP_FAILED)
-	/* Bad luck, this segment is already mapped. */
-	return -1;
+      map_addr = (caddr_t)((char *)(new_thread + 1) - stacksize / 2);
+      res_addr = mmap(map_addr, stacksize / 2,
+		      PROT_READ | PROT_WRITE | PROT_EXEC,
+		      MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
+      if (res_addr != map_addr)
+	{
+	  /* Bad luck, this segment is already mapped. */
+	  if (res_addr != MAP_FAILED)
+	    munmap(res_addr, stacksize / 2);
+	  return -1;
+	}
       /* Then the register stack:	*/
-      if (mmap((caddr_t)new_thread_bottom, stacksize/2,
-	       PROT_READ | PROT_WRITE | PROT_EXEC,
-	       MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0)
-	  == MAP_FAILED)
+      map_addr = (caddr_t)new_thread_bottom;
+      res_addr = mmap(map_addr, stacksize/2,
+		      PROT_READ | PROT_WRITE | PROT_EXEC,
+		      MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXES, -1, 0);
+      if (res_addr != map_addr)
 	{
+	  if (res_addr != MAP_FAILED)
+	    munmap(res_addr, stacksize / 2);
 	  munmap((caddr_t)((char *)(new_thread + 1) - stacksize/2),
 		 stacksize/2);
 	  return -1;
@@ -419,6 +429,8 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
       new_thread_bottom = (char *) map_addr + guardsize;
       new_thread = ((pthread_descr) (new_thread_bottom + stacksize)) - 1;
 # else /* !FLOATING_STACKS */
+      void *res_addr;
+
       if (attr != NULL)
 	{
 	  guardsize = page_roundup (attr->__guardsize, granularity);
@@ -434,13 +446,17 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
 
       new_thread = default_new_thread;
       new_thread_bottom = (char *) (new_thread + 1) - stacksize;
-      map_addr = mmap((caddr_t)((char *)(new_thread + 1) - stacksize - guardsize),
-		      stacksize + guardsize,
+      map_addr = new_thread_bottom - guardsize;
+      res_addr = mmap(map_addr, stacksize + guardsize,
 		      PROT_READ | PROT_WRITE | PROT_EXEC,
 		      MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
-      if (map_addr == MAP_FAILED)
-        /* Bad luck, this segment is already mapped. */
-        return -1;
+      if (res_addr != map_addr)
+	{
+	  /* Bad luck, this segment is already mapped. */
+	  if (res_addr != MAP_FAILED)
+	    munmap (res_addr, stacksize + guardsize);
+	  return -1;
+	}
 
       /* We manage to get a stack.  Protect the guard area pages if
 	 necessary.  */
diff --git a/linuxthreads/sysdeps/powerpc/pspinlock.c b/linuxthreads/sysdeps/powerpc/pspinlock.c
index 80e2727dfe..c0b2dc4ad5 100644
--- a/linuxthreads/sysdeps/powerpc/pspinlock.c
+++ b/linuxthreads/sysdeps/powerpc/pspinlock.c
@@ -19,7 +19,6 @@
 
 #include <errno.h>
 #include <pthread.h>
-#include <pt-machine.h>
 #include "internals.h"
 
 int