1 /* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved. */
3 /* This program is free software; you can redistribute it and/or modify it
4 * under the terms of the license (GNU LGPL) which comes with this package. */
6 #ifndef INSTR_PRIVATE_HPP
7 #define INSTR_PRIVATE_HPP
11 #include "instr/instr_interface.h"
12 #include "simgrid/instr.h"
13 #include "simgrid_config.h"
14 #include "src/internal_config.h"
15 #include "xbt/graph.h"
16 #include <iomanip> /** std::setprecision **/
23 #include <direct.h> // _mkdir
24 /* Need to define function drand48 for Windows */
25 /* FIXME: use _drand48() defined in src/surf/random_mgr.c instead */
26 #define drand48() (rand() / (RAND_MAX + 1.0))
40 PAJE_DefineContainerType,
41 PAJE_DefineVariableType,
45 PAJE_DefineEntityValue,
47 PAJE_DestroyContainer,
69 std::map<std::string, Type*> children_;
71 Type(std::string name, std::string alias, std::string color, Type* father);
74 std::string getName() { return name_; }
75 const char* getCname() { return name_.c_str(); }
76 long long int getId() { return id_; }
77 bool isColored() { return not color_.empty(); }
79 Type* byName(std::string name);
81 ContainerType* getOrCreateContainerType(std::string name);
82 EventType* getOrCreateEventType(std::string name);
83 LinkType* getOrCreateLinkType(std::string name, Type* source, Type* dest);
84 StateType* getOrCreateStateType(std::string name);
85 VariableType* getOrCreateVariableType(std::string name, std::string color);
87 void logDefinition(e_event_type event_type);
88 void logDefinition(Type* source, Type* dest);
90 static ContainerType* createRootType();
91 static ContainerType* getRootType();
94 class ContainerType : public Type {
96 ContainerType(std::string name, Type* father);
99 class VariableType : public Type {
101 VariableType(std::string name, std::string color, Type* father);
104 class ValueType : public Type {
106 std::map<std::string, Value*> values_;
107 ValueType(std::string name, std::string alias, Type* father) : Type(name, alias, "", father){};
108 ValueType(std::string name, Type* father) : Type(name, name, "", father){};
109 virtual ~ValueType();
110 void addEntityValue(std::string name, std::string color);
111 void addEntityValue(std::string name);
112 Value* getEntityValue(std::string name);
115 class LinkType : public ValueType {
117 LinkType(std::string name, std::string alias, Type* father);
120 class EventType : public ValueType {
122 EventType(std::string name, Type* father);
125 class StateType : public ValueType {
127 StateType(std::string name, Type* father);
137 explicit Value(std::string name, std::string color, Type* father);
139 const char* getCname() { return name_.c_str(); }
140 const char* getId() { return id_.c_str(); }
141 bool isColored() { return not color_.empty(); }
147 std::string name_; /* Unique name of this container */
149 Container(std::string name, std::string type_name, Container* father);
150 virtual ~Container();
152 Type* type_; /* Type of this container */
154 std::map<std::string, Container*> children_;
155 sg_netpoint_t netpoint_ = nullptr;
157 static Container* byNameOrNull(std::string name);
158 static Container* byName(std::string name);
159 std::string getName() { return name_; }
160 const char* getCname() { return name_.c_str(); }
161 long long int getId() { return id_; }
162 void removeFromParent();
164 void logDestruction();
166 static Container* getRootContainer();
169 class NetZoneContainer : public Container {
171 NetZoneContainer(std::string name, unsigned int level, NetZoneContainer* father);
174 class RouterContainer : public Container {
176 RouterContainer(std::string name, Container* father);
179 class HostContainer : public Container {
181 HostContainer(simgrid::s4u::Host& host, NetZoneContainer* father);
186 Container* container;
191 e_event_type eventType_;
192 PajeEvent(Container* container, Type* type, double timestamp, e_event_type eventType)
193 : container(container), type(type), timestamp_(timestamp), eventType_(eventType){};
194 virtual void print() = 0;
195 virtual ~PajeEvent();
196 void insertIntoBuffer();
199 //--------------------------------------------------
200 class SetVariableEvent : public PajeEvent {
204 SetVariableEvent(double timestamp, Container* container, Type* type, double value);
205 void print() override;
208 class AddVariableEvent : public PajeEvent {
212 AddVariableEvent(double timestamp, Container* container, Type* type, double value);
213 void print() override;
215 //--------------------------------------------------
217 class SubVariableEvent : public PajeEvent {
221 SubVariableEvent(double timestamp, Container* container, Type* type, double value);
222 void print() override;
224 //--------------------------------------------------
226 class SetStateEvent : public PajeEvent {
228 const char* filename;
232 SetStateEvent(double timestamp, Container* container, Type* type, Value* val);
233 void print() override;
236 class PushStateEvent : public PajeEvent {
238 const char* filename;
243 PushStateEvent(double timestamp, Container* container, Type* type, Value* val);
244 PushStateEvent(double timestamp, Container* container, Type* type, Value* val, void* extra);
245 void print() override;
248 class PopStateEvent : public PajeEvent {
250 PopStateEvent(double timestamp, Container* container, Type* type);
251 void print() override;
254 class ResetStateEvent : public PajeEvent {
256 ResetStateEvent(double timestamp, Container* container, Type* type);
257 void print() override;
260 class StartLinkEvent : public PajeEvent {
261 Container* sourceContainer_;
267 StartLinkEvent(double timestamp, Container* container, Type* type, Container* sourceContainer, std::string value,
269 StartLinkEvent(double timestamp, Container* container, Type* type, Container* sourceContainer, std::string value,
270 std::string key, int size);
271 void print() override;
274 class EndLinkEvent : public PajeEvent {
275 Container* destContainer;
280 EndLinkEvent(double timestamp, Container* container, Type* type, Container* destContainer, std::string value,
282 ~EndLinkEvent() = default;
283 void print() override;
286 class NewEvent : public PajeEvent {
290 NewEvent(double timestamp, Container* container, Type* type, Value* val);
291 void print() override;
294 } // namespace simgrid::instr
295 typedef simgrid::instr::Container* container_t;
299 extern XBT_PRIVATE std::set<std::string> created_categories;
300 extern XBT_PRIVATE std::set<std::string> declared_marks;
301 extern XBT_PRIVATE std::set<std::string> user_host_variables;
302 extern XBT_PRIVATE std::set<std::string> user_vm_variables;
303 extern XBT_PRIVATE std::set<std::string> user_link_variables;
304 extern XBT_PRIVATE double TRACE_last_timestamp_to_dump;
306 /* instr_paje_header.c */
307 XBT_PRIVATE void TRACE_header(bool basic, int size);
310 XBT_PRIVATE void TRACE_paje_start();
311 XBT_PRIVATE void TRACE_paje_end();
313 /* from instr_config.c */
314 XBT_PRIVATE bool TRACE_needs_platform();
315 XBT_PRIVATE bool TRACE_is_enabled();
316 XBT_PRIVATE bool TRACE_platform();
317 XBT_PRIVATE bool TRACE_platform_topology();
318 XBT_PRIVATE bool TRACE_is_configured();
319 XBT_PRIVATE bool TRACE_categorized();
320 XBT_PRIVATE bool TRACE_uncategorized();
321 XBT_PRIVATE bool TRACE_msg_process_is_enabled();
322 XBT_PRIVATE bool TRACE_msg_vm_is_enabled();
323 XBT_PRIVATE bool TRACE_buffer();
324 XBT_PRIVATE bool TRACE_disable_link();
325 XBT_PRIVATE bool TRACE_disable_speed();
326 XBT_PRIVATE bool TRACE_onelink_only();
327 XBT_PRIVATE bool TRACE_disable_destroy();
328 XBT_PRIVATE bool TRACE_basic();
329 XBT_PRIVATE bool TRACE_display_sizes();
330 XBT_PRIVATE char* TRACE_get_comment();
331 XBT_PRIVATE char* TRACE_get_comment_file();
332 XBT_PRIVATE int TRACE_precision();
333 XBT_PRIVATE char* TRACE_get_filename();
334 XBT_PRIVATE char* TRACE_get_viva_uncat_conf();
335 XBT_PRIVATE char* TRACE_get_viva_cat_conf();
336 XBT_PRIVATE void TRACE_generate_viva_uncat_conf();
337 XBT_PRIVATE void TRACE_generate_viva_cat_conf();
338 XBT_PRIVATE void instr_pause_tracing();
339 XBT_PRIVATE void instr_resume_tracing();
341 /* Public functions used in SMPI */
342 XBT_PUBLIC(bool) TRACE_smpi_is_enabled();
343 XBT_PUBLIC(bool) TRACE_smpi_is_grouped();
344 XBT_PUBLIC(bool) TRACE_smpi_is_computing();
345 XBT_PUBLIC(bool) TRACE_smpi_is_sleeping();
346 XBT_PUBLIC(bool) TRACE_smpi_view_internals();
348 /* from resource_utilization.c */
349 XBT_PRIVATE void TRACE_surf_host_set_utilization(const char* resource, const char* category, double value, double now,
351 XBT_PRIVATE void TRACE_surf_link_set_utilization(const char* resource, const char* category, double value, double now,
353 XBT_PUBLIC(void) TRACE_surf_resource_utilization_alloc();
356 extern XBT_PRIVATE std::set<std::string> trivaNodeTypes;
357 extern XBT_PRIVATE std::set<std::string> trivaEdgeTypes;
358 XBT_PRIVATE long long int instr_new_paje_id();
359 void instr_new_variable_type(std::string new_typename, std::string color);
360 void instr_new_user_variable_type(std::string father_type, std::string new_typename, std::string color);
361 void instr_new_user_state_type(std::string father_type, std::string new_typename);
362 void instr_new_value_for_user_state_type(std::string new_typename, const char* value, std::string color);
365 XBT_PRIVATE void TRACE_TI_start();
366 XBT_PRIVATE void TRACE_TI_end();
368 XBT_PRIVATE void TRACE_paje_dump_buffer(bool force);
369 XBT_PRIVATE void dump_comment_file(std::string filename);
370 XBT_PRIVATE void dump_comment(std::string comment);
401 TRACING_REDUCE_SCATTER,
408 struct s_instr_extra_data_t {
413 double sleep_duration;
417 const char* datatype1;
418 const char* datatype2;
423 typedef s_instr_extra_data_t* instr_extra_data;
425 /* Format of TRACING output.
426 * - paje is the regular format, that we all know
427 * - TI is a trick to reuse the tracing functions to generate a time independent trace during the execution. Such
428 * trace can easily be replayed with smpi_replay afterward. This trick should be removed and replaced by some code
429 * using the signal that we will create to cleanup the TRACING
431 enum instr_fmt_type_t { instr_fmt_paje, instr_fmt_TI };
432 extern instr_fmt_type_t instr_fmt_type;