diff options
| author | cjs <cjs@NetBSD.org> | 1997-07-13 19:42:13 +0000 |
|---|---|---|
| committer | cjs <cjs@NetBSD.org> | 1997-07-13 19:42:13 +0000 |
| commit | fce01e04e20bca396dc45dc38e3658469ea93b7a (patch) | |
| tree | a6c5aeae79876b5d2801e4e1d72d89341a58077b /usr.sbin/sendmail/src/clock.c | |
| parent | 28db57eb43fee36a8c41b7116507ddf46495f6f6 (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.c | 47 |
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; |
