blob: 0a485beba9f511ddb935044bee1c7f6696c51214 [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 Nesterov3691c512006-03-31 02:30:30 -08009struct tvec_t_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 Nesterov3691c512006-03-31 02:30:30 -080018 struct tvec_t_base_s *base;
Linus Torvalds1da177e2005-04-16 15:20:36 -070019};
20
Oleg Nesterov3691c512006-03-31 02:30:30 -080021extern struct tvec_t_base_s boot_tvec_bases;
Oleg Nesterov55c888d2005-06-23 00:08:56 -070022
Linus Torvalds1da177e2005-04-16 15:20:36 -070023#define TIMER_INITIALIZER(_function, _expires, _data) { \
24 .function = (_function), \
25 .expires = (_expires), \
26 .data = (_data), \
Oleg Nesterov3691c512006-03-31 02:30:30 -080027 .base = &boot_tvec_bases, \
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
Andrzej Zaborowski13fce802006-03-24 18:13:37 +010072 * timer interrupt at the ->expires point in the future. The
Linus Torvalds1da177e2005-04-16 15:20:36 -070073 * current time is 'jiffies'.
74 *
Andrzej Zaborowski13fce802006-03-24 18:13:37 +010075 * The timer's ->expires, ->function (and if the handler uses it, ->data)
Linus Torvalds1da177e2005-04-16 15:20:36 -070076 * fields must be set prior calling this function.
77 *
Andrzej Zaborowski13fce802006-03-24 18:13:37 +010078 * Timers with an ->expires field in the past will be executed in the next
Linus Torvalds1da177e2005-04-16 15:20:36 -070079 * 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);
Roman Zippel05cfb612006-03-26 01:38:12 -080099struct hrtimer;
100extern int it_real_fn(struct hrtimer *);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700101
102#endif