Module: wine Branch: master Commit: b33c5f163aa3d3d86502eac769600e3c98fb57ce URL: http://source.winehq.org/git/wine.git/?a=commit;h=b33c5f163aa3d3d86502eac769...
Author: Alexandre Julliard julliard@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 */