Fix edge case with video-frame sync where it may never wake up the display thread

This commit is contained in:
Jeffrey Pfau 2014-10-15 04:51:19 -07:00
parent 70f94db208
commit 0d1b323e22
1 changed files with 6 additions and 4 deletions

View File

@ -520,10 +520,12 @@ void GBASyncPostFrame(struct GBASync* sync) {
++sync->videoFramePending; ++sync->videoFramePending;
--sync->videoFrameSkip; --sync->videoFrameSkip;
if (sync->videoFrameSkip < 0) { if (sync->videoFrameSkip < 0) {
do {
ConditionWake(&sync->videoFrameAvailableCond); ConditionWake(&sync->videoFrameAvailableCond);
while (sync->videoFrameWait && sync->videoFramePending) { if (sync->videoFrameWait) {
ConditionWait(&sync->videoFrameRequiredCond, &sync->videoFrameMutex); ConditionWait(&sync->videoFrameRequiredCond, &sync->videoFrameMutex);
} }
} while (sync->videoFrameWait && sync->videoFramePending);
} }
MutexUnlock(&sync->videoFrameMutex); MutexUnlock(&sync->videoFrameMutex);