mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-06 20:58:33 +01:00
htl: Fix stack information for main thread
We can easily directly ask the kernel with vm_region rather than assuming a one-page stack.
This commit is contained in:
parent
89ade8d8cb
commit
8076906109
1 changed files with 27 additions and 3 deletions
|
@ -60,12 +60,36 @@ _init_routine (void *stack)
|
|||
|
||||
if (stack != NULL)
|
||||
{
|
||||
/* We are getting initialized due to dlopening a library using libpthread
|
||||
while the main program was not linked against libpthread. */
|
||||
/* We are given a stack, use it. */
|
||||
|
||||
/* Get the stack area information */
|
||||
vm_address_t addr = (vm_address_t) stack;
|
||||
vm_size_t vm_size;
|
||||
vm_prot_t prot, max_prot;
|
||||
vm_inherit_t inherit;
|
||||
boolean_t is_shared;
|
||||
memory_object_name_t obj;
|
||||
vm_offset_t offset;
|
||||
|
||||
if (vm_region (__mach_task_self (), &addr,
|
||||
&vm_size, &prot, &max_prot, &inherit, &is_shared,
|
||||
&obj, &offset) == KERN_SUCCESS)
|
||||
__mach_port_deallocate (__mach_task_self (), obj);
|
||||
else
|
||||
{
|
||||
/* Uh. Assume at least a page. */
|
||||
vm_size = __vm_page_size;
|
||||
#if _STACK_GROWS_DOWN
|
||||
addr = (vm_address_t) stack - vm_size;
|
||||
#else
|
||||
addr = (vm_address_t) stack + vm_size;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Avoid allocating another stack */
|
||||
attrp = &attr;
|
||||
__pthread_attr_init (attrp);
|
||||
__pthread_attr_setstack (attrp, stack, __vm_page_size);
|
||||
__pthread_attr_setstack (attrp, (void *) addr, vm_size);
|
||||
}
|
||||
|
||||
/* Create the pthread structure for the main thread (i.e. us). */
|
||||
|
|
Loading…
Add table
Reference in a new issue