From 81cc401a4ef05a6bc5bcbda5ad27f8a60706aa02 Mon Sep 17 00:00:00 2001 From: Dimitri Staessens 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 Signed-off-by: Sander Vrijders --- 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