diff options
| author | Gavin Andresen <[email protected]> | 2013-05-24 12:41:04 -0700 |
|---|---|---|
| committer | Gavin Andresen <[email protected]> | 2013-05-24 12:41:04 -0700 |
| commit | 1472a2991b7f75387aaad87a81e65f695408d58d (patch) | |
| tree | 18fd48ebecaf4657faaf02864e6cec36bad3cb76 /src | |
| parent | doc/README was replaced by README.md (diff) | |
| parent | Clean up mining CReserveKey to prevent crash at shutdown (diff) | |
| download | discoin-1472a2991b7f75387aaad87a81e65f695408d58d.tar.xz discoin-1472a2991b7f75387aaad87a81e65f695408d58d.zip | |
Merge pull request #2688 from gavinandresen/issue2687
Clean up mining CReserveKey to prevent crash at shutdown
Diffstat (limited to 'src')
| -rw-r--r-- | src/bitcoinrpc.cpp | 9 | ||||
| -rw-r--r-- | src/bitcoinrpc.h | 2 | ||||
| -rw-r--r-- | src/rpcmining.cpp | 9 |
3 files changed, 14 insertions, 6 deletions
diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp index a9b73fd5a..2c4744a57 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_acceptor<Protocol, void StartRPCThreads() { + // getwork/getblocktemplate mining rewards paid here: + pMiningKey = new CReserveKey(pwalletMain); + strRPCUserColonPass = mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"]; if ((mapArgs["-rpcpassword"] == "") || (mapArgs["-rpcuser"] == mapArgs["-rpcpassword"])) @@ -841,6 +848,8 @@ void StartRPCThreads() void StopRPCThreads() { + delete pMiningKey; pMiningKey = NULL; + if (rpc_io_service == NULL) return; rpc_io_service->stop(); diff --git a/src/bitcoinrpc.h b/src/bitcoinrpc.h index 315fd9238..cf5b13798 100644 --- a/src/bitcoinrpc.h +++ b/src/bitcoinrpc.h @@ -11,6 +11,7 @@ #include <map> 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 fddda8b5f..b8b745963 100644 --- a/src/rpcmining.cpp +++ b/src/rpcmining.cpp @@ -104,7 +104,6 @@ Value getwork(const Array& params, bool fHelp) typedef map<uint256, pair<CBlock*, CScript> > mapNewBlock_t; static mapNewBlock_t mapNewBlock; // FIXME: thread safety static vector<CBlockTemplate*> 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"); |