Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Factorize stack creation.
authorArnaud Giersch <arnaud.giersch@iut-bm.univ-fcomte.fr>
Wed, 12 Mar 2014 13:49:32 +0000 (14:49 +0100)
committerArnaud Giersch <arnaud.giersch@iut-bm.univ-fcomte.fr>
Wed, 12 Mar 2014 21:59:12 +0000 (22:59 +0100)
src/simix/smx_context.c
src/simix/smx_context_raw.c
src/simix/smx_context_sysv.c
src/simix/smx_private.h

index 3a5a066..12552da 100644 (file)
@@ -99,6 +99,16 @@ void SIMIX_context_mod_exit(void)
   xbt_dict_remove((xbt_dict_t) _sg_cfg_set,"contexts/factory");
 }
 
+void *SIMIX_context_stack_new(void)
+{
+  return xbt_malloc0(smx_context_stack_size);
+}
+
+void SIMIX_context_stack_delete(void *stack)
+{
+  xbt_free(stack);
+}
+
 /**
  * \brief Returns whether some parallel threads are used
  * for the user contexts.
index d475f6b..df733cd 100644 (file)
@@ -316,7 +316,7 @@ smx_ctx_raw_create_context(xbt_main_func_t code, int argc, char **argv,
   /* if the user provided a function for the process then use it,
      otherwise it is the context for maestro */
      if (code) {
-       context->malloced_stack = xbt_malloc0(smx_context_stack_size);
+       context->malloced_stack = SIMIX_context_stack_new();
        context->stack_top =
            raw_makecontext(context->malloced_stack, smx_context_stack_size,
                (void_f_pvoid_t) smx_ctx_raw_wrapper, context);
@@ -352,7 +352,8 @@ static void smx_ctx_raw_free(smx_context_t context)
         context)->valgrind_stack_id);
 #endif                          /* HAVE_VALGRIND_VALGRIND_H */
 
-    free(((smx_ctx_raw_t) context)->malloced_stack);
+    SIMIX_context_stack_delete(((smx_ctx_raw_t) context)->malloced_stack);
+
   }
   smx_ctx_base_free(context);
 }
index b1906cc..7b5e292 100644 (file)
@@ -32,7 +32,7 @@ typedef struct s_smx_ctx_sysv {
 #ifdef HAVE_VALGRIND_VALGRIND_H
   unsigned int valgrind_stack_id;       /* the valgrind stack id */
 #endif
-  char stack[0];                /* the thread stack (must remain the last element of the structure) */
+  char *stack;                  /* the thread stack */
 } s_smx_ctx_sysv_t, *smx_ctx_sysv_t;
 
 #ifdef CONTEXT_THREADS
@@ -135,6 +135,7 @@ smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code,
      otherwise it is the context for maestro */
   if (code) {
 
+    context->stack = SIMIX_context_stack_new();
     getcontext(&(context->uc));
 
     context->uc.uc_link = NULL;
@@ -183,8 +184,7 @@ smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char **argv,
                             smx_process_t process)
 {
 
-  return smx_ctx_sysv_create_context_sized(sizeof(s_smx_ctx_sysv_t) +
-                                           smx_context_stack_size,
+  return smx_ctx_sysv_create_context_sized(sizeof(s_smx_ctx_sysv_t),
                                            code, argc, argv, cleanup_func,
                                            process);
 
@@ -199,7 +199,7 @@ static void smx_ctx_sysv_free(smx_context_t context)
     VALGRIND_STACK_DEREGISTER(((smx_ctx_sysv_t)
                                context)->valgrind_stack_id);
 #endif                          /* HAVE_VALGRIND_VALGRIND_H */
-
+    SIMIX_context_stack_delete(((smx_ctx_sysv_t)context)->stack);
   }
   smx_ctx_base_free(context);
 }
index 5c1cf64..87a76e4 100644 (file)
@@ -201,6 +201,9 @@ typedef struct s_smx_action {
 void SIMIX_context_mod_init(void);
 void SIMIX_context_mod_exit(void);
 
+void *SIMIX_context_stack_new(void);
+void SIMIX_context_stack_delete(void *stack);
+
 void SIMIX_context_set_current(smx_context_t context);
 smx_context_t SIMIX_context_get_current(void);