Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1043047
  • 博文数量: 297
  • 博客积分: 11721
  • 博客等级: 上将
  • 技术积分: 3431
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-25 10:21
文章分类

全部博文(297)

文章存档

2016年(9)

2011年(71)

2010年(137)

2009年(80)

分类: 嵌入式

2009-07-15 17:35:45

poll 方法的 scullpipe 实现:

static unsigned int scull_p_poll(struct file *filp, poll_table *wait)
{
    //获取设备数据结构
        struct scull_pipe *dev = filp->private_data;   
        unsigned int mask = 0;

        /*
        * The buffer is circular; it is considered full
        * if "wp" is right behind "rp" and empty if the
        * two are equal.
        */
        down(&dev->sem);  //设置设备旗标

    //将filp描述符指针指向的设备的 等待队列加入到 poll_table中。
        poll_wait(filp, &dev->inq,  wait);
        poll_wait(filp, &dev->outq, wait);
        if (dev->rp != dev->wp)
                mask |= POLLIN | POLLRDNORM;  /* readable */
        if (spacefree(dev))  //判断是否有剩余空间
                mask |= POLLOUT | POLLWRNORM;  /* writable */
        up(&dev->sem);  //释放设备旗标
        return mask;    
}

这个代码简单地增加了 2 个 scullpipe 等待队列到 poll_table, 接着根据数据是否可以读或写,设置正确的掩码位.

poll_table结构的作用:
当应用程式触发poll( )或select的其中之一,核心就依据系统呼叫指定的fd来启动对应装置档的poll作业方法,并将相同的poll_table回传。
poll_table本身是一个由poll_table_entry结构所组成的阵列,每个poll_table_entry结构都是核心在收到poll( )或select( )系统呼叫时,特地为该次呼叫所配置的。
如果被调查的驱动程式中,没有任何一个表示能立即执行I/O而不推延,则poll( )会休眠,直到它所处的待命伫列之一苏醒为止。
在poll( )系统呼叫完成任务之後,poll_table结构就被释放掉了,而先前被加到poll_table的所有待命伫列项目也会被移出轮询表。


阅读(1083) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~