+void sg_platf_new_process(sg_platf_process_cbarg_t process)
+{
+ sg_host_t host = sg_host_by_name(process->host);
+ if (!host) {
+ // The requested host does not exist. Do a nice message to the user
+ char *tmp = bprintf("Cannot create process '%s': host '%s' does not exist\nExisting hosts: '",process->function, process->host);
+ xbt_strbuff_t msg = xbt_strbuff_new_from(tmp);
+ free(tmp);
+ xbt_dynar_t all_hosts = xbt_dynar_sort_strings(sg_hosts_as_dynar());
+ simgrid::s4u::Host* host;
+ unsigned int cursor;
+ xbt_dynar_foreach(all_hosts,cursor, host) {
+ xbt_strbuff_append(msg,host->name().c_str());
+ xbt_strbuff_append(msg,"', '");
+ if (msg->used > 1024) {
+ msg->data[msg->used-3]='\0';
+ msg->used -= 3;
+
+ xbt_strbuff_append(msg," ...(list truncated)......");// That will be shortened by 3 chars when existing the loop
+ }
+ }
+ msg->data[msg->used-3]='\0';
+ xbt_die("%s", msg->data);
+ }
+ simgrid::simix::ActorCodeFactory& factory = SIMIX_get_actor_code_factory(process->function);
+ xbt_assert(factory, "Function '%s' unknown", process->function);
+
+ double start_time = process->start_time;
+ double kill_time = process->kill_time;
+ int auto_restart = process->on_failure == SURF_PROCESS_ON_FAILURE_DIE ? 0 : 1;
+
+ std::vector<std::string> args(process->argv, process->argv + process->argc);
+ std::function<void()> code = factory(std::move(args));
+
+ smx_process_arg_t arg = nullptr;
+ smx_process_t process_created = nullptr;
+
+ arg = new simgrid::simix::ProcessArg();
+ arg->name = std::string(process->argv[0]);
+ arg->code = code;
+ arg->data = nullptr;
+ arg->hostname = sg_host_get_name(host);
+ arg->kill_time = kill_time;
+ arg->properties = current_property_set;
+ if (!sg_host_simix(host)->boot_processes)
+ sg_host_simix(host)->boot_processes = xbt_dynar_new(sizeof(smx_process_arg_t), _SIMIX_host_free_process_arg);
+
+ 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 = std::move(code);
+ arg->data = nullptr;
+ arg->hostname = sg_host_get_name(host);
+ 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, [=]() {
+ simix_global->create_process_function(
+ arg->name.c_str(),
+ std::move(arg->code),
+ arg->data,
+ arg->hostname,
+ arg->kill_time,
+ arg->properties,
+ arg->auto_restart,
+ nullptr);
+ delete 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(), std::move(code), nullptr,
+ sg_host_get_name(host), kill_time,
+ current_property_set, auto_restart, nullptr);
+ else
+ process_created = simcall_process_create(
+ arg->name.c_str(), std::move(code), nullptr, 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) {
+ return;
+ }
+ }
+ current_property_set = nullptr;