]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: stream-int: use si_cant_put() instead of setting SI_FL_WAIT_ROOM
authorWilly Tarreau <w@1wt.eu>
Tue, 6 Nov 2018 18:10:53 +0000 (19:10 +0100)
committerWilly Tarreau <w@1wt.eu>
Sun, 11 Nov 2018 09:18:37 +0000 (10:18 +0100)
We now do this on the si_cs_recv() path so that we always have
SI_FL_WANT_PUT properly set when there's a need to receive and
SI_FL_WAIT_ROOM upon failure.

include/proto/stream_interface.h
src/stream_interface.c

index c320784e781d191cc0219a15b7a87e21dd72a13a..c2c5310dcbaad9ce87d481a7c3b42381a7a93bfd 100644 (file)
@@ -330,7 +330,7 @@ static inline int si_alloc_ibuf(struct stream_interface *si, struct buffer_wait
        si->flags &= ~SI_FL_WAIT_ROOM;
        ret = channel_alloc_buffer(si_ic(si), wait);
        if (!ret)
-               si->flags |= SI_FL_WAIT_ROOM;
+               si_cant_put(si);
        return ret;
 }
 
index f2fa79158a8149186644d62578a261d8441d5f51..7eb9e9c0e7464b83ab20b7235e5e9d730ed34b5a 100644 (file)
@@ -756,7 +756,7 @@ void stream_int_update(struct stream_interface *si)
                        /* stop reading */
                        if (!(si->flags & SI_FL_WAIT_ROOM)) {
                                if (!(ic->flags & CF_DONT_READ)) /* full */
-                                       si->flags |= SI_FL_WAIT_ROOM;
+                                       si_cant_put(si);
                                ic->rex = TICK_ETERNITY;
                        }
                }
@@ -1098,6 +1098,9 @@ int si_cs_recv(struct conn_stream *cs)
        if (si->wait_event.wait_reason & SUB_CAN_RECV)
                return 0;
 
+       /* by default nothing to deliver */
+       si_stop_put(si);
+
        /* maybe we were called immediately after an asynchronous shutr */
        if (ic->flags & CF_SHUTR)
                return 1;
@@ -1165,7 +1168,7 @@ int si_cs_recv(struct conn_stream *cs)
                        /* the pipe is full or we have read enough data that it
                         * could soon be full. Let's stop before needing to poll.
                         */
-                       si->flags |= SI_FL_WAIT_ROOM;
+                       si_cant_put(si);
                }
 
                /* splice not possible (anymore), let's go on on standard copy */
@@ -1191,13 +1194,13 @@ int si_cs_recv(struct conn_stream *cs)
                max = channel_recv_max(ic);
 
                if (!max) {
-                       si->flags |= SI_FL_WAIT_ROOM;
+                       si_cant_put(si);
                        break;
                }
 
                ret = cs->conn->mux->rcv_buf(cs, &ic->buf, max, co_data(ic) ? CO_RFL_BUF_WET : 0);
                if (cs->flags & CS_FL_RCV_MORE)
-                       si->flags |= SI_FL_WAIT_ROOM;
+                       si_cant_put(si);
 
                if (ret <= 0)
                        break;
@@ -1219,7 +1222,7 @@ int si_cs_recv(struct conn_stream *cs)
                ic->total += ret;
 
                if (!channel_may_recv(ic)) {
-                       si->flags |= SI_FL_WAIT_ROOM;
+                       si_cant_put(si);
                        break;
                }