From: schnorr Date: Wed, 25 Apr 2012 16:33:56 +0000 (+0200) Subject: [trace] let user code declare/set/push/pop states for hosts X-Git-Tag: v3_7~63^2~13 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/d44528033ed97582f1e57e061bcef971a8f88ccd [trace] let user code declare/set/push/pop states for hosts details: - useful for gantt-based views --- diff --git a/include/instr/instr.h b/include/instr/instr.h index da7491c558..ccd354e94e 100644 --- a/include/instr/instr.h +++ b/include/instr/instr.h @@ -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); diff --git a/src/instr/instr_interface.c b/src/instr/instr_interface.c index a24ded0384..26daa66622 100644 --- a/src/instr/instr_interface.c +++ b/src/instr/instr_interface.c @@ -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. * diff --git a/src/instr/instr_private.h b/src/instr/instr_private.h index e61edeac0c..76cba92f46 100644 --- a/src/instr/instr_private.h +++ b/src/instr/instr_private.h @@ -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); diff --git a/src/instr/instr_routing.c b/src/instr/instr_routing.c index d2c91ee8bb..5006b6842e 100644 --- a/src/instr/instr_routing.c +++ b/src/instr/instr_routing.c @@ -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 () {