Module: wine Branch: master Commit: b04585164881de5f05d3897eb61005ba43d0b8a2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b04585164881de5f05d3897eb6...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Apr 10 16:29:18 2014 +0200
user32: Cache the server queue mask on the client side and reset them when they have changed.
---
dlls/user32/message.c | 63 +++++++++++++++++++++++++++++++++----------- dlls/user32/user_private.h | 4 ++- 2 files changed, 51 insertions(+), 16 deletions(-)
diff --git a/dlls/user32/message.c b/dlls/user32/message.c index e5dfa3e..1e93c8d 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -2778,6 +2778,11 @@ static BOOL peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags if (res) { HeapFree( GetProcessHeap(), 0, buffer ); + if (res == STATUS_PENDING) + { + thread_info->wake_mask = changed_mask & (QS_SENDMESSAGE | QS_SMRESULT); + thread_info->changed_mask = changed_mask; + } if (res != STATUS_BUFFER_OVERFLOW) return FALSE; if (!(buffer = HeapAlloc( GetProcessHeap(), 0, buffer_size ))) return FALSE; continue; @@ -3001,6 +3006,7 @@ static HANDLE get_server_queue_handle(void) */ static void wait_message_reply( UINT flags ) { + struct user_thread_info *thread_info = get_user_thread_info(); HANDLE server_queue = get_server_queue_handle();
for (;;) @@ -3017,6 +3023,8 @@ static void wait_message_reply( UINT flags ) } SERVER_END_REQ;
+ thread_info->wake_mask = thread_info->changed_mask = 0; + if (wake_bits & QS_SMRESULT) return; /* got a result */ if (wake_bits & QS_SENDMESSAGE) { @@ -3029,6 +3037,43 @@ static void wait_message_reply( UINT flags ) } }
+ +/*********************************************************************** + * wait_objects + * + * Wait for multiple objects including the server queue, with specific queue masks. + */ +static DWORD wait_objects( DWORD count, const HANDLE *handles, DWORD timeout, + DWORD wake_mask, DWORD changed_mask, DWORD flags ) +{ + struct user_thread_info *thread_info = get_user_thread_info(); + DWORD ret; + + assert( count ); /* we must have at least the server queue */ + + flush_window_surfaces( TRUE ); + + if (thread_info->wake_mask != wake_mask || thread_info->changed_mask != changed_mask) + { + SERVER_START_REQ( set_queue_mask ) + { + req->wake_mask = wake_mask; + req->changed_mask = changed_mask; + req->skip_wait = 0; + wine_server_call( req ); + } + SERVER_END_REQ; + thread_info->wake_mask = wake_mask; + thread_info->changed_mask = changed_mask; + } + + ret = wow_handlers.wait_message( count, handles, timeout, changed_mask, flags ); + + if (ret != WAIT_TIMEOUT) thread_info->wake_mask = thread_info->changed_mask = 0; + return ret; +} + + /*********************************************************************** * put_message_in_queue * @@ -3771,8 +3816,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetMessageW( MSG *msg, HWND hwnd, UINT first, UINT
while (!peek_message( msg, hwnd, first, last, PM_REMOVE | (mask << 16), mask )) { - flush_window_surfaces( TRUE ); - wow_handlers.wait_message( 1, &server_queue, INFINITE, mask, 0 ); + wait_objects( 1, &server_queue, INFINITE, mask & (QS_SENDMESSAGE | QS_SMRESULT), mask, 0 ); } check_for_driver_events( msg->message );
@@ -4093,23 +4137,12 @@ DWORD WINAPI MsgWaitForMultipleObjectsEx( DWORD count, const HANDLE *pHandles, return WAIT_FAILED; }
- flush_window_surfaces( TRUE ); - - /* set the queue mask */ - SERVER_START_REQ( set_queue_mask ) - { - req->wake_mask = (flags & MWMO_INPUTAVAILABLE) ? mask : 0; - req->changed_mask = mask; - req->skip_wait = 0; - wine_server_call( req ); - } - SERVER_END_REQ; - /* add the queue to the handle list */ for (i = 0; i < count; i++) handles[i] = pHandles[i]; handles[count] = get_server_queue_handle();
- return wow_handlers.wait_message( count+1, handles, timeout, mask, flags ); + return wait_objects( count+1, handles, timeout, + (flags & MWMO_INPUTAVAILABLE) ? mask : 0, mask, flags ); }
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index a20dd2a..f2345e8 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -172,6 +172,8 @@ struct wm_char_mapping_data struct user_thread_info { HANDLE server_queue; /* Handle to server-side queue */ + DWORD wake_mask; /* Current queue wake mask */ + DWORD changed_mask; /* Current queue changed mask */ WORD recursion_count; /* SendMessage recursion counter */ WORD message_count; /* Get/PeekMessage loop counter */ BOOL hook_unicode; /* Is current hook unicode? */ @@ -188,7 +190,7 @@ struct user_thread_info HWND msg_window; /* HWND_MESSAGE parent window */ RAWINPUT *rawinput;
- ULONG pad[8]; /* Available for more data */ + ULONG pad[6]; /* Available for more data */ };
struct hook_extra_info