[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 3cde209..66bee89 100644
--- a/include/proto/buffers.h
+++ b/include/proto/buffers.h
@@ -389,6 +389,40 @@
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_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 ee7a5dc..edda459 100644
--- a/src/buffers.c
+++ b/src/buffers.c
@@ -119,38 +119,6 @@
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.
* Return values :
* >0 : number of bytes read. Includes the \n if present before len or end.