aboutsummaryrefslogtreecommitdiff
path: root/src/zenutil/parallelwork.cpp
diff options
context:
space:
mode:
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();
}