From 36e826cea14585f68d5c363a82c1a887a779e130 Mon Sep 17 00:00:00 2001 From: Gavin Andresen Date: Thu, 23 May 2013 14:13:05 -0400 Subject: [PATCH] Clean up mining CReserveKey to prevent crash at shutdown Fixes issue#2687 --- src/bitcoinrpc.cpp | 9 +++++++++ src/bitcoinrpc.h | 2 ++ src/rpcmining.cpp | 9 +++------ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp index a9b73fd5..2c4744a5 100644 --- a/src/bitcoinrpc.cpp +++ b/src/bitcoinrpc.cpp @@ -30,6 +30,10 @@ using namespace boost; using namespace boost::asio; using namespace json_spirit; +// Key used by getwork/getblocktemplate miners. +// Allocated in StartRPCThreads, free'd in StopRPCThreads +CReserveKey* pMiningKey = NULL; + static std::string strRPCUserColonPass; // These are created by StartRPCThreads, destroyed in StopRPCThreads @@ -722,6 +726,9 @@ static void RPCAcceptHandler(boost::shared_ptr< basic_socket_acceptorstop(); diff --git a/src/bitcoinrpc.h b/src/bitcoinrpc.h index 315fd923..cf5b1379 100644 --- a/src/bitcoinrpc.h +++ b/src/bitcoinrpc.h @@ -11,6 +11,7 @@ #include class CBlockIndex; +class CReserveKey; #include "json/json_spirit_reader_template.h" #include "json/json_spirit_writer_template.h" @@ -122,6 +123,7 @@ public: }; extern const CRPCTable tableRPC; +extern CReserveKey* pMiningKey; extern int64 nWalletUnlockTime; extern int64 AmountFromValue(const json_spirit::Value& value); diff --git a/src/rpcmining.cpp b/src/rpcmining.cpp index fddda8b5..b8b74596 100644 --- a/src/rpcmining.cpp +++ b/src/rpcmining.cpp @@ -104,7 +104,6 @@ Value getwork(const Array& params, bool fHelp) typedef map > mapNewBlock_t; static mapNewBlock_t mapNewBlock; // FIXME: thread safety static vector vNewBlockTemplate; - static CReserveKey reservekey(pwalletMain); if (params.size() == 0) { @@ -134,7 +133,7 @@ Value getwork(const Array& params, bool fHelp) nStart = GetTime(); // Create new block - pblocktemplate = CreateNewBlock(reservekey); + pblocktemplate = CreateNewBlock(*pMiningKey); if (!pblocktemplate) throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory"); vNewBlockTemplate.push_back(pblocktemplate); @@ -192,7 +191,7 @@ Value getwork(const Array& params, bool fHelp) pblock->vtx[0].vin[0].scriptSig = mapNewBlock[pdata->hashMerkleRoot].second; pblock->hashMerkleRoot = pblock->BuildMerkleTree(); - return CheckWork(pblock, *pwalletMain, reservekey); + return CheckWork(pblock, *pwalletMain, *pMiningKey); } } @@ -243,8 +242,6 @@ Value getblocktemplate(const Array& params, bool fHelp) if (IsInitialBlockDownload()) throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Bitcoin is downloading blocks..."); - static CReserveKey reservekey(pwalletMain); - // Update block static unsigned int nTransactionsUpdatedLast; static CBlockIndex* pindexPrev; @@ -267,7 +264,7 @@ Value getblocktemplate(const Array& params, bool fHelp) delete pblocktemplate; pblocktemplate = NULL; } - pblocktemplate = CreateNewBlock(reservekey); + pblocktemplate = CreateNewBlock(*pMiningKey); if (!pblocktemplate) throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory");