aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/channel.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/channel.c')
-rw-r--r--src/nvim/channel.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/src/nvim/channel.c b/src/nvim/channel.c
index 849b63ae31..24793bcb2a 100644
--- a/src/nvim/channel.c
+++ b/src/nvim/channel.c
@@ -53,12 +53,24 @@ static uint64_t next_chan_id = CHAN_STDERR + 1;
/// Teardown the module
void channel_teardown(void)
{
- Channel *channel;
+ Channel *chan;
+ map_foreach_value(&channels, chan, {
+ channel_close(chan->id, kChannelPartAll, NULL);
+ });
+}
- map_foreach_value(&channels, channel, {
- channel_close(channel->id, kChannelPartAll, NULL);
+#ifdef EXITFREE
+void channel_free_all_mem(void)
+{
+ Channel *chan;
+ map_foreach_value(&channels, chan, {
+ channel_destroy(chan);
});
+ map_destroy(uint64_t, &channels);
+
+ callback_free(&on_print);
}
+#endif
/// Closes a channel
///
@@ -260,9 +272,8 @@ void callback_reader_start(CallbackReader *reader, const char *type)
reader->type = type;
}
-static void free_channel_event(void **argv)
+static void channel_destroy(Channel *chan)
{
- Channel *chan = argv[0];
if (chan->is_rpc) {
rpc_free(chan);
}
@@ -275,11 +286,17 @@ static void free_channel_event(void **argv)
callback_reader_free(&chan->on_stderr);
callback_free(&chan->on_exit);
- pmap_del(uint64_t)(&channels, chan->id, NULL);
multiqueue_free(chan->events);
xfree(chan);
}
+static void free_channel_event(void **argv)
+{
+ Channel *chan = argv[0];
+ pmap_del(uint64_t)(&channels, chan->id, NULL);
+ channel_destroy(chan);
+}
+
static void channel_destroy_early(Channel *chan)
{
if ((chan->id != --next_chan_id)) {