From: Stelian Pop Signed-off-by: Stelian Pop Signed-off-by: Andrew Morton --- 25-akpm/drivers/media/video/meye.c | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+) diff -puN drivers/media/video/meye.c~meye-implement-non-blocking-access-using-poll drivers/media/video/meye.c --- 25/drivers/media/video/meye.c~meye-implement-non-blocking-access-using-poll Thu Nov 4 15:04:39 2004 +++ 25-akpm/drivers/media/video/meye.c Thu Nov 4 15:04:39 2004 @@ -937,6 +937,10 @@ static int meye_do_ioctl(struct inode *i up(&meye.lock); return -EINVAL; case MEYE_BUF_USING: + if (file->f_flags & O_NONBLOCK) { + up(&meye.lock); + return -EAGAIN; + } if (wait_event_interruptible(meye.proc_list, (meye.grab_buffer[*i].state != MEYE_BUF_USING))) { up(&meye.lock); @@ -1072,6 +1076,10 @@ static int meye_do_ioctl(struct inode *i up(&meye.lock); return -EINVAL; case MEYE_BUF_USING: + if (file->f_flags & O_NONBLOCK) { + up(&meye.lock); + return -EAGAIN; + } if (wait_event_interruptible(meye.proc_list, (meye.grab_buffer[*i].state != MEYE_BUF_USING))) { up(&meye.lock); @@ -1137,6 +1145,18 @@ static int meye_ioctl(struct inode *inod return video_usercopy(inode, file, cmd, arg, meye_do_ioctl); } +static unsigned int meye_poll(struct file *file, poll_table *wait) +{ + unsigned int res = 0; + + down(&meye.lock); + poll_wait(file, &meye.proc_list, wait); + if (kfifo_len(meye.doneq)) + res = POLLIN | POLLRDNORM; + up(&meye.lock); + return res; +} + static int meye_mmap(struct file *file, struct vm_area_struct *vma) { unsigned long start = vma->vm_start; unsigned long size = vma->vm_end - vma->vm_start; @@ -1178,6 +1198,7 @@ static struct file_operations meye_fops .release = meye_release, .mmap = meye_mmap, .ioctl = meye_ioctl, + .poll = meye_poll, .llseek = no_llseek, }; _