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:
Thiago de Arruda
2014-06-20 10:37:04 -03:00
parent 0fd46ae8f0
commit 11916b6b59

View File

@@ -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);
}
}