[PATCH 6/7] server: Factor sent or posted message receive helpers.
Rémi Bernon
rbernon at codeweavers.com
Fri Oct 15 04:48:01 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
server/queue.c | 72 +++++++++++++++++---------------------------------
1 file changed, 24 insertions(+), 48 deletions(-)
diff --git a/server/queue.c b/server/queue.c
index f38c7e9fb17..fbbb230e6dc 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -753,16 +753,14 @@ static struct message_result *alloc_message_result( struct msg_queue *send_queue
}
/* receive a message, removing it from the sent queue */
-static void receive_message( struct msg_queue *queue, struct message *msg,
- struct get_message_reply *reply )
+static int receive_message( struct msg_queue *queue, struct message *msg,
+ struct get_message_reply *reply )
{
- struct message_result *result = msg->result;
-
reply->total = msg->data_size;
if (msg->data_size > get_reply_max_size())
{
set_error( STATUS_BUFFER_OVERFLOW );
- return;
+ return 0;
}
reply->type = msg->type;
reply->win = msg->win;
@@ -774,17 +772,7 @@ static void receive_message( struct msg_queue *queue, struct message *msg,
reply->time = msg->time;
if (msg->data) set_reply_data_ptr( msg->data, msg->data_size );
-
- list_remove( &msg->entry );
- /* put the result on the receiver result stack */
- if (result)
- {
- result->msg = NULL;
- result->recv_next = queue->recv_result;
- queue->recv_result = result;
- }
- free( msg );
- if (list_empty( &queue->msg_list[SEND_MESSAGE] )) clear_queue_bits( queue, QS_SENDMESSAGE );
+ return 1;
}
/* set the result of the current received message */
@@ -818,17 +806,18 @@ static int match_window( user_handle_t win, user_handle_t msg_win )
return is_child_window( win, msg_win );
}
-/* retrieve a posted message */
-static int get_posted_message( struct msg_queue *queue, user_handle_t win,
+/* retrieve a sent or posted message */
+static int get_queued_message( struct msg_queue *queue, enum message_kind kind, user_handle_t win,
unsigned int first, unsigned int last, unsigned int flags,
struct get_message_reply *reply )
{
+ struct message_result *result;
struct message *msg;
/* check against the filters */
- LIST_FOR_EACH_ENTRY( msg, &queue->msg_list[POST_MESSAGE], struct message, entry )
+ LIST_FOR_EACH_ENTRY( msg, &queue->msg_list[kind], struct message, entry )
{
- if (!match_window( win, msg->win )) continue;
+ if (kind != SEND_MESSAGE && !match_window( win, msg->win )) continue;
if (!check_msg_filter( msg->msg, first, last )) continue;
goto found; /* found one */
}
@@ -836,32 +825,24 @@ static int get_posted_message( struct msg_queue *queue, user_handle_t win,
/* return it to the app */
found:
- reply->total = msg->data_size;
- if (msg->data_size > get_reply_max_size())
- {
- set_error( STATUS_BUFFER_OVERFLOW );
+ if (!receive_message( queue, msg, reply ))
return 1;
+
+ /* put the result on the receiver result stack */
+ if (kind == SEND_MESSAGE && (result = msg->result))
+ {
+ msg->result = NULL;
+ result->msg = NULL;
+ result->recv_next = queue->recv_result;
+ queue->recv_result = result;
}
- reply->type = msg->type;
- reply->win = msg->win;
- reply->msg = msg->msg;
- reply->wparam = msg->wparam;
- reply->lparam = msg->lparam;
- reply->x = msg->x;
- reply->y = msg->y;
- reply->time = msg->time;
if (flags & PM_REMOVE)
{
- if (msg->data)
- {
- set_reply_data_ptr( msg->data, msg->data_size );
- msg->data = NULL;
- msg->data_size = 0;
- }
- remove_queue_message( queue, msg, POST_MESSAGE );
+ msg->data = NULL;
+ msg->data_size = 0;
+ remove_queue_message( queue, msg, kind );
}
- else if (msg->data) set_reply_data( msg->data, msg->data_size );
return 1;
}
@@ -2586,7 +2567,6 @@ DECL_HANDLER(post_quit_message)
DECL_HANDLER(get_message)
{
struct timer *timer;
- struct list *ptr;
struct msg_queue *queue = get_current_queue();
user_handle_t get_win = get_user_full_handle( req->get_win );
unsigned int filter = req->flags >> 16;
@@ -2604,12 +2584,8 @@ DECL_HANDLER(get_message)
if (!filter) filter = QS_ALLINPUT;
/* first check for sent messages */
- if ((ptr = list_head( &queue->msg_list[SEND_MESSAGE] )))
- {
- struct message *msg = LIST_ENTRY( ptr, struct message, entry );
- receive_message( queue, msg, reply );
+ if (get_queued_message( queue, SEND_MESSAGE, 0, 0, 0xffffffff, PM_REMOVE, reply ))
return;
- }
/* clear changed bits so we can wait on them if we don't find a message */
if (filter & QS_POSTMESSAGE)
@@ -2622,12 +2598,12 @@ DECL_HANDLER(get_message)
/* then check for posted messages */
if ((filter & QS_POSTMESSAGE) &&
- get_posted_message( queue, get_win, req->get_first, req->get_last, req->flags, reply ))
+ get_queued_message( queue, POST_MESSAGE, get_win, req->get_first, req->get_last, req->flags, reply ))
return;
if ((filter & QS_HOTKEY) && queue->hotkey_count &&
req->get_first <= WM_HOTKEY && req->get_last >= WM_HOTKEY &&
- get_posted_message( queue, get_win, WM_HOTKEY, WM_HOTKEY, req->flags, reply ))
+ get_queued_message( queue, POST_MESSAGE, get_win, WM_HOTKEY, WM_HOTKEY, req->flags, reply ))
return;
/* only check for quit messages if not posted messages pending */
--
2.33.0
More information about the wine-devel
mailing list