diff options
author | amurai <amurai@FreeBSD.org> | 1995-01-31 06:29:58 +0000 |
---|---|---|
committer | amurai <amurai@FreeBSD.org> | 1995-01-31 06:29:58 +0000 |
commit | 21ef2761fd1e5a4beb483da8bddf767d36540dce (patch) | |
tree | 3aecd1251d1647032ad1455f304eaeeaab4987d0 /usr.sbin/ppp/timer.c | |
parent | 0487956fcf018d602bfe99b0e3398c6f4d55680a (diff) | |
download | FreeBSD-src-21ef2761fd1e5a4beb483da8bddf767d36540dce.zip FreeBSD-src-21ef2761fd1e5a4beb483da8bddf767d36540dce.tar.gz |
Diffstat (limited to 'usr.sbin/ppp/timer.c')
-rw-r--r-- | usr.sbin/ppp/timer.c | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/usr.sbin/ppp/timer.c b/usr.sbin/ppp/timer.c new file mode 100644 index 0000000..2c665da --- /dev/null +++ b/usr.sbin/ppp/timer.c @@ -0,0 +1,151 @@ +/* + * PPP Timer Processing Module + * + * Written by Toshiharu OHNO (tony-o@iij.ad.jp) + * + * Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the Internet Initiative Japan, Inc. The name of the + * IIJ may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * $Id:$ + * + * TODO: + */ +#include "defs.h" +#include <sys/time.h> +#include <signal.h> +#include "timeout.h" + +void +StartTimer(tp) +struct pppTimer *tp; +{ + struct pppTimer *t, *pt; + u_long ticks = 0; + + if (tp->state == TIMER_RUNNING) { + StopTimer(tp); + } + if (tp->load == 0) { +#ifdef DEBUG + logprintf("timer %x has 0 load!\n", tp); +#endif + return; + } + pt = NULL; + for (t = TimerList; t; t = t->next) { +#ifdef DEBUG + logprintf("%x(%d): ticks: %d, rest: %d\n", t, t->state, ticks, t->rest); +#endif + if (ticks + t->rest >= tp->load) + break; + ticks += t->rest; + pt = t; + } + + tp->state = TIMER_RUNNING; + tp->rest = tp->load - ticks; +#ifdef DEBUG + logprintf("Inserting %x before %x, rest = %d\n", tp, t, tp->rest); +#endif + /* Insert given *tp just before *t */ + tp->next = t; + if (pt) { + pt->next = tp; + } else + TimerList = tp; + if (t) + t->rest -= tp->rest; +} + +void +StopTimer(tp) +struct pppTimer *tp; +{ + struct pppTimer *t, *pt; + + if (tp->state != TIMER_RUNNING) { + tp->next = NULL; + return; + } + +#ifdef DEBUG + logprintf("StopTimer: %x, next = %x\n", tp, tp->next); +#endif + pt = NULL; + for (t = TimerList; t != tp; t = t->next) + pt = t; + if (t) { + if (pt) + pt->next = t->next; + else + TimerList = t->next; + if (t->next) + t->next->rest += tp->rest; + } else + fprintf(stderr, "Oops, timer not found!!\n"); + tp->next = NULL; + tp->state = TIMER_STOPPED; +} + +void +TimerService() +{ + struct pppTimer *tp, *exp, *wt; + + if (tp = TimerList) { + tp->rest--; + if (tp->rest == 0) { + /* + * Multiple timers may expires at once. Create list of expired timers. + */ + exp = NULL; + do { + tp->state = TIMER_EXPIRED; + wt = tp->next; + tp->enext = exp; + exp = tp; +#ifdef DEBUG + logprintf("Add %x to exp\n", tp); +#endif + tp = wt; + } while (tp && (tp->rest == 0)); + + TimerList = tp; +#ifdef DEBUG + logprintf("TimerService: next is %x(%d)\n", + TimerList, TimerList? TimerList->rest : 0); +#endif + /* + * Process all expired timers. + */ + while (exp) { +#ifdef notdef + StopTimer(exp); +#endif + if (exp->func) + (*exp->func)(exp->arg); + exp = exp->enext; + } + } + } +} + +void +ShowTimers() +{ + struct pppTimer *pt; + + for (pt = TimerList; pt; pt = pt->next) + fprintf(stderr, "%x: load = %d, rest = %d\r\n", pt, pt->load, pt->rest); +} |