From: Miroslav Lichvar Date: Tue, 31 Jul 2018 14:44:43 +0000 (+0200) Subject: sched: allow file handler with multiple events to remove itself X-Git-Tag: 3.4-pre1~73 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a8167b7959187889dc3e0c7aa8c68a9431ad636a;p=thirdparty%2Fchrony.git 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. --- diff --git a/sched.c b/sched.c index 45ef11c5..fce9f068 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--; } }