]> git.meshlink.io Git - utcp/commitdiff
Don't call the poll callback unnecessarily.
authorGuus Sliepen <guus@sliepen.org>
Sun, 29 Mar 2020 14:21:51 +0000 (16:21 +0200)
committerGuus Sliepen <guus@sliepen.org>
Sun, 29 Mar 2020 14:21:51 +0000 (16:21 +0200)
Currently we call the poll callback if there is any free space in the send
buffer, every time we call utcp_timeout(). However, if the application
does not send anything inside the callback, then it most likely won't send
anything the next time if the free space in the send buffer did not change.
So only call the callback when more space has been made available in the
send buffer.

utcp.c
utcp_priv.h

diff --git a/utcp.c b/utcp.c
index 0b36de15263b8b005c0625f866e901054432b5ba..6aa985f72701ee2eb0f6e4f1a3f9497cc6ddedd0 100644 (file)
--- a/utcp.c
+++ b/utcp.c
@@ -749,6 +749,7 @@ ssize_t utcp_send(struct utcp_connection *c, const void *data, size_t len) {
        if(!is_reliable(c)) {
                c->snd.una = c->snd.nxt = c->snd.last;
                buffer_discard(&c->sndbuf, c->sndbuf.used);
+               c->do_poll = true;
        }
 
        if(is_reliable(c) && !timespec_isset(&c->rtrx_timeout)) {
@@ -1484,6 +1485,7 @@ synack:
 
                if(data_acked) {
                        buffer_discard(&c->sndbuf, data_acked);
+                       c->do_poll = true;
                }
 
                // Also advance snd.nxt if possible
@@ -2001,8 +2003,9 @@ struct timespec utcp_timeout(struct utcp *utcp) {
                }
 
                if(c->poll) {
-                       if((c->state == ESTABLISHED || c->state == CLOSE_WAIT)) {
-                               uint32_t len =  buffer_free(&c->sndbuf);
+                       if((c->state == ESTABLISHED || c->state == CLOSE_WAIT) && c->do_poll) {
+                               c->do_poll = false;
+                               uint32_t len = buffer_free(&c->sndbuf);
 
                                if(len) {
                                        c->poll(c, len);
@@ -2205,6 +2208,8 @@ void utcp_set_sndbuf(struct utcp_connection *c, size_t size) {
        if(c->sndbuf.maxsize != size) {
                c->sndbuf.maxsize = -1;
        }
+
+       c->do_poll = buffer_free(&c->sndbuf);
 }
 
 size_t utcp_get_rcvbuf(struct utcp_connection *c) {
@@ -2272,6 +2277,7 @@ void utcp_set_recv_cb(struct utcp_connection *c, utcp_recv_t recv) {
 void utcp_set_poll_cb(struct utcp_connection *c, utcp_poll_t poll) {
        if(c) {
                c->poll = poll;
+               c->do_poll = buffer_free(&c->sndbuf);
        }
 }
 
index 1cf9e8743da561020be4165e533b553778798639..0b2efe4e1efd9c8e81b5981554f29b8a8bc8f6cd 100644 (file)
@@ -106,6 +106,7 @@ struct utcp_connection {
        uint32_t flags;
 
        bool reapable;
+       bool do_poll;
 
        // Callbacks
 
@@ -145,6 +146,7 @@ struct utcp_connection {
 
        // Buffers
 
+       uint32_t prev_free;
        struct buffer sndbuf;
        struct buffer rcvbuf;
        struct sack sacks[NSACKS];