mirror of
https://github.com/neovim/neovim.git
synced 2025-10-08 19:06:31 +00:00
Merge pull request #9896 from justinmk/api-async-error
API: emit nvim_error_event on failed async request
This commit is contained in:
@@ -205,10 +205,15 @@
|
||||
#endif
|
||||
|
||||
#ifdef DEFINE_FUNC_ATTRIBUTES
|
||||
/// Non-deferred API function.
|
||||
# define FUNC_API_ASYNC
|
||||
/// Internal C function not exposed in the RPC API.
|
||||
# define FUNC_API_NOEXPORT
|
||||
/// API function not exposed in VimL/eval.
|
||||
# define FUNC_API_REMOTE_ONLY
|
||||
/// API function introduced at the given API level.
|
||||
# define FUNC_API_SINCE(X)
|
||||
/// API function deprecated since the given API level.
|
||||
# define FUNC_API_DEPRECATED_SINCE(X)
|
||||
# define FUNC_ATTR_MALLOC REAL_FATTR_MALLOC
|
||||
# define FUNC_ATTR_ALLOC_SIZE(x) REAL_FATTR_ALLOC_SIZE(x)
|
||||
|
@@ -348,28 +348,28 @@ static void handle_request(Channel *channel, msgpack_object *request)
|
||||
|
||||
if (is_get_mode && !input_blocking()) {
|
||||
// Defer the event to a special queue used by os/input.c. #6247
|
||||
multiqueue_put(ch_before_blocking_events, response_event, 1, evdata);
|
||||
multiqueue_put(ch_before_blocking_events, request_event, 1, evdata);
|
||||
} else {
|
||||
// Invoke immediately.
|
||||
response_event((void **)&evdata);
|
||||
request_event((void **)&evdata);
|
||||
}
|
||||
} else {
|
||||
multiqueue_put(channel->events, response_event, 1, evdata);
|
||||
multiqueue_put(channel->events, request_event, 1, evdata);
|
||||
DLOG("RPC: scheduled %.*s", method->via.bin.size, method->via.bin.ptr);
|
||||
}
|
||||
}
|
||||
|
||||
/// Responds to a message, depending on the type:
|
||||
/// - Request: writes the response.
|
||||
/// - Notification: does nothing.
|
||||
static void response_event(void **argv)
|
||||
/// Handles a message, depending on the type:
|
||||
/// - Request: invokes method and writes the response (or error).
|
||||
/// - Notification: invokes method (emits `nvim_error_event` on error).
|
||||
static void request_event(void **argv)
|
||||
{
|
||||
RequestEvent *e = argv[0];
|
||||
Channel *channel = e->channel;
|
||||
MsgpackRpcRequestHandler handler = e->handler;
|
||||
Error error = ERROR_INIT;
|
||||
Object result = handler.fn(channel->id, e->args, &error);
|
||||
if (e->type == kMessageTypeRequest) {
|
||||
if (e->type == kMessageTypeRequest || ERROR_SET(&error)) {
|
||||
// Send the response.
|
||||
msgpack_packer response;
|
||||
msgpack_packer_init(&response, &out_buffer, msgpack_sbuffer_write);
|
||||
|
Reference in New Issue
Block a user