您好,欢迎来到刀刀网。
搜索
您的当前位置:首页等待队列代码实现

等待队列代码实现

来源:刀刀网
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;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务