diff options
| author | Thiago de Arruda <tpadilha84@gmail.com> | 2014-06-20 10:37:04 -0300 | 
|---|---|---|
| committer | Thiago de Arruda <tpadilha84@gmail.com> | 2014-06-24 13:02:23 -0300 | 
| commit | 11916b6b595421ce2ece10f7aa40757cc4937c0c (patch) | |
| tree | 1872f728bbd02782bc9cf74ddb7693b5d10a4179 /src/nvim/os/wstream.c | |
| parent | 0fd46ae8f08375dd160aa1566d5678b1e51804ce (diff) | |
| download | rneovim-11916b6b595421ce2ece10f7aa40757cc4937c0c.tar.gz rneovim-11916b6b595421ce2ece10f7aa40757cc4937c0c.tar.bz2 rneovim-11916b6b595421ce2ece10f7aa40757cc4937c0c.zip | |
wstream: Refactor buffer memory management
- Extract code to release WBuffer instances into `release_wbuffer`
- Fix memory leak when wstream_write returns false
Diffstat (limited to 'src/nvim/os/wstream.c')
| -rw-r--r-- | src/nvim/os/wstream.c | 16 | 
1 files changed, 11 insertions, 5 deletions
| diff --git a/src/nvim/os/wstream.c b/src/nvim/os/wstream.c index 9a908a4348..a3037e477b 100644 --- a/src/nvim/os/wstream.c +++ b/src/nvim/os/wstream.c @@ -91,11 +91,13 @@ bool wstream_write(WStream *wstream, WBuffer *buffer)    // This should not be called after a wstream was freed    assert(!wstream->freed); +  buffer->refcount++; +    if (wstream->curmem > wstream->maxmem) { +    release_wbuffer(buffer);      return false;    } -  buffer->refcount++;    wstream->curmem += buffer->size;    data = xmalloc(sizeof(WriteData));    data->wstream = wstream; @@ -138,10 +140,7 @@ static void write_cb(uv_write_t *req, int status)    free(req);    data->wstream->curmem -= data->buffer->size; -  if (!--data->buffer->refcount) { -    data->buffer->cb(data->buffer->data); -    free(data->buffer); -  } +  release_wbuffer(data->buffer);    data->wstream->pending_reqs--;    if (data->wstream->freed && data->wstream->pending_reqs == 0) { @@ -152,3 +151,10 @@ static void write_cb(uv_write_t *req, int status)    free(data);  } +static void release_wbuffer(WBuffer *buffer) +{ +  if (!--buffer->refcount) { +    buffer->cb(buffer->data); +    free(buffer); +  } +} | 
