aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/msgpack_rpc
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2024-05-24 19:18:11 +0000
committerJosh Rahm <joshuarahm@gmail.com>2024-05-24 19:18:11 +0000
commitff7ed8f586589d620a806c3758fac4a47a8e7e15 (patch)
tree729bbcb92231538fa61dab6c3d890b025484b7f5 /src/nvim/msgpack_rpc
parent376914f419eb08fdf4c1a63a77e1f035898a0f10 (diff)
parent28c04948a1c887a1cc0cb64de79fa32631700466 (diff)
downloadrneovim-ff7ed8f586589d620a806c3758fac4a47a8e7e15.tar.gz
rneovim-ff7ed8f586589d620a806c3758fac4a47a8e7e15.tar.bz2
rneovim-ff7ed8f586589d620a806c3758fac4a47a8e7e15.zip
Merge remote-tracking branch 'upstream/master' into mix_20240309
Diffstat (limited to 'src/nvim/msgpack_rpc')
-rw-r--r--src/nvim/msgpack_rpc/channel.c81
-rw-r--r--src/nvim/msgpack_rpc/channel_defs.h1
-rw-r--r--src/nvim/msgpack_rpc/unpacker.c12
-rw-r--r--src/nvim/msgpack_rpc/unpacker.h3
4 files changed, 21 insertions, 76 deletions
diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c
index a8fde5a652..5737a0440f 100644
--- a/src/nvim/msgpack_rpc/channel.c
+++ b/src/nvim/msgpack_rpc/channel.c
@@ -67,8 +67,6 @@ static void log_notify(char *dir, uint64_t channel_id, const char *name)
# define log_notify(...)
#endif
-static Set(cstr_t) event_strings = SET_INIT;
-
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "msgpack_rpc/channel.c.generated.h"
#endif
@@ -111,9 +109,9 @@ static Channel *find_rpc_channel(uint64_t id)
return chan;
}
-/// Publishes an event to a channel.
+/// Publishes an event to a channel (emits a notification to method `name`).
///
-/// @param id Channel id. 0 means "broadcast to all subscribed channels"
+/// @param id Channel id, or 0 to broadcast to all RPC channels.
/// @param name Event name (application-defined)
/// @param args Array of event arguments
/// @return True if the event was sent successfully, false otherwise.
@@ -204,41 +202,6 @@ Object rpc_send_call(uint64_t id, const char *method_name, Array args, ArenaMem
return frame.errored ? NIL : frame.result;
}
-/// Subscribes to event broadcasts
-///
-/// @param id The channel id
-/// @param event The event type string
-void rpc_subscribe(uint64_t id, char *event)
-{
- Channel *channel;
-
- if (!(channel = find_rpc_channel(id))) {
- abort();
- }
-
- const char **key_alloc = NULL;
- if (set_put_ref(cstr_t, &event_strings, event, &key_alloc)) {
- *key_alloc = xstrdup(event);
- }
-
- set_put(cstr_t, channel->rpc.subscribed_events, *key_alloc);
-}
-
-/// Unsubscribes to event broadcasts
-///
-/// @param id The channel id
-/// @param event The event type string
-void rpc_unsubscribe(uint64_t id, char *event)
-{
- Channel *channel;
-
- if (!(channel = find_rpc_channel(id))) {
- abort();
- }
-
- unsubscribe(channel, event);
-}
-
static void receive_msgpack(Stream *stream, RBuffer *rbuf, size_t c, void *data, bool eof)
{
Channel *channel = data;
@@ -289,8 +252,9 @@ static void parse_msgpack(Channel *channel)
if (p->type == kMessageTypeRedrawEvent) {
// When exiting, ui_client_stop() has already been called, so don't handle UI events.
if (ui_client_channel_id && !exiting) {
- if (p->grid_line_event) {
- ui_client_event_raw_line(p->grid_line_event);
+ if (p->has_grid_line_event) {
+ ui_client_event_raw_line(&p->grid_line_event);
+ p->has_grid_line_event = false;
} else if (p->ui_handler.fn != NULL && p->result.type == kObjectTypeArray) {
p->ui_handler.fn(p->result.data.array);
}
@@ -339,7 +303,7 @@ static void parse_msgpack(Channel *channel)
}
if (unpacker_closed(p)) {
- chan_close_with_error(channel, p->unpack_error.msg, LOGLVL_ERR);
+ chan_close_with_error(channel, p->unpack_error.msg, LOGLVL_INF);
api_clear_error(&p->unpack_error);
}
}
@@ -493,34 +457,24 @@ static void send_error(Channel *chan, MsgpackRpcRequestHandler handler, MessageT
api_clear_error(&e);
}
+/// Broadcasts a notification to all RPC channels.
static void broadcast_event(const char *name, Array args)
{
- kvec_withinit_t(Channel *, 4) subscribed = KV_INITIAL_VALUE;
- kvi_init(subscribed);
+ kvec_withinit_t(Channel *, 4) chans = KV_INITIAL_VALUE;
+ kvi_init(chans);
Channel *channel;
map_foreach_value(&channels, channel, {
- if (channel->is_rpc
- && set_has(cstr_t, channel->rpc.subscribed_events, name)) {
- kv_push(subscribed, channel);
+ if (channel->is_rpc) {
+ kv_push(chans, channel);
}
});
- if (kv_size(subscribed)) {
- serialize_request(subscribed.items, kv_size(subscribed), 0, name, args);
+ if (kv_size(chans)) {
+ serialize_request(chans.items, kv_size(chans), 0, name, args);
}
- kvi_destroy(subscribed);
-}
-
-static void unsubscribe(Channel *channel, char *event)
-{
- if (!set_has(cstr_t, &event_strings, event)) {
- WLOG("RPC: ch %" PRIu64 ": tried to unsubscribe unknown event '%s'",
- channel->id, event);
- return;
- }
- set_del(cstr_t, channel->rpc.subscribed_events, event);
+ kvi_destroy(chans);
}
/// Mark rpc state as closed, and release its reference to the channel.
@@ -550,7 +504,6 @@ void rpc_free(Channel *channel)
unpacker_teardown(channel->rpc.unpacker);
xfree(channel->rpc.unpacker);
- set_destroy(cstr_t, channel->rpc.subscribed_events);
kv_destroy(channel->rpc.call_stack);
api_free_dictionary(channel->rpc.info);
}
@@ -718,12 +671,6 @@ const char *get_client_info(Channel *chan, const char *key)
#ifdef EXITFREE
void rpc_free_all_mem(void)
{
- cstr_t key;
- set_foreach(&event_strings, key, {
- xfree((void *)key);
- });
- set_destroy(cstr_t, &event_strings);
-
multiqueue_free(ch_before_blocking_events);
}
#endif
diff --git a/src/nvim/msgpack_rpc/channel_defs.h b/src/nvim/msgpack_rpc/channel_defs.h
index 56dbb332e0..7dc1374964 100644
--- a/src/nvim/msgpack_rpc/channel_defs.h
+++ b/src/nvim/msgpack_rpc/channel_defs.h
@@ -37,7 +37,6 @@ typedef struct {
} RequestEvent;
typedef struct {
- Set(cstr_t) subscribed_events[1];
bool closed;
Unpacker *unpacker;
uint32_t next_request_id;
diff --git a/src/nvim/msgpack_rpc/unpacker.c b/src/nvim/msgpack_rpc/unpacker.c
index dbb30b0c9a..28d27e8268 100644
--- a/src/nvim/msgpack_rpc/unpacker.c
+++ b/src/nvim/msgpack_rpc/unpacker.c
@@ -187,6 +187,8 @@ void unpacker_init(Unpacker *p)
p->unpack_error = ERROR_INIT;
p->arena = (Arena)ARENA_EMPTY;
+
+ p->has_grid_line_event = false;
}
void unpacker_teardown(Unpacker *p)
@@ -303,6 +305,7 @@ error:
bool unpacker_advance(Unpacker *p)
{
assert(p->state >= 0);
+ p->has_grid_line_event = false;
if (p->state == 0) {
if (!unpacker_parse_header(p)) {
return false;
@@ -323,6 +326,7 @@ bool unpacker_advance(Unpacker *p)
if (p->state == 16) {
// grid_line event already unpacked
+ p->has_grid_line_event = true;
goto done;
} else {
assert(p->state == 12);
@@ -378,7 +382,7 @@ bool unpacker_parse_redraw(Unpacker *p)
const char *data = p->read_ptr;
size_t size = p->read_size;
- GridLineEvent *g = p->grid_line_event;
+ GridLineEvent *g = &p->grid_line_event;
#define NEXT_TYPE(tok, typ) \
result = mpack_rtoken(&data, &size, &tok); \
@@ -420,16 +424,10 @@ bool unpacker_parse_redraw(Unpacker *p)
p->read_size = size;
if (p->ui_handler.fn != ui_client_event_grid_line) {
p->state = 12;
- if (p->grid_line_event) {
- arena_mem_free(arena_finish(&p->arena));
- p->grid_line_event = NULL;
- }
return true;
} else {
p->state = 14;
p->arena = (Arena)ARENA_EMPTY;
- p->grid_line_event = arena_alloc(&p->arena, sizeof *p->grid_line_event, true);
- g = p->grid_line_event;
}
FALLTHROUGH;
diff --git a/src/nvim/msgpack_rpc/unpacker.h b/src/nvim/msgpack_rpc/unpacker.h
index 022d778013..ed55fdd4af 100644
--- a/src/nvim/msgpack_rpc/unpacker.h
+++ b/src/nvim/msgpack_rpc/unpacker.h
@@ -37,7 +37,8 @@ struct Unpacker {
int nevents;
int ncalls;
UIClientHandler ui_handler;
- GridLineEvent *grid_line_event;
+ GridLineEvent grid_line_event;
+ bool has_grid_line_event;
};
// unrecovareble error. unpack_error should be set!