Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add a function in xbt to allow setting the stack size of a pthread, according to...
authorAugustin Degomme <degomme@idpann.imag.fr>
Fri, 9 Nov 2012 12:58:14 +0000 (13:58 +0100)
committerAugustin Degomme <degomme@idpann.imag.fr>
Fri, 9 Nov 2012 12:58:14 +0000 (13:58 +0100)
include/xbt/xbt_os_thread.h
src/simix/smx_context_thread.c
src/xbt/xbt_os_thread.c

index 866958a..7d7bd29 100644 (file)
@@ -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;
index c8260db..e29c655 100644 (file)
@@ -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);
 
index 08e82d5..2e9e91f 100644 (file)
@@ -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;