X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d2870500ed94896ec3b064fa67af8d729920c007..f00ffb4ea8272126f9a81ec6b8adc6e021182bde:/src/smpi/smpi_global.cpp diff --git a/src/smpi/smpi_global.cpp b/src/smpi/smpi_global.cpp index 9222f7ccba..5783c39929 100644 --- a/src/smpi/smpi_global.cpp +++ b/src/smpi/smpi_global.cpp @@ -40,6 +40,7 @@ typedef struct s_smpi_process_data { char* instance_id; int replaying; /* is the process replaying a trace */ xbt_bar_t finalization_barrier; + int return_value; } s_smpi_process_data_t; static smpi_process_data_t *process_data = NULL; @@ -49,7 +50,6 @@ int* index_to_process_data = NULL; extern double smpi_total_benched_time; xbt_os_timer_t global_timer; MPI_Comm MPI_COMM_WORLD = MPI_COMM_UNINITIALIZED; - MPI_Errhandler *MPI_ERRORS_RETURN = NULL; MPI_Errhandler *MPI_ERRORS_ARE_FATAL = NULL; MPI_Errhandler *MPI_ERRHANDLER_NULL = NULL; @@ -77,7 +77,7 @@ void smpi_process_init(int *argc, char ***argv) if (argc && argv) { proc = SIMIX_process_self(); //FIXME: dirty cleanup method to avoid using msg cleanup functions on these processes when using MSG+SMPI - SIMIX_process_set_cleanup_function(proc, SIMIX_process_cleanup); + SIMIX_process_set_cleanup_function(proc, MSG_process_cleanup_from_SIMIX); char* instance_id = (*argv)[1]; int rank = xbt_str_parse_int((*argv)[2], "Invalid rank: %s"); index = smpi_process_index_of_smx_process(proc); @@ -424,6 +424,7 @@ void smpi_global_init(void) process_data[i]->state = SMPI_UNINITIALIZED; process_data[i]->sampling = 0; process_data[i]->finalization_barrier = NULL; + process_data[i]->return_value = 0; } //if the process was launched through smpirun script we generate a global mpi_comm_world //if not, we let MPI_COMM_NULL, and the comm world will be private to each mpi instance @@ -469,11 +470,17 @@ void smpi_global_destroy(void) if (MPI_COMM_WORLD != MPI_COMM_UNINITIALIZED){ smpi_comm_cleanup_smp(MPI_COMM_WORLD); smpi_comm_cleanup_attributes(MPI_COMM_WORLD); + if(smpi_coll_cleanup_callback!=NULL) + smpi_coll_cleanup_callback(); xbt_free(MPI_COMM_WORLD); } MPI_COMM_WORLD = MPI_COMM_NULL; + if (!MC_is_active()) { + xbt_os_timer_free(global_timer); + } + xbt_free(index_to_process_data); if(smpi_privatize_global_variables) smpi_destroy_global_memory_segments(); @@ -481,6 +488,7 @@ void smpi_global_destroy(void) } #ifndef WIN32 + void __attribute__ ((weak)) user_main_() { xbt_die("Should not be in this smpi_simulated_main"); @@ -494,9 +502,18 @@ int __attribute__ ((weak)) smpi_simulated_main_(int argc, char **argv) return 0; } +inline static int smpi_main_wrapper(int argc, char **argv){ + int ret = smpi_simulated_main_(argc,argv); + if(ret !=0){ + XBT_WARN("SMPI process did not return 0. Return value : %d", ret); + smpi_process_data()->return_value=ret; + } + return 0; +} + int __attribute__ ((weak)) main(int argc, char **argv) { - return smpi_main(smpi_simulated_main_, argc, argv); + return smpi_main(smpi_main_wrapper, argc, argv); } #endif @@ -577,6 +594,7 @@ static void smpi_init_options(){ int barrier_id = find_coll_description(mpi_coll_barrier_description, xbt_cfg_get_string("smpi/barrier"),"barrier"); mpi_coll_barrier_fun = (int (*)(MPI_Comm comm)) mpi_coll_barrier_description[barrier_id].coll; + smpi_coll_cleanup_callback=NULL; smpi_cpu_threshold = xbt_cfg_get_double("smpi/cpu-threshold"); smpi_running_power = xbt_cfg_get_double("smpi/running-power"); smpi_privatize_global_variables = xbt_cfg_get_boolean("smpi/privatize-global-variables"); @@ -642,11 +660,19 @@ int smpi_main(int (*realmain) (int argc, char *argv[]), int argc, char *argv[]) "You may want to use sampling functions or trace replay to reduce this."); } } + int count = smpi_process_count(); + int i, ret=0; + for (i = 0; i < count; i++) { + if(process_data[i]->return_value!=0){ + ret=process_data[i]->return_value;//return first non 0 value + break; + } + } smpi_global_destroy(); TRACE_end(); - return 0; + return ret; } // This function can be called from extern file, to initialize logs, options, and processes of smpi