From: Willy Tarreau Date: Fri, 28 Nov 2014 19:54:13 +0000 (+0100) Subject: MEDIUM: channel: do not report full when buf_empty is present on a channel X-Git-Tag: v1.6-dev1~221 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4428a29e52544894d631122b598deccd37e59804;p=thirdparty%2Fhaproxy.git MEDIUM: channel: do not report full when buf_empty is present on a channel Till now we'd consider a buffer full even if it had size==0 due to pointing to buf.size. Now we change this : if buf_wanted is present, it means that we have already tried to allocate a buffer but failed. Thus the buffer must be considered full so that we stop trying to poll for reads on it. Otherwise if it's empty, it's buf_empty and we report !full since we may allocate it on the fly. --- diff --git a/include/common/buffer.h b/include/common/buffer.h index 4e55285e7d..221839020f 100644 --- a/include/common/buffer.h +++ b/include/common/buffer.h @@ -176,6 +176,9 @@ static inline int buffer_empty(const struct buffer *buf) */ static inline int buffer_full(const struct buffer *b, unsigned int reserve) { + if (b == &buf_empty) + return 0; + return (b->i + reserve >= b->size); } @@ -282,7 +285,10 @@ static inline int buffer_work_area(const struct buffer *buf, const char *end) /* Return 1 if the buffer has less than 1/4 of its capacity free, otherwise 0 */ static inline int buffer_almost_full(const struct buffer *buf) { - if (buffer_total_space(buf) < buf->size / 4) + if (buf == &buf_empty) + return 0; + + if (!buf->size || buffer_total_space(buf) < buf->size / 4) return 1; return 0; } diff --git a/include/proto/channel.h b/include/proto/channel.h index 1c175e9045..1cee05a1d5 100644 --- a/include/proto/channel.h +++ b/include/proto/channel.h @@ -129,6 +129,9 @@ static inline int channel_full(const struct channel *chn) { int rem = chn->buf->size; + if (chn->buf == &buf_empty) + return 0; + rem -= chn->buf->o; rem -= chn->buf->i; if (!rem)