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
This commit is contained in:
Pawel Jakub Dawidek 2011-03-21 08:31:35 +00:00
parent a54f161a82
commit c3a8627c9a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=219813

View File

@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <time.h>
#include <unistd.h>
#include <activemap.h>
@ -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));