Add watermark introspection

This commit is contained in:
Ondřej Kuzník 2013-12-03 22:35:53 +00:00
parent 13a9a020e1
commit 4ce242bd00
3 changed files with 48 additions and 0 deletions

View File

@ -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,

View File

@ -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.

View File

@ -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();