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;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to