Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
"new ruby host method"
[simgrid.git] / src / surf / trace_mgr.c
index 6442cb3..7cc1226 100644 (file)
 #include "trace_mgr_private.h"
 #include "surf_private.h"
 
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_trace, surf, "Surf trace management");
+
 static xbt_dict_t trace_list = NULL;
-static void _tmgr_trace_free(void *trace)
-{
-  tmgr_trace_free(trace);
-}
 
-tmgr_history_t tmgr_history_new(void)
+XBT_INLINE tmgr_history_t tmgr_history_new(void)
 {
   tmgr_history_t h;
 
@@ -29,7 +27,7 @@ tmgr_history_t tmgr_history_new(void)
   return h;
 }
 
-void tmgr_history_free(tmgr_history_t h)
+XBT_INLINE void tmgr_history_free(tmgr_history_t h)
 {
   xbt_heap_free(h->heap);
   free(h);
@@ -48,50 +46,54 @@ tmgr_trace_t tmgr_trace_new_from_string(const char *id, const char *input,
 
   if (trace_list) {
     trace = xbt_dict_get_or_null(trace_list, id);
-    if (trace)
+    if (trace) {
+      WARN1("Ignoring redefinition of trace %s", id);
       return trace;
+    }
   }
 
-  if (periodicity <= 0) {
-    xbt_assert1(0, "Periodicity has to be positive. Your value %lg",
-                periodicity);
-  }
+  xbt_assert1(periodicity >= 0,
+              "Invalid periodicity %lg (must be positive)", periodicity);
 
   trace = xbt_new0(s_tmgr_trace_t, 1);
   trace->event_list = xbt_dynar_new(sizeof(s_tmgr_event_t), NULL);
 
   list = xbt_str_split(input, "\n\r");
 
-
   xbt_dynar_foreach(list, cpt, val) {
     linecount++;
     xbt_str_trim(val, " \t\n\r\x0B");
-    if (strlen(val) > 0) {
-      if (sscanf(val, "%lg" " " "%lg" "\n", &event.delta, &event.value) != 2) {
-        xbt_assert2(0, "%s\n%d: Syntax error", input, linecount);
-      }
-      if (last_event) {
-        if ((last_event->delta = event.delta - last_event->delta) <= 0) {
-          xbt_assert2(0,
-                      "%s\n%d: Invalid trace value, events have to be sorted",
-                      input, linecount);
-        }
-      }
-      xbt_dynar_push(trace->event_list, &event);
-      last_event =
-        xbt_dynar_get_ptr(trace->event_list,
-                          xbt_dynar_length(trace->event_list) - 1);
-      if (periodicity > 0) {
-        if (last_event)
-          last_event->delta = periodicity;
+    if (val[0] == '#' || val[0] == '\0' || val[0] == '%')
+      continue;
+
+    if (sscanf(val, "PERIODICITY " "%lg" "\n", &periodicity) == 1)
+      continue;
+
+    if (sscanf(val, "%lg" " " "%lg" "\n", &event.delta, &event.value) != 2)
+      xbt_die(bprintf
+              ("%s:%d: Syntax error in trace\n%s", id, linecount, input));
+
+    if (last_event) {
+      if (last_event->delta > event.delta) {
+        xbt_die(bprintf
+                ("%s:%d: Invalid trace: Events must be sorted, but time %lg > time %lg.\n%s",
+                 id, linecount, last_event->delta, event.delta, input));
       }
+      last_event->delta = event.delta - last_event->delta;
     }
+    xbt_dynar_push(trace->event_list, &event);
+    last_event =
+      xbt_dynar_get_ptr(trace->event_list,
+                        xbt_dynar_length(trace->event_list) - 1);
   }
+  if (last_event)
+    last_event->delta = periodicity;
 
   if (!trace_list)
     trace_list = xbt_dict_new();
 
-  xbt_dict_set(trace_list, id, (void *) trace, _tmgr_trace_free);
+  xbt_dict_set(trace_list, id, (void *) trace,
+               (void (*)(void *)) tmgr_trace_free);
 
   xbt_dynar_free(&list);
   return trace;
@@ -99,69 +101,28 @@ tmgr_trace_t tmgr_trace_new_from_string(const char *id, const char *input,
 
 tmgr_trace_t tmgr_trace_new(const char *filename)
 {
-  tmgr_trace_t trace = NULL;
   FILE *f = NULL;
-  int linecount = 0;
-  char line[256];
-  double periodicity = -1.0;    /* No periodicity by default */
-  s_tmgr_event_t event;
-  tmgr_event_t last_event = NULL;
+  tmgr_trace_t trace = NULL;
+
+  if ((!filename) || (strcmp(filename, "") == 0))
+    return NULL;
 
   if (trace_list) {
     trace = xbt_dict_get_or_null(trace_list, filename);
-    if (trace)
+    if (trace) {
+      WARN1("Ignoring redefinition of trace %s", filename);
       return trace;
-  }
-
-  if ((f = surf_fopen(filename, "r")) == NULL) {
-    xbt_assert1(0, "Cannot open file '%s'", filename);
-  }
-
-  trace = xbt_new0(s_tmgr_trace_t, 1);
-  trace->event_list = xbt_dynar_new(sizeof(s_tmgr_event_t), NULL);
-
-  while (fgets(line, 256, f)) {
-    linecount++;
-    if ((line[0] == '#') || (line[0] == '\n') || (line[0] == '%'))
-      continue;
-
-    if (sscanf(line, "PERIODICITY " "%lg" "\n", &(periodicity))
-        == 1) {
-      if (periodicity <= 0) {
-        xbt_assert2(0,
-                    "%s,%d: Syntax error. Periodicity has to be positive",
-                    filename, linecount);
-      }
-      continue;
-    }
-
-    if (sscanf(line, "%lg" " " "%lg" "\n", &event.delta, &event.value) != 2) {
-      xbt_assert2(0, "%s,%d: Syntax error", filename, linecount);
     }
-
-    if (last_event) {
-      if ((last_event->delta = event.delta - last_event->delta) <= 0) {
-        xbt_assert2(0,
-                    "%s,%d: Invalid trace value, events have to be sorted",
-                    filename, linecount);
-      }
-    }
-    xbt_dynar_push(trace->event_list, &event);
-    last_event = xbt_dynar_get_ptr(trace->event_list,
-                                   xbt_dynar_length(trace->event_list) - 1);
-  }
-
-  if (periodicity > 0) {
-    if (last_event)
-      last_event->delta = periodicity;
   }
 
-  if (!trace_list)
-    trace_list = xbt_dict_new();
-
-  xbt_dict_set(trace_list, filename, (void *) trace, _tmgr_trace_free);
+  f = surf_fopen(filename, "r");
+  xbt_assert2(f!=NULL, "Cannot open file '%s' (path=%s)", filename,
+       xbt_str_join(surf_path,":"));
 
+  char *tstr = xbt_str_from_file(f);
   fclose(f);
+  trace = tmgr_trace_new_from_string(filename, tstr, 0.);
+  xbt_free(tstr);
 
   return trace;
 }
@@ -169,8 +130,6 @@ tmgr_trace_t tmgr_trace_new(const char *filename)
 tmgr_trace_t tmgr_empty_trace_new(void)
 {
   tmgr_trace_t trace = NULL;
-  /*double periodicity = -1.0;   No periodicity by default; unused variables
-     tmgr_event_t last_event = NULL; */
   s_tmgr_event_t event;
 
   trace = xbt_new0(s_tmgr_trace_t, 1);
@@ -183,7 +142,7 @@ tmgr_trace_t tmgr_empty_trace_new(void)
   return trace;
 }
 
-void tmgr_trace_free(tmgr_trace_t trace)
+XBT_INLINE void tmgr_trace_free(tmgr_trace_t trace)
 {
   if (!trace)
     return;
@@ -211,7 +170,7 @@ tmgr_trace_event_t tmgr_history_add_trace(tmgr_history_t h,
   return trace_event;
 }
 
-double tmgr_history_next_date(tmgr_history_t h)
+XBT_INLINE double tmgr_history_next_date(tmgr_history_t h)
 {
   if (xbt_heap_size(h->heap))
     return (xbt_heap_maxkey(h->heap));
@@ -248,14 +207,22 @@ tmgr_trace_event_t tmgr_history_get_next_event_leq(tmgr_history_t h,
     xbt_heap_push(h->heap, trace_event, event_date + event->delta);
     trace_event->idx = 0;
   } else {                      /* We don't need this trace_event anymore */
-    free(trace_event);
-    return NULL;
+    trace_event->free_me = 1;
   }
 
   return trace_event;
 }
 
-void tmgr_finalize(void)
+XBT_INLINE void tmgr_finalize(void)
 {
   xbt_dict_free(&trace_list);
 }
+
+int tmgr_trace_event_free(tmgr_trace_event_t trace_event)
+{
+  if (trace_event->free_me) {
+    xbt_free(trace_event);
+    return 1;
+  }
+  return 0;
+}