From a8167b7959187889dc3e0c7aa8c68a9431ad636a Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Tue, 31 Jul 2018 16:44:43 +0200 Subject: [PATCH] sched: allow file handler with multiple events to remove itself Before dispatching a handler, check if it is still valid. This allows a handler to remove itself when a descriptor has two different events at the same time. --- sched.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/sched.c b/sched.c index 45ef11c..fce9f06 100644 --- a/sched.c +++ b/sched.c @@ -534,7 +534,8 @@ dispatch_filehandlers(int nfd, fd_set *read_fds, fd_set *write_fds, fd_set *exce if (except_fds && FD_ISSET(fd, except_fds)) { /* This descriptor has an exception, dispatch its handler */ ptr = (FileHandlerEntry *)ARR_GetElement(file_handlers, fd); - (ptr->handler)(fd, SCH_FILE_EXCEPTION, ptr->arg); + if (ptr->handler) + (ptr->handler)(fd, SCH_FILE_EXCEPTION, ptr->arg); nfd--; /* Don't try to read from it now */ @@ -547,14 +548,16 @@ dispatch_filehandlers(int nfd, fd_set *read_fds, fd_set *write_fds, fd_set *exce if (read_fds && FD_ISSET(fd, read_fds)) { /* This descriptor can be read from, dispatch its handler */ ptr = (FileHandlerEntry *)ARR_GetElement(file_handlers, fd); - (ptr->handler)(fd, SCH_FILE_INPUT, ptr->arg); + if (ptr->handler) + (ptr->handler)(fd, SCH_FILE_INPUT, ptr->arg); nfd--; } if (write_fds && FD_ISSET(fd, write_fds)) { /* This descriptor can be written to, dispatch its handler */ ptr = (FileHandlerEntry *)ARR_GetElement(file_handlers, fd); - (ptr->handler)(fd, SCH_FILE_OUTPUT, ptr->arg); + if (ptr->handler) + (ptr->handler)(fd, SCH_FILE_OUTPUT, ptr->arg); nfd--; } }