From c52ab943326ab74d325242e4474c9caf52d2766a Mon Sep 17 00:00:00 2001 From: Frederic Suter Date: Thu, 12 Oct 2017 15:18:07 +0200 Subject: [PATCH] move creation and destruction logging to Class --- src/instr/instr_paje_containers.cpp | 100 +++++++++++++++++++++++++++- src/instr/instr_paje_trace.cpp | 84 +---------------------- src/instr/instr_private.hpp | 8 +-- 3 files changed, 101 insertions(+), 91 deletions(-) diff --git a/src/instr/instr_paje_containers.cpp b/src/instr/instr_paje_containers.cpp index c06da673dc..5d194eb8e3 100644 --- a/src/instr/instr_paje_containers.cpp +++ b/src/instr/instr_paje_containers.cpp @@ -5,13 +5,23 @@ #include "simgrid/s4u/Engine.hpp" #include "simgrid/s4u/Host.hpp" -#include "surf/surf.h" #include "src/instr/instr_private.hpp" +#include "surf/surf.h" +#include +#ifdef WIN32 +#include // _mkdir +#endif +#include /** std::setprecision **/ +#include #include XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_paje_containers, instr, "Paje tracing event system (containers)"); +extern FILE* tracing_file; +extern std::map tracing_files; // TI specific +double prefix = 0.0; // TI specific + static container_t rootContainer = nullptr; /* the root container */ static std::unordered_map allContainers; /* all created containers indexed by name */ std::set trivaNodeTypes; /* all host types defined */ @@ -93,7 +103,7 @@ Container::Container(std::string name, e_container_types kind, Container* father type_ = Type::containerNew(typeNameBuff.c_str(), father_->type_); } father_->children_.insert({name_, this}); - LogContainerCreation(this); + logCreation(); } else if (kind_ == INSTR_AS) { type_ = Type::containerNew("0", nullptr); } @@ -125,7 +135,7 @@ Container::~Container() // trace my destruction if (not TRACE_disable_destroy() && this != PJ_container_get_root()) { // do not trace the container destruction if user requests or if the container is root - LogContainerDestruction(this); + logDestruction(); } // remove me from the allContainers data structure @@ -154,5 +164,89 @@ void Container::removeFromParent() father_->children_.erase(name_); } } + +void Container::logCreation() +{ + double timestamp = SIMIX_get_clock(); + std::stringstream stream; + + XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, simgrid::instr::PAJE_CreateContainer, timestamp); + + if (instr_fmt_type == instr_fmt_paje) { + stream << std::fixed << std::setprecision(TRACE_precision()); + stream << simgrid::instr::PAJE_CreateContainer; + stream << " "; + /* prevent 0.0000 in the trace - this was the behavior before the transition to c++ */ + if (timestamp < 1e-12) + stream << 0; + else + stream << timestamp; + stream << " " << id_ << " " << type_->getId() << " " << father_->id_ << " \"" << name_ << "\"" << std::endl; + fprintf(tracing_file, "%s", stream.str().c_str()); + XBT_DEBUG("Dump %s", stream.str().c_str()); + stream.str(""); + stream.clear(); + } else if (instr_fmt_type == instr_fmt_TI) { + // if we are in the mode with only one file + static FILE* ti_unique_file = nullptr; + + if (tracing_files.empty()) { + // generate unique run id with time + prefix = xbt_os_time(); + } + + if (not xbt_cfg_get_boolean("tracing/smpi/format/ti-one-file") || ti_unique_file == nullptr) { + char* folder_name = bprintf("%s_files", TRACE_get_filename()); + char* filename = bprintf("%s/%f_%s.txt", folder_name, prefix, name_.c_str()); +#ifdef WIN32 + _mkdir(folder_name); +#else + mkdir(folder_name, S_IRWXU | S_IRWXG | S_IRWXO); +#endif + ti_unique_file = fopen(filename, "w"); + xbt_assert(ti_unique_file, "Tracefile %s could not be opened for writing: %s", filename, strerror(errno)); + fprintf(tracing_file, "%s\n", filename); + + xbt_free(folder_name); + xbt_free(filename); + } + + tracing_files.insert({this, ti_unique_file}); + } else { + THROW_IMPOSSIBLE; + } +} + +void Container::logDestruction() +{ + std::stringstream stream; + double timestamp = SIMIX_get_clock(); + + XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, simgrid::instr::PAJE_DestroyContainer, timestamp); + + if (instr_fmt_type == instr_fmt_paje) { + stream << std::fixed << std::setprecision(TRACE_precision()); + stream << simgrid::instr::PAJE_DestroyContainer; + stream << " "; + /* prevent 0.0000 in the trace - this was the behavior before the transition to c++ */ + if (timestamp < 1e-12) + stream << 0; + else + stream << timestamp; + stream << " " << type_->getId() << " " << id_ << std::endl; + fprintf(tracing_file, "%s", stream.str().c_str()); + XBT_DEBUG("Dump %s", stream.str().c_str()); + stream.str(""); + stream.clear(); + } else if (instr_fmt_type == instr_fmt_TI) { + if (not xbt_cfg_get_boolean("tracing/smpi/format/ti-one-file") || tracing_files.size() == 1) { + FILE* f = tracing_files.at(this); + fclose(f); + } + tracing_files.erase(this); + } else { + THROW_IMPOSSIBLE; + } +} } } diff --git a/src/instr/instr_paje_trace.cpp b/src/instr/instr_paje_trace.cpp index 81f33e6940..6ec46dbc21 100644 --- a/src/instr/instr_paje_trace.cpp +++ b/src/instr/instr_paje_trace.cpp @@ -14,18 +14,13 @@ #include #include #include /** std::setprecision **/ -#include -#ifdef WIN32 -#include // _mkdir -#endif XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_paje_trace, instr, "tracing event system"); static std::stringstream stream; FILE *tracing_file = nullptr; -static std::map tracing_files; // TI specific -static double prefix=0.0; // TI specific +std::map tracing_files; // TI specific std::vector buffer; void buffer_debug(std::vector* buf); @@ -301,83 +296,6 @@ void simgrid::instr::Value::print() } } -void LogContainerCreation (container_t container) -{ - double timestamp = SIMIX_get_clock(); - - XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, simgrid::instr::PAJE_CreateContainer, timestamp); - - if (instr_fmt_type == instr_fmt_paje) { - stream << std::fixed << std::setprecision(TRACE_precision()); - stream << simgrid::instr::PAJE_CreateContainer; - stream << " "; - /* prevent 0.0000 in the trace - this was the behavior before the transition to c++ */ - if (timestamp < 1e-12) - stream << 0; - else - stream << timestamp; - stream << " " << container->id_ << " " << container->type_->getId() << " " << container->father_->id_ << " \"" - << container->name_ << "\""; - - print_row(); - } else if (instr_fmt_type == instr_fmt_TI) { - // if we are in the mode with only one file - static FILE* ti_unique_file = nullptr; - - if (tracing_files.empty()) { - // generate unique run id with time - prefix = xbt_os_time(); - } - - if (not xbt_cfg_get_boolean("tracing/smpi/format/ti-one-file") || ti_unique_file == nullptr) { - char* folder_name = bprintf("%s_files", TRACE_get_filename()); - char* filename = bprintf("%s/%f_%s.txt", folder_name, prefix, container->name_.c_str()); -#ifdef WIN32 - _mkdir(folder_name); -#else - mkdir(folder_name, S_IRWXU | S_IRWXG | S_IRWXO); -#endif - ti_unique_file = fopen(filename, "w"); - xbt_assert(ti_unique_file, "Tracefile %s could not be opened for writing: %s", filename, strerror(errno)); - fprintf(tracing_file, "%s\n", filename); - - xbt_free(folder_name); - xbt_free(filename); - } - - tracing_files.insert({container, ti_unique_file}); - } else { - THROW_IMPOSSIBLE; - } -} - -void LogContainerDestruction(container_t container) -{ - double timestamp = SIMIX_get_clock(); - - XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, simgrid::instr::PAJE_DestroyContainer, timestamp); - - if (instr_fmt_type == instr_fmt_paje) { - stream << std::fixed << std::setprecision(TRACE_precision()); - stream << simgrid::instr::PAJE_DestroyContainer; - stream << " "; - /* prevent 0.0000 in the trace - this was the behavior before the transition to c++ */ - if (timestamp < 1e-12) - stream << 0; - else - stream << timestamp; - stream << " " << container->type_->getId() << " " << container->id_; - print_row(); - } else if (instr_fmt_type == instr_fmt_TI) { - if (not xbt_cfg_get_boolean("tracing/smpi/format/ti-one-file") || tracing_files.size() == 1) { - FILE* f = tracing_files.at(container); - fclose(f); - } - tracing_files.erase(container); - } else { - THROW_IMPOSSIBLE; - } -} simgrid::instr::SetVariableEvent::SetVariableEvent(double timestamp, container_t container, Type* type, double value) : simgrid::instr::PajeEvent::PajeEvent(container, type, timestamp, PAJE_SetVariable), value(value) diff --git a/src/instr/instr_private.hpp b/src/instr/instr_private.hpp index 77715de350..0f63eaa7a7 100644 --- a/src/instr/instr_private.hpp +++ b/src/instr/instr_private.hpp @@ -12,6 +12,7 @@ #include "simgrid/instr.h" #include "simgrid_config.h" #include "src/internal_config.h" +#include "xbt/graph.h" #include #include #include @@ -24,9 +25,6 @@ #define INSTR_DEFAULT_STR_SIZE 500 -#include "xbt/dict.h" -#include "xbt/graph.h" - namespace simgrid { namespace instr { @@ -132,6 +130,8 @@ public: static Container* byNameOrNull(std::string name); static Container* byName(std::string name); void removeFromParent(); + void logCreation(); + void logDestruction(); }; //-------------------------------------------------- @@ -392,8 +392,6 @@ void LogContainerTypeDefinition(simgrid::instr::Type* type); void LogVariableTypeDefinition(simgrid::instr::Type* type); void LogStateTypeDefinition(simgrid::instr::Type* type); void LogLinkTypeDefinition(simgrid::instr::Type* type, simgrid::instr::Type* source, simgrid::instr::Type* dest); -void LogContainerCreation(container_t container); -void LogContainerDestruction(container_t container); void LogDefineEventType(simgrid::instr::Type* type); #endif -- 2.20.1