diff options
author | Thiago de Arruda <tpadilha84@gmail.com> | 2014-06-17 10:01:44 -0300 |
---|---|---|
committer | Thiago de Arruda <tpadilha84@gmail.com> | 2014-06-18 11:36:04 -0300 |
commit | ac5fb407e43814477102cea1885adc225742571c (patch) | |
tree | dba1c8635a5397f11fcc84734b3dbf8a59d7b827 | |
parent | 0c764fb1a48ad7ad51766ee480e0cd0d3a43566b (diff) | |
download | rneovim-ac5fb407e43814477102cea1885adc225742571c.tar.gz rneovim-ac5fb407e43814477102cea1885adc225742571c.tar.bz2 rneovim-ac5fb407e43814477102cea1885adc225742571c.zip |
wstream: Refactor wstream_new_buffer/wstream_write
- Removed 'copy' parameter from `wstream_new_buffer`. Callers simply pass a
copy of the buffer if required.
- Added a callback parameter, which is used to notify callers when the data is
successfully written. The callback is also used to free the buffer(if
required) and is compatible with `free` from the standard library.
-rw-r--r-- | src/nvim/os/channel.c | 15 | ||||
-rw-r--r-- | src/nvim/os/job.c | 2 | ||||
-rw-r--r-- | src/nvim/os/wstream.c | 19 | ||||
-rw-r--r-- | src/nvim/os/wstream_defs.h | 1 |
4 files changed, 19 insertions, 18 deletions
diff --git a/src/nvim/os/channel.c b/src/nvim/os/channel.c index b1e2a8a287..878aeac0a8 100644 --- a/src/nvim/os/channel.c +++ b/src/nvim/os/channel.c @@ -194,9 +194,10 @@ static void parse_msgpack(RStream *rstream, void *data, bool eof) // Perform the call msgpack_rpc_call(channel->id, &unpacked.data, &response); wstream_write(channel->data.streams.write, - wstream_new_buffer(channel->sbuffer->data, + wstream_new_buffer(xmemdup(channel->sbuffer->data, + channel->sbuffer->size), channel->sbuffer->size, - true)); + free)); // Clear the buffer for future calls msgpack_sbuffer_clear(channel->sbuffer); @@ -218,9 +219,10 @@ static void parse_msgpack(RStream *rstream, void *data, bool eof) "an object with high level of nesting", &response); wstream_write(channel->data.streams.write, - wstream_new_buffer(channel->sbuffer->data, + wstream_new_buffer(xmemdup(channel->sbuffer->data, + channel->sbuffer->size), channel->sbuffer->size, - true)); + free)); // Clear the buffer for future calls msgpack_sbuffer_clear(channel->sbuffer); } @@ -310,9 +312,10 @@ static WBuffer *serialize_event(char *type, typval_T *data) msgpack_packer packer; msgpack_packer_init(&packer, &msgpack_event_buffer, msgpack_sbuffer_write); msgpack_rpc_notification(event_type, event_data, &packer); - WBuffer *rv = wstream_new_buffer(msgpack_event_buffer.data, + WBuffer *rv = wstream_new_buffer(xmemdup(msgpack_event_buffer.data, + msgpack_event_buffer.size), msgpack_event_buffer.size, - true); + free); msgpack_rpc_free_object(event_data); msgpack_sbuffer_clear(&msgpack_event_buffer); diff --git a/src/nvim/os/job.c b/src/nvim/os/job.c index f9f94158ae..29f0eab24d 100644 --- a/src/nvim/os/job.c +++ b/src/nvim/os/job.c @@ -258,7 +258,7 @@ bool job_write(int id, char *data, uint32_t len) return false; } - if (!wstream_write(job->in, wstream_new_buffer(data, len, false))) { + if (!wstream_write(job->in, wstream_new_buffer(data, len, free))) { job_stop(job->id); return false; } diff --git a/src/nvim/os/wstream.c b/src/nvim/os/wstream.c index 6a4cecf218..9a908a4348 100644 --- a/src/nvim/os/wstream.c +++ b/src/nvim/os/wstream.c @@ -21,8 +21,9 @@ struct wstream { }; struct wbuffer { - size_t refcount, size; + size_t size, refcount; char *data; + wbuffer_data_finalizer cb; }; typedef struct { @@ -116,19 +117,16 @@ bool wstream_write(WStream *wstream, WBuffer *buffer) /// /// @param data Data stored by the WBuffer /// @param size The size of the data array -/// @param copy If true, the data will be copied into the WBuffer +/// @param cb Pointer to function that will be responsible for freeing +/// the buffer data(passing 'free' will work as expected). /// @return The allocated WBuffer instance -WBuffer *wstream_new_buffer(char *data, size_t size, bool copy) +WBuffer *wstream_new_buffer(char *data, size_t size, wbuffer_data_finalizer cb) { WBuffer *rv = xmalloc(sizeof(WBuffer)); rv->size = size; rv->refcount = 0; - - if (copy) { - rv->data = xmemdup(data, size); - } else { - rv->data = data; - } + rv->cb = cb; + rv->data = data; return rv; } @@ -141,8 +139,7 @@ static void write_cb(uv_write_t *req, int status) data->wstream->curmem -= data->buffer->size; if (!--data->buffer->refcount) { - // Free the data written to the stream - free(data->buffer->data); + data->buffer->cb(data->buffer->data); free(data->buffer); } diff --git a/src/nvim/os/wstream_defs.h b/src/nvim/os/wstream_defs.h index a7565c9bc7..1bf61ffce1 100644 --- a/src/nvim/os/wstream_defs.h +++ b/src/nvim/os/wstream_defs.h @@ -3,6 +3,7 @@ typedef struct wbuffer WBuffer; typedef struct wstream WStream; +typedef void (*wbuffer_data_finalizer)(void *data); #endif // NVIM_OS_WSTREAM_DEFS_H |