message: rpc: Track active commands
diff: @@ -32,6 +32,35 @@ static RPCTimerInterface* timerInterface = nullptr;
  /* Map of name to timer. */
  static std::map<std::string, std::unique_ptr<RPCTimerBase> > deadlineTimers;
  +struct RPCCommandExecutionInfo
  +{
  + std::string method;
  + int64_t start;
  +};
  +
  +struct RPCServerInfo
  +{
  + Mutex mutex;
  + std::list<RPCCommandExecutionInfo> active_commands GUARDED_BY(mutex);
  +};
  +
  +static RPCServerInfo g_rpc_server_info;
  +
  +struct RPCCommandExecution
  +{
  + std::list<RPCCommandExecutionInfo>::iterator it;
  + explicit RPCCommandExecution(const std::string& method)
  + {
  + LOCK(g_rpc_server_info.mutex);
  + it = g_rpc_server_info.active_commands.insert(g_rpc_server_info.active_commands.cend(), {method, GetTimeMicros()});
  + }
  + ~RPCCommandExecution()
  + {
  + LOCK(g_rpc_server_info.mutex);
  + g_rpc_server_info.active_commands.erase(it);
  + }
  +};
  +
  static struct CRPCSignals
  {
  boost::signals2::signal<void ()> Started;
  @@ -485,6 +514,7 @@ UniValue CRPCTable::execute(const JSONRPCRequest &request) const
  try
  {
  + RPCCommandExecution execution(request.strMethod);
  // Execute, convert arguments to array if necessary
  if (request.params.isObject()) {
  return pcmd->actor(transformNamedArguments(request, pcmd->argNames));
  