Always call wait() at least once even if timeout is 0 to prevent deadlocks
This commit is contained in:
parent
b85b9125ea
commit
48069f1a3b
|
@ -66,11 +66,15 @@ CondVarBase::wait(Stopwatch& timer, double timeout) const
|
||||||
double remain = timeout-timer.getTime();
|
double remain = timeout-timer.getTime();
|
||||||
// Some ARCH wait()s return prematurely, retry until really timed out
|
// Some ARCH wait()s return prematurely, retry until really timed out
|
||||||
// In particular, ArchMultithreadPosix::waitCondVar() returns every 100ms
|
// In particular, ArchMultithreadPosix::waitCondVar() returns every 100ms
|
||||||
while (remain >= 0.0) {
|
do {
|
||||||
|
// Always call wait at least once, even if remain is 0, to give
|
||||||
|
// other thread a chance to grab the mutex to avoid deadlocks on
|
||||||
|
// busy waiting.
|
||||||
|
if (remain<0.0) remain=0.0;
|
||||||
if (wait(remain))
|
if (wait(remain))
|
||||||
return true;
|
return true;
|
||||||
remain = timeout - timer.getTime();
|
remain = timeout - timer.getTime();
|
||||||
}
|
} while (remain >= 0.0);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue