diff libpurple/protocols/oscar/flap_connection.c @ 29329:4d50162d809e

Put all our rateclass members in a single hash table instead of in one hash table per rateclass. Should reduce memory usage by using 1 hash table instead of 5ish for each flap connection
author Mark Doliner <mark@kingant.net>
date Wed, 03 Feb 2010 01:03:09 +0000
parents 0616027add19
children 6d2ba42595fe
line wrap: on
line diff
--- a/libpurple/protocols/oscar/flap_connection.c	Wed Feb 03 00:07:45 2010 +0000
+++ b/libpurple/protocols/oscar/flap_connection.c	Wed Feb 03 01:03:09 2010 +0000
@@ -106,19 +106,13 @@
 static struct rateclass *
 flap_connection_get_rateclass(FlapConnection *conn, guint16 family, guint16 subtype)
 {
-	GSList *tmp1;
 	gconstpointer key;
+	gpointer rateclass;
 
 	key = GUINT_TO_POINTER((family << 16) + subtype);
-
-	for (tmp1 = conn->rateclasses; tmp1 != NULL; tmp1 = tmp1->next)
-	{
-		struct rateclass *rateclass;
-		rateclass = tmp1->data;
-
-		if (g_hash_table_lookup(rateclass->members, key))
-			return rateclass;
-	}
+	rateclass = g_hash_table_lookup(conn->rateclass_members, key);
+	if (rateclass != NULL)
+		return rateclass;
 
 	return conn->default_rateclass;
 }
@@ -346,6 +340,7 @@
 	conn->fd = -1;
 	conn->subtype = -1;
 	conn->type = type;
+	conn->rateclass_members = g_hash_table_new(g_direct_hash, g_direct_equal);
 
 	od->oscar_connections = g_slist_prepend(od->oscar_connections, conn);
 
@@ -413,13 +408,6 @@
 	conn->buffer_outgoing = NULL;
 }
 
-static void
-flap_connection_destroy_rateclass(struct rateclass *rateclass)
-{
-	g_hash_table_destroy(rateclass->members);
-	g_free(rateclass);
-}
-
 /**
  * Free a FlapFrame
  *
@@ -507,10 +495,12 @@
 	g_slist_free(conn->groups);
 	while (conn->rateclasses != NULL)
 	{
-		flap_connection_destroy_rateclass(conn->rateclasses->data);
+		g_free(conn->rateclasses->data);
 		conn->rateclasses = g_slist_delete_link(conn->rateclasses, conn->rateclasses);
 	}
 
+	g_hash_table_destroy(conn->rateclass_members);
+
 	if (conn->queued_snacs) {
 		while (!g_queue_is_empty(conn->queued_snacs))
 		{