From 4ce242bd0087ed3f6d36c64d0d15094d8a6fc9fc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ond=C5=99ej=20Kuzn=C3=ADk?= Date: Tue, 3 Dec 2013 22:35:53 +0000 Subject: [PATCH] Add watermark introspection --- bufferevent.c | 21 +++++++++++++++++++++ include/event2/bufferevent.h | 12 ++++++++++++ test/regress_bufferevent.c | 15 +++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/bufferevent.c b/bufferevent.c index 3cd1ba62..96ce109f 100644 --- a/bufferevent.c +++ b/bufferevent.c @@ -596,6 +596,27 @@ bufferevent_setwatermark(struct bufferevent *bufev, short events, BEV_UNLOCK(bufev); } +void +bufferevent_getwatermark(struct bufferevent *bufev, short events, + size_t *lowmark, size_t *highmark) +{ + BEV_LOCK(bufev); + if (events & EV_WRITE) { + if (lowmark) + *lowmark = bufev->wm_write.low; + if (highmark) + *highmark = bufev->wm_write.high; + } + + if (events & EV_READ) { + if (lowmark) + *lowmark = bufev->wm_read.low; + if (highmark) + *highmark = bufev->wm_read.high; + } + BEV_UNLOCK(bufev); +} + int bufferevent_flush(struct bufferevent *bufev, short iotype, diff --git a/include/event2/bufferevent.h b/include/event2/bufferevent.h index f3cf1d6e..efe0617b 100644 --- a/include/event2/bufferevent.h +++ b/include/event2/bufferevent.h @@ -507,6 +507,18 @@ int bufferevent_set_timeouts(struct bufferevent *bufev, void bufferevent_setwatermark(struct bufferevent *bufev, short events, size_t lowmark, size_t highmark); +/** + Retrieves the watermarks for read or write events. Result is undefined if + events contains both EV_READ and EV_WRITE. + + @param bufev the bufferevent to be examined + @param events EV_READ or EV_WRITE + @param lowmark receives the lower watermark if not NULL + @param highmark receives the high watermark if not NULL +*/ +void bufferevent_getwatermark(struct bufferevent *bufev, short events, + size_t *lowmark, size_t *highmark); + /** Acquire the lock on a bufferevent. Has no effect if locking was not enabled with BEV_OPT_THREADSAFE. diff --git a/test/regress_bufferevent.c b/test/regress_bufferevent.c index 1be16216..89c405bf 100644 --- a/test/regress_bufferevent.c +++ b/test/regress_bufferevent.c @@ -243,6 +243,7 @@ test_bufferevent_watermarks_impl(int use_pair) { struct bufferevent *bev1 = NULL, *bev2 = NULL; char buffer[65000]; + size_t low, high; int i; test_ok = 0; @@ -262,16 +263,30 @@ test_bufferevent_watermarks_impl(int use_pair) bufferevent_disable(bev1, EV_READ); bufferevent_enable(bev2, EV_READ); + /* By default, low watermarks are set to 0 */ + bufferevent_getwatermark(bev1, EV_READ, &low, NULL); + tt_int_op(low, ==, 0); + bufferevent_getwatermark(bev2, EV_WRITE, &low, NULL); + tt_int_op(low, ==, 0); + for (i = 0; i < (int)sizeof(buffer); i++) buffer[i] = (char)i; /* limit the reading on the receiving bufferevent */ bufferevent_setwatermark(bev2, EV_READ, 10, 20); + bufferevent_getwatermark(bev2, EV_READ, &low, &high); + tt_int_op(low, ==, 10); + tt_int_op(high, ==, 20); + /* Tell the sending bufferevent not to notify us till it's down to 100 bytes. */ bufferevent_setwatermark(bev1, EV_WRITE, 100, 2000); + bufferevent_getwatermark(bev1, EV_WRITE, &low, &high); + tt_int_op(low, ==, 100); + tt_int_op(high, ==, 2000); + bufferevent_write(bev1, buffer, sizeof(buffer)); event_dispatch(); -- 2.40.0