Improved sleep/alarm/mark implementation by

Alan Jenkins <alan-jenkins@tuffmail.co.uk>
This commit is contained in:
Joey Schulze 2007-10-08 15:24:06 +00:00
parent 7097243191
commit be3066caa3

View File

@ -783,6 +783,8 @@ int LogPort; /* port number for INET connections */
int Initialized = 0; /* set when we have initialized ourselves */ int Initialized = 0; /* set when we have initialized ourselves */
int MarkInterval = 20 * 60; /* interval between marks in seconds */ int MarkInterval = 20 * 60; /* interval between marks in seconds */
int MarkSeq = 0; /* mark sequence number */ int MarkSeq = 0; /* mark sequence number */
int LastAlarm = 0; /* last value passed to alarm() (seconds) */
int DupesPending = 0; /* Number of unflushed duplicate messages */
int NoFork = 0; /* don't fork - don't run in daemon mode */ int NoFork = 0; /* don't fork - don't run in daemon mode */
int AcceptRemote = 0; /* receive messages that come via UDP */ int AcceptRemote = 0; /* receive messages that come via UDP */
char **StripDomains = NULL; /* these domains may be stripped before writing logs */ char **StripDomains = NULL; /* these domains may be stripped before writing logs */
@ -1054,7 +1056,9 @@ int main(argc, argv)
(void) signal(SIGALRM, domark); (void) signal(SIGALRM, domark);
(void) signal(SIGUSR1, Debug ? debug_switch : SIG_IGN); (void) signal(SIGUSR1, Debug ? debug_switch : SIG_IGN);
(void) signal(SIGXFSZ, SIG_IGN); (void) signal(SIGXFSZ, SIG_IGN);
(void) alarm(TIMERINTVL);
LastAlarm = MarkInterval;
alarm(LastAlarm);
/* Create a partial message table for all file descriptors. */ /* Create a partial message table for all file descriptors. */
num_fds = getdtablesize(); num_fds = getdtablesize();
@ -1698,6 +1702,17 @@ void logmsg(pri, msg, from, flags)
dprintf("msg repeated %d times, %ld sec of %d.\n", dprintf("msg repeated %d times, %ld sec of %d.\n",
f->f_prevcount, now - f->f_time, f->f_prevcount, now - f->f_time,
repeatinterval[f->f_repeatcount]); repeatinterval[f->f_repeatcount]);
if (f->f_prevcount == 1 && DupesPending++ == 0) {
dprintf("setting alarm to flush duplicate messages\n");
LastAlarm -= alarm(0);
MarkSeq += LastAlarm;
if (LastAlarm > TIMERINTVL)
LastAlarm = TIMERINTVL;
alarm(LastAlarm);
}
/* /*
* If domark would have logged this by now, * If domark would have logged this by now,
* flush it now (so we don't hold isolated messages), * flush it now (so we don't hold isolated messages),
@ -1710,8 +1725,17 @@ void logmsg(pri, msg, from, flags)
} }
} else { } else {
/* new line, save it */ /* new line, save it */
if (f->f_prevcount) if (f->f_prevcount) {
fprintlog(f, (char *)from, 0, (char *)NULL); fprintlog(f, (char *)from, 0, (char *)NULL);
if (--DupesPending == 0) {
dprintf("unsetting duplicate message flush alarm\n");
MarkSeq += LastAlarm - alarm(0);
LastAlarm = MarkInterval - MarkSeq;
alarm(LastAlarm);
}
}
f->f_prevpri = pri; f->f_prevpri = pri;
f->f_repeatcount = 0; f->f_repeatcount = 0;
(void) strncpy(f->f_lasttime, timestamp, 15); (void) strncpy(f->f_lasttime, timestamp, 15);
@ -2164,10 +2188,10 @@ void domark()
if (MarkInterval > 0) { if (MarkInterval > 0) {
now = time(0); now = time(0);
MarkSeq += TIMERINTVL; MarkSeq += LastAlarm;
if (MarkSeq >= MarkInterval) { if (MarkSeq >= MarkInterval) {
logmsg(LOG_MARK|LOG_INFO, "-- MARK --", LocalHostName, ADDDATE|MARK); logmsg(LOG_MARK|LOG_INFO, "-- MARK --", LocalHostName, ADDDATE|MARK);
MarkSeq = 0; MarkSeq -= MarkInterval;
} }
#ifdef SYSV #ifdef SYSV
@ -2182,11 +2206,17 @@ void domark()
repeatinterval[f->f_repeatcount]); repeatinterval[f->f_repeatcount]);
fprintlog(f, LocalHostName, 0, (char *)NULL); fprintlog(f, LocalHostName, 0, (char *)NULL);
BACKOFF(f); BACKOFF(f);
DupesPending--;
} }
} }
} }
(void) signal(SIGALRM, domark); (void) signal(SIGALRM, domark);
(void) alarm(TIMERINTVL);
LastAlarm = MarkInterval - MarkSeq;
if (DupesPending && LastAlarm > TIMERINTVL)
LastAlarm = TIMERINTVL;
(void) alarm(LastAlarm);
} }
void debug_switch() void debug_switch()