Mercurial > pidgin.yaz
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; |