diff options
Diffstat (limited to 'lib/libthr/thread/thr_init.c')
-rw-r--r-- | lib/libthr/thread/thr_init.c | 66 |
1 files changed, 52 insertions, 14 deletions
diff --git a/lib/libthr/thread/thr_init.c b/lib/libthr/thread/thr_init.c index 82bde10a153e..007cf5be81c9 100644 --- a/lib/libthr/thread/thr_init.c +++ b/lib/libthr/thread/thr_init.c @@ -33,11 +33,9 @@ * SUCH DAMAGE. */ -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - #include "namespace.h" -#include <sys/types.h> +#include <sys/param.h> +#include <sys/auxv.h> #include <sys/signalvar.h> #include <sys/ioctl.h> #include <sys/link_elf.h> @@ -272,6 +270,7 @@ static pthread_func_t jmp_table[][2] = { [PJT_MUTEXATTR_SETROBUST] = {DUAL_ENTRY(_thr_mutexattr_setrobust)}, [PJT_GETTHREADID_NP] = {DUAL_ENTRY(_thr_getthreadid_np)}, [PJT_ATTR_GET_NP] = {DUAL_ENTRY(_thr_attr_get_np)}, + [PJT_GETNAME_NP] = {DUAL_ENTRY(_thr_getname_np)}, }; static int init_once = 0; @@ -433,12 +432,43 @@ init_main_thread(struct pthread *thread) /* Others cleared to zero by thr_alloc() */ } -static void -init_private(void) +bool +__thr_get_main_stack_base(char **base) { - struct rlimit rlim; size_t len; int mib[2]; + + if (elf_aux_info(AT_USRSTACKBASE, base, sizeof(*base)) == 0) + return (true); + + mib[0] = CTL_KERN; + mib[1] = KERN_USRSTACK; + len = sizeof(*base); + if (sysctl(mib, nitems(mib), base, &len, NULL, 0) == 0) + return (true); + + return (false); +} + +bool +__thr_get_main_stack_lim(size_t *lim) +{ + struct rlimit rlim; + + if (elf_aux_info(AT_USRSTACKLIM, lim, sizeof(*lim)) == 0) + return (true); + + if (getrlimit(RLIMIT_STACK, &rlim) == 0) { + *lim = rlim.rlim_cur; + return (true); + } + + return (false); +} + +static void +init_private(void) +{ char *env, *env_bigstack, *env_splitstack; _thr_umutex_init(&_mutex_static_lock); @@ -462,18 +492,15 @@ init_private(void) if (init_once == 0) { __thr_pshared_init(); __thr_malloc_init(); + /* Find the stack top */ - mib[0] = CTL_KERN; - mib[1] = KERN_USRSTACK; - len = sizeof (_usrstack); - if (sysctl(mib, 2, &_usrstack, &len, NULL, 0) == -1) - PANIC("Cannot get kern.usrstack from sysctl"); + if (!__thr_get_main_stack_base(&_usrstack)) + PANIC("Cannot get kern.usrstack"); env_bigstack = getenv("LIBPTHREAD_BIGSTACK_MAIN"); env_splitstack = getenv("LIBPTHREAD_SPLITSTACK_MAIN"); if (env_bigstack != NULL || env_splitstack == NULL) { - if (getrlimit(RLIMIT_STACK, &rlim) == -1) + if (!__thr_get_main_stack_lim(&_thr_stack_initial)) PANIC("Cannot get stack rlimit"); - _thr_stack_initial = rlim.rlim_cur; } _thr_is_smp = sysconf(_SC_NPROCESSORS_CONF); if (_thr_is_smp == -1) @@ -493,6 +520,17 @@ init_private(void) if (env) _thr_queuefifo = atoi(env); TAILQ_INIT(&_thr_atfork_list); + env = getenv("LIBPTHREAD_UMTX_MIN_TIMEOUT"); + if (env) { + char *endptr; + long mint; + + mint = strtol(env, &endptr, 0); + if (*endptr == '\0' && mint >= 0) { + _umtx_op(NULL, UMTX_OP_SET_MIN_TIMEOUT, + mint, NULL, NULL); + } + } } init_once = 1; } |