From 031921c32270c1540ddd18a5e828fc566c497c24 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Thu, 9 Nov 2017 14:16:07 -0500 Subject: [PATCH] purge old entries from SSRC hash table if it gets too full fixes #417 Change-Id: I4da50858d3c4959687b341b7c0856a868c87ffa7 --- daemon/ssrc.c | 12 +++++++----- daemon/ssrc.h | 1 + 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/daemon/ssrc.c b/daemon/ssrc.c index 74c734008..db960a62b 100644 --- a/daemon/ssrc.c +++ b/daemon/ssrc.c @@ -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; } diff --git a/daemon/ssrc.h b/daemon/ssrc.h index 93755edf3..0d261542f 100644 --- a/daemon/ssrc.h +++ b/daemon/ssrc.h @@ -21,6 +21,7 @@ enum ssrc_dir; struct ssrc_hash { GHashTable *ht; + GQueue q; rwlock_t lock; }; struct ssrc_ctx {