From bcb912bc273cb11a5a4168aeca1232da23c54c82 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 10 Sep 2021 12:15:15 -0400 Subject: [PATCH] TT#136952 allow passing user data to ssrc_hash_foreach Change-Id: Iea158f06901de33ad9b53f8c277011b859cb214a --- daemon/codec.c | 14 ++++++-------- daemon/ssrc.c | 9 ++++++--- include/ssrc.h | 2 +- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/daemon/codec.c b/daemon/codec.c index 0a212a734..683212127 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -191,7 +191,7 @@ static codec_handler_func handler_func_t38; static struct ssrc_entry *__ssrc_handler_transcode_new(void *p); static struct ssrc_entry *__ssrc_handler_new(void *p); -static void __ssrc_handler_stop(void *p); +static void __ssrc_handler_stop(void *p, void *dummy); static void __free_ssrc_handler(void *); INLINE struct codec_handler *codec_handler_lookup(GHashTable *ht, int pt, struct call_media *sink); @@ -226,10 +226,9 @@ static struct codec_handler codec_handler_stub_ssrc = { static void __handler_shutdown(struct codec_handler *handler) { - if (handler->ssrc_hash) { - ssrc_hash_foreach(handler->ssrc_hash, __ssrc_handler_stop); - free_ssrc_hash(&handler->ssrc_hash); - } + ssrc_hash_foreach(handler->ssrc_hash, __ssrc_handler_stop, NULL); + free_ssrc_hash(&handler->ssrc_hash); + if (handler->ssrc_handler) obj_put(&handler->ssrc_handler->h); handler->ssrc_handler = NULL; @@ -2471,7 +2470,7 @@ static void __dtx_setup(struct codec_ssrc_handler *ch) { dtx->clockrate = ch->handler->source_pt.clock_rate; dtx->tspp = dtx->ptime * dtx->clockrate / 1000; } -static void __ssrc_handler_stop(void *p) { +static void __ssrc_handler_stop(void *p, void *dummy) { struct codec_ssrc_handler *ch = p; if (ch->dtx_buffer) { mutex_lock(&ch->dtx_buffer->lock); @@ -2484,8 +2483,7 @@ static void __ssrc_handler_stop(void *p) { void codec_handlers_stop(GQueue *q) { for (GList *l = q->head; l; l = l->next) { struct codec_handler *h = l->data; - if (h->ssrc_hash) - ssrc_hash_foreach(h->ssrc_hash, __ssrc_handler_stop); + ssrc_hash_foreach(h->ssrc_hash, __ssrc_handler_stop, NULL); } } diff --git a/daemon/ssrc.c b/daemon/ssrc.c index 46e86fcc4..27224090f 100644 --- a/daemon/ssrc.c +++ b/daemon/ssrc.c @@ -186,13 +186,16 @@ void free_ssrc_hash(struct ssrc_hash **ht) { g_slice_free1(sizeof(**ht), *ht); *ht = NULL; } -void ssrc_hash_foreach(struct ssrc_hash *sh, void (*f)(void *)) { +void ssrc_hash_foreach(struct ssrc_hash *sh, void (*f)(void *, void *), void *ptr) { + if (!sh) + return; + rwlock_lock_w(&sh->lock); for (GList *k = sh->q.head; k; k = k->next) - f(k->data); + f(k->data, ptr); if (sh->precreat) - f(sh->precreat); + f(sh->precreat, ptr); rwlock_unlock_w(&sh->lock); } diff --git a/include/ssrc.h b/include/ssrc.h index dde25a9d4..e6f02298d 100644 --- a/include/ssrc.h +++ b/include/ssrc.h @@ -206,7 +206,7 @@ struct ssrc_xr_voip_metrics { void free_ssrc_hash(struct ssrc_hash **); -void ssrc_hash_foreach(struct ssrc_hash *, void (*)(void *)); +void ssrc_hash_foreach(struct ssrc_hash *, void (*)(void *, void *), void *); struct ssrc_hash *create_ssrc_hash_full(ssrc_create_func_t, void *uptr); struct ssrc_hash *create_ssrc_hash_call(void);