|
|
|
|
@ -52,7 +52,7 @@ static struct ssrc_entry *create_ssrc_entry_call(void *uptr) {
|
|
|
|
|
}
|
|
|
|
|
static void add_ssrc_entry(uint32_t ssrc, struct ssrc_entry *ent, struct ssrc_hash *ht) {
|
|
|
|
|
init_ssrc_entry(ent, ssrc);
|
|
|
|
|
g_hash_table_replace(ht->ht, &ent->ssrc, ent);
|
|
|
|
|
g_hash_table_replace(ht->nht, GUINT_TO_POINTER(ent->ssrc), ent);
|
|
|
|
|
obj_hold(ent); // HT entry
|
|
|
|
|
g_queue_push_tail(&ht->q, ent);
|
|
|
|
|
obj_hold(ent); // queue entry
|
|
|
|
|
@ -190,7 +190,7 @@ static void *find_ssrc(uint32_t ssrc, struct ssrc_hash *ht) {
|
|
|
|
|
rwlock_lock_r(&ht->lock);
|
|
|
|
|
struct ssrc_entry *ret = atomic_get_na(&ht->cache);
|
|
|
|
|
if (!ret || ret->ssrc != ssrc) {
|
|
|
|
|
ret = g_hash_table_lookup(ht->ht, &ssrc);
|
|
|
|
|
ret = g_hash_table_lookup(ht->nht, GUINT_TO_POINTER(ssrc));
|
|
|
|
|
if (ret) {
|
|
|
|
|
obj_hold(ret);
|
|
|
|
|
// cache shares the reference from ht
|
|
|
|
|
@ -253,11 +253,11 @@ restart:
|
|
|
|
|
"deleting SSRC %s%x%s",
|
|
|
|
|
FMT_M(ssrc), FMT_M(old_ent->ssrc));
|
|
|
|
|
atomic_set(&ht->cache, NULL);
|
|
|
|
|
g_hash_table_remove(ht->ht, &old_ent->ssrc); // does obj_put
|
|
|
|
|
g_hash_table_remove(ht->nht, GUINT_TO_POINTER(old_ent->ssrc)); // does obj_put
|
|
|
|
|
obj_put(old_ent); // for the queue entry
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (g_hash_table_lookup(ht->ht, &ssrc)) {
|
|
|
|
|
if (g_hash_table_lookup(ht->nht, GUINT_TO_POINTER(ssrc))) {
|
|
|
|
|
// preempted
|
|
|
|
|
rwlock_unlock_w(&ht->lock);
|
|
|
|
|
// return created entry if slot is still empty
|
|
|
|
|
@ -277,7 +277,7 @@ restart:
|
|
|
|
|
void free_ssrc_hash(struct ssrc_hash **ht) {
|
|
|
|
|
if (!*ht)
|
|
|
|
|
return;
|
|
|
|
|
g_hash_table_destroy((*ht)->ht);
|
|
|
|
|
g_hash_table_destroy((*ht)->nht);
|
|
|
|
|
g_queue_clear_full(&(*ht)->q, ssrc_entry_put);
|
|
|
|
|
if ((*ht)->precreat)
|
|
|
|
|
obj_put((struct ssrc_entry *) (*ht)->precreat);
|
|
|
|
|
@ -302,7 +302,7 @@ void ssrc_hash_foreach(struct ssrc_hash *sh, void (*f)(void *, void *), void *pt
|
|
|
|
|
struct ssrc_hash *create_ssrc_hash_full_fast(ssrc_create_func_t cfunc, void *uptr) {
|
|
|
|
|
struct ssrc_hash *ret;
|
|
|
|
|
ret = g_new0(__typeof(*ret), 1);
|
|
|
|
|
ret->ht = g_hash_table_new_full(uint32_hash, uint32_eq, NULL, ssrc_entry_put);
|
|
|
|
|
ret->nht = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, ssrc_entry_put);
|
|
|
|
|
rwlock_init(&ret->lock);
|
|
|
|
|
ret->create_func = cfunc;
|
|
|
|
|
ret->uptr = uptr;
|
|
|
|
|
|