X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/daed4654ea561b011525bd6d322622eed7ba70c6..f807f3ecd43bd280674b57f277d3af275fbfbaa5:/src/smpi/bindings/smpi_pmpi.cpp diff --git a/src/smpi/bindings/smpi_pmpi.cpp b/src/smpi/bindings/smpi_pmpi.cpp index 06567f1d8c..744b0a37a9 100644 --- a/src/smpi/bindings/smpi_pmpi.cpp +++ b/src/smpi/bindings/smpi_pmpi.cpp @@ -128,10 +128,15 @@ int PMPI_Abort(MPI_Comm comm, int /*errorcode*/) { smpi_bench_end(); CHECK_COMM(1) - // Should kill all processes in comm instead.. but most real implementations also kill everything at this point - XBT_WARN("MPI_Abort was called, something went probably wrong in this simulation ! Killing this process"); - smx_actor_t actor = SIMIX_process_self(); - simgrid::kernel::actor::simcall([actor] { actor->exit(); }); + XBT_WARN("MPI_Abort was called, something went probably wrong in this simulation ! Killing all processes sharing the same MPI_COMM_WORLD"); + smx_actor_t myself = SIMIX_process_self(); + for (int i = 0; i < comm->size(); i++){ + smx_actor_t actor = simgrid::kernel::actor::ActorImpl::by_pid(comm->group()->actor_pid(i)); + if (actor != nullptr && actor != myself) + simgrid::kernel::actor::simcall([actor] { actor->exit(); }); + } + // now ourself + simgrid::kernel::actor::simcall([myself] { myself->exit(); }); return MPI_SUCCESS; } @@ -209,6 +214,7 @@ int PMPI_Initialized(int* flag) { int PMPI_Alloc_mem(MPI_Aint size, MPI_Info /*info*/, void* baseptr) { + CHECK_NEGATIVE(1, MPI_ERR_COUNT, size) void *ptr = xbt_malloc(size); *static_cast(baseptr) = ptr; return MPI_SUCCESS; @@ -243,6 +249,8 @@ int PMPI_Keyval_create(MPI_Copy_function* copy_fn, MPI_Delete_function* delete_f } int PMPI_Keyval_free(int* keyval) { + CHECK_NULL(1, MPI_ERR_ARG, keyval) + CHECK_VAL(1, MPI_KEYVAL_INVALID, MPI_ERR_KEYVAL, *keyval) return simgrid::smpi::Keyval::keyval_free(keyval); }