mirror of
https://github.com/neovim/neovim.git
synced 2025-10-01 23:48:32 +00:00
msgpack-rpc: Allow selective deferral API calls
Since all API functions now run immediately after a msgpack-rpc request is parsed by libuv callbacks, a mechanism was added to override this behavior and allow certain functions to run in Nvim main loop. The mechanism is simple: Any API function tagged with the FUNC_ATTR_DEFERRED (a "dummy" attribute only used by msgpack-gen.lua) will be called when Nvim main loop receives a K_EVENT key. To implement this mechanism it was necessary some restructuration on the msgpack-rpc modules, especially in the msgpack-gen.lua script.
This commit is contained in:
@@ -6,9 +6,15 @@
|
||||
|
||||
/// The rpc_method_handlers table, used in msgpack_rpc_dispatch(), stores
|
||||
/// functions of this type.
|
||||
typedef Object (*rpc_method_handler_fn)(uint64_t channel_id,
|
||||
msgpack_object *req,
|
||||
Error *error);
|
||||
typedef struct {
|
||||
Object (*fn)(uint64_t channel_id,
|
||||
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.
|
||||
} MsgpackRpcRequestHandler;
|
||||
|
||||
/// Initializes the msgpack-rpc method table
|
||||
void msgpack_rpc_init_method_table(void);
|
||||
@@ -31,4 +37,7 @@ Object msgpack_rpc_dispatch(uint64_t channel_id,
|
||||
Error *error)
|
||||
FUNC_ATTR_NONNULL_ARG(2) FUNC_ATTR_NONNULL_ARG(3);
|
||||
|
||||
MsgpackRpcRequestHandler msgpack_rpc_get_handler_for(const char *name,
|
||||
size_t name_len)
|
||||
FUNC_ATTR_NONNULL_ARG(1);
|
||||
#endif // NVIM_MSGPACK_RPC_DEFS_H
|
||||
|
Reference in New Issue
Block a user