Use simgrid::simix::kernel() instead.
{
if (name == nullptr)
name = "";
- return (smx_process_t) simcall_BODY_process_create(name, code, data, hostname,
- kill_time, argc, argv, properties,
- auto_restart);
+ auto wrapped_code = simgrid::simix::wrap_main(code, argc, argv);
+ for (int i = 0; i != argc; ++i)
+ xbt_free(argv[i]);
+ xbt_free(argv);
+ smx_process_t res = simcall_process_create(name,
+ std::move(wrapped_code),
+ data, hostname, kill_time, properties, auto_restart);
+ return res;
}
/**
simcall->args[0].dp = arg;
}
-static inline const char* simcall_process_create__get__name(smx_simcall_t simcall) {
- return simcall->args[0].cc;
-}
-static inline void simcall_process_create__set__name(smx_simcall_t simcall, const char* arg) {
- simcall->args[0].cc = arg;
-}
-static inline xbt_main_func_t simcall_process_create__get__code(smx_simcall_t simcall) {
- return (xbt_main_func_t) simcall->args[1].fp;
-}
-static inline void simcall_process_create__set__code(smx_simcall_t simcall, FPtr arg) {
- simcall->args[1].fp = arg;
-}
-static inline void* simcall_process_create__get__data(smx_simcall_t simcall) {
- return simcall->args[2].dp;
-}
-static inline void simcall_process_create__set__data(smx_simcall_t simcall, void* arg) {
- simcall->args[2].dp = arg;
-}
-static inline const char* simcall_process_create__get__hostname(smx_simcall_t simcall) {
- return simcall->args[3].cc;
-}
-static inline void simcall_process_create__set__hostname(smx_simcall_t simcall, const char* arg) {
- simcall->args[3].cc = arg;
-}
-static inline double simcall_process_create__get__kill_time(smx_simcall_t simcall) {
- return simcall->args[4].d;
-}
-static inline void simcall_process_create__set__kill_time(smx_simcall_t simcall, double arg) {
- simcall->args[4].d = arg;
-}
-static inline int simcall_process_create__get__argc(smx_simcall_t simcall) {
- return simcall->args[5].i;
-}
-static inline void simcall_process_create__set__argc(smx_simcall_t simcall, int arg) {
- simcall->args[5].i = arg;
-}
-static inline char** simcall_process_create__get__argv(smx_simcall_t simcall) {
- return (char**) simcall->args[6].dp;
-}
-static inline void simcall_process_create__set__argv(smx_simcall_t simcall, void* arg) {
- simcall->args[6].dp = arg;
-}
-static inline xbt_dict_t simcall_process_create__get__properties(smx_simcall_t simcall) {
- return (xbt_dict_t) simcall->args[7].dp;
-}
-static inline void simcall_process_create__set__properties(smx_simcall_t simcall, void* arg) {
- simcall->args[7].dp = arg;
-}
-static inline int simcall_process_create__get__auto_restart(smx_simcall_t simcall) {
- return simcall->args[8].i;
-}
-static inline void simcall_process_create__set__auto_restart(smx_simcall_t simcall, int arg) {
- simcall->args[8].i = arg;
-}
-static inline void* simcall_process_create__get__result(smx_simcall_t simcall){
- return simcall->result.dp;
-}
-static inline void simcall_process_create__set__result(smx_simcall_t simcall, void* result){
- simcall->result.dp = result;
-}
-
static inline smx_process_t simcall_process_kill__get__process(smx_simcall_t simcall) {
return (smx_process_t) simcall->args[0].dp;
}
XBT_PRIVATE void simcall_HANDLER_vm_shutdown(smx_simcall_t simcall, sg_host_t ind_vm);
XBT_PRIVATE void simcall_HANDLER_vm_save(smx_simcall_t simcall, sg_host_t ind_vm);
XBT_PRIVATE void simcall_HANDLER_vm_restore(smx_simcall_t simcall, sg_host_t ind_vm);
-XBT_PRIVATE void* simcall_HANDLER_process_create(smx_simcall_t simcall, const char* name, xbt_main_func_t code, void* data, const char* hostname, double kill_time, int argc, char** argv, xbt_dict_t properties, int auto_restart);
XBT_PRIVATE void simcall_HANDLER_process_kill(smx_simcall_t simcall, smx_process_t process);
XBT_PRIVATE void simcall_HANDLER_process_killall(smx_simcall_t simcall, int reset_pid);
XBT_PRIVATE void simcall_HANDLER_process_suspend(smx_simcall_t simcall, smx_process_t process);
}
-inline static void* simcall_BODY_process_create(const char* name, xbt_main_func_t code, void* data, const char* hostname, double kill_time, int argc, char** argv, xbt_dict_t properties, int auto_restart) {
- smx_process_t self = SIMIX_process_self();
-
- /* Go to that function to follow the code flow through the simcall barrier */
- if (0) simcall_HANDLER_process_create(&self->simcall, name, code, data, hostname, kill_time, argc, argv, properties, auto_restart);
- /* end of the guide intended to the poor programmer wanting to go from MSG to Surf */
-
- self->simcall.call = SIMCALL_PROCESS_CREATE;
- memset(&self->simcall.result, 0, sizeof(self->simcall.result));
- memset(self->simcall.args, 0, sizeof(self->simcall.args));
- self->simcall.args[0].cc = (const char*) name;
- self->simcall.args[1].fp = (FPtr) code;
- self->simcall.args[2].dp = (void*) data;
- self->simcall.args[3].cc = (const char*) hostname;
- self->simcall.args[4].d = (double) kill_time;
- self->simcall.args[5].i = (int) argc;
- self->simcall.args[6].dp = (void*) argv;
- self->simcall.args[7].dp = (void*) properties;
- self->simcall.args[8].i = (int) auto_restart;
- if (self != simix_global->maestro_process) {
- XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name.c_str(),
- SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
- SIMIX_process_yield(self);
- } else {
- SIMIX_simcall_handle(&self->simcall, 0);
- }
- return (void*) self->simcall.result.dp;
- }
-
inline static void simcall_BODY_process_kill(smx_process_t process) {
smx_process_t self = SIMIX_process_self();
SIMCALL_VM_SHUTDOWN,
SIMCALL_VM_SAVE,
SIMCALL_VM_RESTORE,
- SIMCALL_PROCESS_CREATE,
SIMCALL_PROCESS_KILL,
SIMCALL_PROCESS_KILLALL,
SIMCALL_PROCESS_CLEANUP,
"SIMCALL_VM_SHUTDOWN",
"SIMCALL_VM_SAVE",
"SIMCALL_VM_RESTORE",
- "SIMCALL_PROCESS_CREATE",
"SIMCALL_PROCESS_KILL",
"SIMCALL_PROCESS_KILLALL",
"SIMCALL_PROCESS_CLEANUP",
SIMIX_simcall_answer(simcall);
break;
-case SIMCALL_PROCESS_CREATE:
- simcall->result.dp = simcall_HANDLER_process_create(simcall , simcall->args[0].cc, (xbt_main_func_t) simcall->args[1].fp, simcall->args[2].dp, simcall->args[3].cc, simcall->args[4].d, simcall->args[5].i, (char**) simcall->args[6].dp, (xbt_dict_t) simcall->args[7].dp, simcall->args[8].i);
- SIMIX_simcall_answer(simcall);
- break;
-
case SIMCALL_PROCESS_KILL:
simcall_HANDLER_process_kill(simcall , (smx_process_t) simcall->args[0].dp);
SIMIX_simcall_answer(simcall);
Proc H vm_save (void) (ind_vm, void*, sg_host_t)
Proc H vm_restore (void) (ind_vm, void*, sg_host_t)
-Func H process_create (void*) (name, const char*) (code, FPtr, xbt_main_func_t) (data, void*) (hostname, const char*) (kill_time, double) (argc, int) (argv, void*, char**) (properties, void*, xbt_dict_t) (auto_restart, int)
Proc H process_kill (void) (process, void*, smx_process_t)
Proc H process_killall (void) (reset_pid, int)
Proc - process_cleanup (void) (process, void*, smx_process_t)