From ff58997de5ecd501485f9214f4fbdc4766157b42 Mon Sep 17 00:00:00 2001 From: pk910 Date: Wed, 22 Aug 2012 04:16:44 +0200 Subject: [PATCH] [IOMultiplexer] do not request events from closed descriptors --- src/IOEngine_epoll.c | 4 ++++ src/IOEngine_kevent.c | 4 ++++ src/IOEngine_select.c | 2 ++ src/IOHandler.c | 1 + 4 files changed, 11 insertions(+) diff --git a/src/IOEngine_epoll.c b/src/IOEngine_epoll.c index 19c6227..e363949 100644 --- a/src/IOEngine_epoll.c +++ b/src/IOEngine_epoll.c @@ -55,6 +55,10 @@ static void engine_epoll_remove(struct IODescriptor *iofd) { static void engine_epoll_update(struct IODescriptor *iofd) { if(iofd->type == IOTYPE_TIMER) return; + if(iofd->state == IO_CLOSED) { + engine_epoll_remove(iofd); + return; + } struct epoll_event evt; int res; diff --git a/src/IOEngine_kevent.c b/src/IOEngine_kevent.c index 1ebb801..21c81ef 100644 --- a/src/IOEngine_kevent.c +++ b/src/IOEngine_kevent.c @@ -59,6 +59,10 @@ static void engine_kevent_remove(struct IODescriptor *iofd) { static void engine_kevent_update(struct IODescriptor *iofd) { if(iofd->type == IOTYPE_TIMER) return; + if(iofd->state == IO_CLOSED) { + engine_epoll_remove(iofd); + return; + } struct kevent changes[2]; int nchanges = 0; int res; diff --git a/src/IOEngine_select.c b/src/IOEngine_select.c index 8c25ba6..2d85d7c 100644 --- a/src/IOEngine_select.c +++ b/src/IOEngine_select.c @@ -99,6 +99,8 @@ static void engine_select_loop(struct timeval *timeout) { #endif } else if(iofd->type == IOTYPE_SERVER || iofd->type == IOTYPE_CLIENT) { + if(iofd->state == IO_CLOSED) + continue; if(iofd->fd > fds_size) fds_size = iofd->fd; FD_SET(iofd->fd, &read_fds); diff --git a/src/IOHandler.c b/src/IOHandler.c index e4fa1dd..f9e74d0 100644 --- a/src/IOHandler.c +++ b/src/IOHandler.c @@ -553,6 +553,7 @@ void iohandler_events(struct IODescriptor *iofd, int readable, int writeable) { if(!readable && !writeable) { callback_event.type = IOEVENT_SSLFAILED; iofd->state = IO_CLOSED; + engine->update(iofd); } else { iohandler_log(IOLOG_DEBUG, "triggering iohandler_ssl_client_handshake for %s (fd: %d)", iohandler_iotype_name(iofd->type), iofd->fd); iohandler_ssl_client_handshake(iofd); -- 2.20.1