From 201977983e237e35b9e640866e71613387fe1ab9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1?= =?UTF-8?q?=D1=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= Date: Sat, 29 Jul 2017 08:06:18 +0000 Subject: [PATCH] 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 file changed, 14 insertions(+), 16 deletions(-) diff --git a/glib/gpoll.c b/glib/gpoll.c index 4bc42a173..786191364 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)