From c77e7619689c8ccd77ce1a80d379579a86f03843 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sun, 13 Sep 2009 14:58:00 +0200 Subject: [PATCH] [MINOR] buffers: inline buffer_si_putchar() By inlining this function and slightly reordering it, we can double the getchar/putchar test throughput, and reduce its footprint by about 40 bytes. Also, it was the only non-inlined char-based function, which now makes it more consistent this time. --- include/proto/buffers.h | 34 ++++++++++++++++++++++++++++++++++ src/buffers.c | 32 -------------------------------- 2 files changed, 34 insertions(+), 32 deletions(-) diff --git a/include/proto/buffers.h b/include/proto/buffers.h index 3cde20922..66bee8905 100644 --- a/include/proto/buffers.h +++ b/include/proto/buffers.h @@ -389,6 +389,40 @@ static inline int buffer_si_peekchar(struct buffer *buf) return -2; } +/* Try to write character into buffer after length controls. This + * work like buffer_feed(buf, &c, 1). + * Returns non-zero in case of success, 0 if the buffer was full. + * The send limit is automatically adjusted with the amount of data written. + */ +static inline int buffer_si_putchar(struct buffer *buf, char c) +{ + if (buf->flags & BF_FULL) + return 0; + + if (buf->flags & BF_EMPTY) { + buf->flags &= ~BF_EMPTY; + buf->r = buf->w = buf->lr = buf->data; + } + + *buf->r = c; + + buf->l++; + if (buf->l >= buf->max_len) + buf->flags |= BF_FULL; + + buf->r++; + if (buf->r - buf->data == buf->size) + buf->r -= buf->size; + + if ((signed)(buf->to_forward - 1) >= 0) { + buf->to_forward--; + buf->send_max++; + } + + buf->total++; + return 1; +} + int buffer_write(struct buffer *buf, const char *msg, int len); int buffer_feed(struct buffer *buf, const char *str, int len); int buffer_si_putchar(struct buffer *buf, char c); diff --git a/src/buffers.c b/src/buffers.c index ee7a5dce7..edda45954 100644 --- a/src/buffers.c +++ b/src/buffers.c @@ -119,38 +119,6 @@ int buffer_feed(struct buffer *buf, const char *str, int len) return -1; } -/* Try to write character into buffer after length controls. This - * work like buffer_feed(buf, &c, 1). - * Returns non-zero in case of success, 0 if the buffer was full. - * The send limit is automatically adjusted with the amount of data written. - */ -int buffer_si_putchar(struct buffer *buf, char c) -{ - if (buf->flags & BF_FULL) - return 0; - - if (!buf->l) - buf->r = buf->w = buf->lr = buf->data; - - *buf->r++ = c; - buf->l++; - buf->total++; - - if (buf->to_forward) { - buf->send_max++; - buf->to_forward--; - } - - if (buf->r == buf->data + buf->size) - buf->r = buf->data; - - buf->flags &= ~(BF_EMPTY|BF_FULL); - if (buf->l >= buf->max_len) - buf->flags |= BF_FULL; - - return 1; -} - /* Get one text line out of a buffer from a stream interface. * Return values : * >0 : number of bytes read. Includes the \n if present before len or end.