X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Flogging.cpp;h=b747ab5452c5f4ee7b2aef633a65fc1e02986f47;hp=b0355168dbb640438db4f62e1b6661e9a2e3826d;hb=b571a8e7e0dc3e3b6daa58f27050e76466f006dd;hpb=d1c343c8dcbde4c3c9c4d85c62457d3bcbf5bde6 diff --git a/pv/logging.cpp b/pv/logging.cpp index b0355168..b747ab54 100644 --- a/pv/logging.cpp +++ b/pv/logging.cpp @@ -20,6 +20,8 @@ #include "logging.hpp" #include "globalsettings.hpp" +#include + #ifdef ENABLE_DECODE #include /* First, so we avoid a _POSIX_C_SOURCE warning. */ #endif @@ -28,18 +30,37 @@ #include +using std::cout; +using std::endl; +using std::lock_guard; + namespace pv { Logging logging; +const int Logging::MIN_BUFFER_SIZE = 10; const int Logging::MAX_BUFFER_SIZE = 50000; +static sr_log_callback prev_sr_log_cb; +static void *prev_sr_log_cb_data; + +#ifdef ENABLE_DECODE +static srd_log_callback prev_srd_log_cb; +static void *prev_srd_log_cb_data; +#endif + Logging::~Logging() { - qInstallMessageHandler(0); - sr_log_callback_set_default(); + qInstallMessageHandler(nullptr); + if (prev_sr_log_cb) + sr_log_callback_set(prev_sr_log_cb, prev_sr_log_cb_data); + prev_sr_log_cb = nullptr; + prev_sr_log_cb_data = nullptr; #ifdef ENABLE_DECODE - srd_log_callback_set_default(); + if (prev_srd_log_cb) + srd_log_callback_set(prev_srd_log_cb, prev_srd_log_cb_data); + prev_srd_log_cb = nullptr; + prev_srd_log_cb_data = nullptr; #endif GlobalSettings::remove_change_handler(this); @@ -55,9 +76,11 @@ void Logging::init() buffer_.reserve(buffer_size_); qInstallMessageHandler(log_pv); - sr_log_callback_set(log_libsigrok, nullptr); + sr_log_callback_get(&prev_sr_log_cb, &prev_sr_log_cb_data); + sr_log_callback_set(log_sr, nullptr); #ifdef ENABLE_DECODE - srd_log_callback_set(log_libsrd, nullptr); + srd_log_callback_get(&prev_srd_log_cb, &prev_srd_log_cb_data); + srd_log_callback_set(log_srd, nullptr); #endif GlobalSettings::add_change_handler(this); @@ -72,7 +95,9 @@ int Logging::get_log_level() const void Logging::set_log_level(int level) { sr_log_loglevel_set(level); +#ifdef ENABLE_DECODE srd_log_loglevel_set(level); +#endif } QString Logging::get_log() const @@ -82,6 +107,8 @@ QString Logging::get_log() const void Logging::log(const QString &text, int source) { + lock_guard log_lock(log_mutex_); + if (buffer_.size() >= buffer_size_) buffer_.removeFirst(); @@ -99,10 +126,10 @@ void Logging::log(const QString &text, int source) switch (source) { case LogSource_pv: - s = QString("pv: ") + text; // black is default color + s = QString("pv: %1").arg(text); break; case LogSource_sr: - s = QString("sr: %1").arg(text); + s = QString("sr: %1").arg(text); break; case LogSource_srd: s = QString("srd: %1").arg(text); @@ -127,12 +154,20 @@ void Logging::log_pv(QtMsgType type, const QMessageLogContext &context, const QS (void)context; logging.log(msg, LogSource_pv); + + cout << msg.toUtf8().data() << endl; } -int Logging::log_libsigrok(void *cb_data, int loglevel, const char *format, va_list args) +int Logging::log_sr(void *cb_data, int loglevel, const char *format, va_list args) { + va_list args2; + (void)cb_data; - (void)loglevel; + + va_copy(args2, args); + if (prev_sr_log_cb) + prev_sr_log_cb(prev_sr_log_cb_data, loglevel, format, args2); + va_end(args2); char *text = g_strdup_vprintf(format, args); logging.log(QString::fromUtf8(text), LogSource_sr); @@ -142,10 +177,16 @@ int Logging::log_libsigrok(void *cb_data, int loglevel, const char *format, va_l } #ifdef ENABLE_DECODE -int Logging::log_libsrd(void *cb_data, int loglevel, const char *format, va_list args) +int Logging::log_srd(void *cb_data, int loglevel, const char *format, va_list args) { + va_list args2; + (void)cb_data; - (void)loglevel; + + va_copy(args2, args); + if (prev_srd_log_cb) + prev_srd_log_cb(prev_srd_log_cb_data, loglevel, format, args2); + va_end(args2); char *text = g_strdup_vprintf(format, args); logging.log(QString::fromUtf8(text), LogSource_srd);