|
|
@ -23,6 +23,7 @@ |
|
|
|
|
|
|
|
#include <string> |
|
|
|
#include <iostream> |
|
|
|
#include <thread> |
|
|
|
#include "Guards.h" |
|
|
|
using namespace std; |
|
|
|
using namespace dev; |
|
|
@ -31,13 +32,87 @@ using namespace dev; |
|
|
|
int dev::g_logVerbosity = 5; |
|
|
|
map<type_info const*, bool> dev::g_logOverride; |
|
|
|
|
|
|
|
ThreadLocalLogName dev::t_logThreadName("main"); |
|
|
|
/// Associate a name with each thread for nice logging.
|
|
|
|
struct ThreadLocalLogName |
|
|
|
{ |
|
|
|
ThreadLocalLogName(std::string const& _name) { m_name.reset(new string(_name)); } |
|
|
|
boost::thread_specific_ptr<std::string> m_name; |
|
|
|
}; |
|
|
|
|
|
|
|
/// Associate a name with each thread for nice logging.
|
|
|
|
struct ThreadLocalLogContext |
|
|
|
{ |
|
|
|
ThreadLocalLogContext() = default; |
|
|
|
|
|
|
|
void push(std::string const& _name) |
|
|
|
{ |
|
|
|
if (!m_contexts.get()) |
|
|
|
m_contexts.reset(new vector<string>); |
|
|
|
m_contexts->push_back(_name); |
|
|
|
} |
|
|
|
|
|
|
|
void pop() |
|
|
|
{ |
|
|
|
m_contexts->pop_back(); |
|
|
|
} |
|
|
|
|
|
|
|
string join(string const& _prior) |
|
|
|
{ |
|
|
|
string ret; |
|
|
|
if (m_contexts.get()) |
|
|
|
for (auto const& i: *m_contexts) |
|
|
|
ret += _prior + i; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
boost::thread_specific_ptr<std::vector<std::string>> m_contexts; |
|
|
|
}; |
|
|
|
|
|
|
|
ThreadLocalLogContext g_logThreadContext; |
|
|
|
|
|
|
|
ThreadLocalLogName g_logThreadName("main"); |
|
|
|
|
|
|
|
void dev::ThreadContext::push(string const& _n) |
|
|
|
{ |
|
|
|
g_logThreadContext.push(_n); |
|
|
|
} |
|
|
|
|
|
|
|
void dev::ThreadContext::pop() |
|
|
|
{ |
|
|
|
g_logThreadContext.pop(); |
|
|
|
} |
|
|
|
|
|
|
|
string dev::ThreadContext::join(string const& _prior) |
|
|
|
{ |
|
|
|
return g_logThreadContext.join(_prior); |
|
|
|
} |
|
|
|
|
|
|
|
// foward declare without all of Windows.h
|
|
|
|
#ifdef _WIN32 |
|
|
|
extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA(const char* lpOutputString); |
|
|
|
#endif |
|
|
|
|
|
|
|
string dev::getThreadName() |
|
|
|
{ |
|
|
|
#ifdef __linux__ |
|
|
|
char buffer[128]; |
|
|
|
pthread_getname_np(pthread_self(), buffer, 127); |
|
|
|
buffer[127] = 0; |
|
|
|
return buffer; |
|
|
|
#else |
|
|
|
return g_logThreadName.m_name.get() ? *g_logThreadName.m_name.get() : "<unknown>"; |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
void dev::setThreadName(string const& _n) |
|
|
|
{ |
|
|
|
#ifdef __linux__ |
|
|
|
pthread_setname_np(pthread_self(), _n.c_str()); |
|
|
|
#else |
|
|
|
g_logThreadName.m_name.reset(new std::string(_n)); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
void dev::simpleDebugOut(std::string const& _s, char const*) |
|
|
|
{ |
|
|
|
static Mutex s_lock; |
|
|
@ -55,4 +130,3 @@ void dev::simpleDebugOut(std::string const& _s, char const*) |
|
|
|
} |
|
|
|
|
|
|
|
std::function<void(std::string const&, char const*)> dev::g_logPost = simpleDebugOut; |
|
|
|
|
|
|
|