svn commit: r270040 - stable/10/lib/libthr/thread
Konstantin Belousov
kib at FreeBSD.org
Sat Aug 16 08:38:54 UTC 2014
Author: kib
Date: Sat Aug 16 08:38:53 2014
New Revision: 270040
URL: http://svnweb.freebsd.org/changeset/base/270040
Log:
MFC r269909:
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.
Modified:
stable/10/lib/libthr/thread/thr_init.c
stable/10/lib/libthr/thread/thr_stack.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/lib/libthr/thread/thr_init.c
==============================================================================
--- stable/10/lib/libthr/thread/thr_init.c Sat Aug 16 08:37:13 2014 (r270039)
+++ stable/10/lib/libthr/thread/thr_init.c Sat Aug 16 08:38:53 2014 (r270040)
@@ -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);
Modified: stable/10/lib/libthr/thread/thr_stack.c
==============================================================================
--- stable/10/lib/libthr/thread/thr_stack.c Sat Aug 16 08:37:13 2014 (r270039)
+++ stable/10/lib/libthr/thread/thr_stack.c Sat Aug 16 08:38:53 2014 (r270040)
@@ -246,7 +246,10 @@ _thr_stack_alloc(struct pthread_attr *at
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;
More information about the svn-src-all
mailing list