Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : cleanups for heap comparison from global and local variables
[simgrid.git] / src / simix / smx_context_sysv.c
index b292db7..90e6b84 100644 (file)
 
 #include "xbt/parmap.h"
 #include "smx_private.h"
-#include "gras_config.h"
+#include "internal_config.h"
 #include "context_sysv_config.h"        /* loads context system definitions */
+#include "mc/mc.h"
+
+#ifdef _XBT_WIN32
+#  include <win32_ucontext.h>     /* context relative declarations */
+#else
+#  include <ucontext.h>           /* context relative declarations */
+#endif
 
 #ifdef HAVE_VALGRIND_VALGRIND_H
 #  include <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[0];                /* the thread stack (must remain the last element of the structure) */
+} s_smx_ctx_sysv_t, *smx_ctx_sysv_t;
+
 #ifdef CONTEXT_THREADS
 static xbt_parmap_t sysv_parmap;
 static ucontext_t* sysv_workers_stacks;        /* space to save the worker's stack in each thread */
@@ -152,6 +168,9 @@ smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code,
     sysv_maestro_context = context;
   }
 
+  if(MC_is_active() && code)
+    MC_new_stack_area(context, ((smx_process_t)((smx_context_t)context)->data)->name, &(context->uc), size);
+
   return (smx_context_t) context;
 }
 
@@ -239,14 +258,12 @@ static void smx_ctx_sysv_resume_serial(smx_process_t first_process)
 
 static void smx_ctx_sysv_runall_serial(void)
 {
-  if (!xbt_dynar_is_empty(simix_global->process_to_run)) {
-    smx_process_t first_process =
-        xbt_dynar_get_as(simix_global->process_to_run, 0, smx_process_t);
-    sysv_process_index = 1;
+  smx_process_t first_process =
+      xbt_dynar_get_as(simix_global->process_to_run, 0, smx_process_t);
+  sysv_process_index = 1;
 
-    /* execute the first process */
-    smx_ctx_sysv_resume_serial(first_process);
-  }
+  /* execute the first process */
+  smx_ctx_sysv_resume_serial(first_process);
 }
 
 static void smx_ctx_sysv_stop_parallel(smx_context_t context)