<p>Pau Espin Pedrol has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11047">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Use pthread_setname_np to name threads<br><br>osmo-trx can start a considerable amount of threads that can make<br>debugging it challenging at least. By using phtread_setname_np, the<br>system sets a meaningful name to the thread which can be seen while<br>debugging with gdb or by printing /proc/$pid/task/$tid/comm.<br><br>Now we also log system TID when setting the name so we can identify<br>different tasks in /proc even if pthread_setname_np fails.<br><br>Change-Id: I84711739c3e224cb383fd12b6db933785b28209e<br>---<br>M CommonLibs/Threads.cpp<br>M CommonLibs/Threads.h<br>M Transceiver52M/Transceiver.cpp<br>M Transceiver52M/device/uhd/UHDDevice.cpp<br>M Transceiver52M/radioInterface.cpp<br>M tests/CommonLibs/Makefile.am<br>6 files changed, 43 insertions(+), 4 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/47/11047/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/CommonLibs/Threads.cpp b/CommonLibs/Threads.cpp</span><br><span>index de6520b..2988e12 100644</span><br><span>--- a/CommonLibs/Threads.cpp</span><br><span>+++ b/CommonLibs/Threads.cpp</span><br><span>@@ -24,11 +24,17 @@</span><br><span> */</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/types.h></span><br><span> </span><br><span> #include "Threads.h"</span><br><span> #include "Timeval.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "Logger.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef gettid</span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/syscall.h></span><br><span style="color: hsl(120, 100%, 40%);">+#define gettid() syscall(SYS_gettid)</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> </span><br><span> </span><br><span> using namespace std;</span><br><span>@@ -102,6 +108,19 @@</span><br><span>    pthread_cond_timedwait(&mSignal,&wMutex.mMutex,&waitTime);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void set_selfthread_name(const char *name)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        pthread_t selfid = pthread_self();</span><br><span style="color: hsl(120, 100%, 40%);">+    pid_t tid = gettid();</span><br><span style="color: hsl(120, 100%, 40%);">+ if (pthread_setname_np(selfid, name) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOG(INFO) << "Thread "<< selfid << " (task " << tid << ") set name: " << name;</span><br><span style="color: hsl(120, 100%, 40%);">+      } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              char buf[256];</span><br><span style="color: hsl(120, 100%, 40%);">+                int err = errno;</span><br><span style="color: hsl(120, 100%, 40%);">+              char* err_str = strerror_r(err, buf, sizeof(buf));</span><br><span style="color: hsl(120, 100%, 40%);">+            LOG(NOTICE) << "Thread "<< selfid << " (task " << tid << ") set name \"" << name << "\" failed: (" << err << ") " << err_str;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> void Thread::start(void *(*task)(void*), void *arg)</span><br><span> {</span><br><span>diff --git a/CommonLibs/Threads.h b/CommonLibs/Threads.h</span><br><span>index 47c7275..857c5d9 100644</span><br><span>--- a/CommonLibs/Threads.h</span><br><span>+++ b/CommonLibs/Threads.h</span><br><span>@@ -141,6 +141,8 @@</span><br><span> #define START_THREAD(thread,function,argument) \</span><br><span>  thread.start((void *(*)(void*))function, (void*)argument);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void set_selfthread_name(const char *name);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /** A C++ wrapper for pthread threads.  */</span><br><span> class Thread {</span><br><span> </span><br><span>diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp</span><br><span>index cdfd79d..076db3e 100644</span><br><span>--- a/Transceiver52M/Transceiver.cpp</span><br><span>+++ b/Transceiver52M/Transceiver.cpp</span><br><span>@@ -1044,11 +1044,15 @@</span><br><span> </span><br><span> void *RxUpperLoopAdapter(TransceiverChannel *chan)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+  char thread_name[16];</span><br><span>   Transceiver *trx = chan->trx;</span><br><span>   size_t num = chan->num;</span><br><span> </span><br><span>   delete chan;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  snprintf(thread_name, 16, "RxUpper%zu", num);</span><br><span style="color: hsl(120, 100%, 40%);">+  set_selfthread_name(thread_name);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   trx->setPriority(0.42);</span><br><span> </span><br><span>   while (1) {</span><br><span>@@ -1060,6 +1064,8 @@</span><br><span> </span><br><span> void *RxLowerLoopAdapter(Transceiver *transceiver)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+  set_selfthread_name("RxLower");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   transceiver->setPriority(0.45);</span><br><span> </span><br><span>   while (1) {</span><br><span>@@ -1071,6 +1077,8 @@</span><br><span> </span><br><span> void *TxLowerLoopAdapter(Transceiver *transceiver)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+  set_selfthread_name("TxLower");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   transceiver->setPriority(0.44);</span><br><span> </span><br><span>   while (1) {</span><br><span>@@ -1082,11 +1090,15 @@</span><br><span> </span><br><span> void *ControlServiceLoopAdapter(TransceiverChannel *chan)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+  char thread_name[16];</span><br><span>   Transceiver *trx = chan->trx;</span><br><span>   size_t num = chan->num;</span><br><span> </span><br><span>   delete chan;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  snprintf(thread_name, 16, "CtrlService%zu", num);</span><br><span style="color: hsl(120, 100%, 40%);">+  set_selfthread_name(thread_name);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   while (1) {</span><br><span>     trx->driveControl(num);</span><br><span>     pthread_testcancel();</span><br><span>@@ -1096,11 +1108,15 @@</span><br><span> </span><br><span> void *TxUpperLoopAdapter(TransceiverChannel *chan)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+  char thread_name[16];</span><br><span>   Transceiver *trx = chan->trx;</span><br><span>   size_t num = chan->num;</span><br><span> </span><br><span>   delete chan;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  snprintf(thread_name, 16, "TxUpper%zu", num);</span><br><span style="color: hsl(120, 100%, 40%);">+  set_selfthread_name(thread_name);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   trx->setPriority(0.40);</span><br><span> </span><br><span>   while (1) {</span><br><span>diff --git a/Transceiver52M/device/uhd/UHDDevice.cpp b/Transceiver52M/device/uhd/UHDDevice.cpp</span><br><span>index b7109a4..c30f3a7 100644</span><br><span>--- a/Transceiver52M/device/uhd/UHDDevice.cpp</span><br><span>+++ b/Transceiver52M/device/uhd/UHDDevice.cpp</span><br><span>@@ -322,6 +322,7 @@</span><br><span> </span><br><span> void *async_event_loop(uhd_device *dev)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+      set_selfthread_name("UHDAsyncEvent");</span><br><span>      dev->setPriority(0.43);</span><br><span> </span><br><span>       while (1) {</span><br><span>diff --git a/Transceiver52M/radioInterface.cpp b/Transceiver52M/radioInterface.cpp</span><br><span>index 7d6a03b..0f949d7 100644</span><br><span>--- a/Transceiver52M/radioInterface.cpp</span><br><span>+++ b/Transceiver52M/radioInterface.cpp</span><br><span>@@ -148,6 +148,7 @@</span><br><span> /** synchronization thread loop */</span><br><span> void *AlignRadioServiceLoopAdapter(RadioInterface *radioInterface)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+  set_selfthread_name("AlignRadio");</span><br><span>   while (1) {</span><br><span>     sleep(60);</span><br><span>     radioInterface->alignRadio();</span><br><span>diff --git a/tests/CommonLibs/Makefile.am b/tests/CommonLibs/Makefile.am</span><br><span>index 4543c72..2a9a021 100644</span><br><span>--- a/tests/CommonLibs/Makefile.am</span><br><span>+++ b/tests/CommonLibs/Makefile.am</span><br><span>@@ -28,11 +28,11 @@</span><br><span> </span><br><span> InterthreadTest_SOURCES = InterthreadTest.cpp</span><br><span> InterthreadTest_LDADD = $(COMMON_LA)</span><br><span style="color: hsl(0, 100%, 40%);">-InterthreadTest_LDFLAGS = -lpthread</span><br><span style="color: hsl(120, 100%, 40%);">+InterthreadTest_LDFLAGS = -lpthread $(AM_LDFLAGS)</span><br><span> </span><br><span> SocketsTest_SOURCES = SocketsTest.cpp</span><br><span> SocketsTest_LDADD = $(COMMON_LA)</span><br><span style="color: hsl(0, 100%, 40%);">-SocketsTest_LDFLAGS = -lpthread</span><br><span style="color: hsl(120, 100%, 40%);">+SocketsTest_LDFLAGS = -lpthread $(AM_LDFLAGS)</span><br><span> </span><br><span> TimevalTest_SOURCES = TimevalTest.cpp</span><br><span> TimevalTest_LDADD = $(COMMON_LA)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11047">change 11047</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/11047"/><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-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I84711739c3e224cb383fd12b6db933785b28209e </div>
<div style="display:none"> Gerrit-Change-Number: 11047 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>