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
This commit is contained in:
Pau Espin 2018-09-20 18:04:46 +02:00 committed by Harald Welte
parent 207d8a2624
commit 5b60c98769
6 changed files with 43 additions and 4 deletions

View File

@ -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)
{

View File

@ -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 {

View File

@ -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) {

View File

@ -322,6 +322,7 @@ private:
void *async_event_loop(uhd_device *dev)
{
set_selfthread_name("UHDAsyncEvent");
dev->setPriority(0.43);
while (1) {

View File

@ -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();

View File

@ -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)