分享

内核定时机制API之timer_setup

 兰宝888 2018-04-18
  1. timer_setup(timer, callback, flags) 用于为第一次使用timer做好准备,一般和add_timer 配合使用  
  2. 其使用的例程如下:  
  3. static void prb_setup_retire_blk_timer(struct packet_sock *po)  
  4. {  
  5.     struct tpacket_kbdq_core *pkc;  
  6.   
  7.     pkc = GET_PBDQC_FROM_RB(&po->rx_ring);  
  8.     timer_setup(&pkc->retire_blk_timer, prb_retire_rx_blk_timer_expired,  
  9.             0);  
  10.     pkc->retire_blk_timer.expires = jiffies;  
  11. }  
  12. 其源码分析如下:  
  13. #define timer_setup(timer, callback, flags)         \  
  14.     __init_timer((timer), (callback), (flags))  
  15. 原来这个是一个宏  
  16. #ifdef CONFIG_LOCKDEP  
  17. #define __init_timer(_timer, _fn, _flags)               \  
  18.     do {                                \  
  19.         static struct lock_class_key __key;         \  
  20.         init_timer_key((_timer), (_fn), (_flags), #_timer, &__key);\  
  21.     } while (0)  
  22.   
  23. #define __init_timer_on_stack(_timer, _fn, _flags)          \  
  24.     do {                                \  
  25.         static struct lock_class_key __key;         \  
  26.         init_timer_on_stack_key((_timer), (_fn), (_flags),  \  
  27.                     #_timer, &__key);        \  
  28.     } while (0)  
  29. #else  
  30. #define __init_timer(_timer, _fn, _flags)               \  
  31.     init_timer_key((_timer), (_fn), (_flags), NULL, NULL)  
  32. #define __init_timer_on_stack(_timer, _fn, _flags)          \  
  33.     init_timer_on_stack_key((_timer), (_fn), (_flags), NULL, NULL)  
  34. #endif  
  35. config_lockedp用于检测死锁,常用debug,这里假定没有开这个宏  
  36. 所以这里的又会转调init_timer_key  
  37. void init_timer_key(struct timer_list *timer,  
  38.             void (*func)(struct timer_list *), unsigned int flags,  
  39.             const char *name, struct lock_class_key *key)  
  40. {  
  41.     #如果没有打开CONFIG_DEBUG_OBJECTS_TIMERS的话,debug_init 为null  
  42.     debug_init(timer);  
  43.     #所以主要调用这个函数初始化timer  
  44.     do_init_timer(timer, func, flags, name, key);  
  45. }  
  46.   
  47. static void do_init_timer(struct timer_list *timer,  
  48.               void (*func)(struct timer_list *),  
  49.               unsigned int flags,  
  50.               const char *name, struct lock_class_key *key)  
  51. {  
  52.     #pprev 为null,说明这个timer处于pending状态,当然了刚开始创建timer的时候当然要pending了,毕竟  
  53.     #还没有开始执行  
  54.     timer->entry.pprev = NULL;  
  55.     #时间到期要执行的回调函数  
  56.     timer->function = func;  
  57.     #看来flags中保存了当前的cpu id  
  58.     timer->flags = flags | raw_smp_processor_id();  
  59.     lockdep_init_map(&timer->lockdep_map, name, key, 0);  
  60. }  
  61. 总结一下,看起来timer_setup(timer, callback, flags) 主要用是用callback和flags来给timer_list *timer 来赋值  
  62. 但是不包括新建这个指针. 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多