- Made the message queue access to be thread safe. (Using two new
functions to access the message queue, QUEUE_Lock(), QUEUE_Unlock()
instead of GlobalLock16()).
- Fixed QUEUE_DumpQueue (used by "info queue <handle>" with the
wine-debugger).
diff --git a/windows/hook.c b/windows/hook.c
index 5aac94e..c4336cc 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -827,9 +827,11 @@
MESSAGEQUEUE *queue;
HANDLE16 hook = 0;
- if ((queue = (MESSAGEQUEUE *)GlobalLock16( hQueue )) != NULL)
+ if ((queue = (MESSAGEQUEUE *)QUEUE_Lock( hQueue )) != NULL)
hook = queue->hooks[id - WH_MINHOOK];
if (!hook) hook = HOOK_systemHooks[id - WH_MINHOOK];
+
+ QUEUE_Unlock( queue );
return hook;
}
@@ -878,9 +880,10 @@
if (hQueue)
{
- MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock16( hQueue );
+ MESSAGEQUEUE *queue = (MESSAGEQUEUE *)QUEUE_Lock( hQueue );
data->next = queue->hooks[id - WH_MINHOOK];
queue->hooks[id - WH_MINHOOK] = handle;
+ QUEUE_Unlock( queue );
}
else
{
@@ -921,9 +924,10 @@
if (data->ownerQueue)
{
- MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock16( data->ownerQueue );
+ MESSAGEQUEUE *queue = (MESSAGEQUEUE *)QUEUE_Lock( data->ownerQueue );
if (!queue) return FALSE;
prevHook = &queue->hooks[data->id - WH_MINHOOK];
+ QUEUE_Unlock( queue );
}
else prevHook = &HOOK_systemHooks[data->id - WH_MINHOOK];
@@ -979,7 +983,7 @@
/* Now call it */
- if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetFastQueue() ))) return 0;
+ if (!(queue = (MESSAGEQUEUE *)QUEUE_Lock( GetFastQueue() ))) return 0;
prevHook = queue->hCurHook;
queue->hCurHook = hook;
data->flags |= HOOK_INUSE;
@@ -994,6 +998,8 @@
data->flags &= ~HOOK_INUSE;
queue->hCurHook = prevHook;
+ QUEUE_Unlock( queue );
+
if (UnMapFunc)
UnMapFunc( data->id, code, wParamOrig, lParamOrig, wParam, lParam );
@@ -1089,7 +1095,7 @@
{
MESSAGEQUEUE *queue;
- if ((queue = (MESSAGEQUEUE *)GlobalLock16( hQueue )) != NULL)
+ if ((queue = (MESSAGEQUEUE *)QUEUE_Lock( hQueue )) != NULL)
{
HOOKDATA* data;
HHOOK hook;
@@ -1106,6 +1112,8 @@
} else break;
}
}
+
+ QUEUE_Unlock( queue );
}
}
@@ -1329,9 +1337,12 @@
/* Note: the *hhook parameter is never used, since we rely on the
* current hook value from the task queue to find the next hook. */
MESSAGEQUEUE *queue;
+ LRESULT ret;
- if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetFastQueue() ))) return 0;
- return CallNextHookEx16( queue->hCurHook, code, wParam, lParam );
+ if (!(queue = (MESSAGEQUEUE *)QUEUE_Lock( GetFastQueue() ))) return 0;
+ ret = CallNextHookEx16( queue->hCurHook, code, wParam, lParam );
+ QUEUE_Unlock( queue );
+ return ret;
}