- if (attr && attr->_a_stackaddr) {
- map = 0;
- tsd = (void *)(attr->_a_stackaddr-__pthread_tsd_size & -16);
- } else {
- if (attr) {
- guard = ROUND(attr->_a_guardsize + DEFAULT_GUARD_SIZE);
- size = guard + ROUND(attr->_a_stacksize
- + DEFAULT_STACK_SIZE + libc.tls_size);
+ if (attr._a_stackaddr) {
+ size_t need = libc.tls_size + __pthread_tsd_size;
+ size = attr._a_stacksize + DEFAULT_STACK_SIZE;
+ stack = (void *)(attr._a_stackaddr & -16);
+ /* Use application-provided stack for TLS only when
+ * it does not take more than ~12% or 2k of the
+ * application's stack space. */
+ if (need < size/8 && need < 2048) {
+ tsd = stack - __pthread_tsd_size;
+ stack = tsd - libc.tls_size;
+ } else {
+ size = ROUND(need);
+ guard = 0;