diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-12-02 07:55:44 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-02 07:55:44 +0800 |
commit | f6e5366d0077e9f171651f37282cb5c47629d1b6 (patch) | |
tree | fb7f29ea11c7c122f3e4404c9473b8fff1dc5eaf /src/nvim/api/ui.c | |
parent | 983defd284f5941c870d7868cdb60587a98ab348 (diff) | |
download | rneovim-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.c | 25 |
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. |