aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2014-06-20 10:37:04 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2014-06-24 13:02:23 -0300
commit11916b6b595421ce2ece10f7aa40757cc4937c0c (patch)
tree1872f728bbd02782bc9cf74ddb7693b5d10a4179 /src
parent0fd46ae8f08375dd160aa1566d5678b1e51804ce (diff)
downloadrneovim-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')
-rw-r--r--src/nvim/os/wstream.c16
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);
+ }
+}