From 5fdc854a464808efaa652b2adb71682660097ced Mon Sep 17 00:00:00 2001 From: patacongo Date: Tue, 22 Jul 2008 10:58:07 +0000 Subject: Add support for O_NONBLOCK git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@777 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/drivers/fifo.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) (limited to 'nuttx/drivers/fifo.c') diff --git a/nuttx/drivers/fifo.c b/nuttx/drivers/fifo.c index 44a2dd69b..c9fa41ea3 100644 --- a/nuttx/drivers/fifo.c +++ b/nuttx/drivers/fifo.c @@ -49,6 +49,7 @@ #include #include #include +#include #include #include #include @@ -270,7 +271,7 @@ static ssize_t fifo_read(FAR struct file *filep, FAR char *buffer, size_t len) struct inode *inode = filep->f_inode; struct fifo_dev_s *dev = inode->i_private; ssize_t nread = 0; - fifo_ndx_t ret; + int ret; /* Some sanity checking */ #if CONFIG_DEBUG @@ -291,7 +292,16 @@ static ssize_t fifo_read(FAR struct file *filep, FAR char *buffer, size_t len) while (dev->d_wrndx == dev->d_rdndx) { -#warning "Support for O_NONBLOCK needed" + /* If O_NONBLOCK was set, then return EGAIN */ + + if (filep->f_oflags & O_NONBLOCK) + { + sem_post(&dev->d_bfsem); + return -EAGAIN; + } + + /* Otherwise, wait for something to be written to the FIFO */ + dev->d_nreaders++; sched_lock(); sem_post(&dev->d_bfsem); @@ -408,17 +418,28 @@ static ssize_t fifo_write(FAR struct file *filep, FAR const char *buffer, size_t sem_post(&dev->d_rdsem); } } + last = nwritten; + + /* If O_NONBLOCK was set, then return partial bytes written or EGAIN */ + + if (filep->f_oflags & O_NONBLOCK) + { + if (nwritten == 0) + { + nwritten = -EAGAIN; + } + sem_post(&dev->d_bfsem); + return nwritten; + } /* There is more to be written.. wait for data to be removed from the FIFO */ -#warning "Support for O_NONBLOCK needed" dev->d_nwriters++; sched_lock(); sem_post(&dev->d_bfsem); fifo_semtake(&dev->d_wrsem); sched_unlock(); fifo_semtake(&dev->d_bfsem); - last = nwritten; } } } -- cgit v1.2.3