Er, that was the one *before* it also handled realloc.  This is the
final one:

static bool grow_stats_buf(conn *c, size_t needed) {
    size_t nsize = c->stats.size;
    size_t available = nsize - c->stats.offset;
    bool rv = true;

    /* Special case: No buffer -- need to allocate fresh */
    if (c->stats.buffer == NULL) {
        nsize = 1024;
        available = c->stats.size = c->stats.offset = 0;
    }

    while (needed > available) {
        assert(nsize > 0);
        nsize = nsize << 1;
        available = nsize - c->stats.offset;
    }

    if (nsize != c->stats.size) {
        char *ptr = realloc(c->stats.buffer, nsize);
        if (ptr) {
            c->stats.buffer = ptr;
            c->stats.size = nsize;
        } else {
            rv = false;
        }
    }

    return rv;
}


On Apr 6, 11:09 am, Dustin <[email protected]> wrote:
>   There's been some confusion around grow_stats_buf, so I thought I'd
> rewrite it a bit for clarity to make it clear that its goal is to
> figure out how much space it has, how much space it needs and get
> there.
>
>   I also thought it'd be good to be able to special case a null buffer
> and reset itself to 0 so that allocation and reallocation occur in the
> same place.  This is where it ends up:
>
> static bool grow_stats_buf(conn *c, size_t needed) {
>     size_t nsize = c->stats.size;
>     size_t available = nsize - c->stats.offset;
>     bool rv = true;
>
>     while (needed > available) {
>         assert(nsize > 0);
>         nsize = nsize << 1;
>         available = nsize - c->stats.offset;
>     }
>
>     if (nsize != c->stats.size) {
>         char *ptr = realloc(c->stats.buffer, nsize);
>         if (ptr) {
>             c->stats.buffer = ptr;
>             c->stats.size = nsize;
>         } else {
>             rv = false;
>         }
>     }
>
>     return rv;
>
> }
>
> http://github.com/dustin/memcached/commits/growth-refactor

Reply via email to