mirror of
https://github.com/neovim/neovim.git
synced 2025-10-07 18:36:30 +00:00
msgpack: Replace FUNC_ATTR_DEFERRED by FUNC_ATTR_ASYNC
API functions exposed via msgpack-rpc now fall into two categories: - async functions, which are executed as soon as the request is parsed - sync functions, which are invoked in nvim main loop when processing the `K_EVENT special key Only a few functions which can be safely executed in any context are marked as async.
This commit is contained in:
@@ -450,16 +450,16 @@ static void handle_request(Channel *channel, msgpack_object *request)
|
||||
method->via.bin.size);
|
||||
} else {
|
||||
handler.fn = msgpack_rpc_handle_missing_method;
|
||||
handler.defer = false;
|
||||
handler.async = true;
|
||||
}
|
||||
|
||||
Array args = ARRAY_DICT_INIT;
|
||||
if (!msgpack_rpc_to_array(msgpack_rpc_args(request), &args)) {
|
||||
handler.fn = msgpack_rpc_handle_invalid_arguments;
|
||||
handler.defer = false;
|
||||
handler.async = true;
|
||||
}
|
||||
|
||||
bool defer = (!kv_size(channel->call_stack) && handler.defer);
|
||||
bool async = kv_size(channel->call_stack) || handler.async;
|
||||
RequestEvent *event_data = xmalloc(sizeof(RequestEvent));
|
||||
event_data->channel = channel;
|
||||
event_data->handler = handler;
|
||||
@@ -469,7 +469,7 @@ static void handle_request(Channel *channel, msgpack_object *request)
|
||||
loop_push_event(&loop, (Event) {
|
||||
.handler = on_request_event,
|
||||
.data = event_data
|
||||
}, defer);
|
||||
}, !async);
|
||||
}
|
||||
|
||||
static void on_request_event(Event event)
|
||||
|
@@ -11,9 +11,8 @@ typedef struct {
|
||||
uint64_t request_id,
|
||||
Array args,
|
||||
Error *error);
|
||||
bool defer; // Should the call be deferred to the main loop? This should
|
||||
// be true if the function mutates editor data structures such
|
||||
// as buffers, windows, tabs, or if it executes vimscript code.
|
||||
bool async; // function is always safe to run immediately instead of being
|
||||
// put in a request queue for handling when nvim waits for input.
|
||||
} MsgpackRpcRequestHandler;
|
||||
|
||||
/// Initializes the msgpack-rpc method table
|
||||
|
@@ -28,7 +28,7 @@ void remote_ui_init(void)
|
||||
connected_uis = pmap_new(uint64_t)();
|
||||
// Add handler for "attach_ui"
|
||||
String method = cstr_as_string("ui_attach");
|
||||
MsgpackRpcRequestHandler handler = {.fn = remote_ui_attach, .defer = false};
|
||||
MsgpackRpcRequestHandler handler = {.fn = remote_ui_attach, .async = true};
|
||||
msgpack_rpc_add_method_handler(method, handler);
|
||||
method = cstr_as_string("ui_detach");
|
||||
handler.fn = remote_ui_detach;
|
||||
|
Reference in New Issue
Block a user