mirror of
https://github.com/neovim/neovim.git
synced 2025-09-12 06:18:16 +00:00
wstream: Refactor buffer memory management
- Extract code to release WBuffer instances into `release_wbuffer` - Fix memory leak when wstream_write returns false
This commit is contained in:
@@ -91,11 +91,13 @@ bool wstream_write(WStream *wstream, WBuffer *buffer)
|
|||||||
// This should not be called after a wstream was freed
|
// This should not be called after a wstream was freed
|
||||||
assert(!wstream->freed);
|
assert(!wstream->freed);
|
||||||
|
|
||||||
|
buffer->refcount++;
|
||||||
|
|
||||||
if (wstream->curmem > wstream->maxmem) {
|
if (wstream->curmem > wstream->maxmem) {
|
||||||
|
release_wbuffer(buffer);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer->refcount++;
|
|
||||||
wstream->curmem += buffer->size;
|
wstream->curmem += buffer->size;
|
||||||
data = xmalloc(sizeof(WriteData));
|
data = xmalloc(sizeof(WriteData));
|
||||||
data->wstream = wstream;
|
data->wstream = wstream;
|
||||||
@@ -138,10 +140,7 @@ static void write_cb(uv_write_t *req, int status)
|
|||||||
free(req);
|
free(req);
|
||||||
data->wstream->curmem -= data->buffer->size;
|
data->wstream->curmem -= data->buffer->size;
|
||||||
|
|
||||||
if (!--data->buffer->refcount) {
|
release_wbuffer(data->buffer);
|
||||||
data->buffer->cb(data->buffer->data);
|
|
||||||
free(data->buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
data->wstream->pending_reqs--;
|
data->wstream->pending_reqs--;
|
||||||
if (data->wstream->freed && data->wstream->pending_reqs == 0) {
|
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);
|
free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void release_wbuffer(WBuffer *buffer)
|
||||||
|
{
|
||||||
|
if (!--buffer->refcount) {
|
||||||
|
buffer->cb(buffer->data);
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user