purge old entries from SSRC hash table if it gets too full

fixes #417

Change-Id: I4da50858d3c4959687b341b7c0856a868c87ffa7
changes/87/16787/2
Richard Fuchs 8 years ago
parent 465f3fe721
commit 031921c322

@ -21,6 +21,7 @@ static struct ssrc_entry *create_ssrc_entry(u_int32_t ssrc) {
}
static void add_ssrc_entry(struct ssrc_entry *ent, struct ssrc_hash *ht) {
g_hash_table_replace(ht->ht, &ent->ssrc, ent);
g_queue_push_tail(&ht->q, ent);
}
static void free_sender_report(struct ssrc_sender_report_item *i) {
g_slice_free1(sizeof(*i), i);
@ -78,11 +79,11 @@ restart:
rwlock_lock_w(&ht->lock);
if (G_UNLIKELY(g_hash_table_size(ht->ht) > 20)) { // arbitrary limit
rwlock_unlock_w(&ht->lock);
free_ssrc_entry(ent);
ilog(LOG_INFO, "SSRC hash table exceeded size limit (trying to add %u)", ssrc);
return NULL;
while (G_UNLIKELY(ht->q.length > 20)) { // arbitrary limit
struct ssrc_entry *old_ent = g_queue_pop_head(&ht->q);
ilog(LOG_DEBUG, "SSRC hash table exceeded size limit (trying to add %u) - deleting SSRC %u",
ssrc, old_ent->ssrc);
g_hash_table_remove(ht->ht, &old_ent->ssrc);
}
if (g_hash_table_lookup(ht->ht, &ssrc)) {
@ -101,6 +102,7 @@ void free_ssrc_hash(struct ssrc_hash **ht) {
if (!*ht)
return;
g_hash_table_destroy((*ht)->ht);
g_queue_clear(&(*ht)->q);
g_slice_free1(sizeof(**ht), *ht);
*ht = NULL;
}

@ -21,6 +21,7 @@ enum ssrc_dir;
struct ssrc_hash {
GHashTable *ht;
GQueue q;
rwlock_t lock;
};
struct ssrc_ctx {

Loading…
Cancel
Save