X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/832fed2e817aad1deb04971a551b7a5204981d87..65fa5368ce444c71b473d9cf2ffc8e7ed29a2ea6:/src/gras/Virtu/sg_chrono.c diff --git a/src/gras/Virtu/sg_chrono.c b/src/gras/Virtu/sg_chrono.c index 9b16b28970..8e61e30321 100644 --- a/src/gras/Virtu/sg_chrono.c +++ b/src/gras/Virtu/sg_chrono.c @@ -13,15 +13,18 @@ #include "msg/msg.h" #include "xbt/xbt_portability.h" #include "portable.h" +#include "gras_modinter.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(chrono,gras,"Benchmarking used code"); -static double timer = 0.0; +static xbt_os_timer_t timer; static int benchmarking = 0; static xbt_dict_t benchmark_set = NULL; -static double reference = .00523066250047108838; +static double reference = .00523066250047108838; /* FIXME: we should benchmark host machine to set this */ static double duration = 0.0; -static const char* __location__ = NULL; + +static char* locbuf = NULL; +static int locbufsize; static void store_in_dict(xbt_dict_t dict, const char *key, double value) { @@ -29,7 +32,7 @@ static void store_in_dict(xbt_dict_t dict, const char *key, double value) xbt_dict_get(dict, key, (void *) &ir); if (!ir) { - ir = calloc(1, sizeof(double)); + ir = xbt_new0(double,1); xbt_dict_set(dict, key, ir, free); } *ir = value; @@ -44,12 +47,13 @@ static double get_from_dict(xbt_dict_t dict, const char *key) return *ir; } -int gras_bench_always_begin(const char *location, int line) +int gras_bench_always_begin(const char *location,int line) { xbt_assert0(!benchmarking,"Already benchmarking"); benchmarking = 1; - timer = xbt_os_time(); + if (!timer) + xbt_os_timer_start(timer); return 0; } @@ -59,25 +63,31 @@ int gras_bench_always_end(void) xbt_assert0(benchmarking,"Not benchmarking yet"); benchmarking = 0; - duration = xbt_os_time()-timer; + xbt_os_timer_stop(timer); + duration = xbt_os_timer_elapsed(timer); task = MSG_task_create("task", (duration)/reference, 0 , NULL); MSG_task_execute(task); - /* printf("---> %lg <--- \n", xbt_os_time()-timer); */ MSG_task_destroy(task); return 0; } -int gras_bench_once_begin(const char *location, int line) +int gras_bench_once_begin(const char *location,int line) { double *ir = NULL; xbt_assert0(!benchmarking,"Already benchmarking"); benchmarking = 1; - __location__=location; - xbt_dict_get(benchmark_set, __location__, (void *) &ir); + if (!locbuf || locbufsize < strlen(location) + 64) { + locbufsize = strlen(location) + 64; + locbuf = xbt_realloc(locbuf,locbufsize); + } + sprintf(locbuf,"%s:%d",location, line); + + xbt_dict_get(benchmark_set, locbuf, (void *) &ir); if(!ir) { -/* printf("%s:%d\n",location,line); */ - duration = xbt_os_time(); + DEBUG1("%s",locbuf); + duration = 1; + xbt_os_timer_start(timer); return 1; } else { duration = -1.0; @@ -92,11 +102,13 @@ int gras_bench_once_end(void) xbt_assert0(benchmarking,"Not benchmarking yet"); benchmarking = 0; if(duration>0) { - duration = xbt_os_time()-duration; - store_in_dict(benchmark_set, __location__, duration); + xbt_os_timer_stop(timer); + duration = xbt_os_timer_elapsed(timer); + store_in_dict(benchmark_set, locbuf, duration); } else { - duration = get_from_dict(benchmark_set,__location__); + duration = get_from_dict(benchmark_set,locbuf); } + DEBUG2("Simulate the run of a task of %f sec for %s",duration,locbuf); task = MSG_task_create("task", (duration)/reference, 0 , NULL); MSG_task_execute(task); MSG_task_destroy(task); @@ -105,6 +117,14 @@ int gras_bench_once_end(void) void gras_chrono_init(void) { - if(!benchmark_set) + if(!benchmark_set) { benchmark_set = xbt_dict_new(); + timer = xbt_os_timer_new(); + } +} + +void gras_chrono_exit(void) { + if (locbuf) free(locbuf); + xbt_dict_free(&benchmark_set); + xbt_os_timer_free(timer); }