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.
This commit is contained in:
Ulrich Drepper 2001-07-22 23:41:12 +00:00
parent 47bd306e41
commit 8d42e2e526
4 changed files with 67 additions and 61 deletions

View 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.

View 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;

View 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 of the stack if the rlimit is unlimited. */
#define ARCH_STACK_MAX_SIZE 8*1024*1024

View File

@ -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. */