内核定时机制API之set_normalized_timespec64

void set_normalized_timespec64(struct timespec64 *ts, time64_t sec, s64 nsec) 用于将形参的sec和nsec分别赋值给timespec64的成员
变量,这里第三个形参nsec的范围应该在0 <= tv_nsec < NSEC_PER_SEC之内
其源码分析如下:

void set_normalized_timespec64(struct timespec64 *ts, time64_t sec, s64 nsec)
{
#可以看到这里nsec表示的时间可以大于1s,会将大于1s的时间转成秒
	while (nsec >= NSEC_PER_SEC) {
		/*
		 * The following asm() prevents the compiler from
		 * optimising this loop into a modulo operation. See
		 * also __iter_div_u64_rem() in include/linux/time.h
		 */
		asm("" : "+rm"(nsec));
		#注意这里做减法后可能导致nsec小于零,但是没有关系,后面的while 会处理小于零的case.
		nsec -= NSEC_PER_SEC;
		++sec;
	}
#nsec 表示的时间也可以小于0,会让总的秒数减一,来补偿nsec让其不用小于零
	while (nsec < 0) {
		asm("" : "+rm"(nsec));
		nsec += NSEC_PER_SEC;
		--sec;
	}
	ts->tv_sec = sec;
	ts->tv_nsec = nsec;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值