summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2017-07-27 20:21:38 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2017-07-27 20:21:38 +0000
commit29f104d8e0b46595d8e7a5d315a9ec3afdf26d43 (patch)
tree469f5e58c4bd89f41f33e4f605862e8a25e8dfb8
parentd7588f1fa9d007184163fe5863f87be41d659177 (diff)
downloadskalibs-29f104d8e0b46595d8e7a5d315a9ec3afdf26d43.tar.xz
Add unixmessage_receiver_hasmsginbuf, fix unixmessage_handle
-rw-r--r--package/deps.mak1
-rw-r--r--src/include/skalibs/unixmessage.h4
-rw-r--r--src/libunixonacid/unixmessage_handle.c3
-rw-r--r--src/libunixonacid/unixmessage_receiver_hasmsginbuf.c21
4 files changed, 26 insertions, 3 deletions
diff --git a/package/deps.mak b/package/deps.mak
index 372f806..3bf37f1 100644
--- a/package/deps.mak
+++ b/package/deps.mak
@@ -757,6 +757,7 @@ src/libunixonacid/unixmessage_put.o src/libunixonacid/unixmessage_put.lo: src/li
src/libunixonacid/unixmessage_receive.o src/libunixonacid/unixmessage_receive.lo: src/libunixonacid/unixmessage_receive.c src/include/skalibs/allreadwrite.h src/include/skalibs/cbuffer.h src/include/skalibs/djbunix.h src/include/skalibs/error.h src/include/skalibs/nonposix.h src/include/skalibs/stralloc.h src/include/skalibs/sysdeps.h src/include/skalibs/uint16.h src/include/skalibs/uint32.h src/include/skalibs/unixmessage.h
src/libunixonacid/unixmessage_receiver_0.o src/libunixonacid/unixmessage_receiver_0.lo: src/libunixonacid/unixmessage_receiver_0.c src/include/skalibs/unixmessage.h
src/libunixonacid/unixmessage_receiver_free.o src/libunixonacid/unixmessage_receiver_free.lo: src/libunixonacid/unixmessage_receiver_free.c src/include/skalibs/cbuffer.h src/include/skalibs/djbunix.h src/include/skalibs/stralloc.h src/include/skalibs/unixmessage.h
+src/libunixonacid/unixmessage_receiver_hasmsginbuf.o src/libunixonacid/unixmessage_receiver_hasmsginbuf.lo: src/libunixonacid/unixmessage_receiver_hasmsginbuf.c src/include/skalibs/cbuffer.h src/include/skalibs/siovec.h src/include/skalibs/uint32.h src/include/skalibs/unixmessage.h
src/libunixonacid/unixmessage_receiver_init.o src/libunixonacid/unixmessage_receiver_init.lo: src/libunixonacid/unixmessage_receiver_init.c src/include/skalibs/cbuffer.h src/include/skalibs/stralloc.h src/include/skalibs/unixmessage.h
src/libunixonacid/unixmessage_sender_1.o src/libunixonacid/unixmessage_sender_1.lo: src/libunixonacid/unixmessage_sender_1.c src/include/skalibs/unixmessage.h
src/libunixonacid/unixmessage_sender_closecb.o src/libunixonacid/unixmessage_sender_closecb.lo: src/libunixonacid/unixmessage_sender_closecb.c src/include/skalibs/djbunix.h src/include/skalibs/unixmessage.h
diff --git a/src/include/skalibs/unixmessage.h b/src/include/skalibs/unixmessage.h
index 94f62c6..a246cd6 100644
--- a/src/include/skalibs/unixmessage.h
+++ b/src/include/skalibs/unixmessage.h
@@ -43,7 +43,7 @@ extern unixmessage_v_t const unixmessage_v_zero ;
#define UNIXMESSAGE_MAXFDS 255
#define UNIXMESSAGE_BUFSIZE 2048
#define UNIXMESSAGE_AUXBUFSIZE (sizeof(int) * UNIXMESSAGE_MAXFDS + 1)
-#define UNIXMESSAGE_MAXREADS 4096
+#define UNIXMESSAGE_MAXREADS 128
/* Sender */
@@ -125,6 +125,8 @@ extern void unixmessage_receiver_free (unixmessage_receiver_t *) ;
#define unixmessage_receiver_isempty(b) (cbuffer_isempty(&(b)->mainb) && cbuffer_isempty(&(b)->auxb))
#define unixmessage_receiver_isfull(b) (cbuffer_isfull(&(b)->mainb) || cbuffer_isfull(&(b)->auxb))
+extern int unixmessage_receiver_hasmsginbuf (unixmessage_receiver_t const *) ;
+
extern int unixmessage_receive (unixmessage_receiver_t *, unixmessage_t *) ;
extern int unixmessage_timed_receive (unixmessage_receiver_t *, unixmessage_t *, tain_t const *, tain_t *) ;
#define unixmessage_timed_receive_g(receiver, msg, deadline) unixmessage_timed_receive(receiver, msg, (deadline), &STAMP)
diff --git a/src/libunixonacid/unixmessage_handle.c b/src/libunixonacid/unixmessage_handle.c
index 9d9de5c..487430d 100644
--- a/src/libunixonacid/unixmessage_handle.c
+++ b/src/libunixonacid/unixmessage_handle.c
@@ -4,9 +4,8 @@
int unixmessage_handle (unixmessage_receiver_t *b, unixmessage_handler_func_t_ref f, void *p)
{
- unsigned int n = UNIXMESSAGE_MAXREADS ;
unsigned int count = 0 ;
- while (n--)
+ while (count < UNIXMESSAGE_MAXREADS || unixmessage_receiver_hasmsginbuf(b))
{
unixmessage_t m ;
int r = unixmessage_receive(b, &m) ;
diff --git a/src/libunixonacid/unixmessage_receiver_hasmsginbuf.c b/src/libunixonacid/unixmessage_receiver_hasmsginbuf.c
new file mode 100644
index 0000000..0a5f7d2
--- /dev/null
+++ b/src/libunixonacid/unixmessage_receiver_hasmsginbuf.c
@@ -0,0 +1,21 @@
+/* ISC license. */
+
+#include <stdint.h>
+#include <sys/uio.h>
+#include <skalibs/uint32.h>
+#include <skalibs/siovec.h>
+#include <skalibs/cbuffer.h>
+#include <skalibs/unixmessage.h>
+
+int unixmessage_receiver_hasmsginbuf (unixmessage_receiver_t const *b)
+{
+ size_t len = cbuffer_len(&b->mainb) ;
+ uint32_t mainlen ;
+ char pack[4] ;
+ struct iovec v[2] ;
+ if (len < 6) return 0 ;
+ cbuffer_rpeek(&b->mainb, v) ;
+ siovec_gather(v, 2, pack, 4) ;
+ uint32_unpack_big(pack, &mainlen) ;
+ return len - 6 >= mainlen ;
+}