Merge pull request #3294

c8b7425 setgenerate creates multiple blocks in -regtest mode (Gavin Andresen)
This commit is contained in:
Wladimir J. van der Laan 2013-11-25 15:43:11 +01:00
commit 4c3e24644d
No known key found for this signature in database
GPG key ID: 74810B012346C9A6
5 changed files with 45 additions and 11 deletions

View file

@ -238,7 +238,7 @@ static const CRPCCommand vRPCCommands[] =
{ "getdifficulty", &getdifficulty, true, false, false }, { "getdifficulty", &getdifficulty, true, false, false },
{ "getnetworkhashps", &getnetworkhashps, true, false, false }, { "getnetworkhashps", &getnetworkhashps, true, false, false },
{ "getgenerate", &getgenerate, true, false, false }, { "getgenerate", &getgenerate, true, false, false },
{ "setgenerate", &setgenerate, true, false, true }, { "setgenerate", &setgenerate, true, true, false },
{ "gethashespersec", &gethashespersec, true, false, false }, { "gethashespersec", &gethashespersec, true, false, false },
{ "getinfo", &getinfo, true, false, false }, { "getinfo", &getinfo, true, false, false },
{ "getmininginfo", &getmininginfo, true, false, false }, { "getmininginfo", &getmininginfo, true, false, false },

View file

@ -112,7 +112,7 @@ void Shutdown()
ShutdownRPCMining(); ShutdownRPCMining();
if (pwalletMain) if (pwalletMain)
bitdb.Flush(false); bitdb.Flush(false);
GenerateBitcoins(false, NULL); GenerateBitcoins(false, NULL, 0);
StopNode(); StopNode();
{ {
LOCK(cs_main); LOCK(cs_main);
@ -1050,7 +1050,7 @@ bool AppInit2(boost::thread_group& threadGroup, bool fForceServer)
// Generate coins in the background // Generate coins in the background
if (pwalletMain) if (pwalletMain)
GenerateBitcoins(GetBoolArg("-gen", false), pwalletMain); GenerateBitcoins(GetBoolArg("-gen", false), pwalletMain, GetArg("-genproclimit", -1));
// ********************************************************* Step 12: finished // ********************************************************* Step 12: finished

View file

@ -650,11 +650,10 @@ void static BitcoinMiner(CWallet *pwallet)
} }
} }
void GenerateBitcoins(bool fGenerate, CWallet* pwallet) void GenerateBitcoins(bool fGenerate, CWallet* pwallet, int nThreads)
{ {
static boost::thread_group* minerThreads = NULL; static boost::thread_group* minerThreads = NULL;
int nThreads = GetArg("-genproclimit", -1);
if (nThreads < 0) { if (nThreads < 0) {
if (Params().NetworkID() == CChainParams::REGTEST) if (Params().NetworkID() == CChainParams::REGTEST)
nThreads = 1; nThreads = 1;

View file

@ -16,7 +16,7 @@ class CScript;
class CWallet; class CWallet;
/** Run the miner threads */ /** Run the miner threads */
void GenerateBitcoins(bool fGenerate, CWallet* pwallet); void GenerateBitcoins(bool fGenerate, CWallet* pwallet, int nThreads);
/** Generate a new block, without valid proof-of-work */ /** Generate a new block, without valid proof-of-work */
CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn); CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn);
CBlockTemplate* CreateNewBlockWithKey(CReserveKey& reservekey); CBlockTemplate* CreateNewBlockWithKey(CReserveKey& reservekey);

View file

@ -133,6 +133,7 @@ Value setgenerate(const Array& params, bool fHelp)
"\nArguments:\n" "\nArguments:\n"
"1. generate (boolean, required) Set to true to turn on generation, off to turn off.\n" "1. generate (boolean, required) Set to true to turn on generation, off to turn off.\n"
"2. genproclimit (numeric, optional) Set the processor limit for when generation is on. Can be -1 for unlimited.\n" "2. genproclimit (numeric, optional) Set the processor limit for when generation is on. Can be -1 for unlimited.\n"
" Note: in -regtest mode, genproclimit controls how many blocks are generated immediately.\n"
"\nExamples:\n" "\nExamples:\n"
"\nSet the generation on with a limit of one processor\n" "\nSet the generation on with a limit of one processor\n"
+ HelpExampleCli("setgenerate", "true 1") + + HelpExampleCli("setgenerate", "true 1") +
@ -144,21 +145,55 @@ Value setgenerate(const Array& params, bool fHelp)
+ HelpExampleRpc("setgenerate", "true, 1") + HelpExampleRpc("setgenerate", "true, 1")
); );
if (pwalletMain == NULL)
throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Method not found (disabled)");
bool fGenerate = true; bool fGenerate = true;
if (params.size() > 0) if (params.size() > 0)
fGenerate = params[0].get_bool(); fGenerate = params[0].get_bool();
int nGenProcLimit = -1;
if (params.size() > 1) if (params.size() > 1)
{ {
int nGenProcLimit = params[1].get_int(); nGenProcLimit = params[1].get_int();
mapArgs["-genproclimit"] = itostr(nGenProcLimit);
if (nGenProcLimit == 0) if (nGenProcLimit == 0)
fGenerate = false; fGenerate = false;
} }
mapArgs["-gen"] = (fGenerate ? "1" : "0");
assert(pwalletMain != NULL); // -regtest mode: don't return until nGenProcLimit blocks are generated
GenerateBitcoins(fGenerate, pwalletMain); if (fGenerate && Params().NetworkID() == CChainParams::REGTEST)
{
int nHeightStart = 0;
int nHeightEnd = 0;
int nHeight = 0;
int nGenerate = (nGenProcLimit > 0 ? nGenProcLimit : 1);
{ // Don't keep cs_main locked
LOCK(cs_main);
nHeightStart = chainActive.Height();
nHeight = nHeightStart;
nHeightEnd = nHeightStart+nGenerate;
}
int nHeightLast = -1;
while (nHeight < nHeightEnd)
{
if (nHeightLast != nHeight)
{
nHeightLast = nHeight;
GenerateBitcoins(fGenerate, pwalletMain, 1);
}
MilliSleep(1);
{ // Don't keep cs_main locked
LOCK(cs_main);
nHeight = chainActive.Height();
}
}
}
else // Not -regtest: start generate thread, return immediately
{
mapArgs["-gen"] = (fGenerate ? "1" : "0");
GenerateBitcoins(fGenerate, pwalletMain, nGenProcLimit);
}
return Value::null; return Value::null;
} }