进程调度API之preempt_count_add(val)/preempt_count_sub(val)

preempt_count_add(val)/preempt_count_sub(val)分别用于增加和减小当前进程的引用计数
如果治理的val等于1的话,则等同于下面这两个宏
#define preempt_count_inc() preempt_count_add(1)
#define preempt_count_dec() preempt_count_sub(1)
使用的例子如下:
例如我们一般在进入irq 处理函数的时候会调用preempt_count_add 来增加当前进程的引用计数,
如果引用计数不为0的话,则可以防止内核抢占。

#define __irq_enter()					\
	do {						\
		account_irq_enter_time(current);	\
		preempt_count_add(HARDIRQ_OFFSET);	\
		trace_hardirq_enter();			\
	} while (0)
其源码分析如下:
#define preempt_count_add(val)	__preempt_count_add(val)
#define preempt_count_sub(val)	__preempt_count_sub(val)

static __always_inline void __preempt_count_add(int val)
{
	*preempt_count_ptr() += val;
}

static __always_inline void __preempt_count_sub(int val)
{
	*preempt_count_ptr() -= val;
}
这里分别调用preempt_count_ptr的返回值增加或者减小val
而preempt_count_ptr 定义如下:
static __always_inline volatile int *preempt_count_ptr(void)
{
	return ¤t_thread_info()->preempt_count;
}
可见值直接操作当前thread的preempt_count

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值