muyangzhe123 发表于 2014-03-13 15:41

增加等待队列后的 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]
查看完整版本: 增加等待队列后的 globalfifo 读写函数的不解????