From 8366c32b0a8e0d76b7f1aa9a0a423ede68a7810f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Helleu?= Date: Mon, 10 Jun 2024 23:50:48 +0200 Subject: [PATCH] core: add hashtable to quickly find buffers by id --- src/gui/gui-buffer.c | 32 +++++++++++++++++++----------- tests/unit/gui/test-gui-buffer.cpp | 3 +++ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c index 20e50c87a..fd8831eb7 100644 --- a/src/gui/gui-buffer.c +++ b/src/gui/gui-buffer.c @@ -76,7 +76,8 @@ int gui_buffers_visited_count = 0; /* number of visited buffers*/ int gui_buffers_visited_frozen = 0; /* 1 to forbid list updates */ struct t_gui_buffer *gui_buffer_last_displayed = NULL; /* last b. displayed */ -long long gui_buffer_last_id_assigned = -1; /* last id assigned */ +struct t_hashtable *gui_buffer_by_id = NULL; /* buffers by id */ +long long gui_buffer_last_id_assigned = -1; /* last id assigned */ char *gui_buffer_reserved_names[] = { GUI_BUFFER_MAIN, SECURE_BUFFER_NAME, GUI_COLOR_BUFFER_NAME, @@ -833,6 +834,16 @@ gui_buffer_new_props_with_id (long long id, if (!new_buffer) return NULL; + if (!gui_buffer_by_id) + { + gui_buffer_by_id = hashtable_new ( + 64, + WEECHAT_HASHTABLE_LONGLONG, + WEECHAT_HASHTABLE_POINTER, + NULL, NULL); + } + hashtable_set (gui_buffer_by_id, &id, new_buffer); + /* init buffer */ new_buffer->id = id; if (new_buffer->id > gui_buffer_last_id_assigned) @@ -2979,17 +2990,8 @@ gui_buffer_search_main () struct t_gui_buffer * gui_buffer_search_by_id (long long id) { - struct t_gui_buffer *ptr_buffer; - - for (ptr_buffer = gui_buffers; ptr_buffer; - ptr_buffer = ptr_buffer->next_buffer) - { - if (ptr_buffer->id == id) - return ptr_buffer; - } - - /* buffer not found */ - return NULL; + return (gui_buffer_by_id) ? + hashtable_get (gui_buffer_by_id, &id) : NULL; } /* @@ -3849,6 +3851,12 @@ gui_buffer_close (struct t_gui_buffer *buffer) gui_buffers = buffer->next_buffer; if (last_gui_buffer == buffer) last_gui_buffer = buffer->prev_buffer; + hashtable_remove (gui_buffer_by_id, &buffer->id); + if (gui_buffer_by_id->items_count == 0) + { + free (gui_buffer_by_id); + gui_buffer_by_id = NULL; + } for (ptr_window = gui_windows; ptr_window; ptr_window = ptr_window->next_window) diff --git a/tests/unit/gui/test-gui-buffer.cpp b/tests/unit/gui/test-gui-buffer.cpp index 3a568ef26..13c9989ec 100644 --- a/tests/unit/gui/test-gui-buffer.cpp +++ b/tests/unit/gui/test-gui-buffer.cpp @@ -1403,6 +1403,7 @@ TEST(GuiBuffer, SearchMain) TEST(GuiBuffer, SearchById) { struct t_gui_buffer *buffer; + long long id; buffer = gui_buffer_new (NULL, TEST_BUFFER_NAME, NULL, NULL, NULL, @@ -1415,7 +1416,9 @@ TEST(GuiBuffer, SearchById) POINTERS_EQUAL(gui_buffers, gui_buffer_search_by_id (gui_buffers->id)); POINTERS_EQUAL(buffer, gui_buffer_search_by_id (buffer->id)); + id = buffer->id; gui_buffer_close (buffer); + POINTERS_EQUAL(NULL, gui_buffer_search_by_id (id)); } /*