From c3a8627c9abe4c6a9670b1d0786d8d7e3f8a6d10 Mon Sep 17 00:00:00 2001 From: Pawel Jakub Dawidek Date: Mon, 21 Mar 2011 08:31:35 +0000 Subject: [PATCH] If there is any traffic on one of out descriptors, we were not checking for long running hooks. Fix it by not using select(2) timeout to decide if we want to check hooks or not. MFC after: 1 week --- sbin/hastd/hastd.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/sbin/hastd/hastd.c b/sbin/hastd/hastd.c index dd53eff0c063..4688ed5738e4 100644 --- a/sbin/hastd/hastd.c +++ b/sbin/hastd/hastd.c @@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -877,9 +878,11 @@ main_loop(void) struct timeval seltimeout; struct timespec sigtimeout; int fd, maxfd, ret, signo; + time_t lastcheck, now; sigset_t mask; fd_set rfds; + lastcheck = time(NULL); seltimeout.tv_sec = REPORT_INTERVAL; seltimeout.tv_usec = 0; sigtimeout.tv_sec = 0; @@ -943,9 +946,18 @@ main_loop(void) PJDLOG_ASSERT(maxfd + 1 <= (int)FD_SETSIZE); ret = select(maxfd + 1, &rfds, NULL, NULL, &seltimeout); - if (ret == 0) + now = time(NULL); + if (lastcheck + REPORT_INTERVAL <= now) { hook_check(); - else if (ret == -1) { + lastcheck = now; + } + if (ret == 0) { + /* + * select(2) timed out, so there should be no + * descriptors to check. + */ + continue; + } else if (ret == -1) { if (errno == EINTR) continue; KEEP_ERRNO((void)pidfile_remove(pfh));