diff --git a/daemon/media_socket.c b/daemon/media_socket.c index 7e5177312..65d4e4541 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -1524,7 +1524,7 @@ typedef struct { static void kernelize_state_clear(kernelize_state *s) { rtp_stats_arr_destroy_ptr(&s->payload_types); t_queue_clear_full(&s->outputs, - (void (*)(struct rtpengine_destination_info *)) g_free); // should always be empty + (void (*)(struct rtpengine_destination_info *)) g_free); } G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(kernelize_state, kernelize_state_clear) @@ -1836,10 +1836,11 @@ static bool kernelize_one_sink_handler(kernelize_state *s, static void kernelize(struct packet_stream *stream) { call_t *call = stream->call; struct call_media *media = stream->media; - g_auto(kernelize_state) s = {0}; while (true) { + g_auto(kernelize_state) s = {0}; + LOCK(&stream->lock); // set flag, return if set already @@ -1872,14 +1873,14 @@ static void kernelize(struct packet_stream *stream) { continue; bool ok = kernelize_one_sink_handler(&s, stream, sh); if (!ok) - goto restart; + continue; // retry } // RTP egress mirrors for (__auto_type l = stream->rtp_mirrors.head; l; l = l->next) { struct sink_handler *sh = l->data; bool ok = kernelize_one_sink_handler(&s, stream, sh); if (!ok) - goto restart; + continue; // retry } // RTP -> RTCP sinks // record number of RTP destinations up to now @@ -1890,7 +1891,7 @@ static void kernelize(struct packet_stream *stream) { struct sink_handler *sh = l->data; bool ok = kernelize_one_sink_handler(&s, stream, sh); if (!ok) - goto restart; + continue; // retry } // mark the start of RTCP outputs s.reti.num_rtcp_destinations = s.reti.num_destinations - num_rtp_dests; @@ -1922,14 +1923,6 @@ no_kernel: PS_SET(stream, NO_KERNEL_SUPPORT); return; -restart: // handle detected deadlock - - rtp_stats_arr_destroy_ptr(&s.payload_types); - - while ((redi = t_queue_pop_head(&s.outputs))) - g_free(redi); - - // try again, releases stream->lock } }