diff options
Diffstat (limited to 'linuxthreads/manager.c')
-rw-r--r-- | linuxthreads/manager.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/linuxthreads/manager.c b/linuxthreads/manager.c index 307ce63721..0cbb426c9d 100644 --- a/linuxthreads/manager.c +++ b/linuxthreads/manager.c @@ -289,9 +289,12 @@ static int pthread_allocate_stack(const pthread_attr_t *attr, } else { + stacksize = STACK_SIZE - pagesize; + if (attr != NULL) + stacksize = MIN (stacksize, roundup(attr->__stacksize, pagesize)); /* Allocate space for stack and thread descriptor at default address */ new_thread = default_new_thread; - new_thread_bottom = (char *) new_thread - STACK_SIZE; + new_thread_bottom = (char *) (new_thread + 1) - stacksize; if (mmap((caddr_t)((char *)(new_thread + 1) - INITIAL_STACK_SIZE), INITIAL_STACK_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED | MAP_GROWSDOWN, @@ -300,14 +303,10 @@ static int pthread_allocate_stack(const pthread_attr_t *attr, return -1; /* We manage to get a stack. Now see whether we need a guard and allocate it if necessary. Notice that the default - attributes (stack_size = STACK_SIZE - pagesize and - guardsize = pagesize) do not need a guard page, since - the RLIMIT_STACK soft limit prevents stacks from - running into one another. */ - if (attr == NULL || - attr->__guardsize == 0 || - (attr->__guardsize == pagesize && - attr->__stacksize == STACK_SIZE - pagesize)) + attributes (stack_size = STACK_SIZE - pagesize) do not need + a guard page, since the RLIMIT_STACK soft limit prevents stacks + from running into one another. */ + if (stacksize == STACK_SIZE - pagesize) { /* We don't need a guard page. */ guardaddr = NULL; @@ -316,10 +315,7 @@ static int pthread_allocate_stack(const pthread_attr_t *attr, else { /* Put a bad page at the bottom of the stack */ - stacksize = roundup(attr->__stacksize, pagesize); - if (stacksize >= STACK_SIZE - pagesize) - stacksize = STACK_SIZE - pagesize; - guardaddr = (void *)new_thread - stacksize; + guardaddr = (void *)new_thread_bottom - stacksize; guardsize = attr->__guardsize; if (mmap ((caddr_t) guardaddr, guardsize, 0, MAP_FIXED, -1, 0) == MAP_FAILED) |