From: Jaroslav Kysela Date: Tue, 8 Mar 2016 12:31:34 +0000 (+0100) Subject: mpegts input: start input threads later when all structure members are initialized X-Git-Tag: v4.2.1~938 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e52252592bdb515ac33ade743887c32e76b2c707;p=thirdparty%2Ftvheadend.git mpegts input: start input threads later when all structure members are initialized - for example iptv input initialized mi_display_name later and the input thread might call the the generic function - discovered by 'valgrind --tool=helgrind' --- diff --git a/src/input/mpegts.h b/src/input/mpegts.h index b7b38b118..7ec87f77b 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -677,6 +677,7 @@ struct mpegts_input /* Data input */ // Note: this section is protected by mi_input_lock pthread_t mi_input_tid; + mtimer_t mi_input_thread_start; pthread_mutex_t mi_input_lock; tvh_cond_t mi_input_cond; TAILQ_HEAD(,mpegts_packet) mi_input_queue; diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index 3792ae719..7904cf490 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -1681,8 +1681,9 @@ mpegts_input_clear_stats ( tvh_input_t *i ) } static void -mpegts_input_thread_start ( mpegts_input_t *mi ) +mpegts_input_thread_start ( void *aux ) { + mpegts_input_t *mi = aux; mi->mi_running = 1; tvhthread_create(&mi->mi_table_tid, NULL, @@ -1694,7 +1695,10 @@ mpegts_input_thread_start ( mpegts_input_t *mi ) static void mpegts_input_thread_stop ( mpegts_input_t *mi ) { + int running = mi->mi_running; + mi->mi_running = 0; + mtimer_disarm(&mi->mi_input_thread_start); /* Stop input thread */ pthread_mutex_lock(&mi->mi_input_lock); @@ -1707,10 +1711,12 @@ mpegts_input_thread_stop ( mpegts_input_t *mi ) pthread_mutex_unlock(&mi->mi_output_lock); /* Join threads (relinquish lock due to potential deadlock) */ - pthread_mutex_unlock(&global_lock); - pthread_join(mi->mi_input_tid, NULL); - pthread_join(mi->mi_table_tid, NULL); - pthread_mutex_lock(&global_lock); + if (running) { + pthread_mutex_unlock(&global_lock); + pthread_join(mi->mi_input_tid, NULL); + pthread_join(mi->mi_table_tid, NULL); + pthread_mutex_lock(&global_lock); + } } /* ************************************************************************** @@ -1806,7 +1812,7 @@ mpegts_input_create0 idnode_load(&mi->ti_id, c); /* Start threads */ - mpegts_input_thread_start(mi); + mtimer_arm_rel(&mi->mi_input_thread_start, mpegts_input_thread_start, mi, NULL); return mi; }