Browse Source

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
commit
031921c322
2 changed files with 8 additions and 5 deletions
  1. +7
    -5
      daemon/ssrc.c
  2. +1
    -0
      daemon/ssrc.h

+ 7
- 5
daemon/ssrc.c View File

@ -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;
}


+ 1
- 0
daemon/ssrc.h View File

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


Loading…
Cancel
Save