aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2014-06-17 10:01:44 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2014-06-18 11:36:04 -0300
commitac5fb407e43814477102cea1885adc225742571c (patch)
treedba1c8635a5397f11fcc84734b3dbf8a59d7b827 /src
parent0c764fb1a48ad7ad51766ee480e0cd0d3a43566b (diff)
downloadrneovim-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.
Diffstat (limited to 'src')
-rw-r--r--src/nvim/os/channel.c15
-rw-r--r--src/nvim/os/job.c2
-rw-r--r--src/nvim/os/wstream.c19
-rw-r--r--src/nvim/os/wstream_defs.h1
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