]> jfr.im git - irc/atheme/libmowgli-2.git/commitdiff
eventloop/ports: fix eventloop livelock
authorWilliam Pitcock <redacted>
Wed, 13 Mar 2013 23:12:10 +0000 (18:12 -0500)
committerWilliam Pitcock <redacted>
Wed, 13 Mar 2013 23:13:40 +0000 (18:13 -0500)
src/libmowgli/eventloop/ports_pollops.c

index 3487df2c1648cdef9ed4fe47718e0e32e450dbf6..0f7d79ae07ca99c629ffc2cb688269bd51f71379 100644 (file)
@@ -140,21 +140,21 @@ static void mowgli_ports_eventloop_setselect(mowgli_eventloop_t *eventloop, mowg
 static void mowgli_ports_eventloop_select(mowgli_eventloop_t *eventloop, int delay)
 {
        mowgli_ports_eventloop_private_t *priv;
-       int i, num, o_errno, nget = 1;
+       int i, ret, o_errno, nget = 1;
 
        return_if_fail(eventloop != NULL);
 
        priv = eventloop->poller;
 
-       num = port_getn(priv->port_fd, priv->pfd, priv->pfd_size, &nget,
+       ret = port_getn(priv->port_fd, priv->pfd, priv->pfd_size, &nget,
                        delay >= 0 ? &(struct timespec){ .tv_sec = delay / 1000, .tv_nsec = delay % 1000 * 1000000 } : NULL);
 
        o_errno = errno;
        mowgli_eventloop_synchronize(eventloop);
 
-       if (num < 0)
+       if (ret == -1)
        {
-               if (mowgli_eventloop_ignore_errno(errno))
+               if (mowgli_eventloop_ignore_errno(o_errno))
                        return;
 
                mowgli_log("mowgli_ports_eventloop_select(): port_getn failed: %d (%s)", o_errno, strerror(o_errno));
@@ -165,6 +165,9 @@ static void mowgli_ports_eventloop_select(mowgli_eventloop_t *eventloop, int del
        {
                mowgli_eventloop_pollable_t *pollable = priv->pfd[i].portev_user;
 
+               if (priv->pfd[i].portev_source != PORT_SOURCE_FD)
+                       continue;
+
                if (priv->pfd[i].portev_events & (POLLIN | POLLHUP | POLLERR))
                        mowgli_pollable_trigger(eventloop, pollable, MOWGLI_EVENTLOOP_IO_READ);