diff options
author | Thiago de Arruda <tpadilha84@gmail.com> | 2014-11-01 10:54:41 -0300 |
---|---|---|
committer | Thiago de Arruda <tpadilha84@gmail.com> | 2014-11-02 16:47:50 -0300 |
commit | d4f032a1333be4032b1b057be0c226a904b703bf (patch) | |
tree | 23b218edef87e7d53367f0c8f084d46e0f94871a | |
parent | 0ffeb140a46d6b1a6ecd8853b4eba7302ed99b3f (diff) | |
download | rneovim-d4f032a1333be4032b1b057be0c226a904b703bf.tar.gz rneovim-d4f032a1333be4032b1b057be0c226a904b703bf.tar.bz2 rneovim-d4f032a1333be4032b1b057be0c226a904b703bf.zip |
wstream: Memory allocation improvements
- Rename WriteData to WRequest
- Inline uv_write_t into WRequest, avoiding an extra allocation
- Manage WBuffer/WRequest instances using klib memory pools
-rw-r--r-- | src/nvim/os/event.c | 2 | ||||
-rw-r--r-- | src/nvim/os/wstream.c | 38 |
2 files changed, 27 insertions, 13 deletions
diff --git a/src/nvim/os/event.c b/src/nvim/os/event.c index 2dee529452..fd6363c236 100644 --- a/src/nvim/os/event.c +++ b/src/nvim/os/event.c @@ -14,6 +14,7 @@ #include "nvim/os/provider.h" #include "nvim/os/signal.h" #include "nvim/os/rstream.h" +#include "nvim/os/wstream.h" #include "nvim/os/job.h" #include "nvim/vim.h" #include "nvim/memory.h" @@ -43,6 +44,7 @@ void event_init(void) msgpack_rpc_helpers_init(); // Initialize the event queues pending_events = kl_init(Event); + wstream_init(); // Initialize input events input_init(); // Timer to wake the event loop if a timeout argument is passed to diff --git a/src/nvim/os/wstream.c b/src/nvim/os/wstream.c index eb7de02a2f..a1f3612418 100644 --- a/src/nvim/os/wstream.c +++ b/src/nvim/os/wstream.c @@ -5,6 +5,8 @@ #include <uv.h> +#include "nvim/lib/klist.h" + #include "nvim/os/uv_helpers.h" #include "nvim/os/wstream.h" #include "nvim/os/wstream_defs.h" @@ -36,13 +38,27 @@ struct wbuffer { typedef struct { WStream *wstream; WBuffer *buffer; -} WriteData; + uv_write_t uv_req; +} WRequest; +#define WRequestFreer(x) +KMEMPOOL_INIT(WRequestPool, WRequest, WRequestFreer) +kmempool_t(WRequestPool) *wrequest_pool = NULL; +#define WBufferFreer(x) +KMEMPOOL_INIT(WBufferPool, WBuffer, WBufferFreer) +kmempool_t(WBufferPool) *wbuffer_pool = NULL; #ifdef INCLUDE_GENERATED_DECLARATIONS # include "os/wstream.c.generated.h" #endif +/// Initialize pools for reusing commonly created objects +void wstream_init(void) +{ + wrequest_pool = kmp_init(WRequestPool); + wbuffer_pool = kmp_init(WBufferPool); +} + /// Creates a new WStream instance. A WStream encapsulates all the boilerplate /// necessary for writing to a libuv stream. /// @@ -148,20 +164,17 @@ bool wstream_write(WStream *wstream, WBuffer *buffer) wstream->curmem += buffer->size; - WriteData *data = xmalloc(sizeof(WriteData)); + WRequest *data = kmp_alloc(WRequestPool, wrequest_pool); data->wstream = wstream; data->buffer = buffer; - - uv_write_t *req = xmalloc(sizeof(uv_write_t)); - req->data = data; + data->uv_req.data = data; uv_buf_t uvbuf; uvbuf.base = buffer->data; uvbuf.len = buffer->size; - if (uv_write(req, wstream->stream, &uvbuf, 1, write_cb)) { - free(data); - free(req); + if (uv_write(&data->uv_req, wstream->stream, &uvbuf, 1, write_cb)) { + kmp_free(WRequestPool, wrequest_pool, data); goto err; } @@ -190,7 +203,7 @@ WBuffer *wstream_new_buffer(char *data, size_t refcount, wbuffer_data_finalizer cb) { - WBuffer *rv = xmalloc(sizeof(WBuffer)); + WBuffer *rv = kmp_alloc(WBufferPool, wbuffer_pool); rv->size = size; rv->refcount = refcount; rv->cb = cb; @@ -201,9 +214,8 @@ WBuffer *wstream_new_buffer(char *data, static void write_cb(uv_write_t *req, int status) { - WriteData *data = req->data; + WRequest *data = req->data; - free(req); data->wstream->curmem -= data->buffer->size; release_wbuffer(data->buffer); @@ -221,7 +233,7 @@ static void write_cb(uv_write_t *req, int status) free(data->wstream); } - free(data); + kmp_free(WRequestPool, wrequest_pool, data); } static void release_wbuffer(WBuffer *buffer) @@ -231,7 +243,7 @@ static void release_wbuffer(WBuffer *buffer) buffer->cb(buffer->data); } - free(buffer); + kmp_free(WBufferPool, wbuffer_pool, buffer); } } |