1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-07 02:03:13 +02:00

core: add hashtable to quickly find buffers by id

This commit is contained in:
Sébastien Helleu
2024-06-10 23:50:48 +02:00
parent 70417a1ac6
commit 8366c32b0a
2 changed files with 23 additions and 12 deletions
+20 -12
View File
@@ -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)
+3
View File
@@ -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));
}
/*