diff options
| author | Zousar Shaker <[email protected]> | 2025-08-08 10:44:24 -0600 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2025-08-08 10:44:24 -0600 |
| commit | 4943f66c15e66205edaf0068a73c5d7a3b2f801a (patch) | |
| tree | 1dff0546e0ae7ae31a8cf0f36771639a4e68d19c /src/zenutil/parallelwork.cpp | |
| parent | precommit (diff) | |
| parent | 5.6.15 (diff) | |
| download | zen-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.cpp | 42 |
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(); } |