# HG changeset patch # User Paul Aurich # Date 1310923397 0 # Node ID 4739488955a7ab91124c541889e30beb36e2a509 # Parent a40d1cb09bebf8874fb24236cce4d79bb8e3d6de dnssrv: Avoid a few extraneous iterations through the list. Refs #12647 diff -r a40d1cb09beb -r 4739488955a7 libpurple/dnssrv.c --- a/libpurple/dnssrv.c Sun Jul 17 17:15:13 2011 +0000 +++ b/libpurple/dnssrv.c Sun Jul 17 17:23:17 2011 +0000 @@ -1018,38 +1018,41 @@ static void purple_srv_query_resolved(PurpleSrvTxtQueryData *query_data, GList *records) { - GList *sorted_records, *l; + GList *l; PurpleSrvResponse *records_array; - int i; + int i = 0, length; g_return_if_fail(records != NULL); if (query_data->cb.srv == NULL) { purple_srv_txt_query_destroy(query_data); - g_list_foreach(records, (GFunc)g_free, NULL); - g_list_free(records); + while (records) { + g_free(records->data); + records = g_list_delete_link(records, records); + } return; } - sorted_records = purple_srv_sort(records); - - purple_debug_info("dnssrv", "SRV records resolved for %s, count: %d\n", query_data->query, g_list_length(sorted_records)); + records = purple_srv_sort(records); + length = g_list_length(records); - records_array = g_new(PurpleSrvResponse, g_list_length(sorted_records)); + purple_debug_info("dnssrv", "SRV records resolved for %s, count: %d\n", + query_data->query, length); - i = 0; - - for (l = sorted_records; l; l = l->next, i++) { + records_array = g_new(PurpleSrvResponse, length); + for (l = records; l; l = l->next, i++) { records_array[i] = *(PurpleSrvResponse *)l->data; } - query_data->cb.srv(records_array, i, query_data->extradata); + query_data->cb.srv(records_array, length, query_data->extradata); purple_srv_txt_query_destroy(query_data); - g_list_foreach(sorted_records, (GFunc)g_free, NULL); - g_list_free(sorted_records); + while (records) { + g_free(records->data); + records = g_list_delete_link(records, records); + } } /* @@ -1067,8 +1070,10 @@ if (query_data->cb.txt != NULL) query_data->cb.txt(entries, query_data->extradata); else { - g_list_foreach(entries, (GFunc)g_free, NULL); - g_list_free(entries); + while (entries) { + g_free(entries->data); + entries = g_list_delete_link(entries, entries); + } } purple_srv_txt_query_destroy(query_data);