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:
parent
207d8a2624
commit
5b60c98769
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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 {
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -322,6 +322,7 @@ private:
|
|||
|
||||
void *async_event_loop(uhd_device *dev)
|
||||
{
|
||||
set_selfthread_name("UHDAsyncEvent");
|
||||
dev->setPriority(0.43);
|
||||
|
||||
while (1) {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue