} s_smx_ctx_sysv_t, *smx_ctx_sysv_t;
static smx_context_t
-smx_ctx_sysv_factory_create_context(xbt_main_func_t code, int argc, char** argv,
+smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char** argv,
void_f_pvoid_t cleanup_func, void* cleanup_arg);
-static void smx_ctx_sysv_free(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_resume(smx_context_t new_context);
static void smx_ctx_sysv_wrapper(void);
smx_ctx_base_factory_init(factory);
- (*factory)->create_context = smx_ctx_sysv_factory_create_context;
+ (*factory)->create_context = smx_ctx_sysv_create_context;
/* Do not overload that method (*factory)->finalize */
(*factory)->free = smx_ctx_sysv_free;
(*factory)->stop = smx_ctx_sysv_stop;
(*factory)->name = "smx_sysv_context_factory";
}
-static smx_context_t
-smx_ctx_sysv_factory_create_context(xbt_main_func_t code, int argc, char** argv,
- void_f_pvoid_t cleanup_func, void* cleanup_arg)
-{
+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) {
+
smx_ctx_sysv_t context = (smx_ctx_sysv_t)smx_ctx_base_factory_create_context_sized
- (sizeof(s_smx_ctx_sysv_t), code,argc,argv,cleanup_func,cleanup_arg);
+ (size, code,argc,argv,cleanup_func,cleanup_arg);
/* If the user provided a function for the process then use it
otherwise is the context for maestro */
}
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) {
+
+ return smx_ctx_sysv_create_context_sized(sizeof(s_smx_ctx_sysv_t),
+ code,argc,argv,cleanup_func,cleanup_arg);
+
}
-static void smx_ctx_sysv_free(smx_context_t context) {
+void smx_ctx_sysv_free(smx_context_t context) {
if (context){
smx_ctx_base_free(context);
}
-static void smx_ctx_sysv_stop(smx_context_t context) {
+void smx_ctx_sysv_stop(smx_context_t context) {
smx_ctx_base_stop(context);
smx_ctx_sysv_suspend(context);
}
-static void smx_ctx_sysv_wrapper()
-{
+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
smx_ctx_sysv_stop((smx_context_t)context);
}
-static void smx_ctx_sysv_suspend(smx_context_t context) {
+void smx_ctx_sysv_suspend(smx_context_t context) {
ucontext_t maestro_ctx = ((smx_ctx_sysv_t)simix_global->maestro_process->context)->uc;
int rv = swapcontext(&((smx_ctx_sysv_t) context)->uc, &maestro_ctx);
xbt_assert0((rv == 0), "Context swapping failure");
}
-static void
-smx_ctx_sysv_resume(smx_context_t new_context) {
+void smx_ctx_sysv_resume(smx_context_t new_context) {
smx_ctx_sysv_t maestro = (smx_ctx_sysv_t)simix_global->maestro_process->context;
int rv = swapcontext(&(maestro->uc), &((smx_ctx_sysv_t)new_context)->uc);