日期:2014-05-16  浏览次数:20726 次

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对应的位置是个链表,可以链在一起的,不会覆盖。