Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use proper timer; allow several timed sections per file (ie, use the 'line' argument...
[simgrid.git] / src / gras / Virtu / sg_chrono.c
index 9b16b28..8e61e30 100644 (file)
 #include "msg/msg.h"
 #include "xbt/xbt_portability.h"
 #include "portable.h"
 #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");
 
 
 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 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 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)
 {
 
 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) {
 
   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;
     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;
 }
 
   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;
 
 {
   xbt_assert0(!benchmarking,"Already benchmarking");
   benchmarking = 1;
 
-  timer = xbt_os_time();
+  if (!timer)
+  xbt_os_timer_start(timer);
   return 0;
 }
 
   return 0;
 }
 
@@ -59,25 +63,31 @@ int gras_bench_always_end(void)
   
   xbt_assert0(benchmarking,"Not benchmarking yet");
   benchmarking = 0;
   
   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);
   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;
 }
 
   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;
 
 {
   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) {
   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;
     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) {
   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 {
   } 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);
   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)
 {
 
 void gras_chrono_init(void)
 {
-  if(!benchmark_set)
+  if(!benchmark_set) {
     benchmark_set = xbt_dict_new();
     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);
 }
 }