xbt_dict_t declared_marks = NULL;
xbt_dict_t user_host_variables = NULL;
xbt_dict_t user_link_variables = NULL;
+extern xbt_dict_t trivaNodeTypes;
+extern xbt_dict_t trivaEdgeTypes;
+
+static xbt_dynar_t instr_dict_to_dynar (xbt_dict_t filter)
+{
+ if (!TRACE_is_enabled()) return NULL;
+ if (!TRACE_needs_platform()) return NULL;
+
+ xbt_dynar_t ret = xbt_dynar_new (sizeof(char*), &xbt_free_ref);
+ xbt_dict_cursor_t cursor = NULL;
+ char *name, *value;
+ xbt_dict_foreach(filter, cursor, name, value) {
+ xbt_dynar_push_as (ret, char*, xbt_strdup(name));
+ }
+ return ret;
+}
/** \ingroup TRACE_category
* \brief Declare a new category with a random color.
if (!TRACE_is_enabled()) return NULL;
if (!TRACE_categorized()) return NULL;
- xbt_dynar_t ret = xbt_dynar_new (sizeof(char*), &xbt_free_ref);
- xbt_dict_cursor_t cursor = NULL;
- char *name, *value;
- xbt_dict_foreach(created_categories, cursor, name, value) {
- xbt_dynar_push_as (ret, char*, xbt_strdup(name));
- }
- return ret;
+ return instr_dict_to_dynar (created_categories);
}
/** \ingroup TRACE_mark
{
if (!TRACE_is_enabled()) return NULL;
- xbt_dynar_t ret = xbt_dynar_new (sizeof(char*), &xbt_free_ref);
- xbt_dict_cursor_t cursor = NULL;
- char *name, *value;
- xbt_dict_foreach(declared_marks, cursor, name, value) {
- xbt_dynar_push_as (ret, char*, xbt_strdup(name));
- }
- return ret;
+ return instr_dict_to_dynar (declared_marks);
}
static void instr_user_variable(double time,
if (!TRACE_needs_platform()) return;
//check if variable is already declared
- char *created = xbt_dict_get_or_null(declared_marks, variable);
+ char *created = xbt_dict_get_or_null(filter, variable);
if (what == INSTR_US_DECLARE){
if (created){
//already declared
InstrUserVariable what)
{
xbt_dynar_t route=NULL;
- network_element_t src_elm = xbt_lib_get_or_null(host_lib,src,ROUTING_HOST_LEVEL);
- if(!src_elm) src_elm = xbt_lib_get_or_null(as_router_lib,src,ROUTING_ASR_LEVEL);
+ sg_routing_edge_t src_elm = sg_routing_edge_by_name_or_null(src);
if(!src_elm) xbt_die("Element '%s' not found!",src);
- network_element_t dst_elm = xbt_lib_get_or_null(host_lib,dst,ROUTING_HOST_LEVEL);
- if(!dst_elm) dst_elm = xbt_lib_get_or_null(as_router_lib,dst,ROUTING_ASR_LEVEL);
+ sg_routing_edge_t dst_elm = sg_routing_edge_by_name_or_null(dst);
if(!dst_elm) xbt_die("Element '%s' not found!",dst);
routing_get_route_and_latency (src_elm, dst_elm, &route,NULL);
instr_user_variable(time, host, variable, "HOST", value, INSTR_US_SUB, NULL, user_host_variables);
}
+/** \ingroup TRACE_user_variables
+ * \brief Get declared user host variables
+ *
+ * This function should be used to get host variables that were already
+ * declared with #TRACE_host_variable_declare or with #TRACE_host_variable_declare_with_color.
+ *
+ * \return A dynar with the declared host variables, must be freed with xbt_dynar_free.
+ */
+xbt_dynar_t TRACE_get_host_variables (void)
+{
+ return instr_dict_to_dynar (user_host_variables);
+}
+
/* for link variables */
/** \ingroup TRACE_user_variables
* \brief Declare a new user variable associated to links.
instr_user_srcdst_variable (time, src, dst, variable, "LINK", value, INSTR_US_SUB);
}
+/** \ingroup TRACE_user_variables
+ * \brief Get declared user link variables
+ *
+ * This function should be used to get link variables that were already
+ * declared with #TRACE_link_variable_declare or with #TRACE_link_variable_declare_with_color.
+ *
+ * \return A dynar with the declared link variables, must be freed with xbt_dynar_free.
+ */
+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.
+ *
+ * This function can be used to create a user made
+ * graph configuration file for Triva. Normally, it is
+ * used with the functions defined in \ref TRACE_user_variables.
+ *
+ * \return A dynar with the types, must be freed with xbt_dynar_free.
+ */
+xbt_dynar_t TRACE_get_node_types (void)
+{
+ return instr_dict_to_dynar (trivaNodeTypes);
+}
+
+/** \ingroup TRACE_API
+ * \brief Get Paje container types that can be mapped to the edges of a graph.
+ *
+ * This function can be used to create a user made
+ * graph configuration file for Triva. Normally, it is
+ * used with the functions defined in \ref TRACE_user_variables.
+ *
+ * \return A dynar with the types, must be freed with xbt_dynar_free.
+ */
+xbt_dynar_t TRACE_get_edge_types (void)
+{
+ return instr_dict_to_dynar (trivaEdgeTypes);
+}
+
#endif /* HAVE_TRACING */