summaryrefslogtreecommitdiff
path: root/nuttx
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-07-22 10:58:07 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-07-22 10:58:07 +0000
commit5fdc854a464808efaa652b2adb71682660097ced (patch)
treeb0005a1f27101a572a5ff999764dc0514f404b0b /nuttx
parentfe1b5b31f58240aec58c484cc26f822208169845 (diff)
downloadpx4-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')
-rw-r--r--nuttx/drivers/fifo.c29
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;
}
}
}