X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0e8d56f015e3ca47f201ec7930818e37794d0152..72aca2e8034f48eff3b88af1a171a56e3010b57d:/src/xbt/xbt_os_thread.c diff --git a/src/xbt/xbt_os_thread.c b/src/xbt/xbt_os_thread.c index f435231bbe..f29549575c 100644 --- a/src/xbt/xbt_os_thread.c +++ b/src/xbt/xbt_os_thread.c @@ -2,7 +2,7 @@ /* 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-2014. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -23,6 +23,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_sync_os, xbt, /* ********************************* PTHREAD IMPLEMENTATION ************************************ */ #ifdef HAVE_PTHREAD_H +#include #include #ifdef HAVE_MUTEX_TIMEDLOCK @@ -53,10 +54,9 @@ static xbt_os_thread_t main_thread = NULL; static pthread_key_t xbt_self_thread_key; static int thread_mod_inited = 0; -/* attribute structure to handle pthread stack size changing */ +/* defaults attribute for pthreads */ //FIXME: find where to put this -static pthread_attr_t attr; -static int thread_attr_inited = 0; +static pthread_attr_t thread_attr; /* frees the xbt_os_thread_t corresponding to the current thread */ static void xbt_os_thread_free_thread_data(xbt_os_thread_t thread) @@ -104,11 +104,12 @@ void xbt_os_thread_mod_preinit(void) if ((errcode = pthread_setspecific(xbt_self_thread_key, main_thread))) THROWF(system_error, errcode, "pthread_setspecific failed for xbt_self_thread_key"); - __xbt_running_ctx_fetch = _os_thread_get_running_ctx; __xbt_ex_terminate = _os_thread_ex_terminate; + pthread_attr_init(&thread_attr); + thread_mod_inited = 1; #ifndef HAVE_SEM_INIT @@ -181,7 +182,7 @@ xbt_os_thread_t xbt_os_thread_create(const char *name, XBT_RUNNING_CTX_INITIALIZE(res_thread->running_ctx); res_thread->extra_data = extra_data; - if ((errcode = pthread_create(&(res_thread->t), thread_attr_inited!=0? &attr: NULL, + if ((errcode = pthread_create(&(res_thread->t), &thread_attr, wrapper_start_routine, res_thread))) THROWF(system_error, errcode, "pthread_create failed: %s", strerror(errcode)); @@ -194,18 +195,47 @@ xbt_os_thread_t xbt_os_thread_create(const char *name, 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"); - - 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); + } } - thread_attr_inited=1; + + if (res == EINVAL) + XBT_WARN("invalid stack size (maybe too big): %zd", sz); + else if (res != 0) + XBT_WARN("unknown error %d in pthread stacksize setting: %zd", res, sz); +} + +void xbt_os_thread_setguardsize(int guard_size) +{ + size_t sz = guard_size; + int res = pthread_attr_setguardsize(&thread_attr, sz); + if (res) + XBT_WARN("pthread_attr_setguardsize failed (%d) for size: %zd", res, sz); } const char *xbt_os_thread_name(xbt_os_thread_t t) @@ -736,6 +766,11 @@ void xbt_os_thread_setstacksize(int size) stack_size = size; } +void xbt_os_thread_setguardsize(int size) +{ + XBT_WARN("xbt_os_thread_setguardsize is not implemented (%d)", size); +} + const char *xbt_os_thread_name(xbt_os_thread_t t) { return t->name; @@ -1234,7 +1269,8 @@ void xbt_os_thread_set_extra_data(void *data) 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)