4 * Created on: Dec 1, 2010
13 #include "xbt/dynar.h"
14 #include "xbt/asserts.h"
16 #include "instr/jedule/jedule_output.h"
20 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(jed_out, jedule,
21 "Logging specific to Jedule output");
23 /*********************************************************/
25 xbt_dynar_t jedule_event_list;
27 static FILE *jed_file;
29 static void print_platform(jed_simgrid_container_t root_container);
30 static void print_container(jed_simgrid_container_t container);
31 static void print_resources(jed_simgrid_container_t resource_parent);
32 static void print_key_value_dict(xbt_dict_t meta_info_dict);
33 static void print_events(xbt_dynar_t event_list);
34 static void get_hierarchy_list(xbt_dynar_t hier_list, jed_simgrid_container_t container);
36 /*********************************************************/
39 static void get_hierarchy_list(xbt_dynar_t hier_list, jed_simgrid_container_t container) {
41 xbt_assert( container != NULL );
43 if( container->parent != NULL ) {
45 if( container->parent->container_children == NULL ) {
46 // we are in the last level
47 get_hierarchy_list(hier_list, container->parent);
52 jed_simgrid_container_t child_container;
54 xbt_dynar_foreach(container->parent->container_children, i, child_container) {
55 if( child_container == container ) {
61 xbt_assert( child_nb > - 1);
63 xbt_dynar_insert_at(hier_list, 0, &child_nb);
65 get_hierarchy_list(hier_list, container->parent);
69 xbt_dynar_insert_at(hier_list, 0, &top_level);
74 static void get_hierarchy_string(jed_simgrid_container_t container, char *outbuf) {
76 xbt_dynar_t hier_list;
82 hier_list = xbt_dynar_new(sizeof(int), NULL);
83 get_hierarchy_list(hier_list, container);
85 length = xbt_dynar_length(hier_list);
87 xbt_dynar_foreach(hier_list, iter, number) {
88 if( iter != length-1 ) {
89 sprintf(buf, "%d.", number);
91 sprintf(buf, "%d", number);
96 xbt_dynar_free(&hier_list);
99 static void print_key_value_dict(xbt_dict_t key_value_dict) {
100 xbt_dict_cursor_t cursor=NULL;
103 if( key_value_dict != NULL ) {
104 xbt_dict_foreach(key_value_dict,cursor,key,data) {
105 fprintf(jed_file, "<prop key=\"%s\" value=\"%s\" />\n",key,data);
110 static void print_container(jed_simgrid_container_t container) {
112 jed_simgrid_container_t child_container;
114 xbt_assert( container != NULL );
116 fprintf(jed_file, "<res name=\"%s\">\n", container->name);
117 if( container->container_children != NULL ) {
118 xbt_dynar_foreach(container->container_children, i, child_container) {
119 print_container(child_container);
122 print_resources(container);
124 fprintf(jed_file, "</res>\n");
127 static void print_resources(jed_simgrid_container_t resource_parent) {
132 xbt_assert( resource_parent->resource_list != NULL );
134 res_nb = xbt_dynar_length(resource_parent->resource_list);
136 get_hierarchy_string(resource_parent, resid);
138 fprintf(jed_file, "<rset id=\"%s\" nb=\"%d\" names=\"", resid, res_nb);
139 xbt_dynar_foreach(resource_parent->resource_list, i, res_name) {
140 fprintf(jed_file, "%s", res_name);
141 if( i != res_nb-1 ) {
142 fprintf(jed_file, "|");
145 fprintf(jed_file, "\" />\n");
149 static void print_platform(jed_simgrid_container_t root_container) {
151 fprintf(jed_file, "<platform>\n");
152 print_container(root_container);
153 fprintf(jed_file, "</platform>\n");
156 static void print_event(jed_event_t event) {
158 jed_res_subset_t subset;
161 xbt_assert( event != NULL );
162 xbt_assert( event->resource_subsets != NULL );
164 fprintf(jed_file, "<event>\n");
167 fprintf(jed_file, "<prop key=\"name\" value=\"%s\" />\n", event->name);
168 fprintf(jed_file, "<prop key=\"start\" value=\"%g\" />\n", event->start_time);
169 fprintf(jed_file, "<prop key=\"end\" value=\"%g\" />\n", event->end_time);
170 fprintf(jed_file, "<prop key=\"type\" value=\"%s\" />\n", event->type);
172 fprintf(jed_file, "<res_util>\n");
174 xbt_dynar_foreach(event->resource_subsets, i, subset) {
176 int start = subset->start_idx;
177 int end = subset->start_idx + subset->nres - 1;
180 get_hierarchy_string(subset->parent, resid);
182 fprintf(jed_file, "<select resources=\"");
183 fprintf(jed_file, "%s", resid);
184 fprintf(jed_file, ".[%d-%d]", start, end);
185 fprintf(jed_file, "\" />\n");
189 fprintf(jed_file, "</res_util>\n");
191 fprintf(jed_file, "<characteristics>\n");
195 xbt_dynar_foreach(event->characteristics_list, iter, ch) {
196 fprintf(jed_file, "<characteristic name=\"%s\" />\n", ch);
199 fprintf(jed_file, "</characteristics>\n");
201 fprintf(jed_file, "<info>\n");
202 print_key_value_dict(event->info_hash);
203 fprintf(jed_file, "</info>\n");
205 fprintf(jed_file, "</event>\n");
208 static void print_events(xbt_dynar_t event_list) {
212 fprintf(jed_file, "<events>\n");
213 xbt_dynar_foreach(event_list, i, event) {
216 fprintf(jed_file, "</events>\n");
220 void write_jedule_output(FILE *file, jedule_t jedule,
221 xbt_dynar_t event_list, xbt_dict_t meta_info_dict) {
223 // xbt_assert( jed_file != NULL );
227 fprintf(jed_file, "<jedule>\n");
229 fprintf(jed_file, "<jedule_meta>\n");
230 print_key_value_dict(jedule->jedule_meta_info);
231 fprintf(jed_file, "</jedule_meta>\n");
233 print_platform(jedule->root_container);
235 print_events(event_list);
237 fprintf(jed_file, "</jedule>\n");
241 void jedule_init_output() {
242 jedule_event_list = xbt_dynar_new(sizeof(jed_event_t), NULL);
245 void jedule_cleanup_output() {
246 xbt_dynar_free(&jedule_event_list);
249 void jedule_store_event(jed_event_t event) {
250 xbt_assert(event != NULL);
251 xbt_dynar_push(jedule_event_list, &event);