|
15 | 15 | #include <boost/algorithm/string/split.hpp>
|
16 | 16 | #include <boost/signals2/signal.hpp>
|
17 | 17 |
|
| 18 | +#include <cassert> |
18 | 19 | #include <memory> // for unique_ptr
|
| 20 | +#include <mutex> |
19 | 21 | #include <unordered_map>
|
20 | 22 |
|
21 | 23 | static RecursiveMutex cs_rpcWarmup;
|
22 | 24 | static std::atomic<bool> g_rpc_running{false};
|
| 25 | +static std::once_flag g_rpc_interrupt_flag; |
| 26 | +static std::once_flag g_rpc_stop_flag; |
23 | 27 | static bool fRPCInWarmup GUARDED_BY(cs_rpcWarmup) = true;
|
24 | 28 | static std::string rpcWarmupStatus GUARDED_BY(cs_rpcWarmup) = "RPC server started";
|
25 | 29 | /* Timer-creating functions */
|
@@ -291,17 +295,24 @@ void StartRPC()
|
291 | 295 |
|
292 | 296 | void InterruptRPC()
|
293 | 297 | {
|
294 |
| - LogPrint(BCLog::RPC, "Interrupting RPC\n"); |
295 |
| - // Interrupt e.g. running longpolls |
296 |
| - g_rpc_running = false; |
| 298 | + // This function could be called twice if the GUI has been started with -server=1. |
| 299 | + std::call_once(g_rpc_interrupt_flag, []() { |
| 300 | + LogPrint(BCLog::RPC, "Interrupting RPC\n"); |
| 301 | + // Interrupt e.g. running longpolls |
| 302 | + g_rpc_running = false; |
| 303 | + }); |
297 | 304 | }
|
298 | 305 |
|
299 | 306 | void StopRPC()
|
300 | 307 | {
|
301 |
| - LogPrint(BCLog::RPC, "Stopping RPC\n"); |
302 |
| - WITH_LOCK(g_deadline_timers_mutex, deadlineTimers.clear()); |
303 |
| - DeleteAuthCookie(); |
304 |
| - g_rpcSignals.Stopped(); |
| 308 | + // This function could be called twice if the GUI has been started with -server=1. |
| 309 | + assert(!g_rpc_running); |
| 310 | + std::call_once(g_rpc_stop_flag, []() { |
| 311 | + LogPrint(BCLog::RPC, "Stopping RPC\n"); |
| 312 | + WITH_LOCK(g_deadline_timers_mutex, deadlineTimers.clear()); |
| 313 | + DeleteAuthCookie(); |
| 314 | + g_rpcSignals.Stopped(); |
| 315 | + }); |
305 | 316 | }
|
306 | 317 |
|
307 | 318 | bool IsRPCRunning()
|
|
0 commit comments