#include "xbt/str.h"
#include "xbt/dict.h"
#include "xbt/RngStream.h"
+#include <xbt/functional.hpp>
#include <xbt/signal.hpp>
#include "src/surf/HostImpl.hpp"
#include "surf/surf.h"
double kill_time = process->kill_time;
int auto_restart = process->on_failure == SURF_PROCESS_ON_FAILURE_DIE ? 0 : 1;
+ std::function<void()> code = simgrid::xbt::wrapMain(parse_code, process->argc, process->argv);
+
smx_process_arg_t arg = NULL;
smx_process_t process_created = NULL;
arg = new simgrid::simix::ProcessArg();
arg->name = std::string(process->argv[0]);
- arg->code = parse_code;
+ arg->code = code;
arg->data = NULL;
arg->hostname = sg_host_get_name(host);
- arg->args.assign(process->argc, process->argv);
arg->kill_time = kill_time;
arg->properties = current_property_set;
if (!sg_host_simix(host)->boot_processes)
xbt_dynar_push_as(sg_host_simix(host)->boot_processes,smx_process_arg_t,arg);
if (start_time > SIMIX_get_clock()) {
+
arg = new simgrid::simix::ProcessArg();
arg->name = std::string(process->argv[0]);
- arg->code = parse_code;
+ arg->code = std::move(code);
arg->data = NULL;
arg->hostname = sg_host_get_name(host);
- arg->args.assign(process->argc, process->argv);
arg->kill_time = kill_time;
arg->properties = current_property_set;
XBT_DEBUG("Process %s(%s) will be started at time %f",
arg->name.c_str(), arg->hostname, start_time);
- SIMIX_timer_set(start_time, [](void* p) {
- smx_process_arg_t arg = static_cast<smx_process_arg_t>(p);
+ SIMIX_timer_set(start_time, [=]() {
simix_global->create_process_function(
arg->name.c_str(),
- arg->code,
+ std::move(arg->code),
arg->data,
arg->hostname,
arg->kill_time,
- std::move(arg->args),
arg->properties,
arg->auto_restart,
NULL);
delete arg;
- }, arg);
+ });
} else { // start_time <= SIMIX_get_clock()
XBT_DEBUG("Starting Process %s(%s) right now",
arg->name.c_str(), sg_host_get_name(host));
if (simix_global->create_process_function)
process_created = simix_global->create_process_function(
- arg->name.c_str(),
- parse_code,
- NULL,
- sg_host_get_name(host),
- kill_time,
- arg->args,
- current_property_set,
- auto_restart, NULL);
+ arg->name.c_str(), std::move(code), NULL,
+ sg_host_get_name(host), kill_time,
+ current_property_set, auto_restart, NULL);
else
process_created = simcall_process_create(
- arg->name.c_str(), parse_code, NULL, sg_host_get_name(host), kill_time,
- arg->args, current_property_set,auto_restart);
+ arg->name.c_str(), std::move(code), NULL, sg_host_get_name(host), kill_time,
+ current_property_set,auto_restart);
/* verify if process has been created (won't be the case if the host is currently dead, but that's fine) */
if (!process_created) {