[glib] glib/gpoll W32: pass along GPollFD ptr for msg



commit 201977983e237e35b9e640866e71613387fe1ab9
Author: Руслан Ижбулатов <lrn1986 gmail com>
Date:   Sat Jul 29 08:06:18 2017 +0000

    glib/gpoll W32: pass along GPollFD ptr for msg
    
    Instead of just indicating that messages should be polled for, save the pointer to GPollFD that contains 
G_WIN32_MSG_HANDLE, and pass it along. This way it won't be necessary to loop through all fds later on, 
searching for G_WIN32_MSG_HANDLE.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=785468

 glib/gpoll.c |   30 ++++++++++++++----------------
 1 files changed, 14 insertions(+), 16 deletions(-)
---
diff --git a/glib/gpoll.c b/glib/gpoll.c
index 4bc42a1..7861913 100644
--- a/glib/gpoll.c
+++ b/glib/gpoll.c
@@ -129,7 +129,7 @@ g_poll (GPollFD *fds,
 #ifdef G_OS_WIN32
 
 static int
-poll_rest (gboolean  poll_msgs,
+poll_rest (GPollFD  *msg_fd,
           HANDLE   *handles,
           gint      nhandles,
           GPollFD  *fds,
@@ -140,7 +140,7 @@ poll_rest (gboolean  poll_msgs,
   GPollFD *f;
   int recursed_result;
 
-  if (poll_msgs)
+  if (msg_fd != NULL)
     {
       /* Wait for either messages or handles
        * -> Use MsgWaitForMultipleObjectsEx
@@ -192,18 +192,16 @@ poll_rest (gboolean  poll_msgs,
             ready,
             (ready == WAIT_FAILED ? " (WAIT_FAILED)" :
              (ready == WAIT_TIMEOUT ? " (WAIT_TIMEOUT)" :
-              (poll_msgs && ready == WAIT_OBJECT_0 + nhandles ? " (msg)" : ""))));
+              (msg_fd != NULL && ready == WAIT_OBJECT_0 + nhandles ? " (msg)" : ""))));
 
   if (ready == WAIT_FAILED)
     return -1;
   else if (ready == WAIT_TIMEOUT ||
           ready == WAIT_IO_COMPLETION)
     return 0;
-  else if (poll_msgs && ready == WAIT_OBJECT_0 + nhandles)
+  else if (msg_fd != NULL && ready == WAIT_OBJECT_0 + nhandles)
     {
-      for (f = fds; f < &fds[nfds]; ++f)
-       if (f->fd == G_WIN32_MSG_HANDLE && f->events & G_IO_IN)
-         f->revents |= G_IO_IN;
+      msg_fd->revents |= G_IO_IN;
 
       /* If we have a timeout, or no handles to poll, be satisfied
        * with just noticing we have messages waiting.
@@ -214,7 +212,7 @@ poll_rest (gboolean  poll_msgs,
       /* If no timeout and handles to poll, recurse to poll them,
        * too.
        */
-      recursed_result = poll_rest (FALSE, handles, nhandles, fds, nfds, 0);
+      recursed_result = poll_rest (NULL, handles, nhandles, fds, nfds, 0);
       return (recursed_result == -1) ? -1 : 1 + recursed_result;
     }
   else if (ready >= WAIT_OBJECT_0 && ready < WAIT_OBJECT_0 + nhandles)
@@ -239,7 +237,7 @@ poll_rest (gboolean  poll_msgs,
          for (i = ready - WAIT_OBJECT_0 + 1; i < nhandles; i++)
            handles[i-1] = handles[i];
          nhandles--;
-         recursed_result = poll_rest (FALSE, handles, nhandles, fds, nfds, 0);
+         recursed_result = poll_rest (NULL, handles, nhandles, fds, nfds, 0);
          return (recursed_result == -1) ? -1 : 1 + recursed_result;
        }
       return 1;
@@ -254,7 +252,7 @@ g_poll (GPollFD *fds,
        gint     timeout)
 {
   HANDLE handles[MAXIMUM_WAIT_OBJECTS];
-  gboolean poll_msgs = FALSE;
+  GPollFD *msg_fd = NULL;
   GPollFD *f;
   gint nhandles = 0;
   int retval;
@@ -266,9 +264,9 @@ g_poll (GPollFD *fds,
     {
       if (f->fd == G_WIN32_MSG_HANDLE && (f->events & G_IO_IN))
         {
-          if (_g_main_poll_debug && !poll_msgs)
+          if (_g_main_poll_debug && msg_fd == NULL)
             g_print (" MSG");
-          poll_msgs = TRUE;
+          msg_fd = f;
         }
       else if (f->fd > 0)
         {
@@ -294,26 +292,26 @@ g_poll (GPollFD *fds,
     timeout = INFINITE;
 
   /* Polling for several things? */
-  if (nhandles > 1 || (nhandles > 0 && poll_msgs))
+  if (nhandles > 1 || (nhandles > 0 && msg_fd != NULL))
     {
       /* First check if one or several of them are immediately
        * available
        */
-      retval = poll_rest (poll_msgs, handles, nhandles, fds, nfds, 0);
+      retval = poll_rest (msg_fd, handles, nhandles, fds, nfds, 0);
 
       /* If not, and we have a significant timeout, poll again with
        * timeout then. Note that this will return indication for only
        * one event, or only for messages.
        */
       if (retval == 0 && (timeout == INFINITE || timeout > 0))
-       retval = poll_rest (poll_msgs, handles, nhandles, fds, nfds, timeout);
+       retval = poll_rest (msg_fd, handles, nhandles, fds, nfds, timeout);
     }
   else
     {
       /* Just polling for one thing, so no need to check first if
        * available immediately
        */
-      retval = poll_rest (poll_msgs, handles, nhandles, fds, nfds, timeout);
+      retval = poll_rest (msg_fd, handles, nhandles, fds, nfds, timeout);
     }
 
   if (retval == -1)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]