diff options
-rw-r--r-- | linuxthreads/ChangeLog | 9 | ||||
-rw-r--r-- | linuxthreads/manager.c | 111 | ||||
-rw-r--r-- | linuxthreads/sysdeps/i386/useldt.h | 2 | ||||
-rw-r--r-- | linuxthreads/sysdeps/ia64/pt-machine.h | 6 |
4 files changed, 67 insertions, 61 deletions
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index ee9fb8491c..30ec9090d1 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -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. diff --git a/linuxthreads/manager.c b/linuxthreads/manager.c index 6016219b5e..c7fd9653f2 100644 --- a/linuxthreads/manager.c +++ b/linuxthreads/manager.c @@ -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; diff --git a/linuxthreads/sysdeps/i386/useldt.h b/linuxthreads/sysdeps/i386/useldt.h index b9566ace1f..02d079c9ef 100644 --- a/linuxthreads/sysdeps/i386/useldt.h +++ b/linuxthreads/sysdeps/i386/useldt.h @@ -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 of the stack if the rlimit is unlimited. */ #define ARCH_STACK_MAX_SIZE 8*1024*1024 diff --git a/linuxthreads/sysdeps/ia64/pt-machine.h b/linuxthreads/sysdeps/ia64/pt-machine.h index a243c8b577..216485ea68 100644 --- a/linuxthreads/sysdeps/ia64/pt-machine.h +++ b/linuxthreads/sysdeps/ia64/pt-machine.h @@ -31,6 +31,12 @@ #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. */ |