等待队列代码实现

本文详细介绍了Linux内核中HPET(High Precision Event Timer)设备驱动的读取操作。通过分析`hpet_read`函数,展示了如何处理中断数据、等待队列、任务状态以及信号中断等关键步骤,揭示了内核同步和调度的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hpet_read(struct file *file, char __user *buf, size_t count, loff_t * ppos)
{
	DECLARE_WAITQUEUE(wait, current); 			/* 定义一个等待队列 */
	unsigned long data;
	ssize_t retval;
	struct hpet_dev *devp;

	devp = file->private_data;				 /* 私有化数据 */
	if (!devp->hd_ireqfreq)
		return -EIO;

	if (count < sizeof(unsigned long))
		return -EINVAL;

	add_wait_queue(&devp->hd_waitqueue, &wait);                    /* 添加到等待队列头 */

	for ( ; ; ) {
		set_current_state(TASK_INTERRUPTIBLE);			/* 设置任务状态 */

		spin_lock_irq(&hpet_lock);
		data = devp->hd_irqdata;
		devp->hd_irqdata = 0;
		spin_unlock_irq(&hpet_lock);

		if (data)
			break;
		else if (file->f_flags & O_NONBLOCK) {
			retval = -EAGAIN;
			goto out;
		} else if (signal_pending(current)) { 		/* 判断是否为信号引起的唤醒 */
			retval = -ERESTARTSYS;
			goto out;
		}
		schedule();						/* 进行一次任务切换 */
	}

	retval = put_user(data, (unsigned long __user *)buf);
	if (!retval)
		retval = sizeof(unsigned long);
out:
	__set_current_state(TASK_RUNNING);
	remove_wait_queue(&devp->hd_waitqueue, &wait);

	return retval;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值