aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/msgpack_rpc/channel.c
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2022-06-16 19:17:57 +0200
committerbfredl <bjorn.linse@gmail.com>2022-07-18 14:08:44 +0200
commit67a04fe6cb0f6b0cd3d44ae37b7caddddda198ea (patch)
treebb7f51c543dd03e6303e91d81fc592b1283e03c3 /src/nvim/msgpack_rpc/channel.c
parent1b462705d049fa0cf2bb99bae9112b84abea8d5a (diff)
downloadrneovim-67a04fe6cb0f6b0cd3d44ae37b7caddddda198ea.tar.gz
rneovim-67a04fe6cb0f6b0cd3d44ae37b7caddddda198ea.tar.bz2
rneovim-67a04fe6cb0f6b0cd3d44ae37b7caddddda198ea.zip
perf(ui): unpack a single ui event at a time, instead of a "redraw" batch
This reduces the memory overhead for large redraw batches, as a much smaller prefix of the api object buffer is used and needs to be hot in cache.
Diffstat (limited to 'src/nvim/msgpack_rpc/channel.c')
-rw-r--r--src/nvim/msgpack_rpc/channel.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c
index de01443313..0bb5d800f1 100644
--- a/src/nvim/msgpack_rpc/channel.c
+++ b/src/nvim/msgpack_rpc/channel.c
@@ -239,7 +239,12 @@ static void parse_msgpack(Channel *channel)
{
Unpacker *p = channel->rpc.unpacker;
while (unpacker_advance(p)) {
- if (p->type == kMessageTypeResponse) {
+ if (p->is_ui) {
+ if (p->ui_handler.fn != NULL && p->result.type == kObjectTypeArray) {
+ p->ui_handler.fn(p->result.data.array);
+ }
+ arena_mem_free(arena_finish(&p->arena), &p->reuse_blk);
+ } else if (p->type == kMessageTypeResponse) {
ChannelCallFrame *frame = kv_last(channel->rpc.call_stack);
if (p->request_id != frame->request_id) {
char buf[256];