Am 12.07.2016 um 16:36 schrieb Peter Lieven: > Am 11.07.2016 um 18:39 schrieb Eric Blake: >> On 07/11/2016 03:07 AM, Peter Lieven wrote: >>> the allocated stack will be adjusted to the minimum supported stack size >>> by the OS and rounded up to be a multiple of the system pagesize. >>> Additionally an architecture dependent guard page is added to the stack >>> to catch stack overflows. >>> >>> Signed-off-by: Peter Lieven <p...@kamp.de> >>> --- >>> include/sysemu/os-posix.h | 23 +++++++++++++++++++++++ >>> util/oslib-posix.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ >>> 2 files changed, 67 insertions(+) >>> >>> + >>> +static size_t adjust_stack_size(size_t sz) >>> +{ >>> + /* avoid stacks smaller than _SC_THREAD_STACK_MIN */ >>> + sz = MAX(sz, sysconf(_SC_THREAD_STACK_MIN)); >> sz is unsigned, but sysconf() is signed. Furthermore, sysconf() is >> permitted to return -1 if there is no such minimum. MAX() would then >> operate on the common integral promotion between the two arguments, >> which may treat (unsigned)(-1) as the larger of the two values, and give >> you the wrong results. >> >> I think it is theoretical (all platforms that we compile on have a >> working sysconf(_SC_THREAD_STACK_MIN), right?), but still may be worth >> being sure that sysconf() returned a positive value before computing MAX(). >> > If you feel more comfortable I can surround it by a > > if (sysconf(_SC_THREAD_STACK_MIN) > 0) { } > > I wonder if the _SC_THREAD_STACK_MIN constant exists if there is no minimum?
Update: glibc basically does the following: static gulong g_thread_min_stack_size = 0; #ifdef _SC_THREAD_STACK_MIN g_thread_min_stack_size = MAX (sysconf (_SC_THREAD_STACK_MIN), 0); #endif /* _SC_THREAD_STACK_MIN */ stack_size = MAX (g_thread_min_stack_size, stack_size); So we should do sth similar, I think?! Peter