From f60aec8607aa4ef70b4653d201c854b00a538951 Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Thu, 21 Mar 2024 13:03:41 +0100 Subject: 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 --- src/zenutil/zenserverprocess.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) (limited to 'src/zenutil/zenserverprocess.cpp') diff --git a/src/zenutil/zenserverprocess.cpp b/src/zenutil/zenserverprocess.cpp index 3667ad2c6..7725d0af6 100644 --- a/src/zenutil/zenserverprocess.cpp +++ b/src/zenutil/zenserverprocess.cpp @@ -308,7 +308,7 @@ ZenServerState::Sweep() if (Entry.DesiredListenPort) { - if (IsProcessRunning(Entry.Pid) == false) + if (Entry.Pid != 0 && IsProcessRunning(Entry.Pid) == false) { ZEN_DEBUG("Sweep - pid {} not running, reclaiming entry (port {})", Entry.Pid.load(), Entry.DesiredListenPort.load()); @@ -363,18 +363,15 @@ ZenServerState::ZenServerEntry::AddSponsorProcess(uint32_t PidToAdd) { for (std::atomic& PidEntry : SponsorPids) { - if (PidEntry.load(std::memory_order_relaxed) == 0) + if (PidEntry.load(std::memory_order_relaxed) == PidToAdd) { - uint32_t Expected = 0; - if (PidEntry.compare_exchange_strong(Expected, PidToAdd)) - { - // Success! - return true; - } + // Success, the because pid is already in the list + return true; } - else if (PidEntry.load(std::memory_order_relaxed) == PidToAdd) + uint32_t Expected = 0; + if (PidEntry.compare_exchange_strong(Expected, PidToAdd)) { - // Success, the because pid is already in the list + // Success! return true; } } -- cgit v1.2.3