server: Set the queue mask directly in get_message to avoid an extra server call.
This commit is contained in:
parent
b4edb573fd
commit
2896540a34
|
@ -2017,9 +2017,12 @@ static BOOL peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags
|
||||||
ULONG_PTR extra_info = 0;
|
ULONG_PTR extra_info = 0;
|
||||||
struct user_thread_info *thread_info = get_user_thread_info();
|
struct user_thread_info *thread_info = get_user_thread_info();
|
||||||
struct received_message_info info, *old_info;
|
struct received_message_info info, *old_info;
|
||||||
|
unsigned int wake_mask, changed_mask = HIWORD(flags);
|
||||||
unsigned int hw_id = 0; /* id of previous hardware message */
|
unsigned int hw_id = 0; /* id of previous hardware message */
|
||||||
|
|
||||||
if (!first && !last) last = ~0;
|
if (!first && !last) last = ~0;
|
||||||
|
if (!changed_mask) changed_mask = QS_ALLINPUT;
|
||||||
|
wake_mask = changed_mask & (QS_SENDMESSAGE | QS_SMRESULT);
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
|
@ -2038,6 +2041,8 @@ static BOOL peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags
|
||||||
req->get_first = first;
|
req->get_first = first;
|
||||||
req->get_last = last;
|
req->get_last = last;
|
||||||
req->hw_id = hw_id;
|
req->hw_id = hw_id;
|
||||||
|
req->wake_mask = wake_mask;
|
||||||
|
req->changed_mask = changed_mask;
|
||||||
if (buffer_size) wine_server_set_reply( req, buffer, buffer_size );
|
if (buffer_size) wine_server_set_reply( req, buffer, buffer_size );
|
||||||
if (!(res = wine_server_call( req )))
|
if (!(res = wine_server_call( req )))
|
||||||
{
|
{
|
||||||
|
@ -2933,35 +2938,14 @@ BOOL WINAPI GetMessageW( MSG *msg, HWND hwnd, UINT first, UINT last )
|
||||||
if ((first <= WM_SYSTIMER) && (last >= WM_SYSTIMER)) mask |= QS_TIMER;
|
if ((first <= WM_SYSTIMER) && (last >= WM_SYSTIMER)) mask |= QS_TIMER;
|
||||||
if ((first <= WM_PAINT) && (last >= WM_PAINT)) mask |= QS_PAINT;
|
if ((first <= WM_PAINT) && (last >= WM_PAINT)) mask |= QS_PAINT;
|
||||||
}
|
}
|
||||||
else mask |= QS_MOUSE | QS_KEY | QS_TIMER | QS_PAINT;
|
else mask = QS_ALLINPUT;
|
||||||
|
|
||||||
while (!PeekMessageW( msg, hwnd, first, last, PM_REMOVE ))
|
while (!PeekMessageW( msg, hwnd, first, last, PM_REMOVE | PM_NOYIELD | (mask << 16) ))
|
||||||
{
|
{
|
||||||
/* wait until one of the bits is set */
|
|
||||||
unsigned int wake_bits = 0, changed_bits = 0;
|
|
||||||
DWORD dwlc;
|
DWORD dwlc;
|
||||||
|
|
||||||
SERVER_START_REQ( set_queue_mask )
|
|
||||||
{
|
|
||||||
req->wake_mask = QS_SENDMESSAGE;
|
|
||||||
req->changed_mask = mask;
|
|
||||||
req->skip_wait = 1;
|
|
||||||
if (!wine_server_call( req ))
|
|
||||||
{
|
|
||||||
wake_bits = reply->wake_bits;
|
|
||||||
changed_bits = reply->changed_bits;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SERVER_END_REQ;
|
|
||||||
|
|
||||||
if (changed_bits & mask) continue;
|
|
||||||
if (wake_bits & QS_SENDMESSAGE) continue;
|
|
||||||
|
|
||||||
TRACE( "(%04x) mask=%08x, bits=%08x, changed=%08x, waiting\n",
|
|
||||||
GetCurrentThreadId(), mask, wake_bits, changed_bits );
|
|
||||||
|
|
||||||
ReleaseThunkLock( &dwlc );
|
ReleaseThunkLock( &dwlc );
|
||||||
USER_Driver->pMsgWaitForMultipleObjectsEx( 1, &server_queue, INFINITE, QS_ALLINPUT, 0 );
|
USER_Driver->pMsgWaitForMultipleObjectsEx( 1, &server_queue, INFINITE, mask, 0 );
|
||||||
if (dwlc) RestoreThunkLock( dwlc );
|
if (dwlc) RestoreThunkLock( dwlc );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2499,6 +2499,8 @@ struct get_message_request
|
||||||
unsigned int get_first;
|
unsigned int get_first;
|
||||||
unsigned int get_last;
|
unsigned int get_last;
|
||||||
unsigned int hw_id;
|
unsigned int hw_id;
|
||||||
|
unsigned int wake_mask;
|
||||||
|
unsigned int changed_mask;
|
||||||
};
|
};
|
||||||
struct get_message_reply
|
struct get_message_reply
|
||||||
{
|
{
|
||||||
|
@ -4731,6 +4733,6 @@ union generic_reply
|
||||||
struct make_process_system_reply make_process_system_reply;
|
struct make_process_system_reply make_process_system_reply;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SERVER_PROTOCOL_VERSION 311
|
#define SERVER_PROTOCOL_VERSION 312
|
||||||
|
|
||||||
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
|
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
|
||||||
|
|
|
@ -1859,6 +1859,8 @@ enum message_type
|
||||||
unsigned int get_first; /* first message code to get */
|
unsigned int get_first; /* first message code to get */
|
||||||
unsigned int get_last; /* last message code to get */
|
unsigned int get_last; /* last message code to get */
|
||||||
unsigned int hw_id; /* id of the previous hardware message (or 0) */
|
unsigned int hw_id; /* id of the previous hardware message (or 0) */
|
||||||
|
unsigned int wake_mask; /* wakeup bits mask */
|
||||||
|
unsigned int changed_mask; /* changed bits mask */
|
||||||
@REPLY
|
@REPLY
|
||||||
user_handle_t win; /* window handle */
|
user_handle_t win; /* window handle */
|
||||||
int type; /* message type */
|
int type; /* message type */
|
||||||
|
|
|
@ -1828,6 +1828,8 @@ DECL_HANDLER(get_message)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
queue->wake_mask = req->wake_mask;
|
||||||
|
queue->changed_mask = req->changed_mask;
|
||||||
set_error( STATUS_PENDING ); /* FIXME */
|
set_error( STATUS_PENDING ); /* FIXME */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2304,7 +2304,9 @@ static void dump_get_message_request( const struct get_message_request *req )
|
||||||
fprintf( stderr, " get_win=%p,", req->get_win );
|
fprintf( stderr, " get_win=%p,", req->get_win );
|
||||||
fprintf( stderr, " get_first=%08x,", req->get_first );
|
fprintf( stderr, " get_first=%08x,", req->get_first );
|
||||||
fprintf( stderr, " get_last=%08x,", req->get_last );
|
fprintf( stderr, " get_last=%08x,", req->get_last );
|
||||||
fprintf( stderr, " hw_id=%08x", req->hw_id );
|
fprintf( stderr, " hw_id=%08x,", req->hw_id );
|
||||||
|
fprintf( stderr, " wake_mask=%08x,", req->wake_mask );
|
||||||
|
fprintf( stderr, " changed_mask=%08x", req->changed_mask );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dump_get_message_reply( const struct get_message_reply *req )
|
static void dump_get_message_reply( const struct get_message_reply *req )
|
||||||
|
|
Loading…
Reference in New Issue