xbt_assert(simgrid::s4u::Engine::is_initialized(),
"Your MPI program was not properly initialized. The easiest is to use smpirun to start it.");
- // Init is called only once per SMPI process
- if (not smpi_process()->initializing()){
- simgrid::smpi::ActorExt::init();
- }
- if (not smpi_process()->initialized()){
- int rank_traced = simgrid::s4u::this_actor::get_pid();
- TRACE_smpi_init(rank_traced);
- TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::NoOpTIData("init"));
- TRACE_smpi_comm_out(rank_traced);
- TRACE_smpi_computing_init(rank_traced);
- TRACE_smpi_sleeping_init(rank_traced);
- smpi_bench_begin();
- smpi_process()->mark_as_initialized();
- }
+ xbt_assert(not smpi_process()->initializing());
+ xbt_assert(not smpi_process()->initialized());
+
+ simgrid::smpi::ActorExt::init();
+ int rank_traced = simgrid::s4u::this_actor::get_pid();
+ TRACE_smpi_init(rank_traced);
+ TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::NoOpTIData("init"));
+ TRACE_smpi_comm_out(rank_traced);
+ TRACE_smpi_computing_init(rank_traced);
+ TRACE_smpi_sleeping_init(rank_traced);
+ smpi_bench_begin();
+ smpi_process()->mark_as_initialized();
smpi_mpi_init();
smpi_process()->finalize();
TRACE_smpi_comm_out(rank_traced);
- TRACE_smpi_finalize(rank_traced);
return MPI_SUCCESS;
}
smpi_bench_end();
// FIXME: should kill all processes in comm instead
smx_actor_t actor = SIMIX_process_self();
- simgrid::simix::simcall([actor] { actor->exit(); });
+ simgrid::kernel::actor::simcall([actor] { actor->exit(); });
return MPI_SUCCESS;
}
return MPI_SUCCESS;
}
-int PMPI_Error_string(int errorcode, char* string, int* resultlen){
- if (errorcode<0 || errorcode>= MPI_MAX_ERROR_STRING || string ==nullptr){
+int PMPI_Error_string(int errorcode, char* string, int* resultlen)
+{
+ static const char* smpi_error_string[] = {FOREACH_ERROR(GENERATE_STRING)};
+ constexpr int nerrors = (sizeof smpi_error_string) / (sizeof smpi_error_string[0]);
+ if (errorcode < 0 || errorcode >= nerrors || string == nullptr)
return MPI_ERR_ARG;
- } else {
- static const char *smpi_error_string[] = {
- FOREACH_ERROR(GENERATE_STRING)
- };
- *resultlen = strlen(smpi_error_string[errorcode]);
- strncpy(string, smpi_error_string[errorcode], *resultlen);
- return MPI_SUCCESS;
- }
+
+ int len = snprintf(string, MPI_MAX_ERROR_STRING, "%s", smpi_error_string[errorcode]);
+ *resultlen = std::min(len, MPI_MAX_ERROR_STRING - 1);
+ return MPI_SUCCESS;
}
int PMPI_Keyval_create(MPI_Copy_function* copy_fn, MPI_Delete_function* delete_fn, int* keyval, void* extra_state) {