#include "src/instr/instr_private.h"
#include "simgrid/sg_config.h"
#include "surf/surf.h"
+#include <functional>
+#include <vector>
XBT_LOG_NEW_CATEGORY(instr, "Logging the behavior of the tracing system (used for Visualization/Analysis of simulations)");
XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_config, instr, "Configuration");
trace_precision = xbt_cfg_get_int(OPT_TRACING_PRECISION);
}
-static xbt_dynar_t TRACE_start_functions = nullptr;
+static std::vector<std::function<void()>> TRACE_start_functions;
+
void TRACE_add_start_function(void (*func) ())
{
- if (TRACE_start_functions == nullptr)
- TRACE_start_functions = xbt_dynar_new(sizeof(void (*)()), nullptr);
- xbt_dynar_push(TRACE_start_functions, &func);
+ TRACE_start_functions.push_back(func);
}
int TRACE_start()
XBT_DEBUG("Tracing starts");
/* init the tracing module to generate the right output */
- /* open internal buffer */
- TRACE_init();
/* open the trace file(s) */
const char* format = xbt_cfg_get_string(OPT_TRACING_FORMAT);
user_vm_variables = xbt_dict_new_homogeneous(xbt_free_f);
user_link_variables = xbt_dict_new_homogeneous(xbt_free_f);
- if (TRACE_start_functions != nullptr) {
- void (*func) ();
- unsigned int iter;
- xbt_dynar_foreach(TRACE_start_functions, iter, func) {
- func();
- }
- }
+ for (auto func: TRACE_start_functions)
+ func();
}
- xbt_dynar_free(&TRACE_start_functions);
+ TRACE_start_functions.clear();
return 0;
}
-static xbt_dynar_t TRACE_end_functions = nullptr;
+static std::vector<std::function<void()>> TRACE_end_functions;
void TRACE_add_end_function(void (*func) (void))
{
- if (TRACE_end_functions == nullptr)
- TRACE_end_functions = xbt_dynar_new(sizeof(void (*)(void)), nullptr);
- xbt_dynar_push(TRACE_end_functions, &func);
+ TRACE_end_functions.push_back(func);
}
int TRACE_end()
PJ_container_release();
PJ_type_release();
- if (TRACE_end_functions != nullptr) {
- void (*func) (void);
- unsigned int iter;
- xbt_dynar_foreach(TRACE_end_functions, iter, func) {
- func();
- }
- }
+ for (auto func: TRACE_end_functions)
+ func();
+ TRACE_start_functions.clear();
xbt_dict_free(&user_link_variables);
xbt_dict_free(&user_host_variables);
}else{
xbt_die("Unknown trace format :%s ", format);
}
- /* close internal buffer */
- TRACE_finalize();
+
/* de-activate trace */
trace_active = 0;
XBT_DEBUG("Tracing is off");
XBT_DEBUG("Tracing system is shutdown");
}
- xbt_dynar_free(&TRACE_start_functions); /* useful when exiting early */
- xbt_dynar_free(&TRACE_end_functions);
return retval;
}
XBT_PRIVATE void TRACE_header(int basic, int size);
/* from paje.c */
-XBT_PRIVATE void TRACE_init();
-XBT_PRIVATE void TRACE_finalize();
XBT_PRIVATE void TRACE_paje_init();
XBT_PRIVATE void TRACE_paje_start();
XBT_PRIVATE void TRACE_paje_end();
print_NULL, print_NULL
};
-xbt_dynar_t buffer = nullptr;
+std::vector<paje_event_t> buffer;
void dump_comment (const char *comment)
{
fclose(file);
}
-void TRACE_init()
-{
- buffer = xbt_dynar_new(sizeof(paje_event_t), nullptr);
-}
-
-void TRACE_finalize()
-{
- xbt_dynar_free(&buffer);
-}
-
double TRACE_last_timestamp_to_dump = 0;
//dumps the trace file until the timestamp TRACE_last_timestamp_to_dump
void TRACE_paje_dump_buffer (int force)
if (!TRACE_is_enabled()) return;
XBT_DEBUG("%s: dump until %f. starts", __FUNCTION__, TRACE_last_timestamp_to_dump);
if (force){
- paje_event_t event;
- unsigned int i;
- xbt_dynar_foreach(buffer, i, event){
+ for (auto event :buffer){
event->print (event);
event->free (event);
}
- xbt_dynar_free (&buffer);
- buffer = xbt_dynar_new (sizeof(paje_event_t), nullptr);
+ buffer.clear();
}else{
- paje_event_t event;
- unsigned int cursor;
- xbt_dynar_foreach(buffer, cursor, event) {
+ std::vector<paje_event_t>::iterator i = buffer.begin();
+ for (auto event :buffer){
double head_timestamp = event->timestamp;
- if (head_timestamp > TRACE_last_timestamp_to_dump){
+ if (head_timestamp > TRACE_last_timestamp_to_dump)
break;
- }
event->print (event);
event->free (event);
+ ++i;
}
- xbt_dynar_remove_n_at(buffer, cursor, 0);
+ buffer.erase(buffer.begin(), i);
}
XBT_DEBUG("%s: ends", __FUNCTION__);
}
}
XBT_DEBUG("%s: insert event_type=%d, timestamp=%f, buffersize=%lu)",
- __FUNCTION__, (int)tbi->event_type, tbi->timestamp, xbt_dynar_length(buffer));
-
- unsigned int i;
- for (i = xbt_dynar_length(buffer); i > 0; i--) {
- paje_event_t e1 = *(paje_event_t*)xbt_dynar_get_ptr(buffer, i - 1);
+ __FUNCTION__, (int)tbi->event_type, tbi->timestamp, buffer.size());
+ std::vector<paje_event_t>::reverse_iterator i;
+ for (i = buffer.rbegin(); i != buffer.rend(); ++i) {
+ paje_event_t e1 = *i;
if (e1->timestamp <= tbi->timestamp)
break;
}
- xbt_dynar_insert_at(buffer, i, &tbi);
- if (i == 0)
+ buffer.insert(i.base(), tbi);
+ if (i == buffer.rend())
XBT_DEBUG("%s: inserted at beginning", __FUNCTION__);
else
- XBT_DEBUG("%s: inserted at%s %u", __FUNCTION__, (i == xbt_dynar_length(buffer) - 1 ? " end, pos =" : ""), i);
+ XBT_DEBUG("%s: inserted at%s %ld", __FUNCTION__, (i == buffer.rbegin()) ? " end" :"pos =",
+ std::distance(buffer.rend(),i));
}
static void free_paje_event (paje_event_t event)