mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-22 06:11:32 +02:00
[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.
This commit is contained in:
parent
816b979977
commit
c77e761968
@ -389,6 +389,40 @@ static inline int buffer_si_peekchar(struct buffer *buf)
|
|||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Try to write character <c> into buffer <buf> 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_write(struct buffer *buf, const char *msg, int len);
|
||||||
int buffer_feed(struct buffer *buf, const char *str, int len);
|
int buffer_feed(struct buffer *buf, const char *str, int len);
|
||||||
int buffer_si_putchar(struct buffer *buf, char c);
|
int buffer_si_putchar(struct buffer *buf, char c);
|
||||||
|
@ -119,38 +119,6 @@ int buffer_feed(struct buffer *buf, const char *str, int len)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to write character <c> into buffer <buf> 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.
|
/* Get one text line out of a buffer from a stream interface.
|
||||||
* Return values :
|
* Return values :
|
||||||
* >0 : number of bytes read. Includes the \n if present before len or end.
|
* >0 : number of bytes read. Includes the \n if present before len or end.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user