首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

linux动态定时器插入时 小弟我没想明白

2012-03-14 
linux动态定时器插入时 我没想明白static void internal_add_timer(struct tvec_base *base, struct timer

linux动态定时器插入时 我没想明白
static void internal_add_timer(struct tvec_base *base, struct timer_list *timer)
{
  unsigned long expires = timer->expires;
  unsigned long idx = expires - base->timer_jiffies;
  struct list_head *vec;

  if (idx < TVR_SIZE) {
  int i = expires & TVR_MASK;
  vec = base->tv1.vec + i;
  } else if (idx < 1 << (TVR_BITS + TVN_BITS)) {
  int i = (expires >> TVR_BITS) & TVN_MASK;
  vec = base->tv2.vec + i;
  } else if (idx < 1 << (TVR_BITS + 2 * TVN_BITS)) {
  int i = (expires >> (TVR_BITS + TVN_BITS)) & TVN_MASK;
  vec = base->tv3.vec + i;
......

根据idx的值确定这个定时器应被插入到哪一个定时器向量中
这个很好理解
但是 插入的具体位置根据定时器的expires值来决定????这我就不懂了。。。
那在不同时刻的两个定时器 他们的idx在都一样的情况下,因为expires肯定不一样
,那插入的位置会不一样。
如果定时器1的expires=0x00ff 定时器2 = 0x0155 若是他们的idx一样,那定时器2不是被插到定时器1前面去了?
如果定时器1的expires=0x0055 定时器2 = 0x0155 若是他们的idx一样,那定时器2不是被插到定时器1那里去了?
请懂的人指点一下。。。。。。

[解决办法]
这个定时器,肯定的排序啊,要不你每次都要检查一遍所有的定时器。排好序就只要检查最先超时那个就可以了。

那个vec对应的位置是个链表,可以链在一起的,不会覆盖。

热点排行