Why:
Currently it is hard for a GUI wrapping bitcoind by means of the RPC-server to detect when bitcoin is running but still initialising. This seeks to resolve that.
What does it do:
- Moves RPC server startup to very beginning.
- Adds isinitialized method.
Change made to bitcoin/bitcoin from github
http://pastebin.com/LYtBRXgkdiff --git a/init.cpp b/init.cpp
index 04bdd68..52cf7a1 100644
--- a/init.cpp
+++ b/init.cpp
@@ -115,6 +115,7 @@ bool AppInit(int argc, char* argv[])
} catch (...) {
PrintException(NULL, "AppInit()");
}
+ fInitializationCompleted = true;
if (!fRet)
Shutdown(NULL);
return fRet;
@@ -122,6 +123,9 @@ bool AppInit(int argc, char* argv[])
bool AppInit2(int argc, char* argv[])
{
+ if (GetBoolArg("-server") || fDaemon)
+ CreateThread(ThreadRPCServer, NULL);
+
#ifdef _MSC_VER
// Turn off microsoft heap dump noise
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
@@ -443,9 +447,6 @@ bool AppInit2(int argc, char* argv[])
if (!CreateThread(StartNode, NULL))
wxMessageBox("Error: CreateThread(StartNode) failed", "Bitcoin");
- if (GetBoolArg("-server") || fDaemon)
- CreateThread(ThreadRPCServer, NULL);
-
#if defined(__WXMSW__) && defined(GUI)
if (fFirstRun)
SetStartOnSystemStartup(true);
diff --git a/rpc.cpp b/rpc.cpp
index 69b09bc..72fc9a8 100644
--- a/rpc.cpp
+++ b/rpc.cpp
@@ -28,6 +28,8 @@ void ThreadRPCServer2(void* parg);
typedef Value(*rpcfn_type)(const Array& params, bool fHelp);
extern map<string, rpcfn_type> mapCallTable;
+bool fInitializationCompleted = false;
+
Object JSONRPCError(int code, const string& message)
{
@@ -146,7 +148,6 @@ Value help(const Array& params, bool fHelp)
return strRet;
}
-
Value stop(const Array& params, bool fHelp)
{
if (fHelp || params.size() != 0)
@@ -277,18 +278,22 @@ Value getinfo(const Array& params, bool fHelp)
Object obj;
obj.push_back(Pair("version", (int)VERSION));
- obj.push_back(Pair("balance", (double)GetBalance() / (double)COIN));
- obj.push_back(Pair("blocks", (int)nBestHeight));
- obj.push_back(Pair("connections", (int)vNodes.size()));
- obj.push_back(Pair("proxy", (fUseProxy ? addrProxy.ToStringIPPort() : string())));
- obj.push_back(Pair("generate", (bool)fGenerateBitcoins));
- obj.push_back(Pair("genproclimit", (int)(fLimitProcessors ? nLimitProcessors : -1)));
- obj.push_back(Pair("difficulty", (double)GetDifficulty()));
- obj.push_back(Pair("hashespersec", gethashespersec(params, false)));
- obj.push_back(Pair("testnet", fTestNet));
- obj.push_back(Pair("keypoololdest", (boost::int64_t)GetOldestKeyPoolTime()));
- obj.push_back(Pair("paytxfee", (double)nTransactionFee / (double)COIN));
- obj.push_back(Pair("errors", GetWarnings("statusbar")));
+ obj.push_back(Pair("isinitialized", (bool)fInitializationCompleted));
+ if (fInitializationCompleted)
+ {
+ obj.push_back(Pair("balance", (double)GetBalance() / (double)COIN));
+ obj.push_back(Pair("blocks", (int)nBestHeight));
+ obj.push_back(Pair("connections", (int)vNodes.size()));
+ obj.push_back(Pair("proxy", (fUseProxy ? addrProxy.ToStringIPPort() : string())));
+ obj.push_back(Pair("generate", (bool)fGenerateBitcoins));
+ obj.push_back(Pair("genproclimit", (int)(fLimitProcessors ? nLimitProcessors : -1)));
+ obj.push_back(Pair("difficulty", (double)GetDifficulty()));
+ obj.push_back(Pair("hashespersec", gethashespersec(params, false)));
+ obj.push_back(Pair("testnet", fTestNet));
+ obj.push_back(Pair("keypoololdest", (boost::int64_t)GetOldestKeyPoolTime()));
+ obj.push_back(Pair("paytxfee", (double)nTransactionFee / (double)COIN));
+ obj.push_back(Pair("errors", GetWarnings("statusbar")));
+ }
return obj;
}
@@ -1806,6 +1811,8 @@ void ThreadRPCServer2(void* parg)
if (valMethod.type() != str_type)
throw JSONRPCError(-32600, "Method must be a string");
string strMethod = valMethod.get_str();
+ if (!fInitializationCompleted && strMethod != "help" && strMethod != "getinfo")
+ throw JSONRPCError(-42000, "Still initializing");
if (strMethod != "getwork")
printf("ThreadRPCServer method=%s\n", strMethod.c_str());
diff --git a/rpc.h b/rpc.h
index 48a7b8a..85c3ef3 100644
--- a/rpc.h
+++ b/rpc.h
@@ -4,3 +4,4 @@
void ThreadRPCServer(void* parg);
int CommandLineRPC(int argc, char *argv[]);
+extern bool fInitializationCompleted;
PS plz add .patch to allowed attachments
PSS upload folder is full! i cannot upload the patch file.