Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix build with paranoid flags: remove redundant '\0' in string.
[simgrid.git] / src / instr / jedule / jedule_output.c
index cf24c82..7cb7af0 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 
-#include "jedule_output.h"
-
 #include "xbt/dynar.h"
 #include "xbt/asserts.h"
 
+#include "instr/jedule/jedule_output.h"
+
+#ifdef HAVE_JEDULE
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(jed_out, jedule,
+                                "Logging specific to Jedule output");
+
 /*********************************************************/
 
+xbt_dynar_t jedule_event_list;
+
 static FILE *jed_file;
 
 static void print_platform(jed_simgrid_container_t root_container);
@@ -64,12 +71,39 @@ static void get_hierarchy_list(xbt_dynar_t hier_list, jed_simgrid_container_t co
 
 }
 
+static void get_hierarchy_string(jed_simgrid_container_t container, char *outbuf) {
+    char buf[1024];
+    xbt_dynar_t hier_list;
+    unsigned int iter;
+    int number;
+    int length;
+    
+    outbuf[0] = '\0';
+    hier_list = xbt_dynar_new(sizeof(int), NULL);
+    get_hierarchy_list(hier_list, container);
+    
+    length = xbt_dynar_length(hier_list);
+    
+    xbt_dynar_foreach(hier_list, iter, number) {
+        if( iter != length-1 ) {
+            sprintf(buf, "%d.", number);
+        } else {
+            sprintf(buf, "%d", number);
+        }
+        strcat(outbuf, buf);
+    }
+    
+    xbt_dynar_free(&hier_list);    
+}
+
 static void print_key_value_dict(xbt_dict_t key_value_dict) {
        xbt_dict_cursor_t cursor=NULL;
        char *key,*data;
 
-       xbt_dict_foreach(key_value_dict,cursor,key,data) {
-           fprintf(jed_file, "<prop key=\"%s\" values=\"%s\" />\n",key,data);
+       if( key_value_dict != NULL ) {
+               xbt_dict_foreach(key_value_dict,cursor,key,data) {
+                       fprintf(jed_file, "<prop key=\"%s\" value=\"%s\" />\n",key,data);
+               }
        }
 }
 
@@ -94,11 +128,14 @@ static void print_resources(jed_simgrid_container_t resource_parent) {
        int res_nb;
        unsigned int i;
        char *res_name;
+    char resid[1024];
        xbt_assert( resource_parent->resource_list != NULL );
 
        res_nb = xbt_dynar_length(resource_parent->resource_list);
+    
+    get_hierarchy_string(resource_parent, resid);
 
-       fprintf(jed_file, "<rset nb=\"%d\" names=\"", res_nb);
+       fprintf(jed_file, "<rset id=\"%s\" nb=\"%d\" names=\"", resid, res_nb);
        xbt_dynar_foreach(resource_parent->resource_list, i, res_name) {
                fprintf(jed_file, "%s", res_name);
                if( i != res_nb-1 ) {
@@ -127,10 +164,10 @@ static void print_event(jed_event_t event) {
        fprintf(jed_file, "<event>\n");
 
 
-       fprintf(jed_file, "<prop value=\"name\" value=\"%s\" />\n", event->name);
-       fprintf(jed_file, "<prop value=\"start\" value=\"%g\" />\n", event->start_time);
-       fprintf(jed_file, "<prop value=\"end\" value=\"%g\" />\n", event->end_time);
-       fprintf(jed_file, "<prop value=\"type\" value=\"%s\" />\n", event->type);
+       fprintf(jed_file, "<prop key=\"name\" value=\"%s\" />\n", event->name);
+       fprintf(jed_file, "<prop key=\"start\" value=\"%g\" />\n", event->start_time);
+       fprintf(jed_file, "<prop key=\"end\" value=\"%g\" />\n", event->end_time);
+       fprintf(jed_file, "<prop key=\"type\" value=\"%s\" />\n", event->type);
 
        fprintf(jed_file, "<res_util>\n");
 
@@ -138,26 +175,15 @@ static void print_event(jed_event_t event) {
 
                int start = subset->start_idx;
                int end   = subset->start_idx + subset->nres - 1;
-               xbt_dynar_t hier_list;
-               unsigned int iter;
-               int number;
-
-               hier_list = xbt_dynar_new(sizeof(int), NULL);
-
-               //printf("subset start %d nres %d\n", subset->start_idx, subset->nres);
-
-               //printf("parent %s\n", event->resource_selection[i]->parent->name);
-               get_hierarchy_list(hier_list, subset->parent);
+        char resid[1024];
 
+        get_hierarchy_string(subset->parent, resid);
+        
                fprintf(jed_file, "<select resources=\"");
-
-               xbt_dynar_foreach(hier_list, iter, number) {
-                       fprintf(jed_file, "%d.", number);
-               }
-               fprintf(jed_file, "[%d-%d]", start, end);
+        fprintf(jed_file, "%s", resid);
+               fprintf(jed_file, ".[%d-%d]", start, end);
                fprintf(jed_file, "\" />\n");
 
-               xbt_dynar_free(&hier_list);
        }
 
        fprintf(jed_file, "</res_util>\n");
@@ -191,13 +217,12 @@ static void print_events(xbt_dynar_t event_list)  {
 }
 
 
-void write_jedule_output(char *filename, jedule_t jedule,
+void write_jedule_output(FILE *file, jedule_t jedule,
                xbt_dynar_t event_list, xbt_dict_t meta_info_dict) {
 
-       xbt_assert( filename != NULL );
+//     xbt_assert( jed_file != NULL );
 
-       jed_file = fopen(filename, "w");
-       xbt_assert( jed_file != NULL );
+       jed_file = file;
 
        fprintf(jed_file, "<jedule>\n");
 
@@ -211,15 +236,13 @@ void write_jedule_output(char *filename, jedule_t jedule,
 
        fprintf(jed_file, "</jedule>\n");
 
-       fclose(jed_file);
-
 }
 
-void init_jedule_output() {
+void jedule_init_output() {
        jedule_event_list = xbt_dynar_new(sizeof(jed_event_t), NULL);
 }
 
-void cleanup_jedule() {
+void jedule_cleanup_output() {
        xbt_dynar_free(&jedule_event_list);
 }
 
@@ -228,4 +251,4 @@ void jedule_store_event(jed_event_t event) {
        xbt_dynar_push(jedule_event_list, &event);
 }
 
-
+#endif