Alexandre Julliard : user32: Add a WoW wrapper for message waiting to allow releasing the Win16 lock in the 16-bit code .
Alexandre Julliard
julliard at winehq.org
Thu Dec 24 10:27:16 CST 2009
Module: wine
Branch: master
Commit: b33c5f163aa3d3d86502eac769600e3c98fb57ce
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b33c5f163aa3d3d86502eac769600e3c98fb57ce
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Dec 24 12:02:10 2009 +0100
user32: Add a WoW wrapper for message waiting to allow releasing the Win16 lock in the 16-bit code.
---
dlls/user32/controls.h | 2 ++
dlls/user32/message.c | 21 ++++-----------------
dlls/user32/msg16.c | 15 +++++++++++++++
dlls/user32/winproc.c | 7 +++++++
4 files changed, 28 insertions(+), 17 deletions(-)
diff --git a/dlls/user32/controls.h b/dlls/user32/controls.h
index e8c7bdb..f4d814b 100644
--- a/dlls/user32/controls.h
+++ b/dlls/user32/controls.h
@@ -96,6 +96,7 @@ struct wow_handlers16
LRESULT (*mdiclient_proc)(HWND,UINT,WPARAM,LPARAM,BOOL);
LRESULT (*scrollbar_proc)(HWND,UINT,WPARAM,LPARAM,BOOL);
LRESULT (*static_proc)(HWND,UINT,WPARAM,LPARAM,BOOL);
+ DWORD (*wait_message)(DWORD,const HANDLE*,DWORD,DWORD,DWORD);
HWND (*create_window)(CREATESTRUCTW*,LPCWSTR,HINSTANCE,BOOL);
LRESULT (*call_window_proc)(HWND,UINT,WPARAM,LPARAM,LRESULT*,void*);
LRESULT (*call_dialog_proc)(HWND,UINT,WPARAM,LPARAM,LRESULT*,void*);
@@ -114,6 +115,7 @@ struct wow_handlers32
LRESULT (*mdiclient_proc)(HWND,UINT,WPARAM,LPARAM,BOOL);
LRESULT (*scrollbar_proc)(HWND,UINT,WPARAM,LPARAM,BOOL);
LRESULT (*static_proc)(HWND,UINT,WPARAM,LPARAM,BOOL);
+ DWORD (*wait_message)(DWORD,const HANDLE*,DWORD,DWORD,DWORD);
HWND (*create_window)(CREATESTRUCTW*,LPCWSTR,HINSTANCE,BOOL);
HWND (*get_win_handle)(HWND);
WNDPROC (*alloc_winproc)(WNDPROC,BOOL);
diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index d6fd5af..48c8068 100644
--- a/dlls/user32/message.c
+++ b/dlls/user32/message.c
@@ -2266,7 +2266,6 @@ static void wait_message_reply( UINT flags )
for (;;)
{
unsigned int wake_bits = 0;
- DWORD dwlc, res;
SERVER_START_REQ( set_queue_mask )
{
@@ -2286,12 +2285,7 @@ static void wait_message_reply( UINT flags )
continue;
}
- /* now wait for it */
-
- ReleaseThunkLock( &dwlc );
- res = USER_Driver->pMsgWaitForMultipleObjectsEx( 1, &server_queue,
- INFINITE, QS_SENDMESSAGE, 0 );
- if (dwlc) RestoreThunkLock( dwlc );
+ wow_handlers.wait_message( 1, &server_queue, INFINITE, QS_SENDMESSAGE, 0 );
}
}
@@ -2955,11 +2949,7 @@ BOOL WINAPI GetMessageW( MSG *msg, HWND hwnd, UINT first, UINT last )
while (!peek_message( msg, hwnd, first, last, PM_REMOVE | (mask << 16), mask ))
{
- DWORD dwlc;
-
- ReleaseThunkLock( &dwlc );
- USER_Driver->pMsgWaitForMultipleObjectsEx( 1, &server_queue, INFINITE, mask, 0 );
- if (dwlc) RestoreThunkLock( dwlc );
+ wow_handlers.wait_message( 1, &server_queue, INFINITE, mask, 0 );
}
return (msg->message != WM_QUIT);
@@ -3269,7 +3259,7 @@ DWORD WINAPI MsgWaitForMultipleObjectsEx( DWORD count, CONST HANDLE *pHandles,
DWORD timeout, DWORD mask, DWORD flags )
{
HANDLE handles[MAXIMUM_WAIT_OBJECTS];
- DWORD i, ret, lock;
+ DWORD i;
if (count > MAXIMUM_WAIT_OBJECTS-1)
{
@@ -3291,10 +3281,7 @@ DWORD WINAPI MsgWaitForMultipleObjectsEx( DWORD count, CONST HANDLE *pHandles,
for (i = 0; i < count; i++) handles[i] = pHandles[i];
handles[count] = get_server_queue_handle();
- ReleaseThunkLock( &lock );
- ret = USER_Driver->pMsgWaitForMultipleObjectsEx( count+1, handles, timeout, mask, flags );
- if (lock) RestoreThunkLock( lock );
- return ret;
+ return wow_handlers.wait_message( count+1, handles, timeout, mask, flags );
}
diff --git a/dlls/user32/msg16.c b/dlls/user32/msg16.c
index cbaab4b..27a94c5 100644
--- a/dlls/user32/msg16.c
+++ b/dlls/user32/msg16.c
@@ -2569,6 +2569,20 @@ static LRESULT static_proc16( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,
/***********************************************************************
+ * wait_message16
+ */
+static DWORD wait_message16( DWORD count, CONST HANDLE *handles, DWORD timeout, DWORD mask, DWORD flags )
+{
+ DWORD lock, ret;
+
+ ReleaseThunkLock( &lock );
+ ret = wow_handlers32.wait_message( count, handles, timeout, mask, flags );
+ RestoreThunkLock( lock );
+ return ret;
+}
+
+
+/***********************************************************************
* create_window16
*/
HWND create_window16( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE instance, BOOL unicode )
@@ -2619,6 +2633,7 @@ void register_wow_handlers(void)
mdiclient_proc16,
scrollbar_proc16,
static_proc16,
+ wait_message16,
create_window16,
call_window_proc_Ato16,
call_dialog_proc_Ato16,
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c
index b84abb5..c73a40e 100644
--- a/dlls/user32/winproc.c
+++ b/dlls/user32/winproc.c
@@ -1121,6 +1121,11 @@ static LRESULT WINAPI StaticWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM
return wow_handlers.static_proc( hwnd, msg, wParam, lParam, TRUE );
}
+static DWORD wait_message( DWORD count, CONST HANDLE *handles, DWORD timeout, DWORD mask, DWORD flags )
+{
+ return USER_Driver->pMsgWaitForMultipleObjectsEx( count, handles, timeout, mask, flags );
+}
+
static HICON alloc_icon_handle( unsigned int size )
{
struct user_object *obj = HeapAlloc( GetProcessHeap(), 0, sizeof(*obj) + size );
@@ -1167,6 +1172,7 @@ void WINAPI UserRegisterWowHandlers( const struct wow_handlers16 *new, struct wo
orig->mdiclient_proc = MDIClientWndProc_common;
orig->scrollbar_proc = ScrollBarWndProc_common;
orig->static_proc = StaticWndProc_common;
+ orig->wait_message = wait_message;
orig->create_window = WIN_CreateWindowEx;
orig->get_win_handle = WIN_GetFullHandle;
orig->alloc_winproc = WINPROC_AllocProc;
@@ -1185,6 +1191,7 @@ struct wow_handlers16 wow_handlers =
MDIClientWndProc_common,
ScrollBarWndProc_common,
StaticWndProc_common,
+ wait_message,
WIN_CreateWindowEx,
NULL, /* call_window_proc */
NULL, /* call_dialog_proc */
More information about the wine-cvs
mailing list