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.
This commit is contained in:
Willy Tarreau 2014-11-28 20:54:13 +01:00
parent f2f7d6b27b
commit 4428a29e52
2 changed files with 10 additions and 1 deletions

View File

@ -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;
}

View File

@ -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)