From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/message.c | 34 +++++++++++++++++++--------------- dlls/win32u/ntuser_private.h | 2 -- 2 files changed, 19 insertions(+), 17 deletions(-)
diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 3099f5a6660..d8cb6f395b2 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -2708,8 +2708,6 @@ int peek_message( MSG *msg, const struct peek_message_filter *filter ) free( buffer ); if (res == STATUS_PENDING) { - thread_info->wake_mask = filter->mask & (QS_SENDMESSAGE | QS_SMRESULT); - thread_info->changed_mask = filter->mask; return 0; } if (res != STATUS_BUFFER_OVERFLOW) @@ -3017,6 +3015,23 @@ static DWORD wait_message( DWORD count, const HANDLE *handles, DWORD timeout, DW return ret; }
+/*********************************************************************** + * check_queue_masks + */ +static BOOL check_queue_masks( UINT wake_mask, UINT changed_mask ) +{ + struct object_lock lock = OBJECT_LOCK_INIT; + const queue_shm_t *queue_shm; + BOOL skip = FALSE; + UINT status; + + while ((status = get_shared_queue( &lock, &queue_shm )) == STATUS_PENDING) + skip = queue_shm->wake_mask == wake_mask && queue_shm->changed_mask == changed_mask; + + if (status) return FALSE; + return skip; +} + /*********************************************************************** * wait_objects * @@ -3025,14 +3040,11 @@ static DWORD wait_message( DWORD count, const HANDLE *handles, DWORD timeout, DW 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) + if (!check_queue_masks( wake_mask, changed_mask )) { SERVER_START_REQ( set_queue_mask ) { @@ -3042,14 +3054,9 @@ static DWORD wait_objects( DWORD count, const HANDLE *handles, DWORD timeout, wine_server_call( req ); } SERVER_END_REQ; - thread_info->wake_mask = wake_mask; - thread_info->changed_mask = changed_mask; }
- ret = wait_message( count, handles, timeout, changed_mask, flags ); - - if (ret != WAIT_TIMEOUT) thread_info->wake_mask = thread_info->changed_mask = 0; - return ret; + return wait_message( count, handles, timeout, changed_mask, flags ); }
static HANDLE normalize_std_handle( HANDLE handle ) @@ -3314,7 +3321,6 @@ done: */ static void wait_message_reply( UINT flags ) { - struct user_thread_info *thread_info = get_user_thread_info(); HANDLE server_queue = get_server_queue_handle(); unsigned int wake_mask = QS_SMRESULT | ((flags & SMTO_BLOCK) ? 0 : QS_SENDMESSAGE);
@@ -3331,8 +3337,6 @@ 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) { diff --git a/dlls/win32u/ntuser_private.h b/dlls/win32u/ntuser_private.h index 44edadad8f8..e9d407efb14 100644 --- a/dlls/win32u/ntuser_private.h +++ b/dlls/win32u/ntuser_private.h @@ -108,8 +108,6 @@ struct user_thread_info { struct ntuser_thread_info client_info; /* Data shared with client */ HANDLE server_queue; /* Handle to server-side queue */ - DWORD wake_mask; /* Current queue wake mask */ - DWORD changed_mask; /* Current queue changed mask */ WORD message_count; /* Get/PeekMessage loop counter */ WORD hook_call_depth; /* Number of recursively called hook procs */ WORD hook_unicode; /* Is current hook unicode? */