}
int pthread_attr_getguardsize(const pthread_attr_t *restrict a, size_t *restrict size)
{
- *size = a->_a_guardsize + DEFAULT_GUARD_SIZE;
+ *size = a->_a_guardsize;
return 0;
}
{
if (!a->_a_stackaddr)
return EINVAL;
- *size = a->_a_stacksize + DEFAULT_STACK_SIZE;
+ *size = a->_a_stacksize;
*addr = (void *)(a->_a_stackaddr - *size);
return 0;
}
int pthread_attr_getstacksize(const pthread_attr_t *restrict a, size_t *restrict size)
{
- *size = a->_a_stacksize + DEFAULT_STACK_SIZE;
+ *size = a->_a_stacksize;
return 0;
}
int pthread_attr_init(pthread_attr_t *a)
{
*a = (pthread_attr_t){0};
+ a->_a_stacksize = DEFAULT_STACK_SIZE;
+ a->_a_guardsize = DEFAULT_GUARD_SIZE;
return 0;
}
int pthread_attr_setguardsize(pthread_attr_t *a, size_t size)
{
if (size > SIZE_MAX/8) return EINVAL;
- a->_a_guardsize = size - DEFAULT_GUARD_SIZE;
+ a->_a_guardsize = size;
return 0;
}
{
if (size-PTHREAD_STACK_MIN > SIZE_MAX/4) return EINVAL;
a->_a_stackaddr = (size_t)addr + size;
- a->_a_stacksize = size - DEFAULT_STACK_SIZE;
+ a->_a_stacksize = size;
return 0;
}
{
if (size-PTHREAD_STACK_MIN > SIZE_MAX/4) return EINVAL;
a->_a_stackaddr = 0;
- a->_a_stacksize = size - DEFAULT_STACK_SIZE;
+ a->_a_stacksize = size;
return 0;
}
if (attr._a_stackaddr) {
size_t need = libc.tls_size + __pthread_tsd_size;
- size = attr._a_stacksize + DEFAULT_STACK_SIZE;
+ size = attr._a_stacksize;
stack = (void *)(attr._a_stackaddr & -16);
stack_limit = (void *)(attr._a_stackaddr - size);
/* Use application-provided stack for TLS only when
guard = 0;
}
} else {
- guard = ROUND(DEFAULT_GUARD_SIZE + attr._a_guardsize);
- size = guard + ROUND(DEFAULT_STACK_SIZE + attr._a_stacksize
+ guard = ROUND(attr._a_guardsize);
+ size = guard + ROUND(attr._a_stacksize
+ libc.tls_size + __pthread_tsd_size);
}
a->_a_detach = !!t->detached;
if (t->stack) {
a->_a_stackaddr = (uintptr_t)t->stack;
- a->_a_stacksize = t->stack_size - DEFAULT_STACK_SIZE;
+ a->_a_stacksize = t->stack_size;
} else {
char *p = (void *)libc.auxv;
size_t l = PAGE_SIZE;
a->_a_stackaddr = (uintptr_t)p;
while (mremap(p-l-PAGE_SIZE, PAGE_SIZE, 2*PAGE_SIZE, 0)==MAP_FAILED && errno==ENOMEM)
l += PAGE_SIZE;
- a->_a_stacksize = l - DEFAULT_STACK_SIZE;
+ a->_a_stacksize = l;
}
return 0;
}