From: Augustin Degomme Date: Fri, 9 Nov 2012 12:58:14 +0000 (+0100) Subject: add a function in xbt to allow setting the stack size of a pthread, according to... X-Git-Tag: v3_9_rc1~91^2~127 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/3cdd0ac83adfa4f28b05b4c1961555e5203bc6a8 add a function in xbt to allow setting the stack size of a pthread, according to the value of the contexts/stack_size parameter (which was only raw/ucontext before) --- diff --git a/include/xbt/xbt_os_thread.h b/include/xbt/xbt_os_thread.h index 866958a634..7d7bd290d6 100644 --- a/include/xbt/xbt_os_thread.h +++ b/include/xbt/xbt_os_thread.h @@ -66,7 +66,7 @@ XBT_PUBLIC(void) xbt_os_thread_join(xbt_os_thread_t thread, XBT_PUBLIC(void) xbt_os_thread_yield(void); XBT_PUBLIC(void) xbt_os_thread_cancel(xbt_os_thread_t thread); XBT_PUBLIC(void *) xbt_os_thread_getparam(void); - +XBT_PUBLIC(void) xbt_os_thread_setstacksize(int stack_size); /** \brief Thread mutex data type (opaque structure) */ typedef struct xbt_os_mutex_ *xbt_os_mutex_t; diff --git a/src/simix/smx_context_thread.c b/src/simix/smx_context_thread.c index c8260dbcb6..e29c655c15 100644 --- a/src/simix/smx_context_thread.c +++ b/src/simix/smx_context_thread.c @@ -92,12 +92,15 @@ smx_ctx_thread_factory_create_context(xbt_main_func_t code, int argc, if (code) { context->begin = xbt_os_sem_init(0); context->end = xbt_os_sem_init(0); + xbt_os_thread_setstacksize(smx_context_stack_size); + /* create and start the process */ /* NOTE: The first argument to xbt_os_thread_create used to be the process * * name, but now the name is stored at SIMIX level, so we pass a null */ context->thread = xbt_os_thread_create(NULL, smx_ctx_thread_wrapper, context, context); + /* wait the starting of the newly created process */ xbt_os_sem_acquire(context->end); diff --git a/src/xbt/xbt_os_thread.c b/src/xbt/xbt_os_thread.c index 08e82d5563..2e9e91f910 100644 --- a/src/xbt/xbt_os_thread.c +++ b/src/xbt/xbt_os_thread.c @@ -53,6 +53,11 @@ 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 */ +//FIXME: find where to put this +static pthread_attr_t attr; +static int thread_attr_inited = 0; + /* frees the xbt_os_thread_t corresponding to the current thread */ static void xbt_os_thread_free_thread_data(xbt_os_thread_t thread) { @@ -159,6 +164,7 @@ static void *wrapper_start_routine(void *s) return res; } + xbt_os_thread_t xbt_os_thread_create(const char *name, pvoid_f_pvoid_t start_routine, void *param, @@ -175,14 +181,24 @@ 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), NULL, + if ((errcode = pthread_create(&(res_thread->t), thread_attr_inited!=0? &attr: NULL, wrapper_start_routine, res_thread))) THROWF(system_error, errcode, "pthread_create failed: %s", strerror(errcode)); + + return res_thread; } + +void xbt_os_thread_setstacksize(int stack_size) +{ + pthread_attr_init(&attr); + pthread_attr_setstacksize (&attr, stack_size); + thread_attr_inited=1; +} + const char *xbt_os_thread_name(xbt_os_thread_t t) { return t->name; @@ -643,7 +659,7 @@ typedef struct xbt_os_thread_ { /* the default size of the stack of the threads (in bytes)*/ #define XBT_DEFAULT_THREAD_STACK_SIZE 4096 - +static int stack_size=0; /* key to the TLS containing the xbt_os_thread_t structure */ static unsigned long xbt_self_thread_key; @@ -694,7 +710,7 @@ xbt_os_thread_t xbt_os_thread_create(const char *name, t->start_routine = start_routine; t->param = param; t->extra_data = extra_data; - t->handle = CreateThread(NULL, XBT_DEFAULT_THREAD_STACK_SIZE, + t->handle = CreateThread(NULL, stack_size==0 ? XBT_DEFAULT_THREAD_STACK_SIZE : stack_size, (LPTHREAD_START_ROUTINE) wrapper_start_routine, t, STACK_SIZE_PARAM_IS_A_RESERVATION, &(t->id)); @@ -706,6 +722,11 @@ xbt_os_thread_t xbt_os_thread_create(const char *name, return t; } +void xbt_os_thread_setstacksize(int stack_size) +{ + stack_size=stack_size; +} + const char *xbt_os_thread_name(xbt_os_thread_t t) { return t->name;