Update.
authorUlrich Drepper <drepper@redhat.com>
Sun, 22 Jul 2001 23:41:12 +0000 (23:41 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 22 Jul 2001 23:41:12 +0000 (23:41 +0000)
2001-07-19  Jakub Jelinek  <jakub@redhat.com>

* sysdeps/i386/useldt.h: Fix typo in ARCH_STACK_MAX_SIZE comment.

* sysdeps/ia64/pt-machine.h (FLOATING_STACKS): Define.
(ARCH_STACK_MAX_SIZE): Define.
* manager.c (pthread_allocate_stack): Handle FLOATING_STACKS with
NEED_SEPARATE_REGISTER_STACK.

linuxthreads/ChangeLog
linuxthreads/manager.c
linuxthreads/sysdeps/i386/useldt.h
linuxthreads/sysdeps/ia64/pt-machine.h

index ee9fb84..30ec909 100644 (file)
@@ -1,3 +1,12 @@
+2001-07-19  Jakub Jelinek  <jakub@redhat.com>
+
+       * sysdeps/i386/useldt.h: Fix typo in ARCH_STACK_MAX_SIZE comment.
+
+       * sysdeps/ia64/pt-machine.h (FLOATING_STACKS): Define.
+       (ARCH_STACK_MAX_SIZE): Define.
+       * manager.c (pthread_allocate_stack): Handle FLOATING_STACKS with
+       NEED_SEPARATE_REGISTER_STACK.
+
 2001-07-16  Andreas Schwab  <schwab@suse.de>
 
        * Makefile (before-compile): Don't add $(objpfx)crti.o.
index 6016219..c7fd965 100644 (file)
@@ -353,7 +353,53 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
       void *map_addr;
 
       /* Allocate space for stack and thread descriptor at default address */
-#ifdef NEED_SEPARATE_REGISTER_STACK
+#if FLOATING_STACKS
+      if (attr != NULL)
+       {
+         guardsize = page_roundup (attr->__guardsize, granularity);
+         stacksize = __pthread_max_stacksize - guardsize;
+         stacksize = MIN (stacksize,
+                          page_roundup (attr->__stacksize, granularity));
+       }
+      else
+       {
+         guardsize = granularity;
+         stacksize = __pthread_max_stacksize - guardsize;
+       }
+
+      map_addr = mmap(NULL, stacksize + guardsize,
+                     PROT_READ | PROT_WRITE | PROT_EXEC,
+                     MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+      if (map_addr == MAP_FAILED)
+        /* No more memory available.  */
+        return -1;
+
+# ifdef NEED_SEPARATE_REGISTER_STACK
+      guardaddr = map_addr + stacksize / 2;
+      if (guardsize > 0)
+       mprotect (guardaddr, guardsize, PROT_NONE);
+
+      new_thread_bottom = (char *) map_addr;
+      new_thread = ((pthread_descr) (new_thread_bottom + stacksize
+                                    + guardsize)) - 1;
+# elif _STACK_GROWS_DOWN
+      guardaddr = map_addr;
+      if (guardsize > 0)
+       mprotect (guardaddr, guardsize, PROT_NONE);
+
+      new_thread_bottom = (char *) map_addr + guardsize;
+      new_thread = ((pthread_descr) (new_thread_bottom + stacksize)) - 1;
+# elif _STACK_GROWS_UP
+      guardaddr = map_addr + stacksize;
+      if (guardsize > 0)
+       mprotect (guardaddr, guardsize, PROT_NONE);
+
+      new_thread = (pthread_descr) map_addr;
+      new_thread_bottom = (char *) (new_thread + 1);
+# else
+#  error You must define a stack direction
+# endif /* Stack direction */
+#else /* !FLOATING_STACKS */
       void *res_addr;
 
       if (attr != NULL)
@@ -369,6 +415,7 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
          stacksize = STACK_SIZE - granularity;
        }
 
+# ifdef NEED_SEPARATE_REGISTER_STACK
       new_thread = default_new_thread;
       new_thread_bottom = (char *) (new_thread + 1) - stacksize - guardsize;
       /* Includes guard area, unlike the normal case.  Use the bottom
@@ -379,8 +426,6 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
        in the same region.  The cost is that we might be able to map
        slightly fewer stacks.  */
 
-      /* XXX Fix for floating stacks with variable sizes.  */
-
       /* First the main stack: */
       map_addr = (caddr_t)((char *)(new_thread + 1) - stacksize / 2);
       res_addr = mmap(map_addr, stacksize / 2,
@@ -409,61 +454,7 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
 
       guardaddr = new_thread_bottom + stacksize/2;
       /* We leave the guard area in the middle unmapped.       */
-#else  /* !NEED_SEPARATE_REGISTER_STACK */
-# if FLOATING_STACKS
-      if (attr != NULL)
-       {
-         guardsize = page_roundup (attr->__guardsize, granularity);
-         stacksize = __pthread_max_stacksize - guardsize;
-         stacksize = MIN (stacksize,
-                          page_roundup (attr->__stacksize, granularity));
-       }
-      else
-       {
-         guardsize = granularity;
-         stacksize = __pthread_max_stacksize - guardsize;
-       }
-
-      map_addr = mmap(NULL, stacksize + guardsize,
-                     PROT_READ | PROT_WRITE | PROT_EXEC,
-                     MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-      if (map_addr == MAP_FAILED)
-        /* No more memory available.  */
-        return -1;
-
-#  ifdef _STACK_GROWS_DOWN
-      guardaddr = map_addr;
-      if (guardsize > 0)
-       mprotect (guardaddr, guardsize, PROT_NONE);
-
-      new_thread_bottom = (char *) map_addr + guardsize;
-      new_thread = ((pthread_descr) (new_thread_bottom + stacksize)) - 1;
-#  elif _STACK_GROWS_UP
-      guardaddr = map_addr + stacksize;
-      if (guardsize > 0)
-       mprotect (guardaddr, guardsize, PROT_NONE);
-
-      new_thread = (pthread_descr) map_addr;
-      new_thread_bottom = (char *) (new_thread + 1);
-#  else
-#    error You must define a stack direction
-#  endif /* Stack direction */
-# else /* !FLOATING_STACKS */
-      void *res_addr;
-
-      if (attr != NULL)
-       {
-         guardsize = page_roundup (attr->__guardsize, granularity);
-         stacksize = STACK_SIZE - guardsize;
-         stacksize = MIN (stacksize,
-                          page_roundup (attr->__stacksize, granularity));
-       }
-      else
-       {
-         guardsize = granularity;
-         stacksize = STACK_SIZE - granularity;
-       }
-
+# else  /* !NEED_SEPARATE_REGISTER_STACK */
 #  ifdef _STACK_GROWS_DOWN
       new_thread = default_new_thread;
       new_thread_bottom = (char *) (new_thread + 1) - stacksize;
@@ -501,8 +492,8 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
          mprotect (guardaddr, guardsize, PROT_NONE);
 
 #  endif /* stack direction */
-# endif
-#endif /* !NEED_SEPARATE_REGISTER_STACK */
+# endif  /* !NEED_SEPARATE_REGISTER_STACK */
+#endif   /* !FLOATING_STACKS */
     }
   *out_new_thread = new_thread;
   *out_new_thread_bottom = new_thread_bottom;
index b9566ac..02d079c 100644 (file)
@@ -201,5 +201,5 @@ extern int __modify_ldt (int, struct modify_ldt_ldt_s *, size_t);
 /* We want the OS to assign stack addresses.  */
 #define FLOATING_STACKS        1
 
-/* Maximum size o fthe stack if the rlimit is unlimited.  */
+/* Maximum size othe stack if the rlimit is unlimited.  */
 #define ARCH_STACK_MAX_SIZE    8*1024*1024
index a243c8b..216485e 100644 (file)
 
 #define NEED_SEPARATE_REGISTER_STACK
 
+/* We want the OS to assign stack addresses.  */
+#define FLOATING_STACKS 1
+
+/* Maximum size of the stack if the rlimit is unlimited.  */
+#define ARCH_STACK_MAX_SIZE     32*1024*1024
+
 /* Get some notion of the current stack.  Need not be exactly the top
    of the stack, just something somewhere in the current frame.
    r12 (sp) is the stack pointer. */