From 29f104d8e0b46595d8e7a5d315a9ec3afdf26d43 Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Thu, 27 Jul 2017 20:21:38 +0000 Subject: Add unixmessage_receiver_hasmsginbuf, fix unixmessage_handle --- package/deps.mak | 1 + src/include/skalibs/unixmessage.h | 4 +++- src/libunixonacid/unixmessage_handle.c | 3 +-- .../unixmessage_receiver_hasmsginbuf.c | 21 +++++++++++++++++++++ 4 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 src/libunixonacid/unixmessage_receiver_hasmsginbuf.c 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 +#include +#include +#include +#include +#include + +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 ; +} -- cgit v1.2.3