X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/221538a27f21e52c182ae7fcc08c78c1175395b9..d3db5b503ce1dbf4078a047a4f4d47f791d01983:/src/simix/smx_global.c diff --git a/src/simix/smx_global.c b/src/simix/smx_global.c index 6133fcfd2e..7af670a28e 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, @@ -22,13 +24,15 @@ static void* SIMIX_action_mallocator_new_f(void); static void SIMIX_action_mallocator_free_f(void* action); static void SIMIX_action_mallocator_reset_f(void* action); +static void SIMIX_clean(void); + /* FIXME: Yeah, I'll do it in a portable maner one day [Mt] */ #include -int _surf_do_verbose_exit = 1; +int _sg_do_verbose_exit = 1; static void _XBT_CALL inthandler(int ignored) { - if ( _surf_do_verbose_exit ) { + if ( _sg_do_verbose_exit ) { XBT_INFO("CTRL-C pressed. Displaying status and bailing out"); SIMIX_display_process_status(); } @@ -62,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); @@ -90,7 +94,6 @@ void SIMIX_global_init(int *argc, char **argv) __xbt_running_ctx_fetch = SIMIX_process_get_running_context; __xbt_ex_terminate = SIMIX_process_exception_terminate; - /* Initialize the SIMIX network module */ SIMIX_network_init(); /* Prepare to display some more info when dying on Ctrl-C pressing */ @@ -105,8 +108,13 @@ void SIMIX_global_init(int *argc, char **argv) simix_timers = xbt_heap_new(8, &free); } - XBT_DEBUG("ADD SIMIX LEVELS"); SIMIX_HOST_LEVEL = xbt_lib_add_level(host_lib,SIMIX_host_destroy); + + if (sg_cfg_get_boolean("clean_atexit")) + atexit(SIMIX_clean); + + if (_sg_cfg_exit_asap) + exit(0); } /** @@ -115,14 +123,17 @@ void SIMIX_global_init(int *argc, char **argv) * * This functions remove the memory used by SIMIX */ -void SIMIX_clean(void) +static void SIMIX_clean(void) { +#ifdef HAVE_TRACING + TRACE_end(); +#endif #ifdef TIME_BENCH_PER_SR smx_ctx_raw_new_sr(); #endif /* Kill everyone (except maestro) */ - SIMIX_process_killall(simix_global->maestro_process); + SIMIX_process_killall(simix_global->maestro_process, 1); /* Exit the SIMIX network module */ SIMIX_network_exit(); @@ -154,8 +165,8 @@ 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: %lf; Parallel time: %lf", xbt_os_timer_elapsed(simix_global->timer_seq), xbt_os_timer_elapsed(simix_global->timer_par)); xbt_os_timer_free(simix_global->timer_seq); @@ -178,7 +189,7 @@ void SIMIX_clean(void) */ XBT_INLINE double SIMIX_get_clock(void) { - if(MC_IS_ENABLED){ + if(MC_is_active()){ return MC_process_clock_get(SIMIX_process_self()); }else{ return surf_get_clock(); @@ -224,13 +235,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 */ @@ -313,6 +324,7 @@ 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) { @@ -324,6 +336,16 @@ void SIMIX_run(void) SIMIX_simcall_post((smx_action_t) action->data); } + /* 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(); @@ -335,7 +357,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(); } @@ -445,15 +467,22 @@ void SIMIX_display_process_status(void) case SIMIX_ACTION_IO: action_description = "I/O"; + break; + /* **************************************/ + /* TUTORIAL: New API */ + case SIMIX_ACTION_NEW_API: + action_description = "NEW API"; + /* **************************************/ + break; } XBT_INFO("Process %lu (%s@%s): waiting for %s action %p (%s) in state %d to finish", - process->pid, process->name, process->smx_host->name, + process->pid, process->name, sg_host_name(process->smx_host), action_description, process->waiting_action, process->waiting_action->name, (int)process->waiting_action->state); } else { - XBT_INFO("Process %lu (%s@%s)", process->pid, process->name, process->smx_host->name); + XBT_INFO("Process %lu (%s@%s)", process->pid, process->name, sg_host_name(process->smx_host)); } } } @@ -478,6 +507,9 @@ static void SIMIX_action_mallocator_reset_f(void* action) { ((smx_action_t) action)->simcalls = fifo; } +xbt_dict_t SIMIX_pre_asr_get_properties(smx_simcall_t simcall, const char *name){ + return SIMIX_asr_get_properties(name); +} xbt_dict_t SIMIX_asr_get_properties(const char *name) { return xbt_lib_get_or_null(as_router_lib, name, ROUTING_PROP_ASR_LEVEL);