mirror of
https://github.com/neovim/neovim.git
synced 2025-10-17 15:21:47 +00:00
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.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user