aboutsummaryrefslogtreecommitdiff
path: root/src/zenutil/parallelwork.cpp
diff options
context:
space:
mode:
authorZousar Shaker <[email protected]>2025-08-08 10:44:24 -0600
committerGitHub Enterprise <[email protected]>2025-08-08 10:44:24 -0600
commit4943f66c15e66205edaf0068a73c5d7a3b2f801a (patch)
tree1dff0546e0ae7ae31a8cf0f36771639a4e68d19c /src/zenutil/parallelwork.cpp
parentprecommit (diff)
parent5.6.15 (diff)
downloadzen-4943f66c15e66205edaf0068a73c5d7a3b2f801a.tar.xz
zen-4943f66c15e66205edaf0068a73c5d7a3b2f801a.zip
Merge branch 'main' into zs/put-overwrite-policy
Diffstat (limited to 'src/zenutil/parallelwork.cpp')
-rw-r--r--src/zenutil/parallelwork.cpp42
1 files changed, 30 insertions, 12 deletions
diff --git a/src/zenutil/parallelwork.cpp b/src/zenutil/parallelwork.cpp
index 1edca5050..a571d1d11 100644
--- a/src/zenutil/parallelwork.cpp
+++ b/src/zenutil/parallelwork.cpp
@@ -35,17 +35,19 @@ ParallelWork::~ParallelWork()
m_PendingWork.CountDown();
m_DispatchComplete = true;
}
- m_PendingWork.Wait();
- ptrdiff_t RemainingWork = m_PendingWork.Remaining();
+ const bool WaitSucceeded = m_PendingWork.Wait();
+ const ptrdiff_t RemainingWork = m_PendingWork.Remaining();
+ if (!WaitSucceeded)
+ {
+ ZEN_ERROR("ParallelWork::~ParallelWork(): waiting for latch failed, pending work count at {}", RemainingWork);
+ }
if (RemainingWork != 0)
{
void* Frames[8];
uint32_t FrameCount = GetCallstack(2, 8, Frames);
CallstackFrames* Callstack = CreateCallstack(FrameCount, Frames);
- ZEN_ERROR("ParallelWork destructor waited for outstanding work but pending work count is {} instead of 0\n{}",
- RemainingWork,
- CallstackToString(Callstack, " "));
- FreeCallstack(Callstack);
+ auto _ = MakeGuard([Callstack]() { FreeCallstack(Callstack); });
+ ZEN_WARN("ParallelWork::~ParallelWork(): waited for outstanding work but pending work count is {} instead of 0", RemainingWork);
uint32_t WaitedMs = 0;
while (m_PendingWork.Remaining() > 0 && WaitedMs < 2000)
@@ -53,20 +55,27 @@ ParallelWork::~ParallelWork()
Sleep(50);
WaitedMs += 50;
}
- RemainingWork = m_PendingWork.Remaining();
- if (RemainingWork != 0)
+ ptrdiff_t RemainingWorkAfterSafetyWait = m_PendingWork.Remaining();
+ if (RemainingWorkAfterSafetyWait != 0)
{
- ZEN_WARN("ParallelWork destructor safety wait failed, pending work count at {}", RemainingWork)
+ ZEN_ERROR("ParallelWork::~ParallelWork(): safety wait for {} tasks failed, pending work count at {} after {}\n{}",
+ RemainingWork,
+ RemainingWorkAfterSafetyWait,
+ NiceLatencyNs(WaitedMs * 1000000u),
+ CallstackToString(Callstack, " "))
}
else
{
- ZEN_INFO("ParallelWork destructor safety wait succeeded");
+ ZEN_ERROR("ParallelWork::~ParallelWork(): safety wait for {} tasks completed after {}\n{}",
+ RemainingWork,
+ NiceLatencyNs(WaitedMs * 1000000u),
+ CallstackToString(Callstack, " "));
}
}
}
catch (const std::exception& Ex)
{
- ZEN_ERROR("Exception in ~ParallelWork: {}", Ex.what());
+ ZEN_ERROR("Exception in ParallelWork::~ParallelWork(): {}", Ex.what());
}
}
@@ -103,7 +112,16 @@ ParallelWork::Wait()
m_PendingWork.CountDown();
m_DispatchComplete = true;
- m_PendingWork.Wait();
+ const bool WaitSucceeded = m_PendingWork.Wait();
+ const ptrdiff_t RemainingWork = m_PendingWork.Remaining();
+ if (!WaitSucceeded)
+ {
+ ZEN_ERROR("ParallelWork::Wait(): waiting for latch failed, pending work count at {}", RemainingWork);
+ }
+ else if (RemainingWork != 0)
+ {
+ ZEN_ERROR("ParallelWork::Wait(): pending work count at {} after successful wait for latch", RemainingWork);
+ }
RethrowErrors();
}