|
|
@ -33,7 +33,7 @@ static bool fRPCInWarmup = true; |
|
|
|
static std::string rpcWarmupStatus("RPC server started"); |
|
|
|
static std::string rpcWarmupStatus("RPC server started"); |
|
|
|
static CCriticalSection cs_rpcWarmup; |
|
|
|
static CCriticalSection cs_rpcWarmup; |
|
|
|
/* Timer-creating functions */ |
|
|
|
/* Timer-creating functions */ |
|
|
|
static std::vector<RPCTimerInterface*> timerInterfaces; |
|
|
|
static RPCTimerInterface* timerInterface = NULL; |
|
|
|
/* Map of name to timer.
|
|
|
|
/* Map of name to timer.
|
|
|
|
* @note Can be changed to std::unique_ptr when C++11 */ |
|
|
|
* @note Can be changed to std::unique_ptr when C++11 */ |
|
|
|
static std::map<std::string, boost::shared_ptr<RPCTimerBase> > deadlineTimers; |
|
|
|
static std::map<std::string, boost::shared_ptr<RPCTimerBase> > deadlineTimers; |
|
|
@ -546,24 +546,28 @@ std::string HelpExampleRpc(const std::string& methodname, const std::string& arg |
|
|
|
"\"method\": \"" + methodname + "\", \"params\": [" + args + "] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/\n"; |
|
|
|
"\"method\": \"" + methodname + "\", \"params\": [" + args + "] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/\n"; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void RPCRegisterTimerInterface(RPCTimerInterface *iface) |
|
|
|
void RPCSetTimerInterfaceIfUnset(RPCTimerInterface *iface) |
|
|
|
{ |
|
|
|
{ |
|
|
|
timerInterfaces.push_back(iface); |
|
|
|
if (!timerInterface) |
|
|
|
|
|
|
|
timerInterface = iface; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void RPCUnregisterTimerInterface(RPCTimerInterface *iface) |
|
|
|
void RPCSetTimerInterface(RPCTimerInterface *iface) |
|
|
|
{ |
|
|
|
{ |
|
|
|
std::vector<RPCTimerInterface*>::iterator i = std::find(timerInterfaces.begin(), timerInterfaces.end(), iface); |
|
|
|
timerInterface = iface; |
|
|
|
assert(i != timerInterfaces.end()); |
|
|
|
} |
|
|
|
timerInterfaces.erase(i); |
|
|
|
|
|
|
|
|
|
|
|
void RPCUnsetTimerInterface(RPCTimerInterface *iface) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (timerInterface == iface) |
|
|
|
|
|
|
|
timerInterface = NULL; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void RPCRunLater(const std::string& name, boost::function<void(void)> func, int64_t nSeconds) |
|
|
|
void RPCRunLater(const std::string& name, boost::function<void(void)> func, int64_t nSeconds) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (timerInterfaces.empty()) |
|
|
|
if (!timerInterface) |
|
|
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "No timer handler registered for RPC"); |
|
|
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "No timer handler registered for RPC"); |
|
|
|
deadlineTimers.erase(name); |
|
|
|
deadlineTimers.erase(name); |
|
|
|
RPCTimerInterface* timerInterface = timerInterfaces.back(); |
|
|
|
|
|
|
|
LogPrint("rpc", "queue run of timer %s in %i seconds (using %s)\n", name, nSeconds, timerInterface->Name()); |
|
|
|
LogPrint("rpc", "queue run of timer %s in %i seconds (using %s)\n", name, nSeconds, timerInterface->Name()); |
|
|
|
deadlineTimers.insert(std::make_pair(name, boost::shared_ptr<RPCTimerBase>(timerInterface->NewTimer(func, nSeconds*1000)))); |
|
|
|
deadlineTimers.insert(std::make_pair(name, boost::shared_ptr<RPCTimerBase>(timerInterface->NewTimer(func, nSeconds*1000)))); |
|
|
|
} |
|
|
|
} |
|
|
|