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)
{
(*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 =
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 */
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;
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);
}
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);
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;
+ }
+}