diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2008-07-22 10:58:07 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2008-07-22 10:58:07 +0000 |
commit | 5fdc854a464808efaa652b2adb71682660097ced (patch) | |
tree | b0005a1f27101a572a5ff999764dc0514f404b0b /nuttx/drivers | |
parent | fe1b5b31f58240aec58c484cc26f822208169845 (diff) | |
download | px4-nuttx-5fdc854a464808efaa652b2adb71682660097ced.tar.gz px4-nuttx-5fdc854a464808efaa652b2adb71682660097ced.tar.bz2 px4-nuttx-5fdc854a464808efaa652b2adb71682660097ced.zip |
Add support for O_NONBLOCK
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@777 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/drivers')
-rw-r--r-- | nuttx/drivers/fifo.c | 29 |
1 files changed, 25 insertions, 4 deletions
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 <string.h> #include <sched.h> #include <semaphore.h> +#include <fcntl.h> #include <errno.h> #include <assert.h> #include <nuttx/fs.h> @@ -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; } } } |