/* Used in RL to get win/lin portability, and in SG when CONTEXT_THREAD */
/* in SG, when using CONTEXT_UCONTEXT, xbt_os_thread_stub is used instead */
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
+/* Copyright (c) 2007-2013. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-#include "gras_config.h"
+#include "internal_config.h"
#include "xbt/sysdep.h"
#include "xbt/ex.h"
#include "xbt/ex_interface.h" /* We play crude games with exceptions */
/* ********************************* PTHREAD IMPLEMENTATION ************************************ */
#ifdef HAVE_PTHREAD_H
+#include <limits.h>
#include <semaphore.h>
#ifdef HAVE_MUTEX_TIMEDLOCK
void xbt_os_thread_setstacksize(int stack_size)
{
- 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");
+ size_t sz;
+ int res;
+
+ if (stack_size < 0)
+ xbt_die("stack size %d is negative, maybe it exceeds MAX_INT?", stack_size);
- pthread_attr_setstacksize (&attr, def);
+ sz = stack_size;
+ pthread_attr_init(&attr);
+ res = pthread_attr_setstacksize(&attr, sz);
+
+#ifdef PTHREAD_STACK_MIN
+ if (res == EINVAL) {
+ /* Invalid size, try again with a multiple of PTHREAD_STACK_MIN. */
+ size_t rem = sz % PTHREAD_STACK_MIN;
+ if (rem != 0 || sz == 0) {
+ size_t sz2 = sz - rem + PTHREAD_STACK_MIN;
+ XBT_DEBUG("pthread_attr_setstacksize failed for %#zx, try again with %#zx",
+ sz, sz2);
+ sz = sz2;
+ res = pthread_attr_setstacksize(&attr, sz);
+ }
}
- thread_attr_inited=1;
+#endif
+
+ if (res == EINVAL)
+ XBT_WARN("invalid stack size (maybe too big): %#zx", sz);
+ else if (res != 0)
+ XBT_WARN("unknown error %d in pthread stacksize setting: %#zx", res, sz);
+ thread_attr_inited = 1;
}
const char *xbt_os_thread_name(xbt_os_thread_t t)
THROWF(timeout_error, 0, "mutex %p not ready", mutex);
default:
THROWF(system_error, errcode,
- "xbt_mutex_timedacquire(%p) failed: %s", mutex,
+ "xbt_os_mutex_timedacquire(%p) failed: %s", mutex,
strerror(errcode));
}
void *xbt_os_thread_get_extra_data(void)
{
- return xbt_os_thread_self()->extra_data;
+ xbt_os_thread_t self = xbt_os_thread_self();
+ return self? self->extra_data : NULL;
}
xbt_os_rmutex_t xbt_os_rmutex_init(void)