diff --git a/repos/libports/src/lib/pthread/thread.cc b/repos/libports/src/lib/pthread/thread.cc index 2bda839fb..c2de95200 100644 --- a/repos/libports/src/lib/pthread/thread.cc +++ b/repos/libports/src/lib/pthread/thread.cc @@ -214,6 +214,21 @@ extern "C" { } + int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize) + { + if (!attr || !*attr) + return EINVAL; + + if (stacksize > (Thread::stack_virtual_size() - 4 * 4096) || + stacksize < 4096) + return EINVAL; + + (*attr)->stack_size = Genode::align_addr(stacksize, 12); + + return 0; + } + + int pthread_attr_getstack(const pthread_attr_t *attr, void **stackaddr, ::size_t *stacksize) diff --git a/repos/libports/src/lib/pthread/thread.h b/repos/libports/src/lib/pthread/thread.h index 5be7c5806..db1cd9adb 100644 --- a/repos/libports/src/lib/pthread/thread.h +++ b/repos/libports/src/lib/pthread/thread.h @@ -48,8 +48,9 @@ extern "C" { struct pthread_attr { pthread_t pthread; + size_t stack_size; - pthread_attr() : pthread(0) { } + pthread_attr() : pthread(0), stack_size(0) { } }; diff --git a/repos/libports/src/lib/pthread/thread_create.cc b/repos/libports/src/lib/pthread/thread_create.cc index 3db7f0fdd..7daf42574 100644 --- a/repos/libports/src/lib/pthread/thread_create.cc +++ b/repos/libports/src/lib/pthread/thread_create.cc @@ -30,8 +30,11 @@ extern "C" /* cleanup threads which tried to self-destruct */ pthread_cleanup(); + size_t const stack_size = (attr && *attr && (*attr)->stack_size) + ? (*attr)->stack_size : STACK_SIZE; + pthread_t thread_obj = new pthread(attr ? *attr : 0, start_routine, - arg, STACK_SIZE, "pthread", nullptr, + arg, stack_size, "pthread", nullptr, Genode::Affinity::Location()); if (!thread_obj)