Merge pull request #1738 from laanwj/2012_08_boostthread
implement CreateThread with boost::thread
This commit is contained in:
commit
8c7b6c05db
9 changed files with 40 additions and 79 deletions
|
@ -697,7 +697,7 @@ static void RPCAcceptHandler(boost::shared_ptr< basic_socket_acceptor<Protocol,
|
|||
}
|
||||
|
||||
// start HTTP client thread
|
||||
else if (!CreateThread(ThreadRPCServer3, conn)) {
|
||||
else if (!NewThread(ThreadRPCServer3, conn)) {
|
||||
printf("Failed to create RPC server client thread\n");
|
||||
delete conn;
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ void StartShutdown()
|
|||
uiInterface.QueueShutdown();
|
||||
#else
|
||||
// Without UI, Shutdown() can simply be started in a new thread
|
||||
CreateThread(Shutdown, NULL);
|
||||
NewThread(Shutdown, NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -78,7 +78,7 @@ void Shutdown(void* parg)
|
|||
boost::filesystem::remove(GetPidFile());
|
||||
UnregisterWallet(pwalletMain);
|
||||
delete pwalletMain;
|
||||
CreateThread(ExitTimeout, NULL);
|
||||
NewThread(ExitTimeout, NULL);
|
||||
Sleep(50);
|
||||
printf("Bitcoin exited\n\n");
|
||||
fExit = true;
|
||||
|
@ -759,11 +759,11 @@ bool AppInit2()
|
|||
printf("mapWallet.size() = %d\n", pwalletMain->mapWallet.size());
|
||||
printf("mapAddressBook.size() = %d\n", pwalletMain->mapAddressBook.size());
|
||||
|
||||
if (!CreateThread(StartNode, NULL))
|
||||
if (!NewThread(StartNode, NULL))
|
||||
InitError(_("Error: could not start node"));
|
||||
|
||||
if (fServer)
|
||||
CreateThread(ThreadRPCServer, NULL);
|
||||
NewThread(ThreadRPCServer, NULL);
|
||||
|
||||
// ********************************************************* Step 11: finished
|
||||
|
||||
|
|
|
@ -4025,8 +4025,8 @@ void GenerateBitcoins(bool fGenerate, CWallet* pwallet)
|
|||
printf("Starting %d BitcoinMiner threads\n", nAddThreads);
|
||||
for (int i = 0; i < nAddThreads; i++)
|
||||
{
|
||||
if (!CreateThread(ThreadBitcoinMiner, pwallet))
|
||||
printf("Error: CreateThread(ThreadBitcoinMiner) failed\n");
|
||||
if (!NewThread(ThreadBitcoinMiner, pwallet))
|
||||
printf("Error: NewThread(ThreadBitcoinMiner) failed\n");
|
||||
Sleep(10);
|
||||
}
|
||||
}
|
||||
|
|
32
src/net.cpp
32
src/net.cpp
|
@ -1125,7 +1125,7 @@ void MapPort()
|
|||
{
|
||||
if (fUseUPnP && vnThreadsRunning[THREAD_UPNP] < 1)
|
||||
{
|
||||
if (!CreateThread(ThreadMapPort, NULL))
|
||||
if (!NewThread(ThreadMapPort, NULL))
|
||||
printf("Error: ThreadMapPort(ThreadMapPort) failed\n");
|
||||
}
|
||||
}
|
||||
|
@ -1887,7 +1887,7 @@ void static Discover()
|
|||
|
||||
// Don't use external IPv4 discovery, when -onlynet="IPv6"
|
||||
if (!IsLimited(NET_IPV4))
|
||||
CreateThread(ThreadGetMyExternalIP, NULL);
|
||||
NewThread(ThreadGetMyExternalIP, NULL);
|
||||
}
|
||||
|
||||
void StartNode(void* parg)
|
||||
|
@ -1913,36 +1913,36 @@ void StartNode(void* parg)
|
|||
if (!GetBoolArg("-dnsseed", true))
|
||||
printf("DNS seeding disabled\n");
|
||||
else
|
||||
if (!CreateThread(ThreadDNSAddressSeed, NULL))
|
||||
printf("Error: CreateThread(ThreadDNSAddressSeed) failed\n");
|
||||
if (!NewThread(ThreadDNSAddressSeed, NULL))
|
||||
printf("Error: NewThread(ThreadDNSAddressSeed) failed\n");
|
||||
|
||||
// Map ports with UPnP
|
||||
if (fUseUPnP)
|
||||
MapPort();
|
||||
|
||||
// Get addresses from IRC and advertise ours
|
||||
if (!CreateThread(ThreadIRCSeed, NULL))
|
||||
printf("Error: CreateThread(ThreadIRCSeed) failed\n");
|
||||
if (!NewThread(ThreadIRCSeed, NULL))
|
||||
printf("Error: NewThread(ThreadIRCSeed) failed\n");
|
||||
|
||||
// Send and receive from sockets, accept connections
|
||||
if (!CreateThread(ThreadSocketHandler, NULL))
|
||||
printf("Error: CreateThread(ThreadSocketHandler) failed\n");
|
||||
if (!NewThread(ThreadSocketHandler, NULL))
|
||||
printf("Error: NewThread(ThreadSocketHandler) failed\n");
|
||||
|
||||
// Initiate outbound connections from -addnode
|
||||
if (!CreateThread(ThreadOpenAddedConnections, NULL))
|
||||
printf("Error: CreateThread(ThreadOpenAddedConnections) failed\n");
|
||||
if (!NewThread(ThreadOpenAddedConnections, NULL))
|
||||
printf("Error: NewThread(ThreadOpenAddedConnections) failed\n");
|
||||
|
||||
// Initiate outbound connections
|
||||
if (!CreateThread(ThreadOpenConnections, NULL))
|
||||
printf("Error: CreateThread(ThreadOpenConnections) failed\n");
|
||||
if (!NewThread(ThreadOpenConnections, NULL))
|
||||
printf("Error: NewThread(ThreadOpenConnections) failed\n");
|
||||
|
||||
// Process messages
|
||||
if (!CreateThread(ThreadMessageHandler, NULL))
|
||||
printf("Error: CreateThread(ThreadMessageHandler) failed\n");
|
||||
if (!NewThread(ThreadMessageHandler, NULL))
|
||||
printf("Error: NewThread(ThreadMessageHandler) failed\n");
|
||||
|
||||
// Dump network addresses
|
||||
if (!CreateThread(ThreadDumpAddress, NULL))
|
||||
printf("Error; CreateThread(ThreadDumpAddress) failed\n");
|
||||
if (!NewThread(ThreadDumpAddress, NULL))
|
||||
printf("Error; NewThread(ThreadDumpAddress) failed\n");
|
||||
|
||||
// Generate coins in the background
|
||||
GenerateBitcoins(GetBoolArg("-gen", false), pwalletMain);
|
||||
|
|
|
@ -152,7 +152,7 @@ void ipcInit(int argc, char *argv[])
|
|||
return;
|
||||
}
|
||||
|
||||
if (!CreateThread(ipcThread, mq))
|
||||
if (!NewThread(ipcThread, mq))
|
||||
{
|
||||
delete mq;
|
||||
return;
|
||||
|
|
|
@ -1303,9 +1303,9 @@ Value walletpassphrase(const Array& params, bool fHelp)
|
|||
"walletpassphrase <passphrase> <timeout>\n"
|
||||
"Stores the wallet decryption key in memory for <timeout> seconds.");
|
||||
|
||||
CreateThread(ThreadTopUpKeyPool, NULL);
|
||||
NewThread(ThreadTopUpKeyPool, NULL);
|
||||
int64* pnSleepTime = new int64(params[1].get_int64());
|
||||
CreateThread(ThreadCleanWalletPassphrase, pnSleepTime);
|
||||
NewThread(ThreadCleanWalletPassphrase, pnSleepTime);
|
||||
|
||||
return Value::null;
|
||||
}
|
||||
|
|
12
src/util.cpp
12
src/util.cpp
|
@ -1299,3 +1299,15 @@ void RenameThread(const char* name)
|
|||
(void)name;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool NewThread(void(*pfn)(void*), void* parg)
|
||||
{
|
||||
try
|
||||
{
|
||||
boost::thread(pfn, parg); // thread detaches when out of scope
|
||||
} catch(boost::thread_resource_error &e) {
|
||||
printf("Error creating thread: %s\n", e.what());
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
53
src/util.h
53
src/util.h
|
@ -539,65 +539,14 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
bool NewThread(void(*pfn)(void*), void* parg);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Note: It turns out we might have been able to use boost::thread
|
||||
// by using TerminateThread(boost::thread.native_handle(), 0);
|
||||
#ifdef WIN32
|
||||
typedef HANDLE pthread_t;
|
||||
|
||||
inline pthread_t CreateThread(void(*pfn)(void*), void* parg, bool fWantHandle=false)
|
||||
{
|
||||
DWORD nUnused = 0;
|
||||
HANDLE hthread =
|
||||
CreateThread(
|
||||
NULL, // default security
|
||||
0, // inherit stack size from parent
|
||||
(LPTHREAD_START_ROUTINE)pfn, // function pointer
|
||||
parg, // argument
|
||||
0, // creation option, start immediately
|
||||
&nUnused); // thread identifier
|
||||
if (hthread == NULL)
|
||||
{
|
||||
printf("Error: CreateThread() returned %d\n", GetLastError());
|
||||
return (pthread_t)0;
|
||||
}
|
||||
if (!fWantHandle)
|
||||
{
|
||||
CloseHandle(hthread);
|
||||
return (pthread_t)-1;
|
||||
}
|
||||
return hthread;
|
||||
}
|
||||
|
||||
inline void SetThreadPriority(int nPriority)
|
||||
{
|
||||
SetThreadPriority(GetCurrentThread(), nPriority);
|
||||
}
|
||||
#else
|
||||
inline pthread_t CreateThread(void(*pfn)(void*), void* parg, bool fWantHandle=false)
|
||||
{
|
||||
pthread_t hthread = 0;
|
||||
int ret = pthread_create(&hthread, NULL, (void*(*)(void*))pfn, parg);
|
||||
if (ret != 0)
|
||||
{
|
||||
printf("Error: pthread_create() returned %d\n", ret);
|
||||
return (pthread_t)0;
|
||||
}
|
||||
if (!fWantHandle)
|
||||
{
|
||||
pthread_detach(hthread);
|
||||
return (pthread_t)-1;
|
||||
}
|
||||
return hthread;
|
||||
}
|
||||
|
||||
#define THREAD_PRIORITY_LOWEST PRIO_MAX
|
||||
#define THREAD_PRIORITY_BELOW_NORMAL 2
|
||||
|
|
|
@ -1385,7 +1385,7 @@ int CWallet::LoadWallet(bool& fFirstRunRet)
|
|||
return nLoadWalletRet;
|
||||
fFirstRunRet = !vchDefaultKey.IsValid();
|
||||
|
||||
CreateThread(ThreadFlushWalletDB, &strWalletFile);
|
||||
NewThread(ThreadFlushWalletDB, &strWalletFile);
|
||||
return DB_LOAD_OK;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue