增加等待队列后的 globalfifo 读写函数的不解????
大牛们,我怎么感觉第31行的函数永远不会执行啊????/*globalfifo 读函数*/
2 staticssize_tglobalfifo_read(structfile*filp,char__user*buf, size_t count, loff_t *ppos)
4 {
5 int ret;
6 struct globalfifo_dev *dev = filp->private_data; //获得设备结构体指针
7 DECLARE_WAITQUEUE(wait, current); //定义等待队列
8
down(&dev->sem); //获得信号量
10 add_wait_queue(&dev->r_wait, &wait); //进入读等待队列头
11
12 /*等待 FIFO 非空*/
13 if (dev->current_len == 0)
14 {
15 if (filp->f_flags &O_NONBLOCK)
16 {
17 ret= - EAGAIN;
18 goto out;
19 }
20 __set_current_state(TASK_INTERRUPTIBLE); //改变进程状态为睡眠
21 up(&dev->sem);
22
23 schedule(); //调度其他进程执行
24
if (signal_pending(current))
25 //如果是因为信号**
26 {
27 ret= - ERESTARTSYS;
28 goto out2;
29 }
30
31 down(&dev->sem);
32 }
33
34 /*复制到用户空间*/
35 if (count > dev->current_len)
36 count = dev->current_len;
37
38 if (copy_to_user(buf, dev->mem, count))
39 {
40 ret= - EFAULT;
41 goto out;
42 }
43 else
44 {
45memcpy(dev->mem,dev->mem+count,dev->current_len-count);
//fifo 数据前移
46 dev->current_len -= count; //有效数据长度减少
47 printk(KERN_INFO"read%dbytes(s),current_len:%d\n",count,
dev
48 ->current_len);
49
50 wake_up_interruptible(&dev->w_wait); //**写等待队列
51
52 ret = count;
53 }
54 out: up(&dev->sem); //释放信号量
55 out2:remove_wait_queue(&dev->w_wait,&wait);//从附属的等待队列
头移除
56 set_current_state(TASK_RUNNING);
57 return ret;
页:
[1]