- if (smpi_process_count() == 0) {
- xbt_die("SimGrid was not initialized properly before entering MPI_Init. Aborting, please check compilation process "
- "and use smpirun\n");
- }
- if (argc != nullptr && argv != nullptr) {
- simgrid::s4u::ActorPtr proc = simgrid::s4u::Actor::self();
- proc->get_impl()->context_->set_cleanup(&SIMIX_process_cleanup);
- // cheinrich: I'm not sure what the impact of the SMPI_switch_data_segment on this call is. I moved
- // this up here so that I can set the privatized region before the switch.
- ActorExt* process = smpi_process_remote(proc);
- //if we are in MPI_Init and argc handling has already been done.
- if (process->initialized())
- return;
-
- process->state_ = SmpiProcessState::INITIALIZING;
-
- char* instance_id = (*argv)[1];
- try {
- int rank = std::stoi(std::string((*argv)[2]));
- smpi_deployment_register_process(instance_id, rank, proc);
- } catch (std::invalid_argument& ia) {
- throw std::invalid_argument(std::string("Invalid rank: ") + (*argv)[2]);
- }
+ const simgrid::s4u::Actor* self = simgrid::s4u::Actor::self();
+ const char* id = self->get_property("instance_id");
+ xbt_assert(id != nullptr, "Actor '%s' seem to be calling MPI_Init(), but it was created outside of MPI, wasn't it?",
+ self->get_cname());
+ ext->instance_id_ = id;
+ const int rank = static_cast<int>(xbt_str_parse_int(self->get_property("rank"), "Cannot parse rank"));