From: Ondřej Kuzník Date: Tue, 3 Dec 2013 22:35:53 +0000 (+0000) Subject: Add watermark introspection X-Git-Tag: release-2.1.4-alpha~62^2~3 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4ce242bd0087ed3f6d36c64d0d15094d8a6fc9fc;p=libevent Add watermark introspection --- 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();