diff --git a/CommonLibs/Threads.cpp b/CommonLibs/Threads.cpp index de6520b2..2988e122 100644 --- a/CommonLibs/Threads.cpp +++ b/CommonLibs/Threads.cpp @@ -24,11 +24,17 @@ */ - - +#include +#include #include "Threads.h" #include "Timeval.h" +#include "Logger.h" + +#ifndef gettid +#include +#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 47c72751..857c5d90 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 cdfd79d0..076db3e6 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 b7109a48..c30f3a7a 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 7d6a03b1..0f949d7c 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 4543c726..2a9a0216 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)