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_kqueue.c
diff --git
a/ircd/engine_kqueue.c
b/ircd/engine_kqueue.c
index b3f535f7d8db52825068a42f959ac06d62cadd9b..a0d00dd645b5d35a49e3f350e142732f4d0cfb34 100644
(file)
--- a/
ircd/engine_kqueue.c
+++ b/
ircd/engine_kqueue.c
@@
-53,8
+53,6
@@
static int kqueue_id;
static struct kevent *events;
/** Number of ::events elements that have been populated. */
static int events_used;
static struct kevent *events;
/** Number of ::events elements that have been populated. */
static int events_used;
-/** Current processing position in ::events. */
-static int events_i;
/** Number of recent errors from kqueue. */
static int errors = 0;
/** Number of recent errors from kqueue. */
static int errors = 0;
@@
-293,7
+291,7
@@
engine_delete(struct Socket* sock)
sockList[s_fd(sock)] = 0;
/* Drop any unprocessed events citing this socket. */
sockList[s_fd(sock)] = 0;
/* Drop any unprocessed events citing this socket. */
- for (ii =
events_i
; ii < events_used; ii++) {
+ for (ii =
0
; ii < events_used; ii++) {
if (events[ii].ident == s_fd(sock)) {
events[ii] = events[--events_used];
}
if (events[ii].ident == s_fd(sock)) {
events[ii] = events[--events_used];
}
@@
-353,8
+351,8
@@
engine_loop(struct Generators* gen)
continue;
}
continue;
}
-
for (events_i = 0; events_i < events_used; events_i++
) {
- evt = &events[
events_i
];
+
while (events_used > 0
) {
+ evt = &events[
--events_used
];
if (evt->filter == EVFILT_SIGNAL) {
/* it's a signal; deal appropriately */
if (evt->filter == EVFILT_SIGNAL) {
/* it's a signal; deal appropriately */