X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/821e14387201136b86389d5ea0bdc6c2fb4f0b10..d3db5b503ce1dbf4078a047a4f4d47f791d01983:/src/simix/smx_global.c diff --git a/src/simix/smx_global.c b/src/simix/smx_global.c index 5a350c2366..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, @@ -27,10 +29,10 @@ 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(); } @@ -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); @@ -92,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 */ @@ -107,10 +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); - atexit(SIMIX_clean); + if (sg_cfg_get_boolean("clean_atexit")) + atexit(SIMIX_clean); + + if (_sg_cfg_exit_asap) + exit(0); } /** @@ -121,12 +125,15 @@ void SIMIX_global_init(int *argc, char **argv) */ 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(); @@ -158,8 +165,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: %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); @@ -182,7 +189,7 @@ static 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(); @@ -228,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 */ @@ -317,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) { @@ -328,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(); @@ -339,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(); } @@ -449,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)); } } } @@ -482,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);