Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge tag 'v3_9_90' into hypervisor
[simgrid.git] / src / instr / instr_paje_trace.c
index df1b98f..734496d 100644 (file)
@@ -1,36 +1,16 @@
-/* Copyright (c) 2010. The SimGrid Team.
+/* Copyright (c) 2010-2013. 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. */
 
 #include "instr/instr_private.h"
+#include "xbt/virtu.h" /* sg_cmdline */
 
 #ifdef HAVE_TRACING
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_paje_trace, instr, "Paje tracing event system");
 
-typedef enum {
-  PAJE_DefineContainerType,
-  PAJE_DefineVariableType,
-  PAJE_DefineStateType,
-  PAJE_DefineEventType,
-  PAJE_DefineLinkType,
-  PAJE_DefineEntityValue,
-  PAJE_CreateContainer,
-  PAJE_DestroyContainer,
-  PAJE_SetVariable,
-  PAJE_AddVariable,
-  PAJE_SubVariable,
-  PAJE_SetState,
-  PAJE_PushState,
-  PAJE_PopState,
-  PAJE_ResetState,
-  PAJE_StartLink,
-  PAJE_EndLink,
-  PAJE_NewEvent
-} e_event_type;
-
 typedef struct paje_event *paje_event_t;
 typedef struct paje_event {
   double timestamp;
@@ -115,6 +95,7 @@ typedef struct s_pushState {
   container_t container;
   type_t type;
   val_t value;
+  int size;
 }s_pushState_t;
 
 typedef struct s_popState *popState_t;
@@ -136,6 +117,7 @@ typedef struct s_startLink {
   container_t sourceContainer;
   char *value;
   char *key;
+  int size;
 }s_startLink_t;
 
 typedef struct s_endLink *endLink_t;
@@ -154,10 +136,39 @@ typedef struct s_newEvent {
   val_t value;
 }s_newEvent_t;
 
-static FILE *tracing_file = NULL;
+FILE *tracing_file = NULL;
 
 static xbt_dynar_t buffer = NULL;
 
+static void dump_comment (const char *comment)
+{
+  if (!strlen(comment)) return;
+  fprintf (tracing_file, "# %s\n", comment);
+}
+
+static void dump_comment_file (const char *filename)
+{
+  if (!strlen(filename)) return;
+  FILE *file = fopen (filename, "r");
+  if (!file){
+    THROWF (system_error, 1, "Comment file %s could not be opened for reading.", filename);
+  }
+  while (!feof(file)){
+    char c;
+    c = fgetc(file);
+    if (feof(file)) break;
+    fprintf (tracing_file, "# ");
+    while (c != '\n'){
+      fprintf (tracing_file, "%c", c);
+      c = fgetc(file);
+      if (feof(file)) break;
+    }
+    fprintf (tracing_file, "\n");
+  }
+  fclose(file);
+}
+
+
 void TRACE_paje_start(void)
 {
   char *filename = TRACE_get_filename();
@@ -168,8 +179,24 @@ void TRACE_paje_start(void)
 
   XBT_DEBUG("Filename %s is open for writing", filename);
 
+  /* output generator version */
+  fprintf (tracing_file, "#This file was generated using SimGrid-%d.%d.%d\n", SIMGRID_VERSION_MAJOR, SIMGRID_VERSION_MINOR, SIMGRID_VERSION_PATCH);
+  fprintf (tracing_file, "#[");
+  unsigned int cpt;
+  char *str;
+  xbt_dynar_foreach (xbt_cmdline, cpt, str){
+    fprintf(tracing_file, "%s ",str);
+  }
+  fprintf (tracing_file, "]\n");
+
+  /* output one line comment */
+  dump_comment (TRACE_get_comment());
+
+  /* output comment file */
+  dump_comment_file (TRACE_get_comment_file());
+
   /* output header */
-  TRACE_paje_create_header();
+  TRACE_header(TRACE_basic(),TRACE_display_sizes());
 
   buffer = xbt_dynar_new (sizeof(paje_event_t), NULL);
 }
@@ -199,152 +226,20 @@ void TRACE_paje_dump_buffer (int force)
     buffer = xbt_dynar_new (sizeof(paje_event_t), NULL);
   }else{
     paje_event_t event;
-    while (!xbt_dynar_is_empty(buffer)){
-      double head_timestamp = (*(paje_event_t*)xbt_dynar_get_ptr(buffer, 0))->timestamp;
+    unsigned int cursor;
+    xbt_dynar_foreach(buffer, cursor, event) {
+      double head_timestamp = event->timestamp;
       if (head_timestamp > TRACE_last_timestamp_to_dump){
         break;
       }
-      xbt_dynar_remove_at (buffer, 0, &event);
       event->print (event);
       event->free (event);
     }
+    xbt_dynar_remove_n_at(buffer, cursor, 0);
   }
   XBT_DEBUG("%s: ends", __FUNCTION__);
 }
 
-void TRACE_paje_create_header(void)
-{
-  XBT_DEBUG ("Define paje header");
-  fprintf(tracing_file, "\
-%%EventDef PajeDefineContainerType %d \n\
-%%       Alias string \n\
-%%       Type string \n\
-%%       Name string \n\
-%%EndEventDef \n\
-%%EventDef PajeDefineVariableType %d \n\
-%%       Alias string \n\
-%%       Type string \n\
-%%       Name string \n\
-%%       Color color \n\
-%%EndEventDef \n\
-%%EventDef PajeDefineStateType %d \n\
-%%       Alias string \n\
-%%       Type string \n\
-%%       Name string \n\
-%%EndEventDef \n\
-%%EventDef PajeDefineEventType %d \n\
-%%       Alias string \n\
-%%       Type string \n\
-%%       Name string \n\
-%%       Color color \n\
-%%EndEventDef \n\
-%%EventDef PajeDefineLinkType %d \n\
-%%       Alias string \n\
-%%       Type string \n\
-%%       StartContainerType string \n\
-%%       EndContainerType string \n\
-%%       Name string \n\
-%%EndEventDef \n\
-%%EventDef PajeDefineEntityValue %d \n\
-%%       Alias string \n\
-%%       Type string \n\
-%%       Name string \n\
-%%       Color color \n\
-%%EndEventDef \n\
-%%EventDef PajeCreateContainer %d \n\
-%%       Time date \n\
-%%       Alias string \n\
-%%       Type string \n\
-%%       Container string \n\
-%%       Name string \n\
-%%EndEventDef \n\
-%%EventDef PajeDestroyContainer %d \n\
-%%       Time date \n\
-%%       Type string \n\
-%%       Name string \n\
-%%EndEventDef \n\
-%%EventDef PajeSetVariable %d \n\
-%%       Time date \n\
-%%       Type string \n\
-%%       Container string \n\
-%%       Value double \n\
-%%EndEventDef\n\
-%%EventDef PajeAddVariable %d \n\
-%%       Time date \n\
-%%       Type string \n\
-%%       Container string \n\
-%%       Value double \n\
-%%EndEventDef\n\
-%%EventDef PajeSubVariable %d \n\
-%%       Time date \n\
-%%       Type string \n\
-%%       Container string \n\
-%%       Value double \n\
-%%EndEventDef\n\
-%%EventDef PajeSetState %d \n\
-%%       Time date \n\
-%%       Type string \n\
-%%       Container string \n\
-%%       Value string \n\
-%%EndEventDef\n\
-%%EventDef PajePushState %d \n\
-%%       Time date \n\
-%%       Type string \n\
-%%       Container string \n\
-%%       Value string \n\
-%%EndEventDef\n\
-%%EventDef PajePopState %d \n\
-%%       Time date \n\
-%%       Type string \n\
-%%       Container string \n\
-%%EndEventDef\n\
-%%EventDef PajeResetState %d \n\
-%%       Time date \n\
-%%       Type string \n\
-%%       Container string \n\
-%%EndEventDef\n\
-%%EventDef PajeStartLink %d \n\
-%%       Time date \n\
-%%       Type string \n\
-%%       Container string \n\
-%%       Value string \n\
-%%       StartContainer string \n\
-%%       Key string \n\
-%%EndEventDef\n\
-%%EventDef PajeEndLink %d \n\
-%%       Time date \n\
-%%       Type string \n\
-%%       Container string \n\
-%%       Value string \n\
-%%       EndContainer string \n\
-%%       Key string \n\
-%%EndEventDef\n\
-%%EventDef PajeNewEvent %d \n\
-%%       Time date \n\
-%%       Type string \n\
-%%       Container string \n\
-%%       Value string \n\
-%%EndEventDef\n",
-  PAJE_DefineContainerType,
-  PAJE_DefineVariableType,
-  PAJE_DefineStateType,
-  PAJE_DefineEventType,
-  PAJE_DefineLinkType,
-  PAJE_DefineEntityValue,
-  PAJE_CreateContainer,
-  PAJE_DestroyContainer,
-  PAJE_SetVariable,
-  PAJE_AddVariable,
-  PAJE_SubVariable,
-  PAJE_SetState,
-  PAJE_PushState,
-  PAJE_PopState,
-  PAJE_ResetState,
-  PAJE_StartLink,
-  PAJE_EndLink,
-  PAJE_NewEvent);
-}
-
 /* internal do the instrumentation module */
 static void insert_into_buffer (paje_event_t tbi)
 {
@@ -354,7 +249,7 @@ static void insert_into_buffer (paje_event_t tbi)
     return;
   }
   XBT_DEBUG("%s: insert event_type=%d, timestamp=%f, buffersize=%lu)",
-           __FUNCTION__, (int)tbi->event_type, tbi->timestamp, xbt_dynar_length(buffer));
+      __FUNCTION__, (int)tbi->event_type, tbi->timestamp, xbt_dynar_length(buffer));
 
   unsigned int i;
   for (i = xbt_dynar_length(buffer); i > 0; i--) {
@@ -404,12 +299,11 @@ static void print_pajeDefineStateType(paje_event_t event)
 static void print_pajeDefineEventType(paje_event_t event)
 {
   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
-  fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
+  fprintf(tracing_file, "%d %s %s %s\n",
       (int)event->event_type,
       ((defineEventType_t)event->data)->type->id,
       ((defineEventType_t)event->data)->type->father->id,
-      ((defineEventType_t)event->data)->type->name,
-      ((defineEventType_t)event->data)->type->color);
+      ((defineEventType_t)event->data)->type->name);
 }
 
 static void print_pajeDefineLinkType(paje_event_t event)
@@ -446,7 +340,7 @@ static void print_pajeCreateContainer(paje_event_t event)
         ((createContainer_t)event->data)->container->father->id,
         ((createContainer_t)event->data)->container->name);
   }else{
-    fprintf(tracing_file, "%d %lf %s %s %s \"%s\"\n",
+    fprintf(tracing_file, "%d %f %s %s %s \"%s\"\n",
         (int)event->event_type,
         event->timestamp,
         ((createContainer_t)event->data)->container->id,
@@ -465,7 +359,7 @@ static void print_pajeDestroyContainer(paje_event_t event)
         ((destroyContainer_t)event->data)->container->type->id,
         ((destroyContainer_t)event->data)->container->id);
   }else{
-    fprintf(tracing_file, "%d %lf %s %s\n",
+    fprintf(tracing_file, "%d %f %s %s\n",
         (int)event->event_type,
         event->timestamp,
         ((destroyContainer_t)event->data)->container->type->id,
@@ -483,7 +377,7 @@ static void print_pajeSetVariable(paje_event_t event)
         ((setVariable_t)event->data)->container->id,
         ((setVariable_t)event->data)->value);
   }else{
-    fprintf(tracing_file, "%d %lf %s %s %f\n",
+    fprintf(tracing_file, "%d %f %s %s %f\n",
         (int)event->event_type,
         event->timestamp,
         ((setVariable_t)event->data)->type->id,
@@ -502,7 +396,7 @@ static void print_pajeAddVariable(paje_event_t event)
         ((addVariable_t)event->data)->container->id,
         ((addVariable_t)event->data)->value);
   }else{
-    fprintf(tracing_file, "%d %lf %s %s %f\n",
+    fprintf(tracing_file, "%d %f %s %s %f\n",
         (int)event->event_type,
         event->timestamp,
         ((addVariable_t)event->data)->type->id,
@@ -521,7 +415,7 @@ static void print_pajeSubVariable(paje_event_t event)
         ((subVariable_t)event->data)->container->id,
         ((subVariable_t)event->data)->value);
   }else{
-    fprintf(tracing_file, "%d %lf %s %s %f\n",
+    fprintf(tracing_file, "%d %f %s %s %f\n",
         (int)event->event_type,
         event->timestamp,
         ((subVariable_t)event->data)->type->id,
@@ -540,7 +434,7 @@ static void print_pajeSetState(paje_event_t event)
         ((setState_t)event->data)->container->id,
         ((setState_t)event->data)->value->id);
   }else{
-    fprintf(tracing_file, "%d %lf %s %s %s\n",
+    fprintf(tracing_file, "%d %f %s %s %s\n",
         (int)event->event_type,
         event->timestamp,
         ((setState_t)event->data)->type->id,
@@ -552,19 +446,39 @@ static void print_pajeSetState(paje_event_t event)
 static void print_pajePushState(paje_event_t event)
 {
   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
-  if (event->timestamp == 0){
-    fprintf(tracing_file, "%d 0 %s %s %s\n",
-        (int)event->event_type,
-        ((pushState_t)event->data)->type->id,
-        ((pushState_t)event->data)->container->id,
-        ((pushState_t)event->data)->value->id);
+  if (!TRACE_display_sizes()){
+    if (event->timestamp == 0){
+      fprintf(tracing_file, "%d 0 %s %s %s\n",
+          (int)event->event_type,
+          ((pushState_t)event->data)->type->id,
+          ((pushState_t)event->data)->container->id,
+          ((pushState_t)event->data)->value->id);
+    }else{
+      fprintf(tracing_file, "%d %f %s %s %s\n",
+          (int)event->event_type,
+          event->timestamp,
+          ((pushState_t)event->data)->type->id,
+          ((pushState_t)event->data)->container->id,
+          ((pushState_t)event->data)->value->id);
+    }
   }else{
-    fprintf(tracing_file, "%d %lf %s %s %s\n",
-        (int)event->event_type,
-        event->timestamp,
-        ((pushState_t)event->data)->type->id,
-        ((pushState_t)event->data)->container->id,
-        ((pushState_t)event->data)->value->id);
+    if (event->timestamp == 0){
+      fprintf(tracing_file, "%d 0 %s %s %s %d\n",
+          (int)event->event_type,
+          ((pushState_t)event->data)->type->id,
+          ((pushState_t)event->data)->container->id,
+          ((pushState_t)event->data)->value->id,
+          ((pushState_t)event->data)->size);
+    }else{
+      fprintf(tracing_file, "%d %f %s %s %s %d\n",
+          (int)event->event_type,
+          event->timestamp,
+          ((pushState_t)event->data)->type->id,
+          ((pushState_t)event->data)->container->id,
+          ((pushState_t)event->data)->value->id,
+          ((pushState_t)event->data)->size);
+    }
+
   }
 }
 
@@ -577,7 +491,7 @@ static void print_pajePopState(paje_event_t event)
         ((popState_t)event->data)->type->id,
         ((popState_t)event->data)->container->id);
   }else{
-    fprintf(tracing_file, "%d %lf %s %s\n",
+    fprintf(tracing_file, "%d %f %s %s\n",
         (int)event->event_type,
         event->timestamp,
         ((popState_t)event->data)->type->id,
@@ -594,7 +508,7 @@ static void print_pajeResetState(paje_event_t event)
         ((resetState_t)event->data)->type->id,
         ((resetState_t)event->data)->container->id);
   }else{
-    fprintf(tracing_file, "%d %lf %s %s\n",
+    fprintf(tracing_file, "%d %f %s %s\n",
         (int)event->event_type,
         event->timestamp,
         ((resetState_t)event->data)->type->id,
@@ -604,24 +518,47 @@ static void print_pajeResetState(paje_event_t event)
 
 static void print_pajeStartLink(paje_event_t event)
 {
+  if (!TRACE_display_sizes()){
+    if (event->timestamp == 0){
+      fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
+          (int)event->event_type,
+          ((startLink_t)event->data)->type->id,
+          ((startLink_t)event->data)->container->id,
+          ((startLink_t)event->data)->value,
+          ((startLink_t)event->data)->sourceContainer->id,
+          ((startLink_t)event->data)->key);
+    }else {
+      fprintf(tracing_file, "%d %f %s %s %s %s %s\n",
+          (int)event->event_type,
+          event->timestamp,
+          ((startLink_t)event->data)->type->id,
+          ((startLink_t)event->data)->container->id,
+          ((startLink_t)event->data)->value,
+          ((startLink_t)event->data)->sourceContainer->id,
+          ((startLink_t)event->data)->key);
+    }
+  }else{
   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
-  if (event->timestamp == 0){
-    fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
-        (int)event->event_type,
-        ((startLink_t)event->data)->type->id,
-        ((startLink_t)event->data)->container->id,
-        ((startLink_t)event->data)->value,
-        ((startLink_t)event->data)->sourceContainer->id,
-        ((startLink_t)event->data)->key);
-  }else {
-    fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
-        (int)event->event_type,
-        event->timestamp,
-        ((startLink_t)event->data)->type->id,
-        ((startLink_t)event->data)->container->id,
-        ((startLink_t)event->data)->value,
-        ((startLink_t)event->data)->sourceContainer->id,
-        ((startLink_t)event->data)->key);
+    if (event->timestamp == 0){
+      fprintf(tracing_file, "%d 0 %s %s %s %s %s %d\n",
+          (int)event->event_type,
+          ((startLink_t)event->data)->type->id,
+          ((startLink_t)event->data)->container->id,
+          ((startLink_t)event->data)->value,
+          ((startLink_t)event->data)->sourceContainer->id,
+          ((startLink_t)event->data)->key,
+          ((startLink_t)event->data)->size);
+    }else {
+      fprintf(tracing_file, "%d %f %s %s %s %s %s %d\n",
+          (int)event->event_type,
+          event->timestamp,
+          ((startLink_t)event->data)->type->id,
+          ((startLink_t)event->data)->container->id,
+          ((startLink_t)event->data)->value,
+          ((startLink_t)event->data)->sourceContainer->id,
+          ((startLink_t)event->data)->key,
+          ((startLink_t)event->data)->size);
+    }
   }
 }
 
@@ -637,7 +574,7 @@ static void print_pajeEndLink(paje_event_t event)
         ((endLink_t)event->data)->destContainer->id,
         ((endLink_t)event->data)->key);
   }else {
-    fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
+    fprintf(tracing_file, "%d %f %s %s %s %s %s\n",
         (int)event->event_type,
         event->timestamp,
         ((endLink_t)event->data)->type->id,
@@ -658,7 +595,7 @@ static void print_pajeNewEvent (paje_event_t event)
         ((newEvent_t)event->data)->container->id,
         ((newEvent_t)event->data)->value->id);
   }else{
-    fprintf(tracing_file, "%d %lf %s %s %s\n",
+    fprintf(tracing_file, "%d %f %s %s %s\n",
         (int)event->event_type,
         event->timestamp,
         ((newEvent_t)event->data)->type->id,
@@ -905,6 +842,25 @@ void new_pajePushState (double timestamp, container_t container, type_t type, va
   ((pushState_t)(event->data))->type = type;
   ((pushState_t)(event->data))->container = container;
   ((pushState_t)(event->data))->value = value;
+  ((pushState_t)(event->data))->size = -1;
+
+  XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
+
+  insert_into_buffer (event);
+}
+
+void new_pajePushStateWithSize (double timestamp, container_t container, type_t type, val_t value, int size)
+{
+  paje_event_t event = xbt_new0(s_paje_event_t, 1);
+  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 = value;
+  ((pushState_t)(event->data))->size = size;
 
   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
 
@@ -958,6 +914,26 @@ void new_pajeStartLink (double timestamp, container_t container, type_t type, co
   ((startLink_t)(event->data))->sourceContainer = sourceContainer;
   ((startLink_t)(event->data))->value = xbt_strdup(value);
   ((startLink_t)(event->data))->key = xbt_strdup(key);
+  ((startLink_t)(event->data))->size = -1;
+  XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
+
+  insert_into_buffer (event);
+}
+
+void new_pajeStartLinkWithSize (double timestamp, container_t container, type_t type, container_t sourceContainer, const char *value, const char *key, int size)
+{
+  paje_event_t event = xbt_new0(s_paje_event_t, 1);
+  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;
+  ((startLink_t)(event->data))->sourceContainer = sourceContainer;
+  ((startLink_t)(event->data))->value = xbt_strdup(value);
+  ((startLink_t)(event->data))->key = xbt_strdup(key);
+  ((startLink_t)(event->data))->size = size;
 
   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);