X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2f2e508cacac36bd81d1242f11ec2d40661dcb71..c49f2131b81992d4f990d9acb62dd8b365804fdc:/src/smpi/internals/smpi_global.cpp diff --git a/src/smpi/internals/smpi_global.cpp b/src/smpi/internals/smpi_global.cpp index 6f6056b331..719aac55d4 100644 --- a/src/smpi/internals/smpi_global.cpp +++ b/src/smpi/internals/smpi_global.cpp @@ -4,6 +4,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "mc/mc.h" +#include "simgrid/Exception.hpp" #include "simgrid/plugins/file_system.h" #include "simgrid/s4u/Engine.hpp" #include "smpi_coll.hpp" @@ -12,7 +13,6 @@ #include "smpi_host.hpp" #include "src/kernel/EngineImpl.hpp" #include "src/kernel/activity/CommImpl.hpp" -#include "src/simix/smx_private.hpp" #include "src/smpi/include/smpi_actor.hpp" #include "xbt/config.hpp" #include "xbt/file.hpp" @@ -318,8 +318,18 @@ static int smpi_run_entry_point(const F& entry_point, const std::string& executa __io_set_argv(argv); #elif SMPI_GFORTRAN _gfortran_set_args(argc, argv); -#endif - int res = entry_point(argc, argv); +#endif + + try { + int res = entry_point(argc, argv); + if (res != 0) { + XBT_WARN("SMPI process did not return 0. Return value : %d", res); + if (smpi_exit_status == 0) + smpi_exit_status = res; + } + } catch (simgrid::ForcefulKillException const& e) { + XBT_DEBUG("Caught a ForcefulKillException: %s", e.what()); + } #if SMPI_IFORT for_rtl_finish_ (); @@ -329,11 +339,6 @@ static int smpi_run_entry_point(const F& entry_point, const std::string& executa delete args4argv; #endif - if (res != 0){ - XBT_WARN("SMPI process did not return 0. Return value : %d", res); - if (smpi_exit_status == 0) - smpi_exit_status = res; - } return 0; } @@ -544,12 +549,12 @@ int smpi_main(const char* executable, int argc, char* argv[]) } smpi_init_options_internal(true); - auto engine = simgrid::s4u::Engine::get_instance(&argc, argv); + simgrid::s4u::Engine engine(&argc, argv); sg_storage_file_system_init(); // parse the platform file: get the host list - engine->load_platform(argv[1]); - engine->set_default_comm_data_copy_callback(smpi_comm_copy_buffer_callback); + engine.load_platform(argv[1]); + engine.set_default_comm_data_copy_callback(smpi_comm_copy_buffer_callback); if (smpi_cfg_privatization() == SmpiPrivStrategies::DLOPEN) smpi_init_privatization_dlopen(executable); @@ -558,12 +563,12 @@ int smpi_main(const char* executable, int argc, char* argv[]) simgrid::smpi::colls::set_collectives(); simgrid::smpi::colls::smpi_coll_cleanup_callback = nullptr; - + SMPI_init(); const std::vector args(argv + 2, argv + argc); int rank_counts = - smpi_deployment_smpirun(engine, smpi_hostfile.get(), smpi_np.get(), smpi_replay.get(), smpi_map.get(), args); + smpi_deployment_smpirun(&engine, smpi_hostfile.get(), smpi_np.get(), smpi_replay.get(), smpi_map.get(), args); SMPI_app_instance_register(smpi_default_instance_name.c_str(), nullptr, rank_counts); MPI_COMM_WORLD = *smpi_deployment_comm_world(smpi_default_instance_name); @@ -575,7 +580,7 @@ int smpi_main(const char* executable, int argc, char* argv[]) if (MC_is_active()) { MC_run(); } else { - simgrid::kernel::EngineImpl::get_instance()->run(); + engine.get_impl()->run(); xbt_os_walltimer_stop(global_timer); simgrid::smpi::utils::print_time_analysis(xbt_os_timer_elapsed(global_timer)); @@ -636,3 +641,12 @@ void SMPI_thread_create() { TRACE_smpi_init(simgrid::s4u::this_actor::get_pid(), __func__); smpi_process()->mark_as_initialized(); } + +void smpi_exit(int res){ + if(res != 0){ + XBT_WARN("SMPI process did not return 0. Return value : %d", res); + smpi_exit_status = res; + } + simgrid::s4u::this_actor::exit(); + THROW_IMPOSSIBLE; +}