diff options
| author | Dan Engelbrecht <[email protected]> | 2024-03-21 13:03:41 +0100 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2024-03-21 13:03:41 +0100 |
| commit | f60aec8607aa4ef70b4653d201c854b00a538951 (patch) | |
| tree | a10a9b168fbc4f1f9a64c52f3126faecf845b795 /src/zenserver/zenserver.cpp | |
| parent | 5.4.2-pre6 (diff) | |
| download | zen-f60aec8607aa4ef70b4653d201c854b00a538951.tar.xz zen-f60aec8607aa4ef70b4653d201c854b00a538951.zip | |
harden attach sponsor process (#14)
- Improvement: Delay exiting due to no sponsor processes by one second to handle race conditions
- Improvement: Safer IsProcessRunning check
- Improvement: make sure we can RequestApplicationExit safely from any thread
Diffstat (limited to 'src/zenserver/zenserver.cpp')
| -rw-r--r-- | src/zenserver/zenserver.cpp | 45 |
1 files changed, 31 insertions, 14 deletions
diff --git a/src/zenserver/zenserver.cpp b/src/zenserver/zenserver.cpp index daec743a0..d1faeb8b6 100644 --- a/src/zenserver/zenserver.cpp +++ b/src/zenserver/zenserver.cpp @@ -693,7 +693,6 @@ ZenServer::Run() if (m_IsPowerCycle) { ZEN_INFO("Power cycle mode enabled -- shutting down"); - RequestExit(0); } @@ -707,10 +706,12 @@ ZenServer::Run() void ZenServer::RequestExit(int ExitCode) { - RequestApplicationExit(ExitCode); - if (m_Http) + if (RequestApplicationExit(ExitCode)) { - m_Http->RequestExit(); + if (m_Http) + { + m_Http->RequestExit(); + } } } @@ -779,7 +780,7 @@ ZenServer::EnsureIoRunner() } void -ZenServer::EnqueueTimer() +ZenServer::EnqueueProcessMonitorTimer() { m_PidCheckTimer.expires_after(std::chrono::seconds(1)); m_PidCheckTimer.async_wait([this](const asio::error_code&) { CheckOwnerPid(); }); @@ -857,11 +858,10 @@ ZenServer::CheckSigInt() EnqueueSigIntTimer(); } -void -ZenServer::CheckOwnerPid() +bool +ZenServer::UpdateProcessMonitor() { // Pick up any new "owner" processes - std::set<uint32_t> AddedPids; for (auto& PidEntry : m_ServerEntry->SponsorPids) @@ -874,21 +874,38 @@ ZenServer::CheckOwnerPid() { m_ProcessMonitor.AddPid(ThisPid); - ZEN_INFO("added process with pid #{} as a sponsor process", ThisPid); + ZEN_INFO("added process with pid {} as a sponsor process", ThisPid); } } } } + return m_ProcessMonitor.IsRunning(); +} - if (m_ProcessMonitor.IsRunning()) +void +ZenServer::CheckOwnerPid() +{ + bool IsRunning = UpdateProcessMonitor(); + + if (IsRunning) { - EnqueueTimer(); + m_FoundNoActiveSponsors = false; + EnqueueProcessMonitorTimer(); } else { - ZEN_INFO(ZEN_APP_NAME " exiting since sponsor processes are all gone"); - - RequestExit(0); + // Delay exit one iteration to avoid race conditions where one process detaches + // and another attaches + if (m_FoundNoActiveSponsors) + { + ZEN_INFO(ZEN_APP_NAME " exiting since sponsor processes are all gone"); + RequestExit(0); + } + else + { + m_FoundNoActiveSponsors = true; + EnqueueProcessMonitorTimer(); + } } } |