X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/88a573f150347b7a61b6ed2acd1e69da92b7a99b..0c43de62fbe4bfc243d6512296e09207e80bcd54:/src/simix/smx_global.c diff --git a/src/simix/smx_global.c b/src/simix/smx_global.c index ccf0011978..e1f793e180 100644 --- a/src/simix/smx_global.c +++ b/src/simix/smx_global.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2007-2012. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2013. The SimGrid Team. + * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -10,6 +11,7 @@ #include "xbt/str.h" #include "xbt/ex.h" /* ex_backtrace_display */ #include "mc/mc.h" +#include "simgrid/sg_config.h" XBT_LOG_NEW_CATEGORY(simix, "All SIMIX categories"); XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_kernel, simix, @@ -64,7 +66,7 @@ void SIMIX_global_init(int *argc, char **argv) #ifdef TIME_BENCH_AMDAHL simix_global->timer_seq = xbt_os_timer_new(); simix_global->timer_par = xbt_os_timer_new(); - xbt_os_timer_start(simix_global->timer_seq); + xbt_os_cputimer_start(simix_global->timer_seq); #endif simix_global->process_to_run = xbt_dynar_new(sizeof(smx_process_t), NULL); simix_global->process_that_ran = xbt_dynar_new(sizeof(smx_process_t), NULL); @@ -107,8 +109,13 @@ void SIMIX_global_init(int *argc, char **argv) } SIMIX_HOST_LEVEL = xbt_lib_add_level(host_lib,SIMIX_host_destroy); + SIMIX_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, SIMIX_storage_destroy); - atexit(SIMIX_clean); + if (sg_cfg_get_boolean("clean_atexit")) + atexit(SIMIX_clean); + + if (_sg_cfg_exit_asap) + exit(0); } /** @@ -156,8 +163,8 @@ static void SIMIX_clean(void) surf_exit(); #ifdef TIME_BENCH_AMDAHL - xbt_os_timer_stop(simix_global->timer_seq); - XBT_INFO("Amdhal timing informations. Sequential time: %lf; Parallel time: %lf", + xbt_os_cputimer_stop(simix_global->timer_seq); + XBT_INFO("Amdahl timing informations. Sequential time: %f; Parallel time: %f", xbt_os_timer_elapsed(simix_global->timer_seq), xbt_os_timer_elapsed(simix_global->timer_par)); xbt_os_timer_free(simix_global->timer_seq); @@ -226,13 +233,13 @@ void SIMIX_run(void) /* Run all processes that are ready to run, possibly in parallel */ #ifdef TIME_BENCH_AMDAHL - xbt_os_timer_stop(simix_global->timer_seq); - xbt_os_timer_resume(simix_global->timer_par); + xbt_os_cputimer_stop(simix_global->timer_seq); + xbt_os_cputimer_resume(simix_global->timer_par); #endif SIMIX_process_runall(); #ifdef TIME_BENCH_AMDAHL - xbt_os_timer_stop(simix_global->timer_par); - xbt_os_timer_resume(simix_global->timer_seq); + xbt_os_cputimer_stop(simix_global->timer_par); + xbt_os_cputimer_resume(simix_global->timer_seq); #endif /* Move all killing processes to the end of the list, because killing a process that have an ongoing simcall is a bad idea */ @@ -315,22 +322,39 @@ void SIMIX_run(void) timer = xbt_heap_pop(simix_timers); if (timer->func) ((void (*)(void*))timer->func)(timer->args); + xbt_free(timer); } + /* Wake up all processes waiting for a Surf action to finish */ xbt_dynar_foreach(model_list, iter, model) { - set = model->states.failed_action_set; + set = surf_model_failed_action_set(model); while ((action = xbt_swag_extract(set))) - SIMIX_simcall_post((smx_action_t) action->data); - set = model->states.done_action_set; - while ((action = xbt_swag_extract(set))) - SIMIX_simcall_post((smx_action_t) action->data); + + SIMIX_simcall_post((smx_action_t) surf_action_get_data(action)); + set = surf_model_done_action_set(model); + + while ((action = xbt_swag_extract(set))) + if (surf_action_get_data(action) == NULL) + XBT_DEBUG("probably vcpu's action %p, skip", action); + else + SIMIX_simcall_post((smx_action_t) surf_action_get_data(action)); + } + + /* Autorestart all process */ + if(host_that_restart) { + char *hostname = NULL; + xbt_dynar_foreach(host_that_restart,iter,hostname) { + XBT_INFO("Restart processes on host: %s",hostname); + SIMIX_host_autorestart(SIMIX_host_get_by_name(hostname)); + } + xbt_dynar_reset(host_that_restart); } /* Clean processes to destroy */ SIMIX_process_empty_trash(); - // XBT_INFO("### time %f, empty %d", time, xbt_dynar_is_empty(simix_global->process_to_run)); + XBT_DEBUG("### time %f, empty %d", time, xbt_dynar_is_empty(simix_global->process_to_run)); // !(time == -1.0 && xbt_dynar_is_empty()) @@ -342,7 +366,7 @@ void SIMIX_run(void) TRACE_end(); #endif - XBT_WARN("Oops ! Deadlock or code not perfectly clean."); + XBT_CRITICAL("Oops ! Deadlock or code not perfectly clean."); SIMIX_display_process_status(); xbt_abort(); }