Browse Source

Clean up mining CReserveKey to prevent crash at shutdown

Fixes issue#2687
0.8
Gavin Andresen 12 years ago
parent
commit
36e826cea1
  1. 9
      src/bitcoinrpc.cpp
  2. 2
      src/bitcoinrpc.h
  3. 9
      src/rpcmining.cpp

9
src/bitcoinrpc.cpp

@ -30,6 +30,10 @@ using namespace boost;
using namespace boost::asio; using namespace boost::asio;
using namespace json_spirit; using namespace json_spirit;
// Key used by getwork/getblocktemplate miners.
// Allocated in StartRPCThreads, free'd in StopRPCThreads
CReserveKey* pMiningKey = NULL;
static std::string strRPCUserColonPass; static std::string strRPCUserColonPass;
// These are created by StartRPCThreads, destroyed in StopRPCThreads // These are created by StartRPCThreads, destroyed in StopRPCThreads
@ -722,6 +726,9 @@ static void RPCAcceptHandler(boost::shared_ptr< basic_socket_acceptor<Protocol,
void StartRPCThreads() void StartRPCThreads()
{ {
// getwork/getblocktemplate mining rewards paid here:
pMiningKey = new CReserveKey(pwalletMain);
strRPCUserColonPass = mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"]; strRPCUserColonPass = mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"];
if ((mapArgs["-rpcpassword"] == "") || if ((mapArgs["-rpcpassword"] == "") ||
(mapArgs["-rpcuser"] == mapArgs["-rpcpassword"])) (mapArgs["-rpcuser"] == mapArgs["-rpcpassword"]))
@ -841,6 +848,8 @@ void StartRPCThreads()
void StopRPCThreads() void StopRPCThreads()
{ {
delete pMiningKey; pMiningKey = NULL;
if (rpc_io_service == NULL) return; if (rpc_io_service == NULL) return;
rpc_io_service->stop(); rpc_io_service->stop();

2
src/bitcoinrpc.h

@ -11,6 +11,7 @@
#include <map> #include <map>
class CBlockIndex; class CBlockIndex;
class CReserveKey;
#include "json/json_spirit_reader_template.h" #include "json/json_spirit_reader_template.h"
#include "json/json_spirit_writer_template.h" #include "json/json_spirit_writer_template.h"
@ -122,6 +123,7 @@ public:
}; };
extern const CRPCTable tableRPC; extern const CRPCTable tableRPC;
extern CReserveKey* pMiningKey;
extern int64 nWalletUnlockTime; extern int64 nWalletUnlockTime;
extern int64 AmountFromValue(const json_spirit::Value& value); extern int64 AmountFromValue(const json_spirit::Value& value);

9
src/rpcmining.cpp

@ -104,7 +104,6 @@ Value getwork(const Array& params, bool fHelp)
typedef map<uint256, pair<CBlock*, CScript> > mapNewBlock_t; typedef map<uint256, pair<CBlock*, CScript> > mapNewBlock_t;
static mapNewBlock_t mapNewBlock; // FIXME: thread safety static mapNewBlock_t mapNewBlock; // FIXME: thread safety
static vector<CBlockTemplate*> vNewBlockTemplate; static vector<CBlockTemplate*> vNewBlockTemplate;
static CReserveKey reservekey(pwalletMain);
if (params.size() == 0) if (params.size() == 0)
{ {
@ -134,7 +133,7 @@ Value getwork(const Array& params, bool fHelp)
nStart = GetTime(); nStart = GetTime();
// Create new block // Create new block
pblocktemplate = CreateNewBlock(reservekey); pblocktemplate = CreateNewBlock(*pMiningKey);
if (!pblocktemplate) if (!pblocktemplate)
throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory"); throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory");
vNewBlockTemplate.push_back(pblocktemplate); 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->vtx[0].vin[0].scriptSig = mapNewBlock[pdata->hashMerkleRoot].second;
pblock->hashMerkleRoot = pblock->BuildMerkleTree(); 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()) if (IsInitialBlockDownload())
throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Bitcoin is downloading blocks..."); throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Bitcoin is downloading blocks...");
static CReserveKey reservekey(pwalletMain);
// Update block // Update block
static unsigned int nTransactionsUpdatedLast; static unsigned int nTransactionsUpdatedLast;
static CBlockIndex* pindexPrev; static CBlockIndex* pindexPrev;
@ -267,7 +264,7 @@ Value getblocktemplate(const Array& params, bool fHelp)
delete pblocktemplate; delete pblocktemplate;
pblocktemplate = NULL; pblocktemplate = NULL;
} }
pblocktemplate = CreateNewBlock(reservekey); pblocktemplate = CreateNewBlock(*pMiningKey);
if (!pblocktemplate) if (!pblocktemplate)
throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory"); throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory");

Loading…
Cancel
Save