From 9b2dbb0b629b30f953a31080fe2a09049fa88035 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sat, 7 Dec 2013 00:01:24 +0000 Subject: [PATCH] [NTVDM] - Last race condition fix (see revision 61230). - Add a comment why we do twice the same emptiness check (one before holding the mutex and one just after). svn path=/branches/ntvdm/; revision=61239 --- subsystems/ntvdm/ps2.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/subsystems/ntvdm/ps2.c b/subsystems/ntvdm/ps2.c index 07c3fc71c29..9fb6bf6e206 100644 --- a/subsystems/ntvdm/ps2.c +++ b/subsystems/ntvdm/ps2.c @@ -31,10 +31,16 @@ static HANDLE InputThread = NULL; static BOOLEAN KeyboardQueuePush(BYTE ScanCode) { - /* Check if the keyboard queue is full */ + BOOLEAN Result = TRUE; + WaitForSingleObject(QueueMutex, INFINITE); - if (!KeyboardQueueEmpty && (KeyboardQueueStart == KeyboardQueueEnd)) return FALSE; + /* Check if the keyboard queue is full */ + if (!KeyboardQueueEmpty && (KeyboardQueueStart == KeyboardQueueEnd)) + { + Result = FALSE; + goto Done; + } /* Insert the value in the queue */ KeyboardQueue[KeyboardQueueEnd] = ScanCode; @@ -44,19 +50,24 @@ static BOOLEAN KeyboardQueuePush(BYTE ScanCode) /* Since we inserted a value, it's not empty anymore */ KeyboardQueueEmpty = FALSE; +Done: ReleaseMutex(QueueMutex); - return TRUE; + return Result; } static BOOLEAN KeyboardQueuePop(BYTE *ScanCode) { BOOLEAN Result = TRUE; - /* Make sure the keyboard queue is not empty */ + /* Make sure the keyboard queue is not empty (fast check) */ if (KeyboardQueueEmpty) return FALSE; WaitForSingleObject(QueueMutex, INFINITE); + /* + * Recheck whether keyboard queue is not empty (it may + * have been changed after having grabbed the mutex). + */ if (KeyboardQueueEmpty) { Result = FALSE;