]> granicus.if.org Git - libevent/commitdiff
Add watermark introspection
authorOndřej Kuzník <ondra@mistotebe.net>
Tue, 3 Dec 2013 22:35:53 +0000 (22:35 +0000)
committerOndřej Kuzník <ondra@mistotebe.net>
Tue, 3 Dec 2013 23:39:13 +0000 (23:39 +0000)
bufferevent.c
include/event2/bufferevent.h
test/regress_bufferevent.c

index 3cd1ba6291f2047930534232cafda9799434b628..96ce109f18376ada458cc16613197f2fbedc0667 100644 (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,
index f3cf1d6ef21e6456778a2c31ecf7ab7160002b34..efe0617b989af79d2323db01d4e6059162ac7812 100644 (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.
index 1be16216d7cebed9f786bd86c72bf4ff369371c5..89c405bf99f7f4106df0c4bee6e32e169cf5d078 100644 (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();