X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b4852fd3bb330d081de77ad7092fb2f11ee0b7a4..283928d6552afd14c3a5f2feadbafa8d3d4301e0:/src/simix/smx_global.c diff --git a/src/simix/smx_global.c b/src/simix/smx_global.c index bc03b95d7d..5a350c2366 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,7 +22,7 @@ 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 @@ -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 = @@ -93,6 +97,11 @@ void SIMIX_global_init(int *argc, char **argv) /* 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); @@ -100,6 +109,8 @@ void SIMIX_global_init(int *argc, char **argv) XBT_DEBUG("ADD SIMIX LEVELS"); SIMIX_HOST_LEVEL = xbt_lib_add_level(host_lib,SIMIX_host_destroy); + + atexit(SIMIX_clean); } /** @@ -108,9 +119,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 +157,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; @@ -199,7 +219,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 +227,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 +386,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; @@ -453,3 +481,9 @@ 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_asr_get_properties(const char *name) +{ + return xbt_lib_get_or_null(as_router_lib, name, ROUTING_PROP_ASR_LEVEL); +} +