diff --git a/src/client/ring_signal.h b/src/client/ring_signal.h index 5efeb35bb9a442e46770d04054c7e053f3a3dab0..e5c7a87a097c60255ec9b6a358a95f590b9dfa35 100644 --- a/src/client/ring_signal.h +++ b/src/client/ring_signal.h @@ -36,6 +36,8 @@ #include "jami.h" #include "logger.h" +#include "trace-tools.h" +#include "tracepoint.h" #ifdef __APPLE__ #include <TargetConditionals.h> @@ -56,19 +58,29 @@ extern SignalHandlerMap& getSignalHandlers(); * Find related user given callback and call it with given * arguments. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-parameter" template<typename Ts, typename... Args> -static void -emitSignal(Args... args) +void emitSignal(Args... args) { + jami_tracepoint_if_enabled(emit_signal, demangle<Ts>().c_str()); + const auto& handlers = getSignalHandlers(); - if (auto cb = *DRing::CallbackWrapper<typename Ts::cb_type>(handlers.at(Ts::name))) { + if (auto wrap = DRing::CallbackWrapper<typename Ts::cb_type>(handlers.at(Ts::name))) { try { + auto cb = *wrap; + jami_tracepoint(emit_signal_begin_callback, + wrap.file_, wrap.linum_); cb(args...); + jami_tracepoint(emit_signal_end_callback); } catch (std::exception& e) { JAMI_ERR("Exception during emit signal %s:\n%s", Ts::name, e.what()); } } + + jami_tracepoint(emit_signal_end); } +#pragma GCC diagnostic pop template<typename Ts> std::pair<std::string, std::shared_ptr<DRing::CallbackWrapper<typename Ts::cb_type>>> diff --git a/src/jami/jami.h b/src/jami/jami.h index f8966985eea9c5bfa7ad8af57b0ea8ca0d46bdd6..5194ca92d7e95d0bc5ded2fad748777a727322ad 100644 --- a/src/jami/jami.h +++ b/src/jami/jami.h @@ -30,6 +30,8 @@ #include <memory> #include <type_traits> +#include "trace-tools.h" + namespace DRing { /* flags for initialization */ @@ -114,13 +116,18 @@ private: TFunc cb_; // The user-callback public: + const char* file_; + uint32_t linum_; + // Empty wrapper: no callback associated. // Used to initialize internal callback arrays. CallbackWrapper() noexcept {} // Create and initialize a wrapper to given callback. - CallbackWrapper(TFunc&& func) noexcept - : cb_(std::forward<TFunc>(func)) + CallbackWrapper(TFunc&& func, const char* filename, uint32_t linum) noexcept + : cb_(std::forward<TFunc>(func)), + file_(filename), + linum_(linum) {} // Create and initialize a wrapper from a generic CallbackWrapperBase @@ -128,8 +135,13 @@ public: // Note: the given callback is copied into internal storage. CallbackWrapper(const std::shared_ptr<CallbackWrapperBase>& p) noexcept { - if (p) - cb_ = ((CallbackWrapper<TProto>*) p.get())->cb_; + if (p) { + auto other = (CallbackWrapper<TProto>*)p.get(); + + cb_ = other->cb_; + file_ = other->file_; + linum_ = other->linum_; + } } // Return user-callback reference. @@ -149,11 +161,14 @@ public: */ template<typename Ts> std::pair<std::string, std::shared_ptr<CallbackWrapperBase>> -exportable_callback(std::function<typename Ts::cb_type>&& func) +exportable_callback(std::function<typename Ts::cb_type>&& func, + const char* file=CURRENT_FILENAME(), + uint32_t linum=CURRENT_LINE()) { return std::make_pair((const std::string&) Ts::name, std::make_shared<CallbackWrapper<typename Ts::cb_type>>( - std::forward<std::function<typename Ts::cb_type>>(func))); + std::forward<std::function<typename Ts::cb_type>>(func), + file, linum)); } DRING_PUBLIC void registerSignalHandlers( diff --git a/src/jami/tracepoint-def.h b/src/jami/tracepoint-def.h index 154bab33f01219ed82b6ff44dca829a5c6cd16dc..e6505756bbee0585d49e502d3f61bd95e8fe5465 100644 --- a/src/jami/tracepoint-def.h +++ b/src/jami/tracepoint-def.h @@ -112,6 +112,15 @@ LTTNG_UST_TRACEPOINT_EVENT( ) ) +LTTNG_UST_TRACEPOINT_EVENT( + jami, + emit_signal_end, + LTTNG_UST_TP_ARGS( + ), + LTTNG_UST_TP_FIELDS( + ) +) + LTTNG_UST_TRACEPOINT_EVENT( jami, emit_signal_begin_callback,