Home | History | Annotate | Download | only in linux
      1 #ifndef _LINUX_TIMER_H
      2 #define _LINUX_TIMER_H
      3 
      4 #include <linux/list.h>
      5 #include <linux/spinlock.h>
      6 #include <linux/stddef.h>
      7 
      8 struct tvec_t_base_s;
      9 
     10 struct timer_list {
     11 	struct list_head entry;
     12 	unsigned long expires;
     13 
     14 	void (*function)(unsigned long);
     15 	unsigned long data;
     16 
     17 	struct tvec_t_base_s *base;
     18 };
     19 
     20 extern struct tvec_t_base_s boot_tvec_bases;
     21 
     22 #define TIMER_INITIALIZER(_function, _expires, _data) {		\
     23 		.function = (_function),			\
     24 		.expires = (_expires),				\
     25 		.data = (_data),				\
     26 		.base = &boot_tvec_bases,			\
     27 	}
     28 
     29 #define DEFINE_TIMER(_name, _function, _expires, _data)		\
     30 	struct timer_list _name =				\
     31 		TIMER_INITIALIZER(_function, _expires, _data)
     32 
     33 void fastcall init_timer(struct timer_list * timer);
     34 
     35 static inline void setup_timer(struct timer_list * timer,
     36 				void (*function)(unsigned long),
     37 				unsigned long data)
     38 {
     39 	timer->function = function;
     40 	timer->data = data;
     41 	init_timer(timer);
     42 }
     43 
     44 /***
     45  * timer_pending - is a timer pending?
     46  * @timer: the timer in question
     47  *
     48  * timer_pending will tell whether a given timer is currently pending,
     49  * or not. Callers must ensure serialization wrt. other operations done
     50  * to this timer, eg. interrupt contexts, or other CPUs on SMP.
     51  *
     52  * return value: 1 if the timer is pending, 0 if not.
     53  */
     54 static inline int timer_pending(const struct timer_list * timer)
     55 {
     56 	return timer->entry.next != NULL;
     57 }
     58 
     59 extern void add_timer_on(struct timer_list *timer, int cpu);
     60 extern int del_timer(struct timer_list * timer);
     61 extern int __mod_timer(struct timer_list *timer, unsigned long expires);
     62 extern int mod_timer(struct timer_list *timer, unsigned long expires);
     63 
     64 extern unsigned long next_timer_interrupt(void);
     65 
     66 /***
     67  * add_timer - start a timer
     68  * @timer: the timer to be added
     69  *
     70  * The kernel will do a ->function(->data) callback from the
     71  * timer interrupt at the ->expires point in the future. The
     72  * current time is 'jiffies'.
     73  *
     74  * The timer's ->expires, ->function (and if the handler uses it, ->data)
     75  * fields must be set prior calling this function.
     76  *
     77  * Timers with an ->expires field in the past will be executed in the next
     78  * timer tick.
     79  */
     80 static inline void add_timer(struct timer_list *timer)
     81 {
     82 	BUG_ON(timer_pending(timer));
     83 	__mod_timer(timer, timer->expires);
     84 }
     85 
     86 #ifdef CONFIG_SMP
     87   extern int try_to_del_timer_sync(struct timer_list *timer);
     88   extern int del_timer_sync(struct timer_list *timer);
     89 #else
     90 # define try_to_del_timer_sync(t)	del_timer(t)
     91 # define del_timer_sync(t)		del_timer(t)
     92 #endif
     93 
     94 #define del_singleshot_timer_sync(t) del_timer_sync(t)
     95 
     96 extern void init_timers(void);
     97 extern void run_local_timers(void);
     98 struct hrtimer;
     99 extern int it_real_fn(struct hrtimer *);
    100 
    101 #endif
    102