From 81cc401a4ef05a6bc5bcbda5ad27f8a60706aa02 Mon Sep 17 00:00:00 2001
From: Dimitri Staessens <dimitri.staessens@ugent.be>
Date: Mon, 30 Oct 2017 13:01:25 +0100
Subject: dev: Split nonblocking read and write

The FLOWFNONBLOCK flag now has two subflags FLOWFRNOBLOCK and
FLOWFWNOBLOCK which allows setting the behavior of read and write
independently. The default behavior is unchanged (blocking read and
write).

Signed-off-by: Dimitri Staessens <dimitri.staessens@ugent.be>
Signed-off-by: Sander Vrijders <sander.vrijders@ugent.be>
---
 doc/man/fccntl.3           | 6 +++++-
 include/ouroboros/fccntl.h | 5 ++++-
 src/lib/dev.c              | 4 ++--
 3 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/doc/man/fccntl.3 b/doc/man/fccntl.3
index ac28aef5..ad1860ea 100644
--- a/doc/man/fccntl.3
+++ b/doc/man/fccntl.3
@@ -52,7 +52,11 @@ argument. Supported flags are:
 
 \fIFLOWFDOWN\fR     - mark flow as down.
 
-\fIFLOWFNONBLOCK\fR - set I/O to non-blocking.
+\fIFLOWFRNOBLOCK\fR - set read to non-blocking.
+
+\fIFLOWFWNOBLOCK\fR - set write to non-blocking.
+
+\fIFLOWFNONBLOCK\fR - set I/O to non-blocking read/write.
 
 \fIFLOWFDEFAULT\fR  - set flow defaults (blocking, read-write).
 
diff --git a/include/ouroboros/fccntl.h b/include/ouroboros/fccntl.h
index 3bd09e65..afaff8fa 100644
--- a/include/ouroboros/fccntl.h
+++ b/include/ouroboros/fccntl.h
@@ -35,7 +35,10 @@
 
 #define FLOWFDOWN     00000004 /* Flow is down          */
 
-#define FLOWFNONBLOCK 00004000 /* Non-blocking flow     */
+#define FLOWFRNOBLOCK 00001000 /* Non-blocking read     */
+#define FLOWFWNOBLOCK 00002000 /* Non-blocking write    */
+#define FLOWFNONBLOCK 00003000 /* Non-blocking rw       */
+
 #define FLOWFDEFAULT  00000002 /* Default, blocking, rw */
 
 #define FLOWFINVALID  (FLOWFWRONLY | FLOWFRDWR)
diff --git a/src/lib/dev.c b/src/lib/dev.c
index 11ab645d..28a99bc4 100644
--- a/src/lib/dev.c
+++ b/src/lib/dev.c
@@ -430,7 +430,7 @@ static ssize_t frcti_read(int fd)
 
                 pthread_rwlock_rdlock(&ai.lock);
 
-                noblock = ai.flows[fd].oflags & FLOWFNONBLOCK;
+                noblock = ai.flows[fd].oflags & FLOWFRNOBLOCK;
                 rb      = ai.flows[fd].rx_rb;
 
                 if (ai.flows[fd].rcv_timesout) {
@@ -1096,7 +1096,7 @@ ssize_t flow_write(int          fd,
                 return -EPERM;
         }
 
-        if (ai.flows[fd].oflags & FLOWFNONBLOCK) {
+        if (ai.flows[fd].oflags & FLOWFWNOBLOCK) {
                 idx = shm_rdrbuff_write(ai.rdrb,
                                        DU_BUFF_HEADSPACE,
                                        DU_BUFF_TAILSPACE,
-- 
cgit v1.2.3