diff options
Diffstat (limited to 'lib/libatm/timer.c')
-rw-r--r-- | lib/libatm/timer.c | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/lib/libatm/timer.c b/lib/libatm/timer.c new file mode 100644 index 0000000..fc8b64f --- /dev/null +++ b/lib/libatm/timer.c @@ -0,0 +1,261 @@ +/* + * + * =================================== + * HARP | Host ATM Research Platform + * =================================== + * + * + * This Host ATM Research Platform ("HARP") file (the "Software") is + * made available by Network Computing Services, Inc. ("NetworkCS") + * "AS IS". NetworkCS does not provide maintenance, improvements or + * support of any kind. + * + * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, + * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE + * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. + * In no event shall NetworkCS be responsible for any damages, including + * but not limited to consequential damages, arising from or relating to + * any use of the Software or related support. + * + * Copyright 1994-1998 Network Computing Services, Inc. + * + * Copies of this Software may be made, however, the above copyright + * notice must be reproduced on all copies. + * + * @(#) $Id: timer.c,v 1.4 1998/07/16 15:50:26 johnc Exp $ + * + */ + +/* + * User Space Library Functions + * ---------------------------- + * + * Timer functions + * + */ + +#ifndef lint +static char *RCSid = "@(#) $Id: timer.c,v 1.4 1998/07/16 15:50:26 johnc Exp $"; +#endif + +#include <sys/types.h> +#include <sys/param.h> + +#include <errno.h> +#include <sys/socket.h> +#include <net/if.h> +#include <netinet/in.h> +#include <netatm/port.h> +#include <netatm/queue.h> +#include <netatm/atm.h> +#include <netatm/atm_if.h> +#include <netatm/atm_sap.h> +#include <netatm/atm_sys.h> +#include <netatm/atm_ioctl.h> + +#include "libatm.h" + +Harp_timer *harp_timer_head; +int harp_timer_exec; + + +/* + * Process a HARP timer tick + * + * This function is called via the SIGALRM signal. It increments + * harp_timer_exec. The user should check this flag frequently and + * call timer_proc when it is set. + * + * Arguments: + * None + * + * Returns: + * None + * + */ +static void +timer_tick() +{ + /* + * Bump the timer flag + */ + harp_timer_exec++; +} + + +/* + * Process HARP timers + * + * This function is called after a SIGALRM signal is posted. It runs + * down the list of timer entries, calling the specified functions + * for any timers that have expired. + * + * Arguments: + * None + * + * Returns: + * None + * + */ +void +timer_proc() +{ + Harp_timer *htp; + void (*f)(); + + /* + * Reset marks in all timers on the queue + */ + for (htp = harp_timer_head; htp; htp = htp->ht_next) { + htp->ht_mark = -1; + } + + /* + * Run through timer chain decrementing each timer. + * If an expired timer is found, take the timer block + * off the chain and call the specified function. A + * timer's action can result in other timers being + * cancelled (taken off the queue), so every time we + * call a user function, we start over from the top of + * the list. + */ +timer_cont: + for (htp = harp_timer_head; htp; htp = htp->ht_next) { + /* + * Make sure we only process each entry once and + * don't process entries that are put on the queue + * by user functions we call for this tick + */ + if (htp->ht_mark == -1) { + /* + * Decrement the timer and mark that we've + * processed the entry + */ + htp->ht_ticks -= harp_timer_exec; + htp->ht_mark = 1; + + /* + * Check whether the timer is expired + */ + if (htp->ht_ticks <= 0) { + /* + * Unlink the timer block and call + * the user function + */ + f = htp->ht_func; + UNLINK(htp, Harp_timer, harp_timer_head, + ht_next); + f(htp); + + /* + * Start over + */ + goto timer_cont; + } + } + } + + /* + * Reset the timer exec flag + */ + harp_timer_exec = 0; +} + + +/* + * Start the timer + * + * Set up the SIGALRM signal handler and set up the real-time + * timer to tick once per second. + * + * Arguments: + * None + * + * Returns: + * 0 success + * errno reason for failure + * + */ +int +init_timer() +{ + int rc = 0; + struct itimerval timeval; + + /* + * Clear the timer flag + */ + harp_timer_exec = 0; + + /* + * Set up signal handler + */ + if ((int)signal(SIGALRM, timer_tick) == -1) { + return(errno); + } + + /* + * Start timer + */ + timeval.it_value.tv_sec = 1; + timeval.it_value.tv_usec = 0; + timeval.it_interval.tv_sec = 1; + timeval.it_interval.tv_usec = 0; + + if (setitimer(ITIMER_REAL, &timeval, + (struct itimerval *)0) == -1) { + rc = errno; + (void)signal(SIGALRM, SIG_DFL); + } + + return(rc); +} + + +/* + * Block timers from firing + * + * Block the SIGALRM signal. + * + * Arguments: + * None + * + * Returns: + * mask the previous blocked signal mask + * + */ +int +block_timer() +{ + /* + * Block the SIGALRM signal + */ + return(sigblock(sigmask(SIGALRM))); +} + + +/* + * Re-enable timers + * + * Restore the signal mask (presumably one that was returned by + * block_timer). + * + * Arguments: + * mask the signal mask to be restored + * + * Returns: + * mask the previous blocked signal mask + * + */ +void +enable_timer(mask) + int mask; +{ + /* + * Set the signal mask + */ + sigsetmask(mask); + + return; +} |