From 787e192567626dab7788e54363dbccda52d5322c Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Fri, 12 May 2017 13:36:48 +0200 Subject: [PATCH 1/2] improve nicklist performance --- src/core/nicklist.c | 53 ++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/src/core/nicklist.c b/src/core/nicklist.c index 770b0afc..50199f63 100644 --- a/src/core/nicklist.c +++ b/src/core/nicklist.c @@ -166,41 +166,50 @@ void nicklist_rename_unique(SERVER_REC *server, nicklist_get_same_unique(server, old_nick_id)); } +#define NICKLIST_GETNICKS_LOOP_INIT(hashtable) \ + do { \ + GHashTableIter _iter; \ + g_hash_table_iter_init(&_iter, (hashtable)); \ + while (g_hash_table_iter_next(&_iter, NULL, (void*)&nick)) { \ + while (nick != NULL) { +#define NICKLIST_GETNICKS_LOOP_END \ + nick = nick->next; \ + } \ + } \ + } while (0) + static NICK_REC *nicklist_find_wildcards(CHANNEL_REC *channel, const char *mask) { - GSList *nicks, *tmp; NICK_REC *nick; - nicks = nicklist_getnicks(channel); - nick = NULL; - for (tmp = nicks; tmp != NULL; tmp = tmp->next) { - nick = tmp->data; + NICKLIST_GETNICKS_LOOP_INIT(channel->nicks); - if (mask_match_address(channel->server, mask, - nick->nick, nick->host)) - break; - } - g_slist_free(nicks); - return tmp == NULL ? NULL : nick; + if (mask_match_address(channel->server, mask, + nick->nick, nick->host)) + return nick; + + NICKLIST_GETNICKS_LOOP_END; + return NULL; } GSList *nicklist_find_multiple(CHANNEL_REC *channel, const char *mask) { - GSList *nicks, *tmp, *next; + GSList *nicks; + NICK_REC *nick; g_return_val_if_fail(IS_CHANNEL(channel), NULL); g_return_val_if_fail(mask != NULL, NULL); - nicks = nicklist_getnicks(channel); - for (tmp = nicks; tmp != NULL; tmp = next) { - NICK_REC *nick = tmp->data; + nicks = NULL; - next = tmp->next; - if (!mask_match_address(channel->server, mask, - nick->nick, nick->host)) - nicks = g_slist_remove(nicks, tmp->data); - } + NICKLIST_GETNICKS_LOOP_INIT(channel->nicks); + + if (mask_match_address(channel->server, mask, + nick->nick, nick->host)) + nicks = g_slist_prepend(nicks, nick); + + NICKLIST_GETNICKS_LOOP_END; return nicks; } @@ -264,8 +273,8 @@ NICK_REC *nicklist_find_mask(CHANNEL_REC *channel, const char *mask) static void get_nicks_hash(gpointer key, NICK_REC *rec, GSList **list) { while (rec != NULL) { - *list = g_slist_append(*list, rec); - rec = rec->next; + *list = g_slist_prepend(*list, rec); + rec = rec->next; } } From 371eb7f5052b9cce7efcbcc4086cd6f6716e21fd Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Fri, 12 May 2017 16:27:33 +0200 Subject: [PATCH 2/2] expand macro --- src/core/nicklist.c | 43 ++++++++++++++++++------------------------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/src/core/nicklist.c b/src/core/nicklist.c index 50199f63..54dfb5fb 100644 --- a/src/core/nicklist.c +++ b/src/core/nicklist.c @@ -166,30 +166,21 @@ void nicklist_rename_unique(SERVER_REC *server, nicklist_get_same_unique(server, old_nick_id)); } -#define NICKLIST_GETNICKS_LOOP_INIT(hashtable) \ - do { \ - GHashTableIter _iter; \ - g_hash_table_iter_init(&_iter, (hashtable)); \ - while (g_hash_table_iter_next(&_iter, NULL, (void*)&nick)) { \ - while (nick != NULL) { -#define NICKLIST_GETNICKS_LOOP_END \ - nick = nick->next; \ - } \ - } \ - } while (0) - static NICK_REC *nicklist_find_wildcards(CHANNEL_REC *channel, const char *mask) { NICK_REC *nick; + GHashTableIter iter; - NICKLIST_GETNICKS_LOOP_INIT(channel->nicks); + g_hash_table_iter_init(&iter, channel->nicks); + while (g_hash_table_iter_next(&iter, NULL, (void*)&nick)) { + for (; nick != NULL; nick = nick->next) { + if (mask_match_address(channel->server, mask, + nick->nick, nick->host)) + return nick; + } + } - if (mask_match_address(channel->server, mask, - nick->nick, nick->host)) - return nick; - - NICKLIST_GETNICKS_LOOP_END; return NULL; } @@ -197,19 +188,21 @@ GSList *nicklist_find_multiple(CHANNEL_REC *channel, const char *mask) { GSList *nicks; NICK_REC *nick; + GHashTableIter iter; g_return_val_if_fail(IS_CHANNEL(channel), NULL); g_return_val_if_fail(mask != NULL, NULL); nicks = NULL; - NICKLIST_GETNICKS_LOOP_INIT(channel->nicks); - - if (mask_match_address(channel->server, mask, - nick->nick, nick->host)) - nicks = g_slist_prepend(nicks, nick); - - NICKLIST_GETNICKS_LOOP_END; + g_hash_table_iter_init(&iter, channel->nicks); + while (g_hash_table_iter_next(&iter, NULL, (void*)&nick)) { + for (; nick != NULL; nick = nick->next) { + if (mask_match_address(channel->server, mask, + nick->nick, nick->host)) + nicks = g_slist_prepend(nicks, nick); + } + } return nicks; }