diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/os/uv_helpers.c | 70 | ||||
-rw-r--r-- | src/os/uv_helpers.h | 47 |
2 files changed, 117 insertions, 0 deletions
diff --git a/src/os/uv_helpers.c b/src/os/uv_helpers.c new file mode 100644 index 0000000000..62b021de5e --- /dev/null +++ b/src/os/uv_helpers.c @@ -0,0 +1,70 @@ +#include <uv.h> + +#include "os/uv_helpers.h" +#include "vim.h" +#include "memory.h" + +/// Common structure that will always be assigned to the `data` field of +/// libuv handles. It has fields for many types of pointers, and allow a single +/// handle to contain data from many sources +typedef struct { + WStream *wstream; + RStream *rstream; + Job *job; +} HandleData; + +static HandleData *init(uv_handle_t *handle); + +RStream *handle_get_rstream(uv_handle_t *handle) +{ + RStream *rv = init(handle)->rstream; + assert(rv != NULL); + return rv; +} + +void handle_set_rstream(uv_handle_t *handle, RStream *rstream) +{ + init(handle)->rstream = rstream; +} + +WStream *handle_get_wstream(uv_handle_t *handle) +{ + WStream *rv = init(handle)->wstream; + assert(rv != NULL); + return rv; +} + +void handle_set_wstream(uv_handle_t *handle, WStream *wstream) +{ + HandleData *data = init(handle); + data->wstream = wstream; +} + +Job *handle_get_job(uv_handle_t *handle) +{ + Job *rv = init(handle)->job; + assert(rv != NULL); + return rv; +} + +void handle_set_job(uv_handle_t *handle, Job *job) +{ + init(handle)->job = job; +} + +static HandleData *init(uv_handle_t *handle) +{ + HandleData *rv; + + if (handle->data == NULL) { + rv = xmalloc(sizeof(HandleData)); + rv->rstream = NULL; + rv->wstream = NULL; + rv->job = NULL; + handle->data = rv; + } else { + rv = handle->data; + } + + return rv; +} diff --git a/src/os/uv_helpers.h b/src/os/uv_helpers.h new file mode 100644 index 0000000000..9d4cea30b2 --- /dev/null +++ b/src/os/uv_helpers.h @@ -0,0 +1,47 @@ +#ifndef NEOVIM_OS_UV_HELPERS_H +#define NEOVIM_OS_UV_HELPERS_H + +#include <uv.h> + +#include "os/wstream_defs.h" +#include "os/rstream_defs.h" +#include "os/job_defs.h" + +/// Gets the RStream instance associated with a libuv handle +/// +/// @param handle libuv handle +/// @return the RStream pointer +RStream *handle_get_rstream(uv_handle_t *handle); + +/// Associates a RStream instance with a libuv handle +/// +/// @param handle libuv handle +/// @param rstream the RStream pointer +void handle_set_rstream(uv_handle_t *handle, RStream *rstream); + +/// Gets the WStream instance associated with a libuv handle +/// +/// @param handle libuv handle +/// @return the WStream pointer +WStream *handle_get_wstream(uv_handle_t *handle); + +/// Associates a WStream instance with a libuv handle +/// +/// @param handle libuv handle +/// @param wstream the WStream pointer +void handle_set_wstream(uv_handle_t *handle, WStream *wstream); + +/// Gets the Job instance associated with a libuv handle +/// +/// @param handle libuv handle +/// @return the Job pointer +Job *handle_get_job(uv_handle_t *handle); + +/// Associates a Job instance with a libuv handle +/// +/// @param handle libuv handle +/// @param job the Job pointer +void handle_set_job(uv_handle_t *handle, Job *job); + +#endif // NEOVIM_OS_UV_HELPERS_H + |