]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts input: start input threads later when all structure members are initialized
authorJaroslav Kysela <perex@perex.cz>
Tue, 8 Mar 2016 12:31:34 +0000 (13:31 +0100)
committerJaroslav Kysela <perex@perex.cz>
Tue, 8 Mar 2016 12:31:43 +0000 (13:31 +0100)
- for example iptv input initialized mi_display_name later and
  the input thread might call the the generic function
- discovered by 'valgrind --tool=helgrind'

src/input/mpegts.h
src/input/mpegts/mpegts_input.c

index b7b38b118d87164b6baff2209615ee981270825e..7ec87f77bf19727d93e4676213c4a3a8e51efd84 100644 (file)
@@ -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;
index 3792ae719bd41b1de457af7dc9416e2ec34d9fa2..7904cf490d07b354cb65c8d1ba8e4d59ca531a92 100644 (file)
@@ -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;
 }