On 11/25/13 14:56, Lars-Peter Clausen wrote: > Currently the IIO buffer interface only allows non-blocking reads. This patch > adds support for blocking IO. In blocking mode the thread will go to sleep if no > data is available and will wait for the buffer implementation to signal that new > data is available by waking up the buffers waitqueue. > > Signed-off-by: Lars-Peter Clausen <lars@xxxxxxxxxx> Applied to the togreg branch of iio.git Nice little bit of functionality. Thanks. Jonathan > --- > drivers/iio/industrialio-buffer.c | 23 ++++++++++++++++++++++- > 1 file changed, 22 insertions(+), 1 deletion(-) > > diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c > index 4dcc3a0..c67d83b 100644 > --- a/drivers/iio/industrialio-buffer.c > +++ b/drivers/iio/industrialio-buffer.c > @@ -56,13 +56,34 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf, > { > struct iio_dev *indio_dev = filp->private_data; > struct iio_buffer *rb = indio_dev->buffer; > + int ret; > > if (!indio_dev->info) > return -ENODEV; > > if (!rb || !rb->access->read_first_n) > return -EINVAL; > - return rb->access->read_first_n(rb, n, buf); > + > + do { > + if (!iio_buffer_data_available(rb)) { > + if (filp->f_flags & O_NONBLOCK) > + return -EAGAIN; > + > + ret = wait_event_interruptible(rb->pollq, > + iio_buffer_data_available(rb) || > + indio_dev->info == NULL); > + if (ret) > + return ret; > + if (indio_dev->info == NULL) > + return -ENODEV; > + } > + > + ret = rb->access->read_first_n(rb, n, buf); > + if (ret == 0 && (filp->f_flags & O_NONBLOCK)) > + ret = -EAGAIN; > + } while (ret == 0); > + > + return ret; > } > > /** > -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html