- notifiers[pfd[i].fd]->activate(pfd[i].revents);
-
- if (!--ret)
- break;
- } else if (pfd[i].revents & (POLLERR|POLLHUP|POLLNVAL))
- eDebug("poll: unhandled POLLERR/HUP/NVAL for fd %d(%d)", pfd[i].fd,pfd[i].revents);
+ int handled = 0;
+ it = notifiers.find(pfd[i].fd);
+ if (it != notifiers.end())
+ {
+ int req = it->second->getRequested();
+ handled |= req;
+ if (pfd[i].revents & req)
+ it->second->activate(pfd[i].revents);
+ }
+ pfd[i].revents &= ~handled;
+ if (pfd[i].revents & (POLLERR|POLLHUP|POLLNVAL))
+ eDebug("poll: unhandled POLLERR/HUP/NVAL for fd %d(%d)", pfd[i].fd, pfd[i].revents);
+ }
+ }
+ for (; i < fdcount; ++i)
+ {
+ if (pfd[i].revents)
+ {
+ if (!*res)
+ *res = PyList_New(0);
+ PyObject *it = PyTuple_New(2);
+ PyTuple_SET_ITEM(it, 0, PyInt_FromLong(pfd[i].fd));
+ PyTuple_SET_ITEM(it, 1, PyInt_FromLong(pfd[i].revents));
+ PyList_Append(*res, it);
+ Py_DECREF(it);
+ }
+ }
+
+ ret = 1; /* poll did not timeout. */
+ } else if (ret < 0)
+ {
+ /* when we got a signal, we get EINTR. */
+ if (errno != EINTR)
+ eDebug("poll made error (%m)");
+ else
+ {
+ return_reason = 2;
+ ret = -1; /* don't assume the timeout has passed when we got a signal */