Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[trace] let user code declare/set/push/pop states for hosts
authorschnorr <Lucas.Schnorr@imag.fr>
Wed, 25 Apr 2012 16:33:56 +0000 (18:33 +0200)
committerschnorr <Lucas.Schnorr@imag.fr>
Wed, 25 Apr 2012 16:41:19 +0000 (18:41 +0200)
details:
- useful for gantt-based views

include/instr/instr.h
src/instr/instr_interface.c
src/instr/instr_private.h
src/instr/instr_routing.c

index da7491c..ccd354e 100644 (file)
@@ -69,6 +69,11 @@ XBT_PUBLIC(void) TRACE_link_srcdst_variable_set_with_time (double time, const ch
 XBT_PUBLIC(void) TRACE_link_srcdst_variable_add_with_time (double time, const char *src, const char *dst, const char *variable, double value);
 XBT_PUBLIC(void) TRACE_link_srcdst_variable_sub_with_time (double time, const char *src, const char *dst, const char *variable, double value);
 XBT_PUBLIC(xbt_dynar_t) TRACE_get_link_variables (void);
+XBT_PUBLIC(void) TRACE_host_state_declare (const char *state);
+XBT_PUBLIC(void) TRACE_host_state_declare_value (const char *state, const char *value, const char *color);
+XBT_PUBLIC(void) TRACE_host_set_state (const char *host, const char *state, const char *value);
+XBT_PUBLIC(void) TRACE_host_push_state (const char *host, const char *state, const char *value);
+XBT_PUBLIC(void) TRACE_host_pop_state (const char *host, const char *state);
 
 /* for creating graph configuration files for Triva by hand */
 XBT_PUBLIC(xbt_dynar_t) TRACE_get_node_types (void);
index a24ded0..26daa66 100644 (file)
@@ -787,6 +787,102 @@ xbt_dynar_t TRACE_get_link_variables (void)
   return instr_dict_to_dynar (user_link_variables);
 }
 
+/** \ingroup TRACE_user_variables
+ *  \brief Declare a new user state associated to hosts.
+ *
+ *  Declare a user state that will be associated to hosts.
+ *  A user host state can be used to trace application states.
+ *
+ *  \param state The name of the new state to be declared.
+ *
+ *  \see TRACE_host_state_declare_value
+ */
+void TRACE_host_state_declare (const char *state)
+{
+  instr_new_user_state_type("HOST", state);
+}
+
+/** \ingroup TRACE_user_variables
+ *  \brief Declare a new value for a user state associated to hosts.
+ *
+ *  Declare a value for a state. The color needs to be
+ *  a string with three numbers separated by spaces in the range [0,1].
+ *  A light-gray color can be specified using "0.7 0.7 0.7" as color.
+ *
+ *  \param state The name of the new state to be declared.
+ *  \param value The name of the value
+ *  \param color The color of the value
+ *
+ *  \see TRACE_host_state_declare
+ */
+void TRACE_host_state_declare_value (const char *state, const char *value, const char *color)
+{
+  instr_new_value_for_user_state_type (state, value, color);
+}
+
+/** \ingroup TRACE_user_variables
+ *  \brief Set the user state to the given value.
+ *
+ *  Change a user state previously declared to the given value.
+ *
+ *  \param host The name of the host to be considered.
+ *  \param state The name of the state previously declared.
+ *  \param value The new value of the state.
+ *
+ *  \see TRACE_host_state_declare, TRACE_host_push_state, TRACE_host_pop_state
+ */
+void TRACE_host_set_state (const char *host, const char *state, const char *value)
+{
+  container_t container = PJ_container_get(host);
+  type_t type = PJ_type_get (state, container->type);
+  val_t val = PJ_value_get (value, type);
+  if (val == NULL){
+    //if user didn't declare a value with a color, user a NULL color
+    PJ_value_new (value, NULL, type);
+  }
+  new_pajeSetState(MSG_get_clock(), container, type, val);
+}
+
+/** \ingroup TRACE_user_variables
+ *  \brief Push a new value for a state of a given host.
+ *
+ *  Change a user state previously declared by pushing the new value to the state.
+ *
+ *  \param host The name of the host to be considered.
+ *  \param state The name of the state previously declared.
+ *  \param value The value to be pushed.
+ *
+ *  \see TRACE_host_state_declare, TRACE_host_set_state, TRACE_host_pop_state
+ */
+void TRACE_host_push_state (const char *host, const char *state, const char *value)
+{
+  container_t container = PJ_container_get(host);
+  type_t type = PJ_type_get (state, container->type);
+  val_t val = PJ_value_get (value, type);
+  if (val == NULL){
+    //if user didn't declare a value with a color, user a NULL color
+    PJ_value_new (value, NULL, type);
+  }
+  new_pajePushState(MSG_get_clock(), container, type, val);
+}
+
+/** \ingroup TRACE_user_variables
+ *  \brief Pop the last value of a state of a given host.
+ *
+ *  Change a user state previously declared by removing the last value of the state.
+ *
+ *  \param host The name of the host to be considered.
+ *  \param state The name of the state to be popped.
+ *
+ *  \see TRACE_host_state_declare, TRACE_host_set_state, TRACE_host_push_state
+ */
+void TRACE_host_pop_state (const char *host, const char *state)
+{
+  container_t container = PJ_container_get(host);
+  type_t type = PJ_type_get (state, container->type);
+  new_pajePopState(MSG_get_clock(), container, type);
+}
+
 /** \ingroup TRACE_API
  *  \brief Get Paje container types that can be mapped to the nodes of a graph.
  *
index e61edea..76cba92 100644 (file)
@@ -226,6 +226,8 @@ void PJ_value_free (val_t value);
 void instr_routing_define_callbacks (void);
 void instr_new_variable_type (const char *new_typename, const char *color);
 void instr_new_user_variable_type  (const char *father_type, const char *new_typename, const char *color);
+void instr_new_user_state_type (const char *father_type, const char *new_typename);
+void instr_new_value_for_user_state_type (const char *typename, const char *value, const char *color);
 int instr_platform_traced (void);
 xbt_graph_t instr_routing_platform_graph (void);
 void instr_routing_platform_graph_export_graphviz (xbt_graph_t g, const char *filename);
index d2c91ee..5006b68 100644 (file)
@@ -396,7 +396,41 @@ void instr_new_user_variable_type  (const char *father_type, const char *new_typ
   recursiveNewUserVariableType (father_type, new_typename, color, PJ_type_get_root());
 }
 
+static void recursiveNewUserStateType (const char *father_type, const char *new_typename, type_t root)
+{
+  if (!strcmp (root->name, father_type)){
+    PJ_type_state_new (new_typename, root);
+  }
+  xbt_dict_cursor_t cursor = NULL;
+  type_t child_type;
+  char *name;
+  xbt_dict_foreach(root->children, cursor, name, child_type) {
+    recursiveNewUserStateType (father_type, new_typename, child_type);
+  }
+}
+
+void instr_new_user_state_type (const char *father_type, const char *new_typename)
+{
+  recursiveNewUserStateType (father_type, new_typename, PJ_type_get_root());
+}
 
+static void recursiveNewValueForUserStateType (const char *typename, const char *value, const char *color, type_t root)
+{
+  if (!strcmp (root->name, typename)){
+    PJ_value_new (value, color, root);
+  }
+  xbt_dict_cursor_t cursor = NULL;
+  type_t child_type;
+  char *name;
+  xbt_dict_foreach(root->children, cursor, name, child_type) {
+    recursiveNewValueForUserStateType (typename, value, color, child_type);
+  }
+}
+
+void instr_new_value_for_user_state_type (const char *typename, const char *value, const char *color)
+{
+  recursiveNewValueForUserStateType (typename, value, color, PJ_type_get_root());
+}
 
 int instr_platform_traced ()
 {