Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fixes to make dist
[simgrid.git] / src / simix / smx_context_sysv.c
index 03e08ab..fe0f7ac 100644 (file)
@@ -25,7 +25,6 @@ typedef struct s_smx_ctx_sysv {
   SMX_CTX_BASE_T;
   ucontext_t uc;                /* the thread that execute the code */
   char stack[STACK_SIZE];       /* the thread stack size */
   SMX_CTX_BASE_T;
   ucontext_t uc;                /* the thread that execute the code */
   char stack[STACK_SIZE];       /* the thread stack size */
-  struct s_smx_ctx_sysv *prev;           /* the previous process */
 #ifdef HAVE_VALGRIND_VALGRIND_H
   unsigned int valgrind_stack_id;       /* the valgrind stack id */
 #endif                          
 #ifdef HAVE_VALGRIND_VALGRIND_H
   unsigned int valgrind_stack_id;       /* the valgrind stack id */
 #endif                          
@@ -38,15 +37,9 @@ smx_ctx_sysv_factory_create_context(xbt_main_func_t code, int argc, char** argv,
 static int smx_ctx_sysv_factory_finalize(smx_context_factory_t *factory);
 
 static void smx_ctx_sysv_free(smx_context_t context);
 static int smx_ctx_sysv_factory_finalize(smx_context_factory_t *factory);
 
 static void smx_ctx_sysv_free(smx_context_t context);
-
-static void smx_ctx_sysv_start(smx_context_t context);
-
 static void smx_ctx_sysv_stop(smx_context_t context);
 static void smx_ctx_sysv_stop(smx_context_t context);
-
 static void smx_ctx_sysv_suspend(smx_context_t context);
 static void smx_ctx_sysv_suspend(smx_context_t context);
-
-static void 
-smx_ctx_sysv_resume(smx_context_t old_context, smx_context_t new_context);
+static void smx_ctx_sysv_resume(smx_context_t new_context);
 
 static void smx_ctx_sysv_wrapper(void);
 
 
 static void smx_ctx_sysv_wrapper(void);
 
@@ -57,7 +50,6 @@ void SIMIX_ctx_sysv_factory_init(smx_context_factory_t *factory)
   (*factory)->create_context = smx_ctx_sysv_factory_create_context;
   (*factory)->finalize = smx_ctx_sysv_factory_finalize;
   (*factory)->free = smx_ctx_sysv_free;
   (*factory)->create_context = smx_ctx_sysv_factory_create_context;
   (*factory)->finalize = smx_ctx_sysv_factory_finalize;
   (*factory)->free = smx_ctx_sysv_free;
-  (*factory)->start = smx_ctx_sysv_start;
   (*factory)->stop = smx_ctx_sysv_stop;
   (*factory)->suspend = smx_ctx_sysv_suspend;
   (*factory)->resume = smx_ctx_sysv_resume;
   (*factory)->stop = smx_ctx_sysv_stop;
   (*factory)->suspend = smx_ctx_sysv_suspend;
   (*factory)->resume = smx_ctx_sysv_resume;
@@ -104,6 +96,8 @@ smx_ctx_sysv_factory_create_context(xbt_main_func_t code, int argc, char** argv,
     context->argv = argv;
     context->cleanup_func = cleanup_func;
     context->cleanup_arg = cleanup_arg;
     context->argv = argv;
     context->cleanup_func = cleanup_func;
     context->cleanup_arg = cleanup_arg;
+
+    makecontext(&((smx_ctx_sysv_t)context)->uc, smx_ctx_sysv_wrapper, 0);
   }
 
   return (smx_context_t)context;
   }
 
   return (smx_context_t)context;
@@ -133,11 +127,6 @@ static void smx_ctx_sysv_free(smx_context_t pcontext)
   }
 }
 
   }
 }
 
-static void smx_ctx_sysv_start(smx_context_t context)
-{  
-  makecontext(&((smx_ctx_sysv_t)context)->uc, smx_ctx_sysv_wrapper, 0);
-}
-
 static void smx_ctx_sysv_stop(smx_context_t pcontext)
 {
   smx_ctx_sysv_t context = (smx_ctx_sysv_t)pcontext;
 static void smx_ctx_sysv_stop(smx_context_t pcontext)
 {
   smx_ctx_sysv_t context = (smx_ctx_sysv_t)pcontext;
@@ -150,7 +139,7 @@ static void smx_ctx_sysv_stop(smx_context_t pcontext)
 
 static void smx_ctx_sysv_wrapper()
 {
 
 static void smx_ctx_sysv_wrapper()
 {
-  /*FIXME: I would like to avoid accesing simix_global to get the current
+  /*FIXME: I would like to avoid accessing simix_global to get the current
     context by passing it as an argument of the wrapper function. The problem
     is that this function is called from smx_ctx_sysv_start, and uses
     makecontext for calling it, and the stupid posix specification states that
     context by passing it as an argument of the wrapper function. The problem
     is that this function is called from smx_ctx_sysv_start, and uses
     makecontext for calling it, and the stupid posix specification states that
@@ -165,28 +154,21 @@ static void smx_ctx_sysv_wrapper()
   smx_ctx_sysv_stop((smx_context_t)context);
 }
 
   smx_ctx_sysv_stop((smx_context_t)context);
 }
 
-static void smx_ctx_sysv_suspend(smx_context_t context)
-{
+static void smx_ctx_sysv_suspend(smx_context_t context) {
   int rv;
   int rv;
+  ucontext_t maestro_ctx = ((smx_ctx_sysv_t)simix_global->maestro_process->context)->uc;
 
 
-  smx_ctx_sysv_t prev_context = ((smx_ctx_sysv_t) context)->prev;
-
-  ((smx_ctx_sysv_t) context)->prev = NULL;
-
-  rv = swapcontext(&((smx_ctx_sysv_t) context)->uc, &prev_context->uc);
+  rv = swapcontext(&((smx_ctx_sysv_t) context)->uc, &maestro_ctx);
 
   xbt_assert0((rv == 0), "Context swapping failure");
 }
 
 static void 
 
   xbt_assert0((rv == 0), "Context swapping failure");
 }
 
 static void 
-smx_ctx_sysv_resume(smx_context_t old_context, smx_context_t new_context)
-{
+smx_ctx_sysv_resume(smx_context_t new_context) {
   int rv;
   int rv;
+  smx_ctx_sysv_t maestro = (smx_ctx_sysv_t)simix_global->maestro_process->context;
 
 
-  ((smx_ctx_sysv_t) new_context)->prev = (smx_ctx_sysv_t)old_context;
-
-  rv = swapcontext(&((smx_ctx_sysv_t)old_context)->uc,
-      &((smx_ctx_sysv_t)new_context)->uc);
+  rv = swapcontext(&(maestro->uc), &((smx_ctx_sysv_t)new_context)->uc);
 
   xbt_assert0((rv == 0), "Context swapping failure");
 }
 
   xbt_assert0((rv == 0), "Context swapping failure");
 }