- When SendMessageTimeout times out, the CompletionEvent goes out of scope,

so tell the target thread not to signal it
- Replace message queue hardware lock FAST_MUTEX with KMUTEX so it can
  be recursively acquired

svn path=/trunk/; revision=9018
This commit is contained in:
Gé van Geldorp 2004-04-07 21:12:08 +00:00
parent c3cb9779e3
commit 9edefdbda2
2 changed files with 21 additions and 6 deletions

View file

@ -50,7 +50,7 @@ typedef struct _USER_MESSAGE_QUEUE
/* Queue for hardware messages for the queue. */
LIST_ENTRY HardwareMessagesListHead;
/* Lock for the hardware message list. */
FAST_MUTEX HardwareLock;
KMUTEX HardwareLock;
/* Lock for the queue. */
FAST_MUTEX Lock;
/* Pointer to the current WM_MOUSEMOVE message */
@ -189,10 +189,10 @@ LPARAM FASTCALL MsqGetMessageExtraInfo(VOID);
ExReleaseFastMutex(&MsgQueue->Lock)
#define IntLockHardwareMessageQueue(MsgQueue) \
ExAcquireFastMutex(&MsgQueue->HardwareLock)
KeWaitForMutexObject(&MsgQueue->HardwareLock, UserRequest, KernelMode, FALSE, NULL)
#define IntUnLockHardwareMessageQueue(MsgQueue) \
ExReleaseFastMutex(&MsgQueue->HardwareLock)
KeReleaseMutex(&MsgQueue->HardwareLock, FALSE)
/* check the queue status */
#define MsqIsSignaled(MsgQueue) \

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: msgqueue.c,v 1.80 2004/03/31 19:44:34 weiden Exp $
/* $Id: msgqueue.c,v 1.81 2004/04/07 21:12:08 gvg Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -906,6 +906,7 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue,
LRESULT Result;
PUSER_MESSAGE_QUEUE ThreadQueue;
LARGE_INTEGER Timeout;
PLIST_ENTRY Entry;
KeInitializeEvent(&CompletionEvent, NotificationEvent, FALSE);
@ -944,7 +945,21 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue,
WaitStatus = KeWaitForMultipleObjects(2, WaitObjects, WaitAny, UserRequest,
UserMode, FALSE, (uTimeout ? &Timeout : NULL), NULL);
if(WaitStatus == STATUS_TIMEOUT)
{DbgPrint("MsqSendMessage timed out\n");
{
IntLockMessageQueue(MessageQueue);
Entry = MessageQueue->SentMessagesListHead.Flink;
while (Entry != &MessageQueue->SentMessagesListHead)
{
if ((PUSER_SENT_MESSAGE) CONTAINING_RECORD(Entry, USER_SENT_MESSAGE, ListEntry)
== Message)
{
Message->CompletionEvent = NULL;
break;
}
Entry = Entry->Flink;
}
IntUnLockMessageQueue(MessageQueue);
DbgPrint("MsqSendMessage timed out\n");
break;
}
while (MsqDispatchOneSentMessage(ThreadQueue))
@ -1066,7 +1081,7 @@ MsqInitializeMessageQueue(struct _ETHREAD *Thread, PUSER_MESSAGE_QUEUE MessageQu
InitializeListHead(&MessageQueue->PostedMessagesListHead);
InitializeListHead(&MessageQueue->SentMessagesListHead);
InitializeListHead(&MessageQueue->HardwareMessagesListHead);
ExInitializeFastMutex(&MessageQueue->HardwareLock);
KeInitializeMutex(&MessageQueue->HardwareLock, 0);
ExInitializeFastMutex(&MessageQueue->Lock);
MessageQueue->QuitPosted = FALSE;
MessageQueue->QuitExitCode = 0;