Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
17515ef4b2ba9f89bd35d47d6ddee886a1f6e365
[simgrid.git] / src / instr / instr_interface.c
1 /* Copyright (c) 2010. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5   * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #include "simgrid_config.h"
8
9 #ifdef HAVE_TRACING
10
11 #include "instr/instr_private.h"
12 #include "surf/network_private.h"
13
14 XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_api, instr, "API");
15
16 void TRACE_category(const char *category)
17 {
18   TRACE_category_with_color (category, NULL);
19 }
20
21 void TRACE_category_with_color (const char *category, const char *color)
22 {
23   if (!(TRACE_is_active() && category != NULL))
24     return;
25
26   xbt_assert (instr_platform_traced(),
27       "%s must be called after environment creation", __FUNCTION__);
28
29   //check if category is already created
30   char *created = xbt_dict_get_or_null(created_categories, category);
31   if (created) return;
32   xbt_dict_set (created_categories, category, xbt_strdup("1"), xbt_free);
33
34   //define final_color
35   char final_color[INSTR_DEFAULT_STR_SIZE];
36   if (!color){
37     //generate a random color
38     double red = drand48();
39     double green = drand48();
40     double blue = drand48();
41     snprintf (final_color, INSTR_DEFAULT_STR_SIZE, "%f %f %f", red, green, blue);
42   }else{
43     snprintf (final_color, INSTR_DEFAULT_STR_SIZE, "%s", color);
44   }
45
46   XBT_DEBUG("CAT,declare %s, %s", category, final_color);
47
48 //FIXME
49 //  -  if (final) {
50 //  -    //for m_process_t
51 //  -    if (TRACE_msg_process_is_enabled())
52 //  -      pajeDefineContainerType("process", type, "process");
53 //  -    if (TRACE_msg_process_is_enabled())
54 //  -      pajeDefineStateType("process-state", "process", "process-state");
55 //  -
56 //  -    if (TRACE_msg_task_is_enabled())
57 //  -      pajeDefineContainerType("task", type, "task");
58 //  -    if (TRACE_msg_task_is_enabled())
59 //  -      pajeDefineStateType("task-state", "task", "task-state");
60 //  -  }
61
62   //define the type of this category on top of hosts and links
63   if (TRACE_categorized ()){
64     instr_new_variable_type (category, final_color);
65   }
66 }
67
68 void TRACE_declare_mark(const char *mark_type)
69 {
70   if (!TRACE_is_active())
71     return;
72   if (!mark_type)
73     return;
74
75   XBT_DEBUG("MARK,declare %s", mark_type);
76   getEventType(mark_type, NULL, getRootType());
77 }
78
79 void TRACE_mark(const char *mark_type, const char *mark_value)
80 {
81   if (!TRACE_is_active())
82     return;
83   if (!mark_type || !mark_value)
84     return;
85
86   XBT_DEBUG("MARK %s %s", mark_type, mark_value);
87   type_t type = getEventType (mark_type, NULL, getRootContainer()->type);
88   val_t value = getValue (mark_value, NULL, type);
89   new_pajeNewEvent (MSG_get_clock(), getRootContainer(), type, value);
90 }
91
92 void TRACE_user_variable(double time,
93                          const char *resource,
94                          const char *variable,
95                          const char *father_type,
96                          double value,
97                          InstrUserVariable what)
98 {
99   if (!TRACE_is_active())
100     return;
101
102   xbt_assert (instr_platform_traced(),
103       "%s must be called after environment creation", __FUNCTION__);
104
105   char valuestr[100];
106   snprintf(valuestr, 100, "%g", value);
107
108   switch (what){
109   case INSTR_US_DECLARE:
110     instr_new_user_variable_type (father_type, variable, NULL);
111     break;
112   case INSTR_US_SET:
113   {
114     container_t container = getContainerByName(resource);
115     type_t type = getVariableType (variable, NULL, container->type);
116     new_pajeSetVariable(time, container, type, value);
117     break;
118   }
119   case INSTR_US_ADD:
120   {
121     container_t container = getContainerByName(resource);
122     type_t type = getVariableType (variable, NULL, container->type);
123     new_pajeAddVariable(time, container, type, value);
124     break;
125   }
126   case INSTR_US_SUB:
127   {
128     container_t container = getContainerByName(resource);
129     type_t type = getVariableType (variable, NULL, container->type);
130     new_pajeSubVariable(time, container, type, value);
131     break;
132   }
133   default:
134     //TODO: launch exception
135     break;
136   }
137 }
138
139 void TRACE_user_srcdst_variable(double time,
140                               const char *src,
141                               const char *dst,
142                               const char *variable,
143                               const char *father_type,
144                               double value,
145                               InstrUserVariable what)
146 {
147   xbt_dynar_t route = global_routing->get_route (src, dst);
148   unsigned int i;
149   void *link;
150   xbt_dynar_foreach (route, i, link) {
151     char *link_name = ((link_CM02_t)link)->lmm_resource.generic_resource.name;
152     TRACE_user_variable (time, link_name, variable, father_type, value, what);
153   }
154 }
155
156 const char *TRACE_node_name (xbt_node_t node)
157 {
158   void *data = xbt_graph_node_get_data(node);
159   char *str = (char*)data;
160   return str;
161 }
162
163 xbt_graph_t TRACE_platform_graph (void)
164 {
165   if (!TRACE_is_active())
166     return NULL;
167
168   return instr_routing_platform_graph ();
169 }
170
171 void TRACE_platform_graph_export_graphviz (xbt_graph_t g, const char *filename)
172 {
173   instr_routing_platform_graph_export_graphviz (g, filename);
174 }
175
176 #endif /* HAVE_TRACING */