|
@@ -214,6 +214,9 @@ char *__pthread_manager_thread_tos = NULL;
|
|
|
int __pthread_exit_requested = 0;
|
|
|
int __pthread_exit_code = 0;
|
|
|
|
|
|
+
|
|
|
+size_t __pthread_max_stacksize;
|
|
|
+
|
|
|
|
|
|
|
|
|
const int __pthread_threads_max = PTHREAD_THREADS_MAX;
|
|
@@ -314,6 +317,50 @@ void __pthread_initialize_minimal(void)
|
|
|
}
|
|
|
|
|
|
|
|
|
+void
|
|
|
+__pthread_init_max_stacksize(void)
|
|
|
+{
|
|
|
+ struct rlimit limit;
|
|
|
+ size_t max_stack;
|
|
|
+
|
|
|
+ getrlimit(RLIMIT_STACK, &limit);
|
|
|
+#ifdef FLOATING_STACKS
|
|
|
+ if (limit.rlim_cur == RLIM_INFINITY)
|
|
|
+ limit.rlim_cur = ARCH_STACK_MAX_SIZE;
|
|
|
+# ifdef NEED_SEPARATE_REGISTER_STACK
|
|
|
+ max_stack = limit.rlim_cur / 2;
|
|
|
+# else
|
|
|
+ max_stack = limit.rlim_cur;
|
|
|
+# endif
|
|
|
+#else
|
|
|
+
|
|
|
+ beyond STACK_SIZE minus one page (to act as a guard page). */
|
|
|
+# ifdef NEED_SEPARATE_REGISTER_STACK
|
|
|
+
|
|
|
+ store. The rlimit value applies to each individually. */
|
|
|
+ max_stack = STACK_SIZE/2 - __getpagesize ();
|
|
|
+# else
|
|
|
+ max_stack = STACK_SIZE - __getpagesize();
|
|
|
+# endif
|
|
|
+ if (limit.rlim_cur > max_stack) {
|
|
|
+ limit.rlim_cur = max_stack;
|
|
|
+ setrlimit(RLIMIT_STACK, &limit);
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ __pthread_max_stacksize = max_stack;
|
|
|
+#define __MAX_ALLOCA_CUTOFF 65536
|
|
|
+ if (max_stack / 4 < __MAX_ALLOCA_CUTOFF)
|
|
|
+ {
|
|
|
+#ifdef USE_TLS
|
|
|
+ pthread_descr self = THREAD_SELF;
|
|
|
+ self->p_alloca_cutoff = max_stack / 4;
|
|
|
+#else
|
|
|
+ __pthread_initial_thread.p_alloca_cutoff = max_stack / 4;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
static void pthread_initialize(void)
|
|
|
{
|
|
|
struct sigaction sa;
|