projects
/
ircu2.10.12-pk.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Don't skip events when a devpoll-like engine deletes a socket.
[ircu2.10.12-pk.git]
/
ircd
/
engine_devpoll.c
diff --git
a/ircd/engine_devpoll.c
b/ircd/engine_devpoll.c
index e4fd20042120a216556f95cef53bb6b860170a4a..34b90330530e1e9c838c03ef8e84724246091556 100644
(file)
--- a/
ircd/engine_devpoll.c
+++ b/
ircd/engine_devpoll.c
@@
-78,8
+78,6
@@
static struct Timer clear_error;
static struct pollfd *polls;
/** Number of ::polls elements that have been populated. */
static int polls_used;
static struct pollfd *polls;
/** Number of ::polls elements that have been populated. */
static int polls_used;
-/** Current processing position in ::polls. */
-static int polls_i;
/** Decrement the error count (once per hour).
* @param[in] ev Expired timer event (ignored).
/** Decrement the error count (once per hour).
* @param[in] ev Expired timer event (ignored).
@@
-273,7
+271,7
@@
engine_delete(struct Socket* sock)
sockList[s_fd(sock)] = 0; /* zero the socket list entry */
/* Drop any unprocessed events citing this socket. */
sockList[s_fd(sock)] = 0; /* zero the socket list entry */
/* Drop any unprocessed events citing this socket. */
- for (ii =
polls_i
; ii < polls_used; ii++) {
+ for (ii =
0
; ii < polls_used; ii++) {
if (polls[ii].fd == s_fd(sock)) {
polls[ii] = polls[--polls_used];
}
if (polls[ii].fd == s_fd(sock)) {
polls[ii] = polls[--polls_used];
}
@@
-336,8
+334,8
@@
engine_loop(struct Generators* gen)
continue;
}
continue;
}
-
for (polls_i = 0; polls_i < polls_used; polls_i++
) {
- pfd = &polls[
polls_i
];
+
while (polls_used > 0
) {
+ pfd = &polls[
--polls_used
];
assert(-1 < pfd->fd);
sock = sockList[pfd->fd];
assert(-1 < pfd->fd);
sock = sockList[pfd->fd];