[NTVDM]
authorAleksandar Andrejevic <aandrejevic@reactos.org>
Fri, 6 Dec 2013 04:51:47 +0000 (04:51 +0000)
committerAleksandar Andrejevic <aandrejevic@reactos.org>
Fri, 6 Dec 2013 04:51:47 +0000 (04:51 +0000)
Fix race conditions.

svn path=/branches/ntvdm/; revision=61230

subsystems/ntvdm/ps2.c

index d2f9997..07c3fc7 100644 (file)
@@ -32,10 +32,10 @@ static HANDLE InputThread = NULL;
 static BOOLEAN KeyboardQueuePush(BYTE ScanCode)
 {
     /* Check if the keyboard queue is full */
-    if (!KeyboardQueueEmpty && (KeyboardQueueStart == KeyboardQueueEnd)) return FALSE;
-
     WaitForSingleObject(QueueMutex, INFINITE);
 
+    if (!KeyboardQueueEmpty && (KeyboardQueueStart == KeyboardQueueEnd)) return FALSE;
+
     /* Insert the value in the queue */
     KeyboardQueue[KeyboardQueueEnd] = ScanCode;
     KeyboardQueueEnd++;
@@ -50,11 +50,19 @@ static BOOLEAN KeyboardQueuePush(BYTE ScanCode)
 
 static BOOLEAN KeyboardQueuePop(BYTE *ScanCode)
 {
+    BOOLEAN Result = TRUE;
+
     /* Make sure the keyboard queue is not empty */
     if (KeyboardQueueEmpty) return FALSE;
 
     WaitForSingleObject(QueueMutex, INFINITE);
 
+    if (KeyboardQueueEmpty)
+    {
+        Result = FALSE;
+        goto Done;
+    }
+
     /* Get the scan code */
     *ScanCode = KeyboardQueue[KeyboardQueueStart];
 
@@ -68,8 +76,9 @@ static BOOLEAN KeyboardQueuePop(BYTE *ScanCode)
         KeyboardQueueEmpty = TRUE;
     }
 
+Done:
     ReleaseMutex(QueueMutex);
-    return TRUE;
+    return Result;
 }
 
 /* PUBLIC FUNCTIONS ***********************************************************/