|
|
@ -527,4 +527,60 @@ inline uint32_t ByteReverse(uint32_t value) |
|
|
|
return (value<<16) | (value>>16); |
|
|
|
return (value<<16) | (value>>16); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Standard wrapper for do-something-forever thread functions.
|
|
|
|
|
|
|
|
// "Forever" really means until the thread is interrupted.
|
|
|
|
|
|
|
|
// Use it like:
|
|
|
|
|
|
|
|
// new boost::thread(boost::bind(&LoopForever<void (*)()>, "dumpaddr", &DumpAddresses, 10000));
|
|
|
|
|
|
|
|
// or maybe:
|
|
|
|
|
|
|
|
// boost::function<void()> f = boost::bind(&FunctionWithArg, argument);
|
|
|
|
|
|
|
|
// threadGroup.create_thread(boost::bind(&LoopForever<boost::function<void()> >, "nothing", f, milliseconds));
|
|
|
|
|
|
|
|
template <typename Callable> void LoopForever(const char* name, Callable func, int64 msecs) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
std::string s = strprintf("bitcoin-%s", name); |
|
|
|
|
|
|
|
RenameThread(s.c_str()); |
|
|
|
|
|
|
|
printf("%s thread start\n", name); |
|
|
|
|
|
|
|
try |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
while (1) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
func(); |
|
|
|
|
|
|
|
MilliSleep(msecs); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
catch (boost::thread_interrupted) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
printf("%s thread stop\n", name); |
|
|
|
|
|
|
|
throw; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
catch (std::exception& e) { |
|
|
|
|
|
|
|
PrintException(&e, name); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
catch (...) { |
|
|
|
|
|
|
|
PrintException(NULL, name); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// .. and a wrapper that just calls func once
|
|
|
|
|
|
|
|
template <typename Callable> void TraceThread(const char* name, Callable func) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
std::string s = strprintf("bitcoin-%s", name); |
|
|
|
|
|
|
|
RenameThread(s.c_str()); |
|
|
|
|
|
|
|
try |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
printf("%s thread start\n", name); |
|
|
|
|
|
|
|
func(); |
|
|
|
|
|
|
|
printf("%s thread exit\n", name); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
catch (boost::thread_interrupted) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
printf("%s thread interrupt\n", name); |
|
|
|
|
|
|
|
throw; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
catch (std::exception& e) { |
|
|
|
|
|
|
|
PrintException(&e, name); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
catch (...) { |
|
|
|
|
|
|
|
PrintException(NULL, name); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|