- size_t def=0;
- if(stack_size<0)xbt_die("stack size is negative, maybe it exceeds MAX_INT?\n");
- pthread_attr_init(&attr);
- pthread_attr_getstacksize (&attr, &def);
- int res = pthread_attr_setstacksize (&attr, stack_size);
- if ( res!=0 ) {
- if(res==EINVAL)XBT_WARN("Thread stack size is either < PTHREAD_STACK_MIN, > the max limit of the system, or perhaps not a multiple of PTHREAD_STACK_MIN - The parameter was ignored");
- else XBT_WARN("unknown error in pthread stacksize setting");
-
- pthread_attr_setstacksize (&attr, def);
+ size_t alignment[] = {
+ xbt_pagesize,
+#ifdef PTHREAD_STACK_MIN
+ PTHREAD_STACK_MIN,
+#endif
+ 0
+ };
+ size_t sz;
+ int res;
+ int i;
+
+ if (stack_size < 0)
+ xbt_die("stack size %d is negative, maybe it exceeds MAX_INT?", stack_size);
+
+ sz = stack_size;
+ res = pthread_attr_setstacksize(&thread_attr, sz);
+
+ for (i = 0; res == EINVAL && alignment[i] > 0; i++) {
+ /* Invalid size, try again with next multiple of alignment[i]. */
+ size_t rem = sz % alignment[i];
+ if (rem != 0 || sz == 0) {
+ size_t sz2 = sz - rem + alignment[i];
+ XBT_DEBUG("pthread_attr_setstacksize failed for %zd, try again with %zd",
+ sz, sz2);
+ sz = sz2;
+ res = pthread_attr_setstacksize(&thread_attr, sz);
+ }