linux/include/linux/timer.h
<<
>>
Prefs
   1#ifndef _LINUX_TIMER_H
   2#define _LINUX_TIMER_H
   3
   4#include <linux/list.h>
   5#include <linux/ktime.h>
   6#include <linux/stddef.h>
   7
   8struct tvec_t_base_s;
   9
  10struct 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#ifdef CONFIG_TIMER_STATS
  19        void *start_site;
  20        char start_comm[16];
  21        int start_pid;
  22#endif
  23};
  24
  25extern struct tvec_t_base_s boot_tvec_bases;
  26
  27#define TIMER_INITIALIZER(_function, _expires, _data) {         \
  28                .function = (_function),                        \
  29                .expires = (_expires),                          \
  30                .data = (_data),                                \
  31                .base = &boot_tvec_bases,                       \
  32        }
  33
  34#define DEFINE_TIMER(_name, _function, _expires, _data)         \
  35        struct timer_list _name =                               \
  36                TIMER_INITIALIZER(_function, _expires, _data)
  37
  38void fastcall init_timer(struct timer_list * timer);
  39void fastcall init_timer_deferrable(struct timer_list *timer);
  40
  41static inline void setup_timer(struct timer_list * timer,
  42                                void (*function)(unsigned long),
  43                                unsigned long data)
  44{
  45        timer->function = function;
  46        timer->data = data;
  47        init_timer(timer);
  48}
  49
  50/**
  51 * timer_pending - is a timer pending?
  52 * @timer: the timer in question
  53 *
  54 * timer_pending will tell whether a given timer is currently pending,
  55 * or not. Callers must ensure serialization wrt. other operations done
  56 * to this timer, eg. interrupt contexts, or other CPUs on SMP.
  57 *
  58 * return value: 1 if the timer is pending, 0 if not.
  59 */
  60static inline int timer_pending(const struct timer_list * timer)
  61{
  62        return timer->entry.next != NULL;
  63}
  64
  65extern void add_timer_on(struct timer_list *timer, int cpu);
  66extern int del_timer(struct timer_list * timer);
  67extern int __mod_timer(struct timer_list *timer, unsigned long expires);
  68extern int mod_timer(struct timer_list *timer, unsigned long expires);
  69
  70/*
  71 * The jiffies value which is added to now, when there is no timer
  72 * in the timer wheel:
  73 */
  74#define NEXT_TIMER_MAX_DELTA    ((1UL << 30) - 1)
  75
  76/*
  77 * Return when the next timer-wheel timeout occurs (in absolute jiffies),
  78 * locks the timer base:
  79 */
  80extern unsigned long next_timer_interrupt(void);
  81/*
  82 * Return when the next timer-wheel timeout occurs (in absolute jiffies),
  83 * locks the timer base and does the comparison against the given
  84 * jiffie.
  85 */
  86extern unsigned long get_next_timer_interrupt(unsigned long now);
  87
  88/*
  89 * Timer-statistics info:
  90 */
  91#ifdef CONFIG_TIMER_STATS
  92
  93#define TIMER_STATS_FLAG_DEFERRABLE     0x1
  94
  95extern void init_timer_stats(void);
  96
  97extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
  98                                     void *timerf, char *comm,
  99                                     unsigned int timer_flag);
 100
 101extern void __timer_stats_timer_set_start_info(struct timer_list *timer,
 102                                               void *addr);
 103
 104static inline void timer_stats_timer_set_start_info(struct timer_list *timer)
 105{
 106        __timer_stats_timer_set_start_info(timer, __builtin_return_address(0));
 107}
 108
 109static inline void timer_stats_timer_clear_start_info(struct timer_list *timer)
 110{
 111        timer->start_site = NULL;
 112}
 113#else
 114static inline void init_timer_stats(void)
 115{
 116}
 117
 118static inline void timer_stats_timer_set_start_info(struct timer_list *timer)
 119{
 120}
 121
 122static inline void timer_stats_timer_clear_start_info(struct timer_list *timer)
 123{
 124}
 125#endif
 126
 127extern void delayed_work_timer_fn(unsigned long __data);
 128
 129/**
 130 * add_timer - start a timer
 131 * @timer: the timer to be added
 132 *
 133 * The kernel will do a ->function(->data) callback from the
 134 * timer interrupt at the ->expires point in the future. The
 135 * current time is 'jiffies'.
 136 *
 137 * The timer's ->expires, ->function (and if the handler uses it, ->data)
 138 * fields must be set prior calling this function.
 139 *
 140 * Timers with an ->expires field in the past will be executed in the next
 141 * timer tick.
 142 */
 143static inline void add_timer(struct timer_list *timer)
 144{
 145        BUG_ON(timer_pending(timer));
 146        __mod_timer(timer, timer->expires);
 147}
 148
 149#ifdef CONFIG_SMP
 150  extern int try_to_del_timer_sync(struct timer_list *timer);
 151  extern int del_timer_sync(struct timer_list *timer);
 152#else
 153# define try_to_del_timer_sync(t)       del_timer(t)
 154# define del_timer_sync(t)              del_timer(t)
 155#endif
 156
 157#define del_singleshot_timer_sync(t) del_timer_sync(t)
 158
 159extern void init_timers(void);
 160extern void run_local_timers(void);
 161struct hrtimer;
 162extern enum hrtimer_restart it_real_fn(struct hrtimer *);
 163
 164unsigned long __round_jiffies(unsigned long j, int cpu);
 165unsigned long __round_jiffies_relative(unsigned long j, int cpu);
 166unsigned long round_jiffies(unsigned long j);
 167unsigned long round_jiffies_relative(unsigned long j);
 168
 169
 170#endif
 171
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.