blob: 72f3a7781106ab1290198d25edd33a8723588e0b [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001#ifndef _LINUX_TIMER_H
2#define _LINUX_TIMER_H
3
4#include <linux/config.h>
5#include <linux/list.h>
6#include <linux/spinlock.h>
7#include <linux/stddef.h>
8
Oleg Nesterov55c888d2005-06-23 00:08:56 -07009struct timer_base_s;
Linus Torvalds1da177e2005-04-16 15:20:36 -070010
11struct timer_list {
12 struct list_head entry;
13 unsigned long expires;
14
Linus Torvalds1da177e2005-04-16 15:20:36 -070015 void (*function)(unsigned long);
16 unsigned long data;
17
Oleg Nesterov55c888d2005-06-23 00:08:56 -070018 struct timer_base_s *base;
Linus Torvalds1da177e2005-04-16 15:20:36 -070019};
20
Oleg Nesterov55c888d2005-06-23 00:08:56 -070021extern struct timer_base_s __init_timer_base;
22
Linus Torvalds1da177e2005-04-16 15:20:36 -070023#define TIMER_INITIALIZER(_function, _expires, _data) { \
24 .function = (_function), \
25 .expires = (_expires), \
26 .data = (_data), \
Oleg Nesterov55c888d2005-06-23 00:08:56 -070027 .base = &__init_timer_base, \
Linus Torvalds1da177e2005-04-16 15:20:36 -070028 }
29
Ingo Molnar8d06afa2005-09-09 13:10:40 -070030#define DEFINE_TIMER(_name, _function, _expires, _data) \
31 struct timer_list _name = \
32 TIMER_INITIALIZER(_function, _expires, _data)
33
Oleg Nesterov55c888d2005-06-23 00:08:56 -070034void fastcall init_timer(struct timer_list * timer);
Linus Torvalds1da177e2005-04-16 15:20:36 -070035
Oleg Nesterova8db2db2005-10-30 15:01:38 -080036static inline void setup_timer(struct timer_list * timer,
37 void (*function)(unsigned long),
38 unsigned long data)
39{
40 timer->function = function;
41 timer->data = data;
42 init_timer(timer);
43}
44
Linus Torvalds1da177e2005-04-16 15:20:36 -070045/***
46 * timer_pending - is a timer pending?
47 * @timer: the timer in question
48 *
49 * timer_pending will tell whether a given timer is currently pending,
50 * or not. Callers must ensure serialization wrt. other operations done
51 * to this timer, eg. interrupt contexts, or other CPUs on SMP.
52 *
53 * return value: 1 if the timer is pending, 0 if not.
54 */
55static inline int timer_pending(const struct timer_list * timer)
56{
Oleg Nesterov55c888d2005-06-23 00:08:56 -070057 return timer->entry.next != NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -070058}
59
60extern void add_timer_on(struct timer_list *timer, int cpu);
61extern int del_timer(struct timer_list * timer);
62extern int __mod_timer(struct timer_list *timer, unsigned long expires);
63extern int mod_timer(struct timer_list *timer, unsigned long expires);
64
65extern unsigned long next_timer_interrupt(void);
66
67/***
68 * add_timer - start a timer
69 * @timer: the timer to be added
70 *
71 * The kernel will do a ->function(->data) callback from the
72 * timer interrupt at the ->expired point in the future. The
73 * current time is 'jiffies'.
74 *
75 * The timer's ->expired, ->function (and if the handler uses it, ->data)
76 * fields must be set prior calling this function.
77 *
78 * Timers with an ->expired field in the past will be executed in the next
79 * timer tick.
80 */
Andrew Morton15d2bac2005-10-30 15:02:24 -080081static inline void add_timer(struct timer_list *timer)
Linus Torvalds1da177e2005-04-16 15:20:36 -070082{
Andrew Morton15d2bac2005-10-30 15:02:24 -080083 BUG_ON(timer_pending(timer));
Linus Torvalds1da177e2005-04-16 15:20:36 -070084 __mod_timer(timer, timer->expires);
85}
86
87#ifdef CONFIG_SMP
Oleg Nesterovfd450b72005-06-23 00:08:59 -070088 extern int try_to_del_timer_sync(struct timer_list *timer);
Linus Torvalds1da177e2005-04-16 15:20:36 -070089 extern int del_timer_sync(struct timer_list *timer);
Linus Torvalds1da177e2005-04-16 15:20:36 -070090#else
Oleg Nesterovfd450b72005-06-23 00:08:59 -070091# define try_to_del_timer_sync(t) del_timer(t)
92# define del_timer_sync(t) del_timer(t)
Linus Torvalds1da177e2005-04-16 15:20:36 -070093#endif
94
Oleg Nesterov55c888d2005-06-23 00:08:56 -070095#define del_singleshot_timer_sync(t) del_timer_sync(t)
96
Linus Torvalds1da177e2005-04-16 15:20:36 -070097extern void init_timers(void);
98extern void run_local_timers(void);
99extern void it_real_fn(unsigned long);
100
101#endif