pespin has submitted this change and it was merged. ( https://gerrit.osmocom.org/c/osmo-trx/+/14645 )
Change subject: Logger: global Log mutex is now available from C code ...................................................................... Logger: global Log mutex is now available from C code This way the C++ logging API can still be used while allowing for C files to use the same mutex. Change-Id: I473e57479f8ae98a84ad00b76ff338f79f732236 --- M CommonLibs/Logger.cpp M CommonLibs/debug.c M CommonLibs/debug.h M Transceiver52M/osmo-trx.cpp 4 files changed, 79 insertions(+), 7 deletions(-) Approvals: laforge: Looks good to me, but someone else must approve fixeria: Looks good to me, but someone else must approve pespin: Looks good to me, approved Jenkins Builder: Verified diff --git a/CommonLibs/Logger.cpp b/CommonLibs/Logger.cpp index 171c635..f68fab5 100644 --- a/CommonLibs/Logger.cpp +++ b/CommonLibs/Logger.cpp @@ -35,8 +35,6 @@ using namespace std; -Mutex gLogToLock; - std::ostream& operator<<(std::ostream& os, std::ostringstream& ss) { return os << ss.str(); @@ -45,15 +43,13 @@ Log::~Log() { int old_state; - pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_state); int mlen = mStream.str().size(); int neednl = (mlen==0 || mStream.str()[mlen-1] != '\n'); const char *fmt = neednl ? "%s\n" : "%s"; - ScopedLock lock(gLogToLock); - // The COUT() macro prevents messages from stomping each other but adds uninteresting thread numbers, - // so just use std::cout. + + log_mutex_lock_canceldisable(&old_state); LOGPSRC(mCategory, mPriority, filename, line, fmt, mStream.str().c_str()); - pthread_setcancelstate(old_state, NULL); + log_mutex_unlock_canceldisable(old_state); } ostringstream& Log::get() diff --git a/CommonLibs/debug.c b/CommonLibs/debug.c index 294924d..17ef5bc 100644 --- a/CommonLibs/debug.c +++ b/CommonLibs/debug.c @@ -1,3 +1,5 @@ +#include <pthread.h> + #include <osmocom/core/logging.h> #include <osmocom/core/utils.h> #include "debug.h" @@ -34,3 +36,49 @@ .cat = default_categories, .num_cat = ARRAY_SIZE(default_categories), }; + +pthread_mutex_t log_mutex; + +bool log_mutex_init() { + int rc; + pthread_mutexattr_t attr; + + if ((rc = pthread_mutexattr_init(&attr))) { + fprintf(stderr, "pthread_mutexattr_init() failed: %d\n", rc); + return false; + } + if ((rc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE))) { + fprintf(stderr, "pthread_mutexattr_settype() failed: %d\n", rc); + return false; + } + if ((rc = pthread_mutex_init(&log_mutex, &attr))) { + fprintf(stderr, "pthread_mutex_init() failed: %d\n", rc); + return false; + } + if ((rc = pthread_mutexattr_destroy(&attr))) { + fprintf(stderr, "pthread_mutexattr_destroy() failed: %d\n", rc); + return false; + } + return true; + /* FIXME: do we need to call pthread_mutex_destroy() during process exit? */ +} + +/* If called inside a C++ destructor, use log_mutex_(un)lock_canceldisable() APIs instead. + See osmo-trx commit 86be40b4eb762d5c12e8e3f7388ca9f254e77b36 for more information */ +void log_mutex_lock() { + OSMO_ASSERT(!pthread_mutex_lock(&log_mutex)); +} + +void log_mutex_unlock() { + OSMO_ASSERT(!pthread_mutex_unlock(&log_mutex)); +} + +void log_mutex_lock_canceldisable(int *st) { + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, st); + log_mutex_lock(); +} + +void log_mutex_unlock_canceldisable(int st) { + log_mutex_unlock(); + pthread_setcancelstate(st, NULL); +} diff --git a/CommonLibs/debug.h b/CommonLibs/debug.h index a5b9271..760ab32 100644 --- a/CommonLibs/debug.h +++ b/CommonLibs/debug.h @@ -1,5 +1,10 @@ #pragma once +#include <stdbool.h> +#include <pthread.h> + +#include <osmocom/core/logging.h> + extern const struct log_info log_info; /* Debug Areas of the code */ @@ -9,3 +14,22 @@ DDEV, DLMS, }; + + +bool log_mutex_init(); +void log_mutex_lock(); +void log_mutex_unlock(); +void log_mutex_lock_canceldisable(int *st); +void log_mutex_unlock_canceldisable(int st); + +#define CLOGC(category, level, fmt, args...) do { \ + log_mutex_lock(); \ + LOGP(category, level, "[tid=%lu] " fmt, pthread_self(), ##args); \ + log_mutex_unlock(); \ +} while(0) + +#define CLOGCHAN(chan, category, level, fmt, args...) do { \ + log_mutex_lock(); \ + LOGP(category, level, "[tid=%lu][chan=%lu] " fmt, pthread_self(), chan, ##args); \ + log_mutex_unlock(); \ +} while(0) diff --git a/Transceiver52M/osmo-trx.cpp b/Transceiver52M/osmo-trx.cpp index b8cf968..8a3f1e3 100644 --- a/Transceiver52M/osmo-trx.cpp +++ b/Transceiver52M/osmo-trx.cpp @@ -569,6 +569,10 @@ #endif #endif + if (!log_mutex_init()) { + fprintf(stderr, "Failed to initialize log mutex!\n"); + exit(2); + } convolve_init(); convert_init(); -- To view, visit https://gerrit.osmocom.org/c/osmo-trx/+/14645 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-trx Gerrit-Branch: master Gerrit-Change-Id: I473e57479f8ae98a84ad00b76ff338f79f732236 Gerrit-Change-Number: 14645 Gerrit-PatchSet: 9 Gerrit-Owner: pespin <pes...@sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <axilira...@gmail.com> Gerrit-Reviewer: laforge <lafo...@gnumonks.org> Gerrit-Reviewer: pespin <pes...@sysmocom.de> Gerrit-MessageType: merged