summaryrefslogtreecommitdiff
path: root/usr.sbin/sendmail/src/clock.c
diff options
context:
space:
mode:
authorcjs <cjs@NetBSD.org>1997-07-13 19:42:13 +0000
committercjs <cjs@NetBSD.org>1997-07-13 19:42:13 +0000
commitfce01e04e20bca396dc45dc38e3658469ea93b7a (patch)
treea6c5aeae79876b5d2801e4e1d72d89341a58077b /usr.sbin/sendmail/src/clock.c
parent28db57eb43fee36a8c41b7116507ddf46495f6f6 (diff)
Resolve conflicts in 8.8.6 import.
Diffstat (limited to 'usr.sbin/sendmail/src/clock.c')
-rw-r--r--usr.sbin/sendmail/src/clock.c47
1 files changed, 31 insertions, 16 deletions
diff --git a/usr.sbin/sendmail/src/clock.c b/usr.sbin/sendmail/src/clock.c
index 5639f440517..6940b297894 100644
--- a/usr.sbin/sendmail/src/clock.c
+++ b/usr.sbin/sendmail/src/clock.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1983, 1995, 1996 Eric P. Allman
+ * Copyright (c) 1983, 1995-1997 Eric P. Allman
* Copyright (c) 1988, 1993
* The Regents of the University of California. All rights reserved.
*
@@ -33,7 +33,7 @@
*/
#ifndef lint
-static char sccsid[] = "@(#)clock.c 8.18 (Berkeley) 12/31/96";
+static char sccsid[] = "@(#)clock.c 8.24 (Berkeley) 4/19/97";
#endif /* not lint */
# include "sendmail.h"
@@ -60,7 +60,9 @@ static char sccsid[] = "@(#)clock.c 8.18 (Berkeley) 12/31/96";
** none.
*/
-static SIGFUNC_DECL tick __P((int));
+EVENT *FreeEventList; /* list of free events */
+
+static SIGFUNC_DECL tick __P((int));
EVENT *
setevent(intvl, func, arg)
@@ -71,6 +73,7 @@ setevent(intvl, func, arg)
register EVENT **evp;
register EVENT *ev;
auto time_t now;
+ int wasblocked;
if (intvl <= 0)
{
@@ -78,7 +81,7 @@ setevent(intvl, func, arg)
return (NULL);
}
- (void) setsignal(SIGALRM, SIG_IGN);
+ wasblocked = blocksignal(SIGALRM);
(void) time(&now);
/* search event queue for correct position */
@@ -89,7 +92,11 @@ setevent(intvl, func, arg)
}
/* insert new event */
- ev = (EVENT *) xalloc(sizeof *ev);
+ ev = FreeEventList;
+ if (ev == NULL)
+ ev = (EVENT *) xalloc(sizeof *ev);
+ else
+ FreeEventList = ev->ev_link;
ev->ev_time = now + intvl;
ev->ev_func = func;
ev->ev_arg = arg;
@@ -101,7 +108,11 @@ setevent(intvl, func, arg)
printf("setevent: intvl=%ld, for=%ld, func=%lx, arg=%d, ev=%lx\n",
intvl, now + intvl, (u_long) func, arg, (u_long) ev);
- tick(0);
+ setsignal(SIGALRM, tick);
+ intvl = EventQueue->ev_time - now;
+ (void) alarm((unsigned) intvl < 1 ? 1 : intvl);
+ if (wasblocked == 0)
+ (void) releasesignal(SIGALRM);
return (ev);
}
/*
@@ -122,6 +133,7 @@ clrevent(ev)
register EVENT *ev;
{
register EVENT **evp;
+ int wasblocked;
if (tTd(5, 5))
printf("clrevent: ev=%lx\n", (u_long) ev);
@@ -129,7 +141,7 @@ clrevent(ev)
return;
/* find the parent event */
- (void) setsignal(SIGALRM, SIG_IGN);
+ wasblocked = blocksignal(SIGALRM);
for (evp = &EventQueue; *evp != NULL; evp = &(*evp)->ev_link)
{
if (*evp == ev)
@@ -140,16 +152,22 @@ clrevent(ev)
if (*evp != NULL)
{
*evp = ev->ev_link;
- free((char *) ev);
+ ev->ev_link = FreeEventList;
+ FreeEventList = ev;
}
/* restore clocks and pick up anything spare */
- tick(0);
+ if (wasblocked == 0)
+ releasesignal(SIGALRM);
+ if (EventQueue != NULL)
+ kill(getpid(), SIGALRM);
}
/*
** TICK -- take a clock tick
**
** Called by the alarm clock. This routine runs events as needed.
+** Always called as a signal handler, so we assume that SIGALRM
+** has been blocked.
**
** Parameters:
** One that is ignored; for compatibility with signal handlers.
@@ -170,13 +188,14 @@ tick(arg)
int mypid = getpid();
int olderrno = errno;
- (void) setsignal(SIGALRM, SIG_IGN);
(void) alarm(0);
now = curtime();
if (tTd(5, 4))
printf("tick: now=%ld\n", now);
+ /* reset signal in case System V semantics */
+ (void) setsignal(SIGALRM, tick);
while ((ev = EventQueue) != NULL &&
(ev->ev_time <= now || ev->ev_pid != mypid))
{
@@ -196,7 +215,8 @@ tick(arg)
f = ev->ev_func;
arg = ev->ev_arg;
pid = ev->ev_pid;
- free((char *) ev);
+ ev->ev_link = FreeEventList;
+ FreeEventList = ev;
if (pid != getpid())
continue;
if (EventQueue != NULL)
@@ -207,17 +227,12 @@ tick(arg)
(void) alarm(3);
}
- /* restore signals so that we can take ticks while in ev_func */
- (void) setsignal(SIGALRM, tick);
- (void) releasesignal(SIGALRM);
-
/* call ev_func */
errno = olderrno;
(*f)(arg);
(void) alarm(0);
now = curtime();
}
- (void) setsignal(SIGALRM, tick);
if (EventQueue != NULL)
(void) alarm((unsigned) (EventQueue->ev_time - now));
errno = olderrno;