linux - 是否需要在 del_timer() 之后再次调用 init_timer()

标签 linux timer module kernel

我有一个创建计时器的 Linux 模块,其中一些计时器可能会在它们的处理程序函数期间再次添加它们自己。

在其他一些情况下,使用 del_timer_sync() 删除计时器(可能在它关闭之前)。

在这种情况下,我是否需要在下一个 add_timer() 之前对结构再次调用 init_timer() 还是只是浪费(宝贵的) 中断延迟?

最佳答案

为了回答我自己的问题,我相信如果我打算再次访问该结构,我确实需要在任何 del_timer() 或 del_timer_sync() 之后对我的结构进行 init_timer() - 例如,在执行 timer_pending() 或其他操作时在模块清理期间。

我认为在编写可能重用定时器的内核模块时,最好的做法是:

static struct timer_list my_timer;

...

static void remove_my_timer(void)
{
  if (timer_pending(&my_timer))
  {
    del_timer_sync(&my_timer);
    init_timer(&my_timer);
  }
}

static void arm_my_timer(...)
{
  remove_my_timer();
  my_timer.expires  = ...;
  my_timer.data     = ...;
  my_timer.function = ...;
  add_timer(&my_timer);
}

...

int __init init_my_device(void)
{
  ...
  init_timer(&my_timer);
  ...
}

void __exit cleanup_my_device(void)
{
  ...
  remove_my_timer();
  ...
}

希望以后能对其他人有所帮助。

关于linux - 是否需要在 del_timer() 之后再次调用 init_timer(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19979276/

相关文章:

linux - 我应该怎么做才能创建 Linux 可安装 I2C EEPROM 设备?

c++ - 我如何获得与打开它们的应用程序关联的端口?

c - 在下面的代码中 fork 后发送信号有什么问题

java - android 秒表/计时器应用程序 - 当时间用完时切换回应用程序

perl - 为什么 AnyEvent 计时器观察器必须在其回调中取消定义才能触发?

Javascript简易计时器不起作用

python - 在 python 中,如果一个模块调用另一个模块的函数,该函数是否可以访问第一个模块的文件路径?

c - 选择中断的系统调用

python - 导入可选模块

python - 如何将文件名作为参数传递到我的模块中?