mirror of
https://gitlab.com/chrony/chrony.git
synced 2025-12-03 20:55:07 -05:00
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.
This commit is contained in:
9
sched.c
9
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)) {
|
if (except_fds && FD_ISSET(fd, except_fds)) {
|
||||||
/* This descriptor has an exception, dispatch its handler */
|
/* This descriptor has an exception, dispatch its handler */
|
||||||
ptr = (FileHandlerEntry *)ARR_GetElement(file_handlers, fd);
|
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--;
|
nfd--;
|
||||||
|
|
||||||
/* Don't try to read from it now */
|
/* 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)) {
|
if (read_fds && FD_ISSET(fd, read_fds)) {
|
||||||
/* This descriptor can be read from, dispatch its handler */
|
/* This descriptor can be read from, dispatch its handler */
|
||||||
ptr = (FileHandlerEntry *)ARR_GetElement(file_handlers, fd);
|
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--;
|
nfd--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (write_fds && FD_ISSET(fd, write_fds)) {
|
if (write_fds && FD_ISSET(fd, write_fds)) {
|
||||||
/* This descriptor can be written to, dispatch its handler */
|
/* This descriptor can be written to, dispatch its handler */
|
||||||
ptr = (FileHandlerEntry *)ARR_GetElement(file_handlers, fd);
|
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--;
|
nfd--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user