Skip to content

Commit 3603c7c

Browse files
Implmented #1021 detection
1 parent 38b9c5a commit 3603c7c

File tree

2 files changed

+32
-6
lines changed

2 files changed

+32
-6
lines changed

tic/dll/src/ItemLocks.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "Unit.h"
2525

2626
#include "OperationContext.h"
27+
SizeT GetNumberOfActivatedOrRunningOperations();
2728

2829
//----------------------------------------------------------------------
2930
// impl details
@@ -96,8 +97,19 @@ namespace treeitem_production_task
9697
}
9798
}
9899

100+
retry:
101+
bool noMoreOperationsRunning = (GetNumberOfActivatedOrRunningOperations() == 0);
102+
99103
leveled_critical_section::unique_lock lock(cs_lockCounterUpdate);
100-
cv_lockrelease.wait(lock.m_BaseLock, [self]() {return self->m_ItemCount >= 0; });
104+
if (self->m_ItemCount < 0)
105+
{
106+
if (noMoreOperationsRunning)
107+
throwErrorD("DeadLock", "lock_shared waiting for ItemCount to be unlocked but no active or running operations");
108+
109+
cv_lockrelease.wait_for(lock.m_BaseLock, std::chrono::milliseconds(500));
110+
if (self->m_ItemCount < 0)
111+
goto retry;
112+
}
101113

102114
assert(self->m_Producer.expired()); // was cleaned up by producers task
103115
assert(self->m_ItemCount >= 0);

tic/dll/src/OperationContext.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -519,20 +519,34 @@ static UInt32 sd_OcCount;
519519
static std::set<OperationContext*> sd_OC;
520520
static std::map<OperationContext*, phase_number> sd_RunningOC;
521521

522-
// Verify that administrative counters agree.
523-
void CheckNumberOfRunningOCConsistency()
522+
SizeT getNumberOfActivatedOrRunningOperations()
524523
{
525-
MG_CHECK(!cs_ThreadMessing.try_lock());
526-
527524
SizeT numberOfRunningOCs = 0;
528525
for (const auto& levelNumberPair : s_NrActivatedOrRunningOperations)
529526
numberOfRunningOCs += levelNumberPair.second;
530527
MG_CHECK(numberOfRunningOCs == sd_RunningOC.size());
531528

529+
return numberOfRunningOCs;
530+
}
531+
532+
SizeT GetNumberOfActivatedOrRunningOperations()
533+
{
534+
leveled_critical_section::scoped_lock lockToAvoidHasMainThreadTasksToBeMissed(cs_ThreadMessing);
535+
536+
return getNumberOfActivatedOrRunningOperations();
537+
}
538+
539+
// Verify that administrative counters agree.
540+
void CheckNumberOfRunningOCConsistency()
541+
{
542+
MG_CHECK(!cs_ThreadMessing.try_lock());
543+
544+
SizeT numberOfRunningOCs = getNumberOfActivatedOrRunningOperations();
545+
532546
std::map<phase_number, RunningOperationsCounter> recount;
533547
for (const auto& runningPair : sd_RunningOC)
534548
{
535-
MG_CHECK(runningPair.first->m_PhaseNumber == runningPair.second);
549+
MG_CHECK(runningPair.first->m_PhaseNumber == runningPair.second);
536550
++recount[runningPair.second];
537551
}
538552
for (const auto& recountPair : recount)

0 commit comments

Comments
 (0)