Fix some thread-safeness problem when accessing the system message
queue.
diff --git a/windows/message.c b/windows/message.c
index 9a19c72..1f799f1 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -466,11 +466,15 @@
DWORD status = SYSQ_MSG_ACCEPT;
MESSAGEQUEUE *sysMsgQueue = QUEUE_GetSysQueue();
int kbd_msg;
- QMSG *nextqmsg, *qmsg = sysMsgQueue->firstMsg;
+ QMSG *nextqmsg, *qmsg = 0;
/* FIXME: there has to be a better way to do this */
joySendMessages();
+ EnterCriticalSection(&sysMsgQueue->cSection);
+
+ qmsg = sysMsgQueue->firstMsg;
+
/* If the queue is empty, attempt to fill it */
if (!sysMsgQueue->msgCount && THREAD_IsWin16( THREAD_Current() )
&& EVENT_Pending())
@@ -557,6 +561,7 @@
continue;
case SYSQ_MSG_ABANDON:
+ LeaveCriticalSection(&sysMsgQueue->cSection);
return FALSE;
}
@@ -565,8 +570,10 @@
if (HOOK_IsHooked( WH_JOURNALRECORD )) MSG_JournalRecordMsg( msg );
QUEUE_RemoveMsg( sysMsgQueue, qmsg );
}
+ LeaveCriticalSection(&sysMsgQueue->cSection);
return TRUE;
}
+ LeaveCriticalSection(&sysMsgQueue->cSection);
return FALSE;
}