1 | /* 2 | * Layer Two Tunnelling Protocol Daemon 3 | * Copyright (C) 1998 Adtran, Inc. 4 | * 5 | * Mark Spencer 6 | * 7 | * This software is distributed under the terms 8 | * of the GPL, which you should have received 9 | * along with this source. 10 | * 11 | * Scheduler structures and functions 12 | * 13 | */ 14 | 15 | #ifndef _SCHEDULER_H 16 | #define _SCHEDULER_H 17 | #include <sys/time.h> 18 | 19 | /* 20 | * The idea is to provide a general scheduler which can schedule 21 | * events to be run periodically 22 | */ 23 | 24 | struct schedule_entry 25 | { 26 | struct timeval tv; /* Scheduled time to execute */ 27 | void (*func) (void *); /* Function to execute */ 28 | void *data; /* Data to be passed to func */ 29 | struct schedule_entry *next; /* Next entry in queue */ 30 | }; 31 | 32 | extern struct schedule_entry *events; 33 | 34 | /* Schedule func to be executed with argument data sometime 35 | tv in the future. */ 36 | 37 | struct schedule_entry *schedule (struct timeval tv, void (*func) (void *), 38 | void *data); 39 | 40 | /* Like schedule() but tv represents an absolute time in the future */ 41 | 42 | struct schedule_entry *aschedule (struct timeval tv, void (*func) (void *), 43 | void *data); 44 | 45 | /* Remove a scheduled event from the queue */ 46 | 47 | void deschedule (struct schedule_entry *); 48 | 49 | /* The alarm handler */ 50 | 51 | void alarm_handler (int); 52 | 53 | /* Initialization function */ 54 | void init_scheduler (void); 55 | 56 | /* Prevent the scheduler from running */ 57 | void schedule_lock (); 58 | 59 | /* Restore normal scheduling functions */ 60 | void schedule_unlock (); 61 | 62 | /* Compare two timeval functions and see if a <= b */ 63 | 64 | #define TVLESS(a,b) ((a).tv_sec == (b).tv_sec ? \ 65 | ((a).tv_usec < (b).tv_usec) : \ 66 | ((a).tv_sec < (b).tv_sec)) 67 | #define TVLESSEQ(a,b) ((a).tv_sec == (b).tv_sec ? \ 68 | ((a).tv_usec <= (b).tv_usec) : \ 69 | ((a).tv_sec <= (b).tv_sec)) 70 | #define TVGT(a,b) ((a).tv_sec == (b).tv_sec ? \ 71 | ((a).tv_usec > (b).tv_usec) : \ 72 | ((a).tv_sec > (b).tv_sec)) 73 | #endif