aboutsummaryrefslogtreecommitdiff
path: root/src/bitcoinrpc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/bitcoinrpc.cpp')
-rw-r--r--src/bitcoinrpc.cpp53
1 files changed, 43 insertions, 10 deletions
diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp
index 474207bdce..2e3f8a8e5b 100644
--- a/src/bitcoinrpc.cpp
+++ b/src/bitcoinrpc.cpp
@@ -1569,11 +1569,17 @@ Value keypoolrefill(const Array& params, bool fHelp)
void ThreadTopUpKeyPool(void* parg)
{
+ // Make this thread recognisable as the key-topping-up thread
+ RenameThread("bitcoin-key-top");
+
pwalletMain->TopUpKeyPool();
}
void ThreadCleanWalletPassphrase(void* parg)
{
+ // Make this thread recognisable as the wallet relocking thread
+ RenameThread("bitcoin-lock-wa");
+
int64 nMyWakeTime = GetTimeMillis() + *((int64*)parg) * 1000;
ENTER_CRITICAL_SECTION(cs_nWalletUnlockTime);
@@ -1845,8 +1851,13 @@ Value getwork(const Array& params, bool fHelp)
delete pblock;
vNewBlock.clear();
}
+
+ // Clear pindexPrev so future getworks make a new block, despite any failures from here on
+ pindexPrev = NULL;
+
+ // Store the pindexBest used before CreateNewBlock, to avoid races
nTransactionsUpdatedLast = nTransactionsUpdated;
- pindexPrev = pindexBest;
+ CBlockIndex* pindexPrevNew = pindexBest;
nStart = GetTime();
// Create new block
@@ -1854,6 +1865,9 @@ Value getwork(const Array& params, bool fHelp)
if (!pblock)
throw JSONRPCError(-7, "Out of memory");
vNewBlock.push_back(pblock);
+
+ // Need to update only after we know CreateNewBlock succeeded
+ pindexPrev = pindexPrevNew;
}
// Update nTime
@@ -1867,7 +1881,7 @@ Value getwork(const Array& params, bool fHelp)
// Save
mapNewBlock[pblock->hashMerkleRoot] = make_pair(pblock, pblock->vtx[0].vin[0].scriptSig);
- // Prebuild hash buffers
+ // Pre-build hash buffers
char pmidstate[32];
char pdata[128];
char phash1[64];
@@ -1944,16 +1958,26 @@ Value getmemorypool(const Array& params, bool fHelp)
if (pindexPrev != pindexBest ||
(nTransactionsUpdated != nTransactionsUpdatedLast && GetTime() - nStart > 5))
{
+ // Clear pindexPrev so future calls make a new block, despite any failures from here on
+ pindexPrev = NULL;
+
+ // Store the pindexBest used before CreateNewBlock, to avoid races
nTransactionsUpdatedLast = nTransactionsUpdated;
- pindexPrev = pindexBest;
+ CBlockIndex* pindexPrevNew = pindexBest;
nStart = GetTime();
// Create new block
if(pblock)
+ {
delete pblock;
+ pblock = NULL;
+ }
pblock = CreateNewBlock(reservekey);
if (!pblock)
throw JSONRPCError(-7, "Out of memory");
+
+ // Need to update only after we know CreateNewBlock succeeded
+ pindexPrev = pindexPrevNew;
}
// Update nTime
@@ -2167,7 +2191,7 @@ string rfc1123Time()
time(&now);
struct tm* now_gmt = gmtime(&now);
string locale(setlocale(LC_TIME, NULL));
- setlocale(LC_TIME, "C"); // we want posix (aka "C") weekday/month strings
+ setlocale(LC_TIME, "C"); // we want POSIX (aka "C") weekday/month strings
strftime(buffer, sizeof(buffer), "%a, %d %b %Y %H:%M:%S +0000", now_gmt);
setlocale(LC_TIME, locale.c_str());
return string(buffer);
@@ -2361,7 +2385,7 @@ bool ClientAllowed(const boost::asio::ip::address& address)
if (address == asio::ip::address_v4::loopback()
|| address == asio::ip::address_v6::loopback()
|| (address.is_v4()
- // Chech whether IPv4 addresses match 127.0.0.0/8 (loopback subnet)
+ // Check whether IPv4 addresses match 127.0.0.0/8 (loopback subnet)
&& (address.to_v4().to_ulong() & 0xff000000) == 0x7f000000))
return true;
@@ -2476,6 +2500,10 @@ private:
void ThreadRPCServer(void* parg)
{
IMPLEMENT_RANDOMIZE_STACK(ThreadRPCServer(parg));
+
+ // Make this thread recognisable as the RPC listener
+ RenameThread("bitcoin-rpclist");
+
try
{
vnThreadsRunning[THREAD_RPCLISTENER]++;
@@ -2534,7 +2562,7 @@ static void RPCAcceptHandler(boost::shared_ptr< basic_socket_acceptor<Protocol,
{
vnThreadsRunning[THREAD_RPCLISTENER]++;
- // Immediately start accepting new connections, except when we're canceled or our socket is closed.
+ // Immediately start accepting new connections, except when we're cancelled or our socket is closed.
if (error != asio::error::operation_aborted
&& acceptor->is_open())
RPCListen(acceptor, context, fUseSSL);
@@ -2667,7 +2695,7 @@ void ThreadRPCServer2(void* parg)
}
catch(boost::system::system_error &e)
{
- uiInterface.ThreadSafeMessageBox(strprintf(_("An error occured while setting up the RPC port %i for listening: %s"), endpoint.port(), e.what()),
+ uiInterface.ThreadSafeMessageBox(strprintf(_("An error occurred while setting up the RPC port %i for listening: %s"), endpoint.port(), e.what()),
_("Error"), CClientUIInterface::OK | CClientUIInterface::MODAL);
StartShutdown();
return;
@@ -2759,6 +2787,10 @@ static CCriticalSection cs_THREAD_RPCHANDLER;
void ThreadRPCServer3(void* parg)
{
IMPLEMENT_RANDOMIZE_STACK(ThreadRPCServer3(parg));
+
+ // Make this thread recognisable as the RPC handler
+ RenameThread("bitcoin-rpchand");
+
{
LOCK(cs_THREAD_RPCHANDLER);
vnThreadsRunning[THREAD_RPCHANDLER]++;
@@ -2940,8 +2972,9 @@ void ConvertTo(Value& value)
{
// reinterpret string as unquoted json value
Value value2;
- if (!read_string(value.get_str(), value2))
- throw runtime_error("type mismatch");
+ string strJSON = value.get_str();
+ if (!read_string(strJSON, value2))
+ throw runtime_error(string("Error parsing JSON:")+strJSON);
value = value2.get_value<T>();
}
else
@@ -3069,7 +3102,7 @@ int CommandLineRPC(int argc, char *argv[])
int main(int argc, char *argv[])
{
#ifdef _MSC_VER
- // Turn off microsoft heap dump noise
+ // Turn off Microsoft heap dump noise
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, CreateFile("NUL", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0));
#endif