aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2018-09-20 18:04:46 +0200
committerHarald Welte <laforge@gnumonks.org>2018-09-28 23:17:57 +0000
commit5b60c98769ba297053801a3192187ebdd558698a (patch)
treed820183c9b7ec21088aa842a0f743938576c9da3
parent207d8a26246eb095425487c2bb3e8a0ca101340e (diff)
Use pthread_setname_np to name threads
osmo-trx can start a considerable amount of threads that can make debugging it challenging at least. By using phtread_setname_np, the system sets a meaningful name to the thread which can be seen while debugging with gdb or by printing /proc/$pid/task/$tid/comm. Now we also log system TID when setting the name so we can identify different tasks in /proc even if pthread_setname_np fails. Change-Id: I84711739c3e224cb383fd12b6db933785b28209e
-rw-r--r--CommonLibs/Threads.cpp23
-rw-r--r--CommonLibs/Threads.h2
-rw-r--r--Transceiver52M/Transceiver.cpp16
-rw-r--r--Transceiver52M/device/uhd/UHDDevice.cpp1
-rw-r--r--Transceiver52M/radioInterface.cpp1
-rw-r--r--tests/CommonLibs/Makefile.am4
6 files changed, 43 insertions, 4 deletions
diff --git a/CommonLibs/Threads.cpp b/CommonLibs/Threads.cpp
index de6520b..2988e12 100644
--- a/CommonLibs/Threads.cpp
+++ b/CommonLibs/Threads.cpp
@@ -24,11 +24,17 @@
*/
-
-
+#include <string.h>
+#include <sys/types.h>
#include "Threads.h"
#include "Timeval.h"
+#include "Logger.h"
+
+#ifndef gettid
+#include <sys/syscall.h>
+#define gettid() syscall(SYS_gettid)
+#endif
using namespace std;
@@ -102,6 +108,19 @@ void Signal::wait(Mutex& wMutex, unsigned timeout) const
pthread_cond_timedwait(&mSignal,&wMutex.mMutex,&waitTime);
}
+void set_selfthread_name(const char *name)
+{
+ pthread_t selfid = pthread_self();
+ pid_t tid = gettid();
+ if (pthread_setname_np(selfid, name) == 0) {
+ LOG(INFO) << "Thread "<< selfid << " (task " << tid << ") set name: " << name;
+ } else {
+ char buf[256];
+ int err = errno;
+ char* err_str = strerror_r(err, buf, sizeof(buf));
+ LOG(NOTICE) << "Thread "<< selfid << " (task " << tid << ") set name \"" << name << "\" failed: (" << err << ") " << err_str;
+ }
+}
void Thread::start(void *(*task)(void*), void *arg)
{
diff --git a/CommonLibs/Threads.h b/CommonLibs/Threads.h
index 47c7275..857c5d9 100644
--- a/CommonLibs/Threads.h
+++ b/CommonLibs/Threads.h
@@ -141,6 +141,8 @@ class Signal {
#define START_THREAD(thread,function,argument) \
thread.start((void *(*)(void*))function, (void*)argument);
+void set_selfthread_name(const char *name);
+
/** A C++ wrapper for pthread threads. */
class Thread {
diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp
index cdfd79d..076db3e 100644
--- a/Transceiver52M/Transceiver.cpp
+++ b/Transceiver52M/Transceiver.cpp
@@ -1044,11 +1044,15 @@ void Transceiver::writeClockInterface()
void *RxUpperLoopAdapter(TransceiverChannel *chan)
{
+ char thread_name[16];
Transceiver *trx = chan->trx;
size_t num = chan->num;
delete chan;
+ snprintf(thread_name, 16, "RxUpper%zu", num);
+ set_selfthread_name(thread_name);
+
trx->setPriority(0.42);
while (1) {
@@ -1060,6 +1064,8 @@ void *RxUpperLoopAdapter(TransceiverChannel *chan)
void *RxLowerLoopAdapter(Transceiver *transceiver)
{
+ set_selfthread_name("RxLower");
+
transceiver->setPriority(0.45);
while (1) {
@@ -1071,6 +1077,8 @@ void *RxLowerLoopAdapter(Transceiver *transceiver)
void *TxLowerLoopAdapter(Transceiver *transceiver)
{
+ set_selfthread_name("TxLower");
+
transceiver->setPriority(0.44);
while (1) {
@@ -1082,11 +1090,15 @@ void *TxLowerLoopAdapter(Transceiver *transceiver)
void *ControlServiceLoopAdapter(TransceiverChannel *chan)
{
+ char thread_name[16];
Transceiver *trx = chan->trx;
size_t num = chan->num;
delete chan;
+ snprintf(thread_name, 16, "CtrlService%zu", num);
+ set_selfthread_name(thread_name);
+
while (1) {
trx->driveControl(num);
pthread_testcancel();
@@ -1096,11 +1108,15 @@ void *ControlServiceLoopAdapter(TransceiverChannel *chan)
void *TxUpperLoopAdapter(TransceiverChannel *chan)
{
+ char thread_name[16];
Transceiver *trx = chan->trx;
size_t num = chan->num;
delete chan;
+ snprintf(thread_name, 16, "TxUpper%zu", num);
+ set_selfthread_name(thread_name);
+
trx->setPriority(0.40);
while (1) {
diff --git a/Transceiver52M/device/uhd/UHDDevice.cpp b/Transceiver52M/device/uhd/UHDDevice.cpp
index b7109a4..c30f3a7 100644
--- a/Transceiver52M/device/uhd/UHDDevice.cpp
+++ b/Transceiver52M/device/uhd/UHDDevice.cpp
@@ -322,6 +322,7 @@ private:
void *async_event_loop(uhd_device *dev)
{
+ set_selfthread_name("UHDAsyncEvent");
dev->setPriority(0.43);
while (1) {
diff --git a/Transceiver52M/radioInterface.cpp b/Transceiver52M/radioInterface.cpp
index 7d6a03b..0f949d7 100644
--- a/Transceiver52M/radioInterface.cpp
+++ b/Transceiver52M/radioInterface.cpp
@@ -148,6 +148,7 @@ bool RadioInterface::tuneRx(double freq, size_t chan)
/** synchronization thread loop */
void *AlignRadioServiceLoopAdapter(RadioInterface *radioInterface)
{
+ set_selfthread_name("AlignRadio");
while (1) {
sleep(60);
radioInterface->alignRadio();
diff --git a/tests/CommonLibs/Makefile.am b/tests/CommonLibs/Makefile.am
index 4543c72..2a9a021 100644
--- a/tests/CommonLibs/Makefile.am
+++ b/tests/CommonLibs/Makefile.am
@@ -28,11 +28,11 @@ PRBSTest_SOURCES = PRBSTest.cpp
InterthreadTest_SOURCES = InterthreadTest.cpp
InterthreadTest_LDADD = $(COMMON_LA)
-InterthreadTest_LDFLAGS = -lpthread
+InterthreadTest_LDFLAGS = -lpthread $(AM_LDFLAGS)
SocketsTest_SOURCES = SocketsTest.cpp
SocketsTest_LDADD = $(COMMON_LA)
-SocketsTest_LDFLAGS = -lpthread
+SocketsTest_LDFLAGS = -lpthread $(AM_LDFLAGS)
TimevalTest_SOURCES = TimevalTest.cpp
TimevalTest_LDADD = $(COMMON_LA)