Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Biggest commit ever (SIMIX2): the user processes can now run in parallel
[simgrid.git] / src / simix / smx_context_sysv.c
index a1dc635..9774fda 100644 (file)
@@ -25,11 +25,11 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context);
 
 static smx_context_t
 smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char **argv,
-                            void_f_pvoid_t cleanup_func,
-                            void *cleanup_arg);
+    void_pfn_smxprocess_t cleanup_func,
+    smx_process_t process);
 
 
-static void smx_ctx_sysv_wrapper(void);
+static void smx_ctx_sysv_wrapper(smx_ctx_sysv_t context);
 
 void SIMIX_ctx_sysv_factory_init(smx_context_factory_t * factory)
 {
@@ -41,15 +41,15 @@ void SIMIX_ctx_sysv_factory_init(smx_context_factory_t * factory)
   (*factory)->free = smx_ctx_sysv_free;
   (*factory)->stop = smx_ctx_sysv_stop;
   (*factory)->suspend = smx_ctx_sysv_suspend;
-  (*factory)->resume = smx_ctx_sysv_resume;
+  (*factory)->runall = smx_ctx_sysv_runall;
   (*factory)->name = "smx_sysv_context_factory";
 }
 
 smx_context_t
 smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code,
                                   int argc, char **argv,
-                                  void_f_pvoid_t cleanup_func,
-                                  void *cleanup_arg)
+                                  void_pfn_smxprocess_t cleanup_func,
+                                  smx_process_t process)
 {
 
   smx_ctx_sysv_t context =
@@ -58,7 +58,7 @@ smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code,
                                                                  argc,
                                                                  argv,
                                                                  cleanup_func,
-                                                                 cleanup_arg);
+                                                                 process);
 
   /* If the user provided a function for the process then use it
      otherwise is the context for maestro */
@@ -83,7 +83,8 @@ smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code,
                                 context->uc.uc_stack.ss_size);
 #endif                          /* HAVE_VALGRIND_VALGRIND_H */
 
-    makecontext(&((smx_ctx_sysv_t) context)->uc, smx_ctx_sysv_wrapper, 0);
+    makecontext(&((smx_ctx_sysv_t) context)->uc, (void (*)())smx_ctx_sysv_wrapper,
+                sizeof(void*)/sizeof(int), context);
   }
 
   return (smx_context_t) context;
@@ -92,12 +93,13 @@ smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code,
 
 static smx_context_t
 smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char **argv,
-                            void_f_pvoid_t cleanup_func, void *cleanup_arg)
+    void_pfn_smxprocess_t cleanup_func,
+    smx_process_t process)
 {
 
   return smx_ctx_sysv_create_context_sized(sizeof(s_smx_ctx_sysv_t),
                                            code, argc, argv, cleanup_func,
-                                           cleanup_arg);
+                                           process);
 
 }
 
@@ -122,18 +124,8 @@ void smx_ctx_sysv_stop(smx_context_t context)
   smx_ctx_sysv_suspend(context);
 }
 
-void smx_ctx_sysv_wrapper()
-{
-  /*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
-     all the arguments of the function should be int(32 bits), making it useless
-     in 64-bit architectures where pointers are 64 bit long.
-   */
-  smx_ctx_sysv_t context =
-      (smx_ctx_sysv_t) simix_global->current_process->context;
-
+void smx_ctx_sysv_wrapper(smx_ctx_sysv_t context)
+{ 
   (context->super.code) (context->super.argc, context->super.argv);
 
   smx_ctx_sysv_stop((smx_context_t) context);
@@ -159,3 +151,13 @@ void smx_ctx_sysv_resume(smx_context_t new_context)
 
   xbt_assert0((rv == 0), "Context swapping failure");
 }
+
+void smx_ctx_sysv_runall(xbt_swag_t processes)
+{
+  smx_process_t process;
+  while((process = xbt_swag_extract(processes))){
+    simix_global->current_process = process;
+    smx_ctx_sysv_resume(process->context);
+    simix_global->current_process = simix_global->maestro_process;
+  }
+}