Commit 0a90cab4 authored by Deomid Ryabkov's avatar Deomid Ryabkov Committed by Cesanta Bot

Improve mbuf allocation behavior

 * Limit total amount of headroom, in absolute terms (`MBUF_SIZE_MAX_HEADROOM`).
 * If unable to allocate with headroom, fall back to allocating the required minimum.
 * For mOS, set default `MBUF_SIZE_MULTIPLIER` to 2 to avoid floating point operations.
   Since max headroom size is now capped to 128 bytes, this will not result in much of a bloat.

PUBLISHED_FROM=11d4fc65a46a805bb7c8960f89a3d0b753c58bb8
parent d16dbc19
...@@ -1470,10 +1470,21 @@ size_t mbuf_insert(struct mbuf *a, size_t off, const void *buf, size_t len) { ...@@ -1470,10 +1470,21 @@ size_t mbuf_insert(struct mbuf *a, size_t off, const void *buf, size_t len) {
} }
a->len += len; a->len += len;
} else { } else {
size_t new_size = (size_t)((a->len + len) * MBUF_SIZE_MULTIPLIER); size_t min_size = (a->len + len);
if ((p = (char *) MBUF_REALLOC(a->buf, new_size)) != NULL) { size_t new_size = (size_t)(min_size * MBUF_SIZE_MULTIPLIER);
if (new_size - min_size > MBUF_SIZE_MAX_HEADROOM) {
new_size = min_size + MBUF_SIZE_MAX_HEADROOM;
}
p = (char *) MBUF_REALLOC(a->buf, new_size);
if (p == NULL && new_size != min_size) {
new_size = min_size;
p = (char *) MBUF_REALLOC(a->buf, new_size);
}
if (p != NULL) {
a->buf = p; a->buf = p;
if (off != a->len) {
memmove(a->buf + off + len, a->buf + off, a->len - off); memmove(a->buf + off + len, a->buf + off, a->len - off);
}
if (buf != NULL) memcpy(a->buf + off, buf, len); if (buf != NULL) memcpy(a->buf + off, buf, len);
a->len += len; a->len += len;
a->size = new_size; a->size = new_size;
......
...@@ -1963,6 +1963,14 @@ extern "C" { ...@@ -1963,6 +1963,14 @@ extern "C" {
#define MBUF_SIZE_MULTIPLIER 1.5 #define MBUF_SIZE_MULTIPLIER 1.5
#endif #endif
#ifndef MBUF_SIZE_MAX_HEADROOM
#ifdef BUFSIZ
#define MBUF_SIZE_MAX_HEADROOM BUFSIZ
#else
#define MBUF_SIZE_MAX_HEADROOM 1024
#endif
#endif
/* Memory buffer descriptor */ /* Memory buffer descriptor */
struct mbuf { struct mbuf {
char *buf; /* Buffer pointer */ char *buf; /* Buffer pointer */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment