aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bitcoinrpc.cpp2
-rw-r--r--src/init.cpp8
-rw-r--r--src/main.cpp4
-rw-r--r--src/net.cpp32
-rw-r--r--src/qt/qtipcserver.cpp2
-rw-r--r--src/rpcwallet.cpp4
-rw-r--r--src/util.cpp12
-rw-r--r--src/util.h53
-rw-r--r--src/wallet.cpp2
9 files changed, 40 insertions, 79 deletions
diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp
index 2271ff07c4..84a6d6f896 100644
--- a/src/bitcoinrpc.cpp
+++ b/src/bitcoinrpc.cpp
@@ -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;
}
diff --git a/src/init.cpp b/src/init.cpp
index b085a23d60..0a28312af5 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -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
diff --git a/src/main.cpp b/src/main.cpp
index 71d425e15f..cfbb2d2731 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -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);
}
}
diff --git a/src/net.cpp b/src/net.cpp
index dc55fae5c5..8e9c4f85f0 100644
--- a/src/net.cpp
+++ b/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);
diff --git a/src/qt/qtipcserver.cpp b/src/qt/qtipcserver.cpp
index a2fe866e29..ec2d56b9e3 100644
--- a/src/qt/qtipcserver.cpp
+++ b/src/qt/qtipcserver.cpp
@@ -152,7 +152,7 @@ void ipcInit(int argc, char *argv[])
return;
}
- if (!CreateThread(ipcThread, mq))
+ if (!NewThread(ipcThread, mq))
{
delete mq;
return;
diff --git a/src/rpcwallet.cpp b/src/rpcwallet.cpp
index b8e6a4467a..929dde9c15 100644
--- a/src/rpcwallet.cpp
+++ b/src/rpcwallet.cpp
@@ -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;
}
diff --git a/src/util.cpp b/src/util.cpp
index 461f42d177..d1270348e0 100644
--- a/src/util.cpp
+++ b/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;
+}
diff --git a/src/util.h b/src/util.h
index 709b0e05bd..65923e68a3 100644
--- a/src/util.h
+++ b/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
diff --git a/src/wallet.cpp b/src/wallet.cpp
index 6538ca9713..2f312d809e 100644
--- a/src/wallet.cpp
+++ b/src/wallet.cpp
@@ -1385,7 +1385,7 @@ int CWallet::LoadWallet(bool& fFirstRunRet)
return nLoadWalletRet;
fFirstRunRet = !vchDefaultKey.IsValid();
- CreateThread(ThreadFlushWalletDB, &strWalletFile);
+ NewThread(ThreadFlushWalletDB, &strWalletFile);
return DB_LOAD_OK;
}