- // This is mostly a copy/paste from SIMIX_process_new(),
- // it'd be nice to share some code between those two functions.
-
- sg_host_t host = sg_host_by_name(hostname);
- XBT_DEBUG("Attach process %s on host '%s'", name, hostname);
-
- if (not host->is_on()) {
- XBT_WARN("Cannot launch process '%s' on failed host '%s'", name, hostname);
- return nullptr;
- }
-
- smx_actor_t actor = new simgrid::kernel::actor::ActorImpl(simgrid::xbt::string(name), host);
- /* Actor data */
- actor->set_user_data(data);
- actor->code = nullptr;
-
- if (parent_process != nullptr)
- actor->ppid_ = parent_process->pid_;
-
- XBT_VERB("Create context %s", actor->get_cname());
- xbt_assert(simix_global != nullptr, "simix is not initialized, please call MSG_init first");
- actor->context_ = simix_global->context_factory->attach(&SIMIX_process_cleanup, actor);
-
- /* Add properties */
- if (properties != nullptr)
- for (auto const& kv : *properties)
- actor->set_property(kv.first, kv.second);
-
- /* Add the process to it's host process list */
- host->pimpl_->process_list_.push_back(*actor);
-
- /* Now insert it in the global process list and in the process to run list */
- simix_global->process_list[actor->pid_] = actor;
- XBT_DEBUG("Inserting [%p] %s(%s) in the to_run list", actor, actor->get_cname(), host->get_cname());
- simix_global->actors_to_run.push_back(actor);
- intrusive_ptr_add_ref(actor);
-
- auto* context = dynamic_cast<simgrid::kernel::context::AttachContext*>(actor->context_);
- xbt_assert(nullptr != context, "Not a suitable context");
- context->attach_start();
-
- /* The on_creation() signal must be delayed until there, where the pid and everything is set */
- simgrid::s4u::ActorPtr tmp = actor->iface(); // Passing this directly to on_creation will lead to crashes
- simgrid::s4u::Actor::on_creation(tmp);
-
- return actor;