中断API之tasklet_init/tasklet_kill

void tasklet_init(struct tasklet_struct *t,void (*func)(unsigned long), unsigned long data)
用于初始化一个tasklet.
其源码分析如下:
void tasklet_init(struct tasklet_struct *t,
		  void (*func)(unsigned long), unsigned long data)
{
	t->next = NULL;
	t->state = 0;
	atomic_set(&t->count, 0);
	t->func = func;
	t->data = data;
}
可以看到tasklet_init 主要就是给tasklet_struct 结构体的成员变量赋值为形参.
tasklet_kill 则用于清掉tasklet_struct成员变量的state的TASKLET_STATE_SCHED位。来禁止这个tasklet
被调度运行.
void tasklet_kill(struct tasklet_struct *t)
{
	#tasklet_kill 可以被用于中断环境中,且如果是中断环境中则打印下面的log.
	if (in_interrupt())
		pr_notice("Attempt to kill tasklet from interrupt\n");
	#返回state的值,state的值只能是
	#enum
	#	{
	#	TASKLET_STATE_SCHED,	/* Tasklet is scheduled for execution */
	#	TASKLET_STATE_RUN	/* Tasklet is running (SMP only) */
	#	};
	#也就是只能是0或者1.如果返回TASKLET_STATE_SCHED的话,也就是说这个tasklet没有
	#被运行,这个while循环不成立。如果state的原来的状态就是TASKLET_STATE_RUN,则这个
	#while 循环成立,进入到内循环中判断state是否被已经是TASKLET_STATE_SCHED,如果是的话,则退出
	#内循环,这个时候外循环也就退出了
	#
	
	while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) {
		do {
			yield();
		} while (test_bit(TASKLET_STATE_SCHED, &t->state));
	}
	#等待这个tasklet 被执行
	tasklet_unlock_wait(t);
	#清理tasklet中的TASKLET_STATE_SCHED 位
	clear_bit(TASKLET_STATE_SCHED, &t->state);
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值