Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Factorize valgrind stuff.
authorArnaud Giersch <arnaud.giersch@iut-bm.univ-fcomte.fr>
Thu, 13 Mar 2014 21:45:38 +0000 (22:45 +0100)
committerArnaud Giersch <arnaud.giersch@iut-bm.univ-fcomte.fr>
Thu, 13 Mar 2014 21:45:38 +0000 (22:45 +0100)
Save valgrind_stack_id on the allocated stack.

src/simix/smx_context.c
src/simix/smx_context_raw.c
src/simix/smx_context_sysv.c
src/simix/smx_private.h

index 12552da..57d84e2 100644 (file)
 #include "simgrid/sg_config.h"
 #include "internal_config.h"
 
+#ifdef HAVE_VALGRIND_VALGRIND_H
+# include <valgrind/valgrind.h>
+#endif
+
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_context, simix,
                                 "Context switching mechanism");
 
@@ -101,11 +105,30 @@ void SIMIX_context_mod_exit(void)
 
 void *SIMIX_context_stack_new(void)
 {
-  return xbt_malloc0(smx_context_stack_size);
+  void *stack = xbt_malloc0(smx_context_stack_size);
+
+#ifdef HAVE_VALGRIND_VALGRIND_H
+  unsigned int valgrind_stack_id =
+    VALGRIND_STACK_REGISTER(stack, (char *)stack + smx_context_stack_size);
+  memcpy((char *)stack + smx_context_usable_stack_size, &valgrind_stack_id,
+         sizeof valgrind_stack_id);
+#endif
+
+  return stack;
 }
 
 void SIMIX_context_stack_delete(void *stack)
 {
+  if (!stack)
+    return;
+
+#ifdef HAVE_VALGRIND_VALGRIND_H
+  unsigned int valgrind_stack_id;
+  memcpy(&valgrind_stack_id, (char *)stack + smx_context_usable_stack_size,
+         sizeof valgrind_stack_id);
+  VALGRIND_STACK_DEREGISTER(valgrind_stack_id);
+#endif
+
   xbt_free(stack);
 }
 
index f380e90..37e0763 100644 (file)
 #include "xbt/parmap.h"
 #include "mc/mc.h"
 
-#ifdef HAVE_VALGRIND_VALGRIND_H
-#  include <valgrind/valgrind.h>
-#endif                          /* HAVE_VALGRIND_VALGRIND_H */
-
 typedef char * raw_stack_t;
 typedef void (*rawctx_entry_point_t)(void *);
 
@@ -21,9 +17,6 @@ typedef struct s_smx_ctx_raw {
   s_smx_ctx_base_t super;         /* Fields of super implementation */
   char *malloced_stack;           /* malloced area containing the stack */
   raw_stack_t stack_top;          /* pointer to stack top (within previous area) */
-#ifdef HAVE_VALGRIND_VALGRIND_H
-  unsigned int valgrind_stack_id; /* the valgrind stack id */
-#endif
 #ifdef TIME_BENCH_PER_SR
   unsigned int thread;            /* Just for measuring purposes */
 #endif
@@ -320,14 +313,9 @@ smx_ctx_raw_create_context(xbt_main_func_t code, int argc, char **argv,
      if (code) {
        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);
-
-#ifdef HAVE_VALGRIND_VALGRIND_H
-       context->valgrind_stack_id =
-           VALGRIND_STACK_REGISTER(context->malloced_stack,
-               context->malloced_stack + smx_context_stack_size);
-#endif                          /* HAVE_VALGRIND_VALGRIND_H */
+           raw_makecontext(context->malloced_stack,
+                           smx_context_usable_stack_size,
+                           (void_f_pvoid_t)smx_ctx_raw_wrapper, context);
 
      } else {
        if(process != NULL && raw_maestro_context==NULL)
@@ -348,14 +336,7 @@ smx_ctx_raw_create_context(xbt_main_func_t code, int argc, char **argv,
 static void smx_ctx_raw_free(smx_context_t context)
 {
   if (context) {
-
-#ifdef HAVE_VALGRIND_VALGRIND_H
-    VALGRIND_STACK_DEREGISTER(((smx_ctx_raw_t)
-        context)->valgrind_stack_id);
-#endif                          /* HAVE_VALGRIND_VALGRIND_H */
-
     SIMIX_context_stack_delete(((smx_ctx_raw_t) context)->malloced_stack);
-
   }
   smx_ctx_base_free(context);
 }
index 4ca2244..d8f90fe 100644 (file)
 #  include <ucontext.h>           /* context relative declarations */
 #endif
 
-#ifdef HAVE_VALGRIND_VALGRIND_H
-#  include <valgrind/valgrind.h>
-#endif                          /* HAVE_VALGRIND_VALGRIND_H */
-
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context);
 
 typedef struct s_smx_ctx_sysv {
   s_smx_ctx_base_t super;       /* Fields of super implementation */
   ucontext_t uc;                /* the ucontext that executes the code */
-#ifdef HAVE_VALGRIND_VALGRIND_H
-  unsigned int valgrind_stack_id;       /* the valgrind stack id */
-#endif
   char *stack;                  /* the thread stack */
 } s_smx_ctx_sysv_t, *smx_ctx_sysv_t;
 
@@ -135,17 +128,11 @@ smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char **argv,
     context->uc.uc_link = NULL;
 
     context->uc.uc_stack.ss_sp =
-        pth_skaddr_makecontext(context->stack, smx_context_stack_size);
+        pth_skaddr_makecontext(context->stack, smx_context_usable_stack_size);
 
     context->uc.uc_stack.ss_size =
-        pth_sksize_makecontext(context->stack, smx_context_stack_size);
-
-#ifdef HAVE_VALGRIND_VALGRIND_H
-    context->valgrind_stack_id =
-        VALGRIND_STACK_REGISTER(context->uc.uc_stack.ss_sp,
-                                ((char *) context->uc.uc_stack.ss_sp) +
-                                context->uc.uc_stack.ss_size);
-#endif                          /* HAVE_VALGRIND_VALGRIND_H */
+        pth_sksize_makecontext(context->stack, smx_context_usable_stack_size);
+
     memcpy(ctx_addr, &context, sizeof(smx_ctx_sysv_t));
     switch (CTX_ADDR_LEN) {
     case 1:
@@ -167,7 +154,7 @@ smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char **argv,
 
   if(MC_is_active() && code)
     MC_new_stack_area(context->stack, ((smx_context_t)context)->process->name,
-                      &(context->uc), smx_context_stack_size);
+                      &(context->uc), smx_context_usable_stack_size);
 
   return (smx_context_t) context;
 }
@@ -176,11 +163,6 @@ static void smx_ctx_sysv_free(smx_context_t context)
 {
 
   if (context) {
-
-#ifdef HAVE_VALGRIND_VALGRIND_H
-    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 87a76e4..2b62920 100644 (file)
@@ -201,6 +201,16 @@ typedef struct s_smx_action {
 void SIMIX_context_mod_init(void);
 void SIMIX_context_mod_exit(void);
 
+/* We are using the bottom of the stack to save some information, like the
+ * valgrind_stack_id. Define smx_context_usable_stack_size to give the remaining
+ * size for the stack. */
+#ifdef HAVE_VALGRIND_VALGRIND_H
+# define smx_context_usable_stack_size                                  \
+  (smx_context_stack_size - sizeof(unsigned int)) /* for valgrind_stack_id */
+#else
+# define smx_context_usable_stack_size smx_context_stack_size
+#endif
+
 void *SIMIX_context_stack_new(void);
 void SIMIX_context_stack_delete(void *stack);