diff --git a/libs/util/include/psemek/util/profiler.hpp b/libs/util/include/psemek/util/profiler.hpp index 57e5d565..758a2662 100644 --- a/libs/util/include/psemek/util/profiler.hpp +++ b/libs/util/include/psemek/util/profiler.hpp @@ -14,6 +14,13 @@ namespace psemek::util ~ profiler(); static void dump(); + static void push(std::string const & name, std::chrono::duration duration); + + template + static void push(std::string const & name, Duration duration) + { + push(name, std::chrono::duration_cast>(duration)); + } private: util::clock, std::chrono::high_resolution_clock> clock_; diff --git a/libs/util/source/profiler.cpp b/libs/util/source/profiler.cpp index 02d184b3..3f918fbe 100644 --- a/libs/util/source/profiler.cpp +++ b/libs/util/source/profiler.cpp @@ -165,6 +165,25 @@ namespace psemek::util current = current->parent; } + void profiler::push(std::string const & name, std::chrono::duration duration) + { + auto const id = std::this_thread::get_id(); + + if (!current) + { + std::lock_guard lock{roots_mutex}; + current = &roots[id]; + current->mutex = &thread_mutex[id]; + } + + std::lock_guard lock{*(current->mutex)}; + + auto child = ¤t->children[name]; + child->parent = current; + child->mutex = current->mutex; + child->execution_time.push(duration.count()); + } + void profiler::dump() { dump_impl(merged_tree(), 0);