comparison 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
comparison
equal deleted inserted replaced
29328:0616027add19 29329:4d50162d809e
104 } 104 }
105 105
106 static struct rateclass * 106 static struct rateclass *
107 flap_connection_get_rateclass(FlapConnection *conn, guint16 family, guint16 subtype) 107 flap_connection_get_rateclass(FlapConnection *conn, guint16 family, guint16 subtype)
108 { 108 {
109 GSList *tmp1;
110 gconstpointer key; 109 gconstpointer key;
110 gpointer rateclass;
111 111
112 key = GUINT_TO_POINTER((family << 16) + subtype); 112 key = GUINT_TO_POINTER((family << 16) + subtype);
113 113 rateclass = g_hash_table_lookup(conn->rateclass_members, key);
114 for (tmp1 = conn->rateclasses; tmp1 != NULL; tmp1 = tmp1->next) 114 if (rateclass != NULL)
115 { 115 return rateclass;
116 struct rateclass *rateclass;
117 rateclass = tmp1->data;
118
119 if (g_hash_table_lookup(rateclass->members, key))
120 return rateclass;
121 }
122 116
123 return conn->default_rateclass; 117 return conn->default_rateclass;
124 } 118 }
125 119
126 /* 120 /*
344 conn->od = od; 338 conn->od = od;
345 conn->buffer_outgoing = purple_circ_buffer_new(0); 339 conn->buffer_outgoing = purple_circ_buffer_new(0);
346 conn->fd = -1; 340 conn->fd = -1;
347 conn->subtype = -1; 341 conn->subtype = -1;
348 conn->type = type; 342 conn->type = type;
343 conn->rateclass_members = g_hash_table_new(g_direct_hash, g_direct_equal);
349 344
350 od->oscar_connections = g_slist_prepend(od->oscar_connections, conn); 345 od->oscar_connections = g_slist_prepend(od->oscar_connections, conn);
351 346
352 return conn; 347 return conn;
353 } 348 }
409 g_free(conn->buffer_incoming.data.data); 404 g_free(conn->buffer_incoming.data.data);
410 conn->buffer_incoming.data.data = NULL; 405 conn->buffer_incoming.data.data = NULL;
411 406
412 purple_circ_buffer_destroy(conn->buffer_outgoing); 407 purple_circ_buffer_destroy(conn->buffer_outgoing);
413 conn->buffer_outgoing = NULL; 408 conn->buffer_outgoing = NULL;
414 }
415
416 static void
417 flap_connection_destroy_rateclass(struct rateclass *rateclass)
418 {
419 g_hash_table_destroy(rateclass->members);
420 g_free(rateclass);
421 } 409 }
422 410
423 /** 411 /**
424 * Free a FlapFrame 412 * Free a FlapFrame
425 * 413 *
505 flap_connection_destroy_chat(od, conn); 493 flap_connection_destroy_chat(od, conn);
506 494
507 g_slist_free(conn->groups); 495 g_slist_free(conn->groups);
508 while (conn->rateclasses != NULL) 496 while (conn->rateclasses != NULL)
509 { 497 {
510 flap_connection_destroy_rateclass(conn->rateclasses->data); 498 g_free(conn->rateclasses->data);
511 conn->rateclasses = g_slist_delete_link(conn->rateclasses, conn->rateclasses); 499 conn->rateclasses = g_slist_delete_link(conn->rateclasses, conn->rateclasses);
512 } 500 }
501
502 g_hash_table_destroy(conn->rateclass_members);
513 503
514 if (conn->queued_snacs) { 504 if (conn->queued_snacs) {
515 while (!g_queue_is_empty(conn->queued_snacs)) 505 while (!g_queue_is_empty(conn->queued_snacs))
516 { 506 {
517 QueuedSnac *queued_snac; 507 QueuedSnac *queued_snac;