aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/api/ui.c
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-12-02 07:55:44 +0800
committerGitHub <noreply@github.com>2023-12-02 07:55:44 +0800
commitf6e5366d0077e9f171651f37282cb5c47629d1b6 (patch)
treefb7f29ea11c7c122f3e4404c9473b8fff1dc5eaf /src/nvim/api/ui.c
parent983defd284f5941c870d7868cdb60587a98ab348 (diff)
downloadrneovim-f6e5366d0077e9f171651f37282cb5c47629d1b6.tar.gz
rneovim-f6e5366d0077e9f171651f37282cb5c47629d1b6.tar.bz2
rneovim-f6e5366d0077e9f171651f37282cb5c47629d1b6.zip
refactor: free more reachable memory with EXITFREE (#26349)
Discovered using __sanitizer_print_memory_profile().
Diffstat (limited to 'src/nvim/api/ui.c')
-rw-r--r--src/nvim/api/ui.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/nvim/api/ui.c b/src/nvim/api/ui.c
index 7e64ce9cd1..b73c026d57 100644
--- a/src/nvim/api/ui.c
+++ b/src/nvim/api/ui.c
@@ -106,21 +106,36 @@ static void mpack_str(char **buf, const char *str)
*buf += len;
}
+static void remote_ui_destroy(UI *ui)
+ FUNC_ATTR_NONNULL_ALL
+{
+ UIData *data = ui->data;
+ kv_destroy(data->call_buf);
+ XFREE_CLEAR(ui->term_name);
+ xfree(ui);
+}
+
void remote_ui_disconnect(uint64_t channel_id)
{
UI *ui = pmap_get(uint64_t)(&connected_uis, channel_id);
if (!ui) {
return;
}
- UIData *data = ui->data;
- kv_destroy(data->call_buf);
pmap_del(uint64_t)(&connected_uis, channel_id, NULL);
ui_detach_impl(ui, channel_id);
+ remote_ui_destroy(ui);
+}
- // Destroy `ui`.
- XFREE_CLEAR(ui->term_name);
- xfree(ui);
+#ifdef EXITFREE
+void remote_ui_free_all_mem(void)
+{
+ UI *ui;
+ map_foreach_value(&connected_uis, ui, {
+ remote_ui_destroy(ui);
+ });
+ map_destroy(uint64_t, &connected_uis);
}
+#endif
/// Wait until ui has connected on stdio channel if only_stdio
/// is true, otherwise any channel.