diff options
author | kib <kib@FreeBSD.org> | 2014-08-13 05:53:41 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2014-08-13 05:53:41 +0000 |
commit | 96b731501d410f1cd80bb059c98fcd676068c877 (patch) | |
tree | 8661644513567e2de6be353bb47eb26592bdc043 /lib/libthr | |
parent | 628dc68fb5739e44312c8e0e172675d0f8b6575f (diff) | |
download | FreeBSD-src-96b731501d410f1cd80bb059c98fcd676068c877.zip FreeBSD-src-96b731501d410f1cd80bb059c98fcd676068c877.tar.gz |
Add a knob LIBPTHREAD_BIGSTACK_MAIN, which instructs libthr to leave
the whole RLIMIT_STACK-sized region of the kernel-allocated stack as
the stack of main thread.
By default, the main thread stack is clamped at 2MB (4MB on 64bit
ABIs) and the rest is used for other threads stack allocation. Since
there is no programmatic way to adjust the size of the main thread
stack, pthread_attr_setstacksize() is too late, the knob allows user
to manage the main stack size both for single-threaded and
multi-threaded processes with the rlimit.
Reported by: "Ivan A. Kosarev" <ivan@ivan-labs.com>
Tested by: dim
Sponsored by: The FreeBSD Foundation
MFC after: 3 days
Diffstat (limited to 'lib/libthr')
-rw-r--r-- | lib/libthr/thread/thr_init.c | 8 | ||||
-rw-r--r-- | lib/libthr/thread/thr_stack.c | 5 |
2 files changed, 12 insertions, 1 deletions
diff --git a/lib/libthr/thread/thr_init.c b/lib/libthr/thread/thr_init.c index 937d83f..9bf0e29 100644 --- a/lib/libthr/thread/thr_init.c +++ b/lib/libthr/thread/thr_init.c @@ -37,6 +37,7 @@ #include <sys/types.h> #include <sys/signalvar.h> #include <sys/ioctl.h> +#include <sys/resource.h> #include <sys/sysctl.h> #include <sys/ttycom.h> #include <sys/mman.h> @@ -441,6 +442,7 @@ init_main_thread(struct pthread *thread) static void init_private(void) { + struct rlimit rlim; size_t len; int mib[2]; char *env; @@ -471,6 +473,12 @@ init_private(void) len = sizeof (_usrstack); if (sysctl(mib, 2, &_usrstack, &len, NULL, 0) == -1) PANIC("Cannot get kern.usrstack from sysctl"); + env = getenv("LIBPTHREAD_BIGSTACK_MAIN"); + if (env != NULL) { + if (getrlimit(RLIMIT_STACK, &rlim) == -1) + PANIC("Cannot get stack rlimit"); + _thr_stack_initial = rlim.rlim_cur; + } len = sizeof(_thr_is_smp); sysctlbyname("kern.smp.cpus", &_thr_is_smp, &len, NULL, 0); _thr_is_smp = (_thr_is_smp > 1); diff --git a/lib/libthr/thread/thr_stack.c b/lib/libthr/thread/thr_stack.c index 5f8cd4e..e5d149e 100644 --- a/lib/libthr/thread/thr_stack.c +++ b/lib/libthr/thread/thr_stack.c @@ -246,7 +246,10 @@ _thr_stack_alloc(struct pthread_attr *attr) THREAD_LIST_UNLOCK(curthread); } else { - /* Allocate a stack from usrstack. */ + /* + * Allocate a stack from or below usrstack, depending + * on the LIBPTHREAD_BIGSTACK_MAIN env variable. + */ if (last_stack == NULL) last_stack = _usrstack - _thr_stack_initial - _thr_guard_default; |