Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[trace] at the end of tracing, dump everything up to last simulated time
[simgrid.git] / src / instr / instr_paje_trace.c
index 5e5033b..285f951 100644 (file)
@@ -36,6 +36,7 @@ typedef struct paje_event {
   double timestamp;
   e_event_type event_type;
   void (*print) (paje_event_t event);
+  void (*free) (paje_event_t event);
   void *data;
 } s_paje_event_t;
 
@@ -115,13 +116,12 @@ typedef struct s_popState *popState_t;
 typedef struct s_popState {
   container_t container;
   type_t type;
-  char *value;
 }s_popState_t;
 
 typedef struct s_startLink *startLink_t;
 typedef struct s_startLink {
-  type_t type;
   container_t container;
+  type_t type;
   container_t sourceContainer;
   char *value;
   char *key;
@@ -129,8 +129,8 @@ typedef struct s_startLink {
 
 typedef struct s_endLink *endLink_t;
 typedef struct s_endLink {
-  type_t type;
   container_t container;
+  type_t type;
   container_t destContainer;
   char *value;
   char *key;
@@ -138,13 +138,14 @@ typedef struct s_endLink {
 
 typedef struct s_newEvent *newEvent_t;
 typedef struct s_newEvent {
-  type_t type;
   container_t container;
+  type_t type;
   char *value;
 }s_newEvent_t;
 
 static FILE *tracing_file = NULL;
 
+static xbt_dynar_t buffer = NULL;
 
 void TRACE_paje_start(void)
 {
@@ -156,6 +157,8 @@ void TRACE_paje_start(void)
 
   /* output header */
   TRACE_paje_create_header();
+
+  buffer = xbt_dynar_new (sizeof(paje_event_t), NULL);
 }
 
 void TRACE_paje_end(void)
@@ -165,6 +168,22 @@ void TRACE_paje_end(void)
   DEBUG1("Filename %s is closed", filename);
 }
 
+double TRACE_last_timestamp_to_dump = 0;
+//dumps the trace file until the timestamp TRACE_last_timestamp_to_dump
+void TRACE_paje_dump_buffer (void)
+{
+  paje_event_t event;
+  while (xbt_dynar_length (buffer) > 0){
+    double head_timestamp = (*(paje_event_t*)xbt_dynar_get_ptr(buffer, 0))->timestamp;
+    if (head_timestamp > TRACE_last_timestamp_to_dump){
+      break;
+    }
+    xbt_dynar_remove_at (buffer, 0, &event);
+    event->print (event);
+    event->free (event);
+  }
+}
+
 void TRACE_paje_create_header(void)
 {
   DEBUG0 ("Define paje header");
@@ -286,6 +305,27 @@ void TRACE_paje_create_header(void)
 }
 
 /* internal do the instrumentation module */
+static void insert_into_buffer (paje_event_t tbi)
+{
+  unsigned int i;
+  if (xbt_dynar_length(buffer) == 0){
+    xbt_dynar_push (buffer, &tbi);
+  }else{
+    int inserted = 0;
+    for (i = 0; i < xbt_dynar_length(buffer); i++){
+      paje_event_t e1 = *(paje_event_t*)xbt_dynar_get_ptr(buffer, i);
+      if (e1->timestamp > tbi->timestamp){
+        xbt_dynar_insert_at (buffer, i, &tbi);
+        inserted = 1;
+        break;
+      }
+    }
+    if (!inserted){
+      xbt_dynar_push (buffer, &tbi);
+    }
+  }
+}
+
 static void print_pajeDefineContainerType(paje_event_t event)
 {
   fprintf(tracing_file, "%d %s %s %s\n",
@@ -539,22 +579,38 @@ static void print_pajeNewEvent (paje_event_t event)
   }
 }
 
+static void free_paje_event (paje_event_t event)
+{
+  if (event->event_type == PAJE_SetState) {
+    xbt_free (((setState_t)(event->data))->value);
+  }else if (event->event_type == PAJE_PushState) {
+    xbt_free (((pushState_t)(event->data))->value);
+  }else if (event->event_type == PAJE_NewEvent){
+    xbt_free (((newEvent_t)(event->data))->value);
+  }else if (event->event_type == PAJE_StartLink){
+    xbt_free (((startLink_t)(event->data))->value);
+    xbt_free (((startLink_t)(event->data))->key);
+  }else if (event->event_type == PAJE_EndLink){
+    xbt_free (((endLink_t)(event->data))->value);
+    xbt_free (((endLink_t)(event->data))->key);
+  }
+  xbt_free (event->data);
+  xbt_free (event);
+}
+
 void new_pajeDefineContainerType(type_t type)
 {
   paje_event_t event = xbt_new0(s_paje_event_t, 1);
   event->event_type = PAJE_DefineContainerType;
   event->timestamp = 0;
   event->print = print_pajeDefineContainerType;
+  event->free = free_paje_event;
   event->data = xbt_new0(s_defineContainerType_t, 1);
   ((defineContainerType_t)(event->data))->type = type;
 
   //print it
   event->print (event);
-
-  //destroy it
-  xbt_free (event->data);
-  xbt_free (event);
-  event = NULL;
+  event->free (event);
 }
 
 void new_pajeDefineVariableType(type_t type)
@@ -563,16 +619,13 @@ void new_pajeDefineVariableType(type_t type)
   event->event_type = PAJE_DefineVariableType;
   event->timestamp = 0;
   event->print = print_pajeDefineVariableType;
+  event->free = free_paje_event;
   event->data = xbt_new0(s_defineVariableType_t, 1);
   ((defineVariableType_t)(event->data))->type = type;
 
   //print it
   event->print (event);
-
-  //destroy it
-  xbt_free (event->data);
-  xbt_free (event);
-  event = NULL;
+  event->free (event);
 }
 
 void new_pajeDefineStateType(type_t type)
@@ -581,16 +634,13 @@ void new_pajeDefineStateType(type_t type)
   event->event_type = PAJE_DefineStateType;
   event->timestamp = 0;
   event->print = print_pajeDefineStateType;
+  event->free = free_paje_event;
   event->data = xbt_new0(s_defineStateType_t, 1);
   ((defineStateType_t)(event->data))->type = type;
 
   //print it
   event->print (event);
-
-  //destroy it
-  xbt_free (event->data);
-  xbt_free (event);
-  event = NULL;
+  event->free (event);
 }
 
 void new_pajeDefineEventType(type_t type)
@@ -599,16 +649,13 @@ void new_pajeDefineEventType(type_t type)
   event->event_type = PAJE_DefineEventType;
   event->timestamp = 0;
   event->print = print_pajeDefineEventType;
+  event->free = free_paje_event;
   event->data = xbt_new0(s_defineEventType_t, 1);
   ((defineEventType_t)(event->data))->type = type;
 
   //print it
   event->print (event);
-
-  //destroy it
-  xbt_free (event->data);
-  xbt_free (event);
-  event = NULL;
+  event->free (event);
 }
 
 void new_pajeDefineLinkType(type_t type, type_t source, type_t dest)
@@ -617,6 +664,7 @@ void new_pajeDefineLinkType(type_t type, type_t source, type_t dest)
   event->event_type = PAJE_DefineLinkType;
   event->timestamp = 0;
   event->print = print_pajeDefineLinkType;
+  event->free = free_paje_event;
   event->data = xbt_new0(s_defineLinkType_t, 1);
   ((defineLinkType_t)(event->data))->type = type;
   ((defineLinkType_t)(event->data))->source = source;
@@ -624,11 +672,7 @@ void new_pajeDefineLinkType(type_t type, type_t source, type_t dest)
 
   //print it
   event->print (event);
-
-  //destroy it
-  xbt_free (event->data);
-  xbt_free (event);
-  event = NULL;
+  event->free (event);
 }
 
 void new_pajeCreateContainer (container_t container)
@@ -637,16 +681,13 @@ void new_pajeCreateContainer (container_t container)
   event->event_type = PAJE_CreateContainer;
   event->timestamp = SIMIX_get_clock();
   event->print = print_pajeCreateContainer;
+  event->free = free_paje_event;
   event->data = xbt_new0(s_createContainer_t, 1);
   ((createContainer_t)(event->data))->container = container;
 
   //print it
   event->print (event);
-
-  //destroy it
-  xbt_free (event->data);
-  xbt_free (event);
-  event = NULL;
+  event->free (event);
 }
 
 void new_pajeDestroyContainer (container_t container)
@@ -655,16 +696,13 @@ void new_pajeDestroyContainer (container_t container)
   event->event_type = PAJE_DestroyContainer;
   event->timestamp = SIMIX_get_clock();
   event->print = print_pajeDestroyContainer;
+  event->free = free_paje_event;
   event->data = xbt_new0(s_destroyContainer_t, 1);
   ((destroyContainer_t)(event->data))->container = container;
 
   //print it
   event->print (event);
-
-  //destroy it
-  xbt_free (event->data);
-  xbt_free (event);
-  event = NULL;
+  event->free (event);
 }
 
 void new_pajeSetVariable (double timestamp, container_t container, type_t type, double value)
@@ -673,18 +711,13 @@ void new_pajeSetVariable (double timestamp, container_t container, type_t type,
   event->event_type = PAJE_SetVariable;
   event->timestamp = timestamp;
   event->print = print_pajeSetVariable;
+  event->free = free_paje_event;
   event->data = xbt_new0(s_setVariable_t, 1);
   ((setVariable_t)(event->data))->type = type;
   ((setVariable_t)(event->data))->container = container;
   ((setVariable_t)(event->data))->value = value;
 
-  //print it
-  event->print (event);
-
-  //destroy it
-  xbt_free (event->data);
-  xbt_free (event);
-  event = NULL;
+  insert_into_buffer (event);
 }
 
 
@@ -694,18 +727,13 @@ void new_pajeAddVariable (double timestamp, container_t container, type_t type,
   event->event_type = PAJE_AddVariable;
   event->timestamp = timestamp;
   event->print = print_pajeAddVariable;
+  event->free = free_paje_event;
   event->data = xbt_new0(s_addVariable_t, 1);
   ((addVariable_t)(event->data))->type = type;
   ((addVariable_t)(event->data))->container = container;
   ((addVariable_t)(event->data))->value = value;
 
-  //print it
-  event->print (event);
-
-  //destroy it
-  xbt_free (event->data);
-  xbt_free (event);
-  event = NULL;
+  insert_into_buffer (event);
 }
 
 void new_pajeSubVariable (double timestamp, container_t container, type_t type, double value)
@@ -714,18 +742,13 @@ void new_pajeSubVariable (double timestamp, container_t container, type_t type,
   event->event_type = PAJE_SubVariable;
   event->timestamp = timestamp;
   event->print = print_pajeSubVariable;
+  event->free = free_paje_event;
   event->data = xbt_new0(s_subVariable_t, 1);
   ((subVariable_t)(event->data))->type = type;
   ((subVariable_t)(event->data))->container = container;
   ((subVariable_t)(event->data))->value = value;
 
-  //print it
-  event->print (event);
-
-  //destroy it
-  xbt_free (event->data);
-  xbt_free (event);
-  event = NULL;
+  insert_into_buffer (event);
 }
 
 void new_pajeSetState (double timestamp, container_t container, type_t type, const char *value)
@@ -734,19 +757,13 @@ void new_pajeSetState (double timestamp, container_t container, type_t type, con
   event->event_type = PAJE_SetState;
   event->timestamp = timestamp;
   event->print = print_pajeSetState;
+  event->free = free_paje_event;
   event->data = xbt_new0(s_setState_t, 1);
   ((setState_t)(event->data))->type = type;
   ((setState_t)(event->data))->container = container;
   ((setState_t)(event->data))->value = xbt_strdup(value);
 
-  //print it
-  event->print (event);
-
-  //destroy it
-  xbt_free (((setState_t)(event->data))->value);
-  xbt_free (event->data);
-  xbt_free (event);
-  event = NULL;
+  insert_into_buffer (event);
 }
 
 
@@ -756,19 +773,13 @@ void new_pajePushState (double timestamp, container_t container, type_t type, co
   event->event_type = PAJE_PushState;
   event->timestamp = timestamp;
   event->print = print_pajePushState;
+  event->free = free_paje_event;
   event->data = xbt_new0(s_pushState_t, 1);
   ((pushState_t)(event->data))->type = type;
   ((pushState_t)(event->data))->container = container;
   ((pushState_t)(event->data))->value = xbt_strdup(value);
 
-  //print it
-  event->print (event);
-
-  //destroy it
-  xbt_free (((pushState_t)(event->data))->value);
-  xbt_free (event->data);
-  xbt_free (event);
-  event = NULL;
+  insert_into_buffer (event);
 }
 
 
@@ -778,17 +789,12 @@ void new_pajePopState (double timestamp, container_t container, type_t type)
   event->event_type = PAJE_PopState;
   event->timestamp = timestamp;
   event->print = print_pajePopState;
+  event->free = free_paje_event;
   event->data = xbt_new0(s_popState_t, 1);
   ((popState_t)(event->data))->type = type;
   ((popState_t)(event->data))->container = container;
 
-  //print it
-  event->print (event);
-
-  //destroy it
-  xbt_free (event->data);
-  xbt_free (event);
-  event = NULL;
+  insert_into_buffer (event);
 }
 
 void new_pajeStartLink (double timestamp, container_t container, type_t type, container_t sourceContainer, const char *value, const char *key)
@@ -797,6 +803,7 @@ void new_pajeStartLink (double timestamp, container_t container, type_t type, co
   event->event_type = PAJE_StartLink;
   event->timestamp = timestamp;
   event->print = print_pajeStartLink;
+  event->free = free_paje_event;
   event->data = xbt_new0(s_startLink_t, 1);
   ((startLink_t)(event->data))->type = type;
   ((startLink_t)(event->data))->container = container;
@@ -804,15 +811,7 @@ void new_pajeStartLink (double timestamp, container_t container, type_t type, co
   ((startLink_t)(event->data))->value = xbt_strdup(value);
   ((startLink_t)(event->data))->key = xbt_strdup(key);
 
-  //print it
-  event->print (event);
-
-  //destroy it
-  xbt_free (((startLink_t)(event->data))->value);
-  xbt_free (((startLink_t)(event->data))->key);
-  xbt_free (event->data);
-  xbt_free (event);
-  event = NULL;
+  insert_into_buffer (event);
 }
 
 void new_pajeEndLink (double timestamp, container_t container, type_t type, container_t destContainer, const char *value, const char *key)
@@ -821,6 +820,7 @@ void new_pajeEndLink (double timestamp, container_t container, type_t type, cont
   event->event_type = PAJE_EndLink;
   event->timestamp = timestamp;
   event->print = print_pajeEndLink;
+  event->free = free_paje_event;
   event->data = xbt_new0(s_endLink_t, 1);
   ((endLink_t)(event->data))->type = type;
   ((endLink_t)(event->data))->container = container;
@@ -828,15 +828,7 @@ void new_pajeEndLink (double timestamp, container_t container, type_t type, cont
   ((endLink_t)(event->data))->value = xbt_strdup(value);
   ((endLink_t)(event->data))->key = xbt_strdup(key);
 
-  //print it
-  event->print (event);
-
-  //destroy it
-  xbt_free (((endLink_t)(event->data))->value);
-  xbt_free (((endLink_t)(event->data))->key);
-  xbt_free (event->data);
-  xbt_free (event);
-  event = NULL;
+  insert_into_buffer (event);
 }
 
 void new_pajeNewEvent (double timestamp, container_t container, type_t type, const char *value)
@@ -845,35 +837,13 @@ void new_pajeNewEvent (double timestamp, container_t container, type_t type, con
   event->event_type = PAJE_NewEvent;
   event->timestamp = timestamp;
   event->print = print_pajeNewEvent;
+  event->free = free_paje_event;
   event->data = xbt_new0(s_newEvent_t, 1);
   ((newEvent_t)(event->data))->type = type;
   ((newEvent_t)(event->data))->container = container;
   ((newEvent_t)(event->data))->value = xbt_strdup(value);
 
-  //print it
-  event->print (event);
-
-  //destroy it
-  xbt_free (((newEvent_t)(event->data))->value);
-  xbt_free (event->data);
-  xbt_free (event);
-  event = NULL;
-}
-//
-//void pajeNewEvent(double time, const char *entityType,
-//                  const char *container, const char *value)
-//{
-//  INSTR_PAJE_ASSERT(entityType);
-//  INSTR_PAJE_ASSERT(container);
-//  INSTR_PAJE_ASSERT(value);
-//
-//  if (time == 0){
-//    fprintf(tracing_file, "%d 0 %s %s %s\n", pajeNewEventId,
-//          entityType, container, value);
-//  }else{
-//    fprintf(tracing_file, "%d %lf %s %s %s\n", pajeNewEventId, time,
-//          entityType, container, value);
-//  }
-//}
+  insert_into_buffer (event);
+}
 
 #endif /* HAVE_TRACING */