- 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
This commit is contained in:
Hermès Bélusca-Maïto 2013-12-07 00:01:24 +00:00
parent 0f83939238
commit 9b2dbb0b62

View file

@ -31,10 +31,16 @@ static HANDLE InputThread = NULL;
static BOOLEAN KeyboardQueuePush(BYTE ScanCode) static BOOLEAN KeyboardQueuePush(BYTE ScanCode)
{ {
/* Check if the keyboard queue is full */ BOOLEAN Result = TRUE;
WaitForSingleObject(QueueMutex, INFINITE); 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 */ /* Insert the value in the queue */
KeyboardQueue[KeyboardQueueEnd] = ScanCode; KeyboardQueue[KeyboardQueueEnd] = ScanCode;
@ -44,19 +50,24 @@ static BOOLEAN KeyboardQueuePush(BYTE ScanCode)
/* Since we inserted a value, it's not empty anymore */ /* Since we inserted a value, it's not empty anymore */
KeyboardQueueEmpty = FALSE; KeyboardQueueEmpty = FALSE;
Done:
ReleaseMutex(QueueMutex); ReleaseMutex(QueueMutex);
return TRUE; return Result;
} }
static BOOLEAN KeyboardQueuePop(BYTE *ScanCode) static BOOLEAN KeyboardQueuePop(BYTE *ScanCode)
{ {
BOOLEAN Result = TRUE; 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; if (KeyboardQueueEmpty) return FALSE;
WaitForSingleObject(QueueMutex, INFINITE); WaitForSingleObject(QueueMutex, INFINITE);
/*
* Recheck whether keyboard queue is not empty (it may
* have been changed after having grabbed the mutex).
*/
if (KeyboardQueueEmpty) if (KeyboardQueueEmpty)
{ {
Result = FALSE; Result = FALSE;