1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00
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> 2001-07-16 Andreas Schwab <schwab@suse.de>
* Makefile (before-compile): Don't add $(objpfx)crti.o. * 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; void *map_addr;
/* Allocate space for stack and thread descriptor at default address */ /* 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; void *res_addr;
if (attr != NULL) if (attr != NULL)
@ -369,6 +415,7 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
stacksize = STACK_SIZE - granularity; stacksize = STACK_SIZE - granularity;
} }
# ifdef NEED_SEPARATE_REGISTER_STACK
new_thread = default_new_thread; new_thread = default_new_thread;
new_thread_bottom = (char *) (new_thread + 1) - stacksize - guardsize; new_thread_bottom = (char *) (new_thread + 1) - stacksize - guardsize;
/* Includes guard area, unlike the normal case. Use the bottom /* 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 in the same region. The cost is that we might be able to map
slightly fewer stacks. */ slightly fewer stacks. */
/* XXX Fix for floating stacks with variable sizes. */
/* First the main stack: */ /* First the main stack: */
map_addr = (caddr_t)((char *)(new_thread + 1) - stacksize / 2); map_addr = (caddr_t)((char *)(new_thread + 1) - stacksize / 2);
res_addr = mmap(map_addr, 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; guardaddr = new_thread_bottom + stacksize/2;
/* We leave the guard area in the middle unmapped. */ /* We leave the guard area in the middle unmapped. */
#else /* !NEED_SEPARATE_REGISTER_STACK */ # 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;
}
# ifdef _STACK_GROWS_DOWN # ifdef _STACK_GROWS_DOWN
new_thread = default_new_thread; new_thread = default_new_thread;
new_thread_bottom = (char *) (new_thread + 1) - stacksize; 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); mprotect (guardaddr, guardsize, PROT_NONE);
# endif /* stack direction */ # 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 = new_thread;
*out_new_thread_bottom = new_thread_bottom; *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. */ /* We want the OS to assign stack addresses. */
#define FLOATING_STACKS 1 #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 #define ARCH_STACK_MAX_SIZE 8*1024*1024

View File

@ -31,6 +31,12 @@
#define NEED_SEPARATE_REGISTER_STACK #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 /* Get some notion of the current stack. Need not be exactly the top
of the stack, just something somewhere in the current frame. of the stack, just something somewhere in the current frame.
r12 (sp) is the stack pointer. */ r12 (sp) is the stack pointer. */