mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08:00
Update.
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:
parent
47bd306e41
commit
8d42e2e526
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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. */
|
||||
|
Loading…
Reference in New Issue
Block a user