diff --git a/external/timemory b/external/timemory index 6baee4c8d9..1f4e7602a4 160000 --- a/external/timemory +++ b/external/timemory @@ -1 +1 @@ -Subproject commit 6baee4c8d9201d748b50a44ec2116f73afa80883 +Subproject commit 1f4e7602a404ffb18998c5a1c0268de989df2d92 diff --git a/source/bin/omnitrace-avail/generate_config.cpp b/source/bin/omnitrace-avail/generate_config.cpp index a07a528107..ea5b7f9103 100644 --- a/source/bin/omnitrace-avail/generate_config.cpp +++ b/source/bin/omnitrace-avail/generate_config.cpp @@ -82,6 +82,10 @@ ignore_setting(const Tp& _v) category_view.count("settings::deprecated") == 0 && _v->get_categories().count("deprecated") > 0) return true; + if(category_view.count("advanced") == 0 && + category_view.count("settings::advanced") == 0 && + _v->get_categories().count("advanced") > 0) + return true; return false; } } // namespace @@ -175,7 +179,8 @@ void pop(type_list) type_list{})); } -void update_choices(std::shared_ptr); +void +update_choices(const std::shared_ptr&); void generate_config(std::string _config_file, const std::set& _config_fmts, @@ -406,7 +411,7 @@ generate_config(std::string _config_file, const std::set& _config_f _open(ofs, _fname, "text") << "# auto-generated by omnitrace-avail (version " << OMNITRACE_VERSION_STRING << ") on " << tim::get_local_datetime("%F @ %H:%M", &_time) << "\n\n" - << _ss.str() << "\n"; + << _ss.str(); } // restores the original serializer @@ -416,7 +421,7 @@ generate_config(std::string _config_file, const std::set& _config_f } void -update_choices(std::shared_ptr _settings) +update_choices(const std::shared_ptr& _settings) { std::vector _info = get_component_info(); diff --git a/source/lib/common/join.hpp b/source/lib/common/join.hpp index cd2c7942e3..de1e5d055b 100644 --- a/source/lib/common/join.hpp +++ b/source/lib/common/join.hpp @@ -79,16 +79,22 @@ template auto join(DelimT&& _delim, Args&&... _args) { + using delim_type = std::remove_cv_t>; + std::stringstream _ss{}; _ss << std::boolalpha; - OMNITRACE_FOLD_EXPRESSION(_ss << _delim << _args); - auto _ret = _ss.str(); - if constexpr(std::is_same::value) + + if constexpr(std::is_same::value) { + const char _delim_c[2] = { _delim, '\0' }; + OMNITRACE_FOLD_EXPRESSION(_ss << _delim_c << _args); + auto _ret = _ss.str(); return (_ret.length() > 1) ? _ret.substr(1) : std::string{}; } else { + OMNITRACE_FOLD_EXPRESSION(_ss << _delim << _args); + auto _ret = _ss.str(); auto&& _len = std::string{ _delim }.length(); return (_ret.length() > _len) ? _ret.substr(_len) : std::string{}; } @@ -101,16 +107,22 @@ template auto join(QuoteStrings&&, DelimT&& _delim, Args&&... _args) { + using delim_type = std::remove_cv_t>; + std::stringstream _ss{}; _ss << std::boolalpha; - OMNITRACE_FOLD_EXPRESSION(_ss << _delim << as_string(_args)); - auto _ret = _ss.str(); - if constexpr(std::is_same::value) + + if constexpr(std::is_same::value) { + const char _delim_c[2] = { _delim, '\0' }; + OMNITRACE_FOLD_EXPRESSION(_ss << _delim_c << as_string(_args)); + auto _ret = _ss.str(); return (_ret.length() > 1) ? _ret.substr(1) : std::string{}; } else { + OMNITRACE_FOLD_EXPRESSION(_ss << _delim << as_string(_args)); + auto _ret = _ss.str(); auto&& _len = std::string{ _delim }.length(); return (_ret.length() > _len) ? _ret.substr(_len) : std::string{}; } diff --git a/source/lib/omnitrace/library/components/backtrace.cpp b/source/lib/omnitrace/library/components/backtrace.cpp index a870ae6f64..e1b3c2a312 100644 --- a/source/lib/omnitrace/library/components/backtrace.cpp +++ b/source/lib/omnitrace/library/components/backtrace.cpp @@ -425,7 +425,6 @@ backtrace::configure(bool _setup, int64_t _tid) } _sampler->stop(); - _sampler->swap_data(); if constexpr(tim::trait::is_available::value) { if(_tid == threading::get_id()) @@ -653,27 +652,29 @@ backtrace::post_process(int64_t _tid) "end_ns", _end_ns); }; - auto _raw_data = _sampler->get_allocator().get_data(); + _sampler->stop(); + auto _raw_data = _sampler->get_data(); + OMNITRACE_CI_THROW( + _sampler->get_sample_count() != _raw_data.size(), + "Error! sampler recorded %zu samples but %zu samples were returned\n", + _sampler->get_sample_count(), _raw_data.size()); // single sample that is useless (backtrace to unblocking signals) if(_raw_data.size() == 1 && _raw_data.front().size() <= 1) _raw_data.clear(); std::vector _data{}; - for(auto& ditr : _raw_data) + for(auto& itr : _raw_data) { - _data.reserve(_data.size() + ditr.size()); - for(auto& ritr : ditr) + _data.reserve(_data.size() + itr.size()); + auto* _bt = itr.get(); + if(!_bt) { - auto* _bt = ritr.get(); - if(!_bt) - { - OMNITRACE_PRINT( - "Warning! Nullptr to backtrace instance for thread %lu...\n", _tid); - continue; - } - if(_bt->empty()) continue; - if(!pthread_create_gotcha::is_valid_execution_time(_tid, _bt->m_ts)) continue; - _data.emplace_back(&ritr); + OMNITRACE_PRINT("Warning! Nullptr to backtrace instance for thread %lu...\n", + _tid); + continue; } + if(_bt->empty()) continue; + if(!pthread_create_gotcha::is_valid_execution_time(_tid, _bt->m_ts)) continue; + _data.emplace_back(&itr); } if(_data.empty()) return;