Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
added jedule output to SimDAG
authorsahu <sahu@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 9 Feb 2011 11:40:14 +0000 (11:40 +0000)
committersahu <sahu@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 9 Feb 2011 11:40:14 +0000 (11:40 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@9595 48e7efb5-ca39-0410-a469-dd3cf9ba447f

16 files changed:
buildtools/Cmake/CompleteInFiles.cmake
buildtools/Cmake/DefinePackages.cmake
buildtools/Cmake/Option.cmake
buildtools/Cmake/PrintArgs.cmake
include/instr/jedule/jedule_events.h
include/instr/jedule/jedule_output.h
include/instr/jedule/jedule_platform.h
include/instr/jedule/jedule_sd_binding.h
include/simgrid_config.h.in
src/instr/jedule/jedule_events.c
src/instr/jedule/jedule_output.c
src/instr/jedule/jedule_platform.c
src/instr/jedule/jedule_sd_binding.c
src/simdag/sd_global.c
src/simdag/sd_task.c
src/surf/surf_routing.c

index 1d76376..48577c5 100644 (file)
@@ -94,6 +94,10 @@ if(enable_tracing)
        SET(HAVE_TRACING 1)
 endif(enable_tracing)
 
+if(enable_jedule)
+       SET(HAVE_JEDULE 1)
+endif(enable_jedule)
+
 if(enable_latency_bound_tracking)
        SET(HAVE_LATENCY_BOUND_TRACKING 1)
 else(enable_latency_bound_tracking)
index 321c436..a32ed9d 100644 (file)
@@ -316,6 +316,18 @@ set(TRACING_SRC
        src/instr/instr_private.h
 )
 
+
+set(JEDULE_SRC
+       include/instr/jedule/jedule_events.h
+       include/instr/jedule/jedule_output.h
+       include/instr/jedule/jedule_platform.h
+       include/instr/jedule/jedule_sd_binding.h
+       src/instr/jedule/jedule_events.c
+       src/instr/jedule/jedule_output.c
+       src/instr/jedule/jedule_platform.c
+       src/instr/jedule/jedule_sd_binding.c
+)
+
 set(RUBY_SRC
        src/simix/smx_context_ruby.c
        src/bindings/ruby/rb_msg_process.c
@@ -480,6 +492,7 @@ set(simgrid_sources
        ${GRAS_COMMON_SRC}
        ${GRAS_SG_SRC}
        ${AMOK_SRC}
+       ${JEDULE_SRC}
 )
 
 if(HAVE_MC)
index 1e27d00..c7d2db7 100644 (file)
@@ -39,6 +39,7 @@ option(enable_memcheck "Enable memcheck." off)
 option(enable_print_message "Enable print message during config." off)
 option(enable_model-checking "" off)
 option(enable_lib_static "" off)
+option(enable_jedule "Jedule output of SimDAG." off)
 
 if(enable_supernovae AND enable_model-checking)
        set(enable_model-checking false CACHE TYPE INTERNAL FORCE)
index a3b6001..be1d029 100644 (file)
@@ -120,6 +120,7 @@ message("   Maintainer mode:        ${enable_maintainer_mode}")
 message("      Supernovae mode:        ${enable_supernovae}")
 message("      Model checking :        ${enable_model-checking}")
 message("      Tracing mode   :        ${enable_tracing}")
+message("      Jedule  mode   :        ${enable_jedule}")
 message("      Latency bound  :        ${enable_latency_bound_tracking}")
 message("        Graphviz mode  :        ${HAVE_GRAPHVIZ}")
 message("")
index 4d5b295..d2d6a97 100644 (file)
@@ -8,11 +8,16 @@
 #ifndef JEDULE_EVENTS_H_
 #define JEDULE_EVENTS_H_
 
-#include "jedule_platform.h"
+#include "simgrid_config.h"
 
 #include "xbt/dynar.h"
 #include "xbt/dict.h"
 
+#include "instr/jedule/jedule_platform.h"
+
+
+#ifdef HAVE_JEDULE
+
 struct jed_event {
        int event_id;
        char *name;
@@ -38,4 +43,6 @@ void jed_event_add_characteristic(jed_event_t event, char *characteristic);
 
 void jed_event_add_info(jed_event_t event, char *key, char *value);
 
+#endif
+
 #endif /* JEDULE_EVENTS_H_ */
index fea8a47..f75d699 100644 (file)
@@ -8,18 +8,26 @@
 #ifndef JEDULE_OUTPUT_H_
 #define JEDULE_OUTPUT_H_
 
+#include "simgrid_config.h"
+
+#include <stdio.h>
+
 #include "jedule_events.h"
 #include "jedule_platform.h"
 
-xbt_dynar_t jedule_event_list;
+#ifdef HAVE_JEDULE
 
-void init_jedule_output();
+extern xbt_dynar_t jedule_event_list;
 
-void cleanup_jedule();
+void jedule_init_output();
+
+void jedule_cleanup_output();
 
 void jedule_store_event(jed_event_t event);
 
-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);
 
+#endif
+
 #endif /* JEDULE_OUTPUT_H_ */
index f700c63..8999e03 100644 (file)
@@ -8,9 +8,13 @@
 #ifndef JED_SIMGRID_PLATFORM_H_
 #define JED_SIMGRID_PLATFORM_H_
 
+#include "simgrid_config.h"
+
 #include "xbt/dynar.h"
 #include "xbt/hash.h"
 
+#ifdef HAVE_JEDULE
+
 typedef struct jed_simgrid_container s_jed_simgrid_container_t,
                *jed_simgrid_container_t;
 
@@ -86,5 +90,7 @@ void jed_simgrid_get_resource_selection_by_hosts(xbt_dynar_t subset_list,
 
 */
 
+#endif
+
 
 #endif /* JED_SIMGRID_PLATFORM_H_ */
index 60f473a..4a8b700 100644 (file)
@@ -8,8 +8,25 @@
 #ifndef JEDULE_SD_BINDING_H_
 #define JEDULE_SD_BINDING_H_
 
+#include "simgrid_config.h"
+
+#include "simdag/private.h"
+#include "simdag/datatypes.h"
+#include "simdag/simdag.h"
+
+#ifdef HAVE_JEDULE
+
 void jedule_log_sd_event(SD_task_t task);
 
 void jedule_setup_platform();
 
+void jedule_sd_init();
+
+void jedule_sd_cleanup();
+
+void jedule_sd_dump();
+
 #endif /* JEDULE_SD_BINDING_H_ */
+
+
+#endif
index 3db2117..eea543b 100644 (file)
@@ -101,6 +101,9 @@ XBT_PUBLIC(char *) bprintf(const char *fmt, ...) _XBT_GNUC_PRINTF(1, 2);
 /* Tracing SimGrid */
 #cmakedefine HAVE_TRACING @HAVE_TRACING@
 
+/* Jedule output  */
+#cmakedefine HAVE_JEDULE @HAVE_JEDULE@
+
 /* Tracking of latency bound */
 #cmakedefine HAVE_LATENCY_BOUND_TRACKING @HAVE_LATENCY_BOUND_TRACKING@
 
index d781b38..7f77000 100644 (file)
@@ -9,13 +9,15 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "jedule_events.h"
-#include "jedule_platform.h"
-
 #include "xbt/dict.h"
 #include "xbt/dynar.h"
 #include "xbt/asserts.h"
 
+#include "instr/jedule/jedule_events.h"
+#include "instr/jedule/jedule_platform.h"
+
+#ifdef HAVE_JEDULE
+
 void jed_event_add_resources(jed_event_t event, xbt_dynar_t host_selection) {
        xbt_dynar_t resource_subset_list;
        jed_res_subset_t res_set;
@@ -80,3 +82,5 @@ void jed_event_free(jed_event_t event) {
 
        free(event);
 }
+
+#endif
index cf24c82..52a2cdd 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 
-#include "jedule_output.h"
+#include "instr/jedule/jedule_output.h"
 
 #include "xbt/dynar.h"
 #include "xbt/asserts.h"
 
+#ifdef HAVE_JEDULE
+
 /*********************************************************/
 
+xbt_dynar_t jedule_event_list;
+
 static FILE *jed_file;
 
 static void print_platform(jed_simgrid_container_t root_container);
@@ -68,8 +72,10 @@ 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\" values=\"%s\" />\n",key,data);
+               }
        }
 }
 
@@ -191,13 +197,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 +216,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 +231,4 @@ void jedule_store_event(jed_event_t event) {
        xbt_dynar_push(jedule_event_list, &event);
 }
 
-
+#endif
index 9b21d5c..04d31b1 100644 (file)
@@ -10,7 +10,9 @@
 #include "xbt/asserts.h"
 #include "xbt/dynar.h"
 
-#include "jedule_platform.h"
+#include "instr/jedule/jedule_platform.h"
+
+#ifdef HAVE_JEDULE
 
 /********************************************************************/
 
@@ -30,7 +32,9 @@ static void jed_free_container(jed_simgrid_container_t container);
 /********************************************************************/
 
 static int compare_hostnames(const void *host1, const void *host2) {
-       return strcmp ((char*)host1, (char*)host2);
+       const char *hp1 = *((const char**) host1);
+       const char *hp2 = *((const char**) host2);
+       return strcmp (hp1, hp2);
 }
 
 static int compare_ids(const void *num1, const void *num2) {
@@ -95,7 +99,6 @@ void jed_simgrid_add_resources(jed_simgrid_container_t parent,
        parent->last_id = 0;
        parent->resource_list = xbt_dynar_new(sizeof(char *), NULL);
 
-
        xbt_dynar_sort (host_names,     &compare_hostnames);
 
        xbt_dynar_foreach(host_names, iter, host_name) {
@@ -280,4 +283,4 @@ void jed_free_jedule(jedule_t jedule) {
        xbt_dict_free(&container_name2container);
 }
 
-
+#endif
index a1b4e56..957989f 100644 (file)
@@ -6,9 +6,23 @@
  */
 
 
+#include <stdio.h>
+
 #include "xbt/asserts.h"
 #include "xbt/dynar.h"
 
+#include "surf/surf_private.h"
+#include "surf/surf.h"
+
+#include "instr/jedule/jedule_sd_binding.h"
+#include "instr/jedule/jedule_events.h"
+#include "instr/jedule/jedule_platform.h"
+#include "instr/jedule/jedule_output.h"
+
+#ifdef HAVE_JEDULE
+
+jedule_t jedule;
+
 void jedule_log_sd_event(SD_task_t task) {
        xbt_dynar_t host_list;
        jed_event_t event;
@@ -23,20 +37,90 @@ void jedule_log_sd_event(SD_task_t task) {
                xbt_dynar_push(host_list, &hostname);
        }
 
-       create_jed_event(&event, SD_task_get_name(task), task->start_time,
-                       task->finish_time, "SD");
+       create_jed_event(&event,
+                       SD_task_get_name(task),
+                       task->start_time,
+                       task->finish_time,
+                       "SD");
 
        jed_event_add_resources(event, host_list);
-
        jedule_store_event(event);
 
        xbt_dynar_free(&host_list);
 }
 
+static void create_hierarchy(routing_component_t current_comp,
+               jed_simgrid_container_t current_container) {
+       xbt_dict_cursor_t cursor = NULL;
+       char *key;
+       routing_component_t elem;
+       network_element_t network_elem;
+
+       if( xbt_dict_length(current_comp->routing_sons) == 0 ) {
+               // I am no AS
+               // add hosts to jedule platform
+               xbt_dynar_t hosts;
+
+               hosts = xbt_dynar_new(sizeof(char*), NULL);
+
+               xbt_dict_foreach(current_comp->to_index, cursor, key, network_elem) {
+                       char *hostname;
+                       printf("key %s value %d\n", key, network_elem);
+                       //xbt_dynar_push_as(hosts, char*, key);
+                       hostname = strdup(key);
+                       xbt_dynar_push(hosts, &hostname);
+               }
+
+               jed_simgrid_add_resources(current_container, hosts);
+
+       } else {
+               xbt_dict_foreach(current_comp->routing_sons, cursor, key, elem) {
+                       jed_simgrid_container_t child_container;
+                       jed_simgrid_create_container(&child_container, elem->name);
+                       jed_simgrid_add_container(current_container, child_container);
+                       printf("name : %s\n", elem->name);
+                       create_hierarchy(elem, child_container);
+               }
+       }
+}
 
 void jedule_setup_platform() {
 
+       routing_component_t root_comp;
+       e_surf_network_element_type_t type;
+
+       jed_simgrid_container_t root_container;
+
+
+       jed_create_jedule(&jedule);
+
+       root_comp = global_routing->root;
+       printf("root name %s\n", root_comp->name);
 
+       // that doesn't work
+       type = root_comp->get_network_element_type(root_comp->name);
 
+       jed_simgrid_create_container(&root_container, root_comp->name);
+       jedule->root_container = root_container;
 
+       create_hierarchy(root_comp, root_container);
+
+}
+
+
+void jedule_sd_cleanup() {
+
+       jedule_cleanup_output();
+}
+
+void jedule_sd_init() {
+
+       jedule_init_output();
+}
+
+void jedule_sd_dump() {
+
+       write_jedule_output(stdout, jedule, jedule_event_list, NULL);
 }
+
+#endif
index 06849ea..a73ce53 100644 (file)
@@ -21,7 +21,7 @@
 #endif
 
 #ifdef HAVE_JEDULE
-#include "instr/jedule/jedule_output.h"
+#include "instr/jedule/jedule_sd_binding.h"
 #endif
 
 XBT_LOG_NEW_CATEGORY(sd, "Logging specific to SimDag");
@@ -98,7 +98,7 @@ void SD_init(int *argc, char **argv)
 #endif
 
 #ifdef HAVE_JEDULE
-  init_jedule_output();
+  jedule_sd_init();
 #endif
 }
 
@@ -149,8 +149,8 @@ void SD_application_reinit(void)
     sd_global->task_number = 0;
 
 #ifdef HAVE_JEDULE
-    cleanup_jedule();
-    init_jedule_output();
+    jedule_sd_cleanup();
+    jedule_sd_init();
 #endif
 
   } else {
@@ -430,7 +430,8 @@ void SD_exit(void)
   TRACE_end();
 #endif
 #ifdef HAVE_JEDULE
-  cleanup_jedule();
+  jedule_sd_dump();
+  jedule_sd_cleanup();
 #endif
 
     DEBUG0("Exiting Surf...");
index 255fe58..6ef31d4 100644 (file)
@@ -150,6 +150,9 @@ void __SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state)
     task->finish_time =
         surf_workstation_model->action_get_finish_time(task->surf_action);
     task->remains = 0;
+#ifdef HAVE_JEDULE
+    jedule_log_sd_event(task);
+#endif
     break;
   case SD_FAILED:
     task->state_set = sd_global->failed_task_set;
@@ -961,10 +964,6 @@ void __SD_task_really_run(SD_task_t task)
     TRACE_surf_action(task->surf_action, task->category);
 #endif
 
-#ifdef HAVE_JEDULE
-  jedule_log_sd_event(task);
-#endif
-
   __SD_task_destroy_scheduling_data(task);      /* now the scheduling data are not useful anymore */
   __SD_task_set_state(task, SD_RUNNING);
   xbt_assert2(__SD_task_is_running(task), "Bad state of task '%s': %d",
index f9c921a..b0f6d7e 100644 (file)
@@ -1282,6 +1282,7 @@ static void *model_full_create(void)
   new_component->generic_routing.finalize = full_finalize;
   new_component->generic_routing.to_index = xbt_dict_new();
   new_component->generic_routing.bypassRoutes = xbt_dict_new();
+  new_component->generic_routing.get_network_element_type = get_network_element_type;
   return new_component;
 }
 
@@ -1604,6 +1605,7 @@ static void *model_floyd_create(void)
   new_component->generic_routing.finalize = floyd_finalize;
   new_component->generic_routing.to_index = xbt_dict_new();
   new_component->generic_routing.bypassRoutes = xbt_dict_new();
+  new_component->generic_routing.get_network_element_type = get_network_element_type;
   return new_component;
 }
 
@@ -2226,6 +2228,7 @@ static void *model_dijkstra_both_create(int cached)
   new_component->cached = cached;
   new_component->generic_routing.to_index = xbt_dict_new();
   new_component->generic_routing.bypassRoutes = xbt_dict_new();
+  new_component->generic_routing.get_network_element_type = get_network_element_type;
   return new_component;
 }
 
@@ -2713,6 +2716,7 @@ static void *model_rulebased_create(void)
   new_component->generic_routing.get_latency = generic_get_link_latency;
   new_component->generic_routing.get_bypass_route = rulebased_get_bypass_route;
   new_component->generic_routing.finalize = rulebased_finalize;
+  new_component->generic_routing.get_network_element_type = get_network_element_type;
   /* initialization of internal structures */
   new_component->dict_processing_units = xbt_dict_new();
   new_component->dict_autonomous_systems = xbt_dict_new();