static ssize_t file_read(struct file *file, char __user * buffer, size_t count, loff_t * ppos) { int minor = iminor(file->f_path.dentry->d_inode); /* data available? */ if (!rtlx_read_poll(minor, (file->f_flags & O_NONBLOCK) ? 0 : 1)) { return 0; // -EAGAIN makes cat whinge } return rtlx_read(minor, buffer, count); }
static ssize_t file_read(struct file *file, char __user * buffer, size_t count, loff_t * ppos) { int minor = iminor(file->f_path.dentry->d_inode); if (!rtlx_read_poll(minor, (file->f_flags & O_NONBLOCK) ? 0 : 1)) { return 0; } return rtlx_read(minor, buffer, count); }
static unsigned int file_poll(struct file *file, poll_table * wait) { int minor = iminor(file_inode(file)); unsigned int mask = 0; poll_wait(file, &channel_wqs[minor].rt_queue, wait); poll_wait(file, &channel_wqs[minor].lx_queue, wait); if (rtlx == NULL) return 0; /* data available to read? */ if (rtlx_read_poll(minor, 0)) mask |= POLLIN | POLLRDNORM; /* space to write */ if (rtlx_write_poll(minor)) mask |= POLLOUT | POLLWRNORM; return mask; }
static unsigned int file_poll(struct file *file, poll_table * wait) { int minor; unsigned int mask = 0; minor = iminor(file->f_path.dentry->d_inode); poll_wait(file, &channel_wqs[minor].rt_queue, wait); poll_wait(file, &channel_wqs[minor].lx_queue, wait); if (rtlx == NULL) return 0; if (rtlx_read_poll(minor, 0)) mask |= POLLIN | POLLRDNORM; if (rtlx_write_poll(minor)) mask |= POLLOUT | POLLWRNORM; return mask; }