<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-trx/+/14645">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Logger: global Log mutex is now available from C code<br><br>This way the C++ logging API can still be used while allowing for C<br>files to use the same mutex.<br><br>Change-Id: I473e57479f8ae98a84ad00b76ff338f79f732236<br>---<br>M CommonLibs/Logger.cpp<br>M CommonLibs/debug.c<br>M CommonLibs/debug.h<br>M Transceiver52M/osmo-trx.cpp<br>4 files changed, 79 insertions(+), 7 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/45/14645/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/CommonLibs/Logger.cpp b/CommonLibs/Logger.cpp</span><br><span>index 171c635..f68fab5 100644</span><br><span>--- a/CommonLibs/Logger.cpp</span><br><span>+++ b/CommonLibs/Logger.cpp</span><br><span>@@ -35,8 +35,6 @@</span><br><span> </span><br><span> using namespace std;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-Mutex gLogToLock;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> std::ostream& operator<<(std::ostream& os, std::ostringstream& ss)</span><br><span> {</span><br><span>  return os << ss.str();</span><br><span>@@ -45,15 +43,13 @@</span><br><span> Log::~Log()</span><br><span> {</span><br><span>       int old_state;</span><br><span style="color: hsl(0, 100%, 40%);">-  pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_state);</span><br><span>      int mlen = mStream.str().size();</span><br><span>     int neednl = (mlen==0 || mStream.str()[mlen-1] != '\n');</span><br><span>     const char *fmt = neednl ? "%s\n" : "%s";</span><br><span style="color: hsl(0, 100%, 40%);">-   ScopedLock lock(gLogToLock);</span><br><span style="color: hsl(0, 100%, 40%);">-    // The COUT() macro prevents messages from stomping each other but adds uninteresting thread numbers,</span><br><span style="color: hsl(0, 100%, 40%);">-   // so just use std::cout.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   log_mutex_lock_canceldisable(&old_state);</span><br><span>        LOGPSRC(mCategory, mPriority, filename, line, fmt, mStream.str().c_str());</span><br><span style="color: hsl(0, 100%, 40%);">-      pthread_setcancelstate(old_state, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      log_mutex_unlock_canceldisable(old_state);</span><br><span> }</span><br><span> </span><br><span> ostringstream& Log::get()</span><br><span>diff --git a/CommonLibs/debug.c b/CommonLibs/debug.c</span><br><span>index 294924d..17ef5bc 100644</span><br><span>--- a/CommonLibs/debug.c</span><br><span>+++ b/CommonLibs/debug.c</span><br><span>@@ -1,3 +1,5 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#include <pthread.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #include <osmocom/core/logging.h></span><br><span> #include <osmocom/core/utils.h></span><br><span> #include "debug.h"</span><br><span>@@ -34,3 +36,49 @@</span><br><span>   .cat = default_categories,</span><br><span>   .num_cat = ARRAY_SIZE(default_categories),</span><br><span> };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+pthread_mutex_t log_mutex;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bool log_mutex_init() {</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       pthread_mutexattr_t attr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if ((rc = pthread_mutexattr_init(&attr))) {</span><br><span style="color: hsl(120, 100%, 40%);">+               fprintf(stderr, "pthread_mutexattr_init() failed: %d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+               return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     if ((rc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE))) {</span><br><span style="color: hsl(120, 100%, 40%);">+           fprintf(stderr, "pthread_mutexattr_settype() failed: %d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+            return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     if ((rc = pthread_mutex_init(&log_mutex, &attr))) {</span><br><span style="color: hsl(120, 100%, 40%);">+           fprintf(stderr, "pthread_mutex_init() failed: %d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+           return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     if ((rc = pthread_mutexattr_destroy(&attr))) {</span><br><span style="color: hsl(120, 100%, 40%);">+            fprintf(stderr, "pthread_mutexattr_destroy() failed: %d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+            return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     return true;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* FIXME: do we need to call pthread_mutex_destroy() during process exit? */</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* If called inside a C++ destructor, use log_mutex_(un)lock_canceldisable() APIs instead.</span><br><span style="color: hsl(120, 100%, 40%);">+   See osmo-trx commit 86be40b4eb762d5c12e8e3f7388ca9f254e77b36 for more information */</span><br><span style="color: hsl(120, 100%, 40%);">+void log_mutex_lock() {</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(!pthread_mutex_lock(&log_mutex));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void log_mutex_unlock() {</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(!pthread_mutex_unlock(&log_mutex));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void log_mutex_lock_canceldisable(int *st) {</span><br><span style="color: hsl(120, 100%, 40%);">+        pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, st);</span><br><span style="color: hsl(120, 100%, 40%);">+   log_mutex_lock();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void log_mutex_unlock_canceldisable(int st) {</span><br><span style="color: hsl(120, 100%, 40%);">+ log_mutex_unlock();</span><br><span style="color: hsl(120, 100%, 40%);">+   pthread_setcancelstate(st, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/CommonLibs/debug.h b/CommonLibs/debug.h</span><br><span>index a5b9271..760ab32 100644</span><br><span>--- a/CommonLibs/debug.h</span><br><span>+++ b/CommonLibs/debug.h</span><br><span>@@ -1,5 +1,10 @@</span><br><span> #pragma once</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <pthread.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> extern const struct log_info log_info;</span><br><span> </span><br><span> /* Debug Areas of the code */</span><br><span>@@ -9,3 +14,22 @@</span><br><span>     DDEV,</span><br><span>        DLMS,</span><br><span> };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bool log_mutex_init();</span><br><span style="color: hsl(120, 100%, 40%);">+void log_mutex_lock();</span><br><span style="color: hsl(120, 100%, 40%);">+void log_mutex_unlock();</span><br><span style="color: hsl(120, 100%, 40%);">+void log_mutex_lock_canceldisable(int *st);</span><br><span style="color: hsl(120, 100%, 40%);">+void log_mutex_unlock_canceldisable(int st);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define CLOGC(category, level, fmt, args...) do { \</span><br><span style="color: hsl(120, 100%, 40%);">+   log_mutex_lock(); \</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGP(category, level, "[tid=%lu] " fmt, pthread_self(), ##args);  \</span><br><span style="color: hsl(120, 100%, 40%);">+ log_mutex_unlock(); \</span><br><span style="color: hsl(120, 100%, 40%);">+} while(0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define CLOGCHAN(chan, category, level, fmt, args...) do { \</span><br><span style="color: hsl(120, 100%, 40%);">+     log_mutex_lock(); \</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGP(category, level, "[tid=%lu][chan=%lu] " fmt, pthread_self(), chan, ##args);  \</span><br><span style="color: hsl(120, 100%, 40%);">+ log_mutex_unlock(); \</span><br><span style="color: hsl(120, 100%, 40%);">+} while(0)</span><br><span>diff --git a/Transceiver52M/osmo-trx.cpp b/Transceiver52M/osmo-trx.cpp</span><br><span>index 06b1a18..6cbd243 100644</span><br><span>--- a/Transceiver52M/osmo-trx.cpp</span><br><span>+++ b/Transceiver52M/osmo-trx.cpp</span><br><span>@@ -569,6 +569,10 @@</span><br><span> #endif</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     if (!log_mutex_init()) {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "Failed to initialize log mutex!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               exit(2);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span>    convolve_init();</span><br><span>     convert_init();</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-trx/+/14645">change 14645</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-trx/+/14645"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-trx </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I473e57479f8ae98a84ad00b76ff338f79f732236 </div>
<div style="display:none"> Gerrit-Change-Number: 14645 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>