From e6a4dc195dadd08667fe4b400aed605bf70f03bc Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 28 Nov 2014 20:54:13 +0100 Subject: 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. --- include/common/buffer.h | 8 +++++++- include/proto/channel.h | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/common/buffer.h b/include/common/buffer.h index 30ae363..380e21f 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 1c175e9..1cee05a 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) -- 1.7.12.1