mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
Add helpers for accessing data in libuv handles
Libuv handles have a single generic pointer for storing user data, this adds some functions for adding/retrieving pointers to "slots" in the new `HandleData` structure, which increase flexibility when using shared handles(job streams for example)
This commit is contained in:
parent
51ee26fe68
commit
7f00608d57
70
src/os/uv_helpers.c
Normal file
70
src/os/uv_helpers.c
Normal file
@ -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;
|
||||
}
|
47
src/os/uv_helpers.h
Normal file
47
src/os/uv_helpers.h
Normal file
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user