From: Willy Tarreau Date: Sun, 13 Sep 2009 12:58:00 +0000 (+0200) Subject: [MINOR] buffers: inline buffer_si_putchar() X-Git-Tag: v1.4-dev3~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c77e7619689c8ccd77ce1a80d379579a86f03843;p=thirdparty%2Fhaproxy.git [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. --- diff --git a/include/proto/buffers.h b/include/proto/buffers.h index 3cde209227..66bee89057 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 ee7a5dce75..edda45954f 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.