timer.h 2.4 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8
#ifndef _LINUX_TIMER_H
#define _LINUX_TIMER_H

#include <linux/config.h>
#include <linux/list.h>
#include <linux/spinlock.h>
#include <linux/stddef.h>

9
struct timer_base_s;
L
Linus Torvalds 已提交
10 11 12 13 14 15 16 17 18 19

struct timer_list {
	struct list_head entry;
	unsigned long expires;

	unsigned long magic;

	void (*function)(unsigned long);
	unsigned long data;

20
	struct timer_base_s *base;
L
Linus Torvalds 已提交
21 22 23 24
};

#define TIMER_MAGIC	0x4b87ad6e

25 26
extern struct timer_base_s __init_timer_base;

L
Linus Torvalds 已提交
27 28 29 30
#define TIMER_INITIALIZER(_function, _expires, _data) {		\
		.function = (_function),			\
		.expires = (_expires),				\
		.data = (_data),				\
31
		.base = &__init_timer_base,			\
L
Linus Torvalds 已提交
32 33 34
		.magic = TIMER_MAGIC,				\
	}

35
void fastcall init_timer(struct timer_list * timer);
L
Linus Torvalds 已提交
36 37 38 39 40 41 42 43 44 45 46 47 48

/***
 * timer_pending - is a timer pending?
 * @timer: the timer in question
 *
 * timer_pending will tell whether a given timer is currently pending,
 * or not. Callers must ensure serialization wrt. other operations done
 * to this timer, eg. interrupt contexts, or other CPUs on SMP.
 *
 * return value: 1 if the timer is pending, 0 if not.
 */
static inline int timer_pending(const struct timer_list * timer)
{
49
	return timer->entry.next != NULL;
L
Linus Torvalds 已提交
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
}

extern void add_timer_on(struct timer_list *timer, int cpu);
extern int del_timer(struct timer_list * timer);
extern int __mod_timer(struct timer_list *timer, unsigned long expires);
extern int mod_timer(struct timer_list *timer, unsigned long expires);

extern unsigned long next_timer_interrupt(void);

/***
 * add_timer - start a timer
 * @timer: the timer to be added
 *
 * The kernel will do a ->function(->data) callback from the
 * timer interrupt at the ->expired point in the future. The
 * current time is 'jiffies'.
 *
 * The timer's ->expired, ->function (and if the handler uses it, ->data)
 * fields must be set prior calling this function.
 *
 * Timers with an ->expired field in the past will be executed in the next
 * timer tick.
 */
static inline void add_timer(struct timer_list * timer)
{
	__mod_timer(timer, timer->expires);
}

#ifdef CONFIG_SMP
79
  extern int try_to_del_timer_sync(struct timer_list *timer);
L
Linus Torvalds 已提交
80 81
  extern int del_timer_sync(struct timer_list *timer);
#else
82 83
# define try_to_del_timer_sync(t)	del_timer(t)
# define del_timer_sync(t)		del_timer(t)
L
Linus Torvalds 已提交
84 85
#endif

86 87
#define del_singleshot_timer_sync(t) del_timer_sync(t)

L
Linus Torvalds 已提交
88 89 90 91 92
extern void init_timers(void);
extern void run_local_timers(void);
extern void it_real_fn(unsigned long);

#endif