mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 20:12:57 +01:00
Clean up mining CReserveKey to prevent crash at shutdown
Fixes issue#2687
This commit is contained in:
parent
36dc41f427
commit
36e826cea1
@ -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();
|
||||||
|
@ -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);
|
||||||
|
@ -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…
Reference in New Issue
Block a user