diff --git a/configure.ac b/configure.ac index 490b638ee104..5138b8066e44 100644 --- a/configure.ac +++ b/configure.ac @@ -775,8 +775,23 @@ AC_LINK_IFELSE([AC_LANG_SOURCE([ } ])], [ - AC_DEFINE(HAVE_THREAD_LOCAL,1,[Define if thread_local is supported.]) - AC_MSG_RESULT(yes) + case $host in + *mingw*) + # mingw32's implementation of thread_local has also been shown to behave + # erroneously under concurrent usage; see: + # https://gist.github.com/jamesob/fe9a872051a88b2025b1aa37bfa98605 + AC_MSG_RESULT(no) + ;; + *darwin*) + # TODO enable thread_local on later versions of Darwin where it is + # supported (per https://stackoverflow.com/a/29929949) + AC_MSG_RESULT(no) + ;; + *) + AC_DEFINE(HAVE_THREAD_LOCAL,1,[Define if thread_local is supported.]) + AC_MSG_RESULT(yes) + ;; + esac ], [ AC_MSG_RESULT(no) diff --git a/doc/release-notes-pr13168.md b/doc/release-notes-pr13168.md new file mode 100644 index 000000000000..fd5d5f1d3635 --- /dev/null +++ b/doc/release-notes-pr13168.md @@ -0,0 +1,6 @@ +Thread names in logs +-------------------- + +On platforms supporting `thread_local`, log lines are now prefixed by default +with the name of the thread that caused the log. To disable this behavior, +specify `-logthreadnames=0`. diff --git a/src/Makefile.am b/src/Makefile.am index 458721293ebd..a0ab13e6e7cb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -169,6 +169,7 @@ BITCOIN_CORE_H = \ support/events.h \ support/lockedpool.h \ sync.h \ + threadutil.h \ threadsafety.h \ threadinterrupt.h \ timedata.h \ @@ -409,6 +410,7 @@ libbitcoin_util_a_SOURCES = \ rpc/protocol.cpp \ support/cleanse.cpp \ sync.cpp \ + threadutil.cpp \ threadinterrupt.cpp \ util.cpp \ utilmoneystr.cpp \ diff --git a/src/Makefile.test.include b/src/Makefile.test.include index 0c1516f4d553..a2bcef02aed7 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -80,6 +80,7 @@ BITCOIN_TESTS =\ test/sigopcount_tests.cpp \ test/skiplist_tests.cpp \ test/streams_tests.cpp \ + test/threadutil_tests.cpp \ test/timedata_tests.cpp \ test/torcontrol_tests.cpp \ test/transaction_tests.cpp \ diff --git a/src/bitcoind.cpp b/src/bitcoind.cpp index 494a925a79ac..bf0268997cbf 100644 --- a/src/bitcoind.cpp +++ b/src/bitcoind.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -58,6 +59,8 @@ static bool AppInit(int argc, char* argv[]) { bool fRet = false; + thread_util::Rename("init"); + // // Parameters // diff --git a/src/httpserver.cpp b/src/httpserver.cpp index bd08b04c0f4a..229ff860ad1a 100644 --- a/src/httpserver.cpp +++ b/src/httpserver.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -16,7 +17,7 @@ #include #include #include -#include +#include #include #include @@ -281,7 +282,7 @@ static void http_reject_request_cb(struct evhttp_request* req, void*) /** Event dispatcher thread */ static bool ThreadHTTP(struct event_base* base, struct evhttp* http) { - RenameThread("bitcoin-http"); + thread_util::Rename("http"); LogPrint(BCLog::HTTP, "Entering http event loop\n"); event_base_dispatch(base); // Event loop will be interrupted by InterruptHTTPServer() @@ -328,9 +329,9 @@ static bool HTTPBindAddresses(struct evhttp* http) } /** Simple wrapper to set thread name and run work queue */ -static void HTTPWorkQueueRun(WorkQueue* queue) +static void HTTPWorkQueueRun(WorkQueue* queue, int worker_num) { - RenameThread("bitcoin-httpworker"); + thread_util::Rename(strprintf("httpworker.%i", worker_num)); queue->Run(); } @@ -433,7 +434,7 @@ bool StartHTTPServer() threadHTTP = std::thread(std::move(task), eventBase, eventHTTP); for (int i = 0; i < rpcThreads; i++) { - g_thread_http_workers.emplace_back(HTTPWorkQueueRun, workQueue); + g_thread_http_workers.emplace_back(HTTPWorkQueueRun, workQueue, i); } return true; } diff --git a/src/init.cpp b/src/init.cpp index 66b0b65eb4bc..d4449644a301 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -36,6 +36,7 @@ #include