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:
Thiago de Arruda
2015-07-24 09:55:31 -03:00
parent b13011ff47
commit ccdeb91e12
10 changed files with 14 additions and 40 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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;