[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