X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b4852fd3bb330d081de77ad7092fb2f11ee0b7a4..e6e653ac5c6803a507ccb966a6e561500f0208a2:/src/simix/smx_global.c diff --git a/src/simix/smx_global.c b/src/simix/smx_global.c index bc03b95d7d..6c0623cb71 100644 --- a/src/simix/smx_global.c +++ b/src/simix/smx_global.c @@ -1,5 +1,4 @@ -/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2007-2012. 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. */ @@ -23,15 +22,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); -extern void smx_ctx_raw_new_sr(void); +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,6 +61,11 @@ void SIMIX_global_init(int *argc, char **argv) if (!simix_global) { simix_global = xbt_new0(s_smx_global_t, 1); +#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); +#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); simix_global->process_list = @@ -88,18 +92,23 @@ 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 */ signal(SIGINT, inthandler); + + /* register a function to be called by SURF after the environment creation */ + sg_platf_init(); + sg_platf_postparse_add_cb(SIMIX_post_create_environment); + } if (!simix_timers) { 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); } /** @@ -108,9 +117,9 @@ 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 TIME_BENCH +#ifdef TIME_BENCH_PER_SR smx_ctx_raw_new_sr(); #endif @@ -146,6 +155,15 @@ 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_timer_elapsed(simix_global->timer_seq), + xbt_os_timer_elapsed(simix_global->timer_par)); + xbt_os_timer_free(simix_global->timer_seq); + xbt_os_timer_free(simix_global->timer_par); +#endif + xbt_mallocator_free(simix_global->action_mallocator); xbt_free(simix_global); simix_global = NULL; @@ -162,7 +180,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(); @@ -199,7 +217,7 @@ void SIMIX_run(void) do { XBT_DEBUG("New Schedule Round; size(queue)=%lu", xbt_dynar_length(simix_global->process_to_run)); -#ifdef TIME_BENCH +#ifdef TIME_BENCH_PER_SR smx_ctx_raw_new_sr(); #endif while (!xbt_dynar_is_empty(simix_global->process_to_run)) { @@ -207,7 +225,15 @@ void SIMIX_run(void) xbt_dynar_length(simix_global->process_to_run)); /* 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); +#endif SIMIX_process_runall(); +#ifdef TIME_BENCH_AMDAHL + xbt_os_timer_stop(simix_global->timer_par); + xbt_os_timer_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 */ xbt_dynar_three_way_partition(simix_global->process_that_ran, process_syscall_color); @@ -358,7 +384,7 @@ XBT_INLINE void SIMIX_function_register_process_create(smx_creation_func_t * * \param function Kill process function */ -XBT_INLINE void SIMIX_function_register_process_kill(void_pfn_smxprocess_t +XBT_INLINE void SIMIX_function_register_process_kill(void_pfn_smxprocess_t_smxprocess_t function) { simix_global->kill_process_function = function; @@ -421,15 +447,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)); } } } @@ -453,3 +486,12 @@ static void SIMIX_action_mallocator_reset_f(void* action) { memset(action, 0, sizeof(s_smx_action_t)); ((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); +} +