]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts tables: reorganize destroy / mt_subscribed code
authorJaroslav Kysela <perex@perex.cz>
Sat, 8 Nov 2014 19:57:55 +0000 (20:57 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sat, 8 Nov 2014 20:05:39 +0000 (21:05 +0100)
src/input/mpegts.h
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_table.c

index 38154ed9bcfb35a975034337d93ad7468cbd8ec7..db8ffaea8f2253fa6359b52de708e31dc398a34a 100644 (file)
@@ -802,7 +802,10 @@ static inline void mpegts_table_release
   (mpegts_table_t *mt)
 {
   assert(mt->mt_refcount > 0);
-  if(--mt->mt_refcount == 0) mpegts_table_release_(mt);
+  if(--mt->mt_refcount == 0) {
+    assert(mt->mt_destroyed == 1);
+    mpegts_table_release_(mt);
+  }
 }
 int mpegts_table_type
   ( mpegts_table_t *mt );
index d260b99a35fae59c588187ba6e4d7ad11894b235..37b18d0046678d8fc7f1087d640f24d0b00146dc 100644 (file)
@@ -770,16 +770,16 @@ mpegts_mux_open_table ( mpegts_mux_t *mm, mpegts_table_t *mt, int subscribe )
   mi = mm->mm_active->mmi_input;
   LIST_INSERT_HEAD(&mm->mm_tables, mt, mt_link);
   mm->mm_num_tables++;
-  mpegts_table_grab(mt);
-  pthread_mutex_unlock(&mm->mm_tables_lock);
-  pthread_mutex_lock(&mi->mi_output_lock);
-  if (subscribe) {
-    mi->mi_open_pid(mi, mm, mt->mt_pid, mpegts_table_type(mt), mt);
+  if (subscribe && !mt->mt_subscribed) {
+    mpegts_table_grab(mt);
     mt->mt_subscribed = 1;
+    pthread_mutex_unlock(&mm->mm_tables_lock);
+    pthread_mutex_lock(&mi->mi_output_lock);
+    mi->mi_open_pid(mi, mm, mt->mt_pid, mpegts_table_type(mt), mt);
+    pthread_mutex_unlock(&mi->mi_output_lock);
+    pthread_mutex_lock(&mm->mm_tables_lock);
+    mpegts_table_release(mt);
   }
-  pthread_mutex_unlock(&mi->mi_output_lock);
-  pthread_mutex_lock(&mm->mm_tables_lock);
-  mpegts_table_release(mt);
 }
 
 void
@@ -819,16 +819,16 @@ mpegts_mux_close_table ( mpegts_mux_t *mm, mpegts_table_t *mt )
   mi = mm->mm_active->mmi_input;
   LIST_REMOVE(mt, mt_link);
   mm->mm_num_tables--;
-  mpegts_table_grab(mt);
-  pthread_mutex_unlock(&mm->mm_tables_lock);
-  pthread_mutex_lock(&mi->mi_output_lock);
   if (mt->mt_subscribed) {
-    mi->mi_close_pid(mi, mm, mt->mt_pid, mpegts_table_type(mt), mt);
+    mpegts_table_grab(mt);
     mt->mt_subscribed = 0;
+    pthread_mutex_unlock(&mm->mm_tables_lock);
+    pthread_mutex_lock(&mi->mi_output_lock);
+    mi->mi_close_pid(mi, mm, mt->mt_pid, mpegts_table_type(mt), mt);
+    pthread_mutex_unlock(&mi->mi_output_lock);
+    pthread_mutex_lock(&mm->mm_tables_lock);
+    mpegts_table_release(mt);
   }
-  pthread_mutex_unlock(&mi->mi_output_lock);
-  pthread_mutex_lock(&mm->mm_tables_lock);
-  mpegts_table_release(mt);
 }
 
 /* **************************************************************************
index 31c71f9d6b65630029b601d3d6695a0746042abb..1e532467b9606d09a10fbeec8f9faf0b7c6446c5 100644 (file)
@@ -148,15 +148,20 @@ mpegts_table_release_ ( mpegts_table_t *mt )
   if (mt->mt_destroy)
     mt->mt_destroy(mt);
   free(mt->mt_name);
+#if ENABLE_TRACE
+  /* poison */
+  memset(mt, 0xa5, sizeof(*mt));
+#endif
   free(mt);
 }
 
-void
-mpegts_table_destroy ( mpegts_table_t *mt )
+static void
+mpegts_table_destroy_ ( mpegts_table_t *mt )
 {
   mpegts_mux_t *mm = mt->mt_mux;
 
-  pthread_mutex_lock(&mm->mm_tables_lock);
+  lock_assert(&mm->mm_tables_lock);
+
   tvhtrace("mpegts", "table: mux %p destroy %s %02X/%02X (%d) pid %04X (%d)",
            mm, mt->mt_name, mt->mt_table, mt->mt_mask, mt->mt_table,
            mt->mt_pid, mt->mt_pid);
@@ -164,10 +169,19 @@ mpegts_table_destroy ( mpegts_table_t *mt )
   mt->mt_destroyed = 1;
   mt->mt_mux->mm_close_table(mt->mt_mux, mt);
   mpegts_table_consistency_check(mm);
-  pthread_mutex_unlock(&mm->mm_tables_lock);
   mpegts_table_release(mt);
 }
 
+void
+mpegts_table_destroy ( mpegts_table_t *mt )
+{
+  mpegts_mux_t *mm = mt->mt_mux;
+
+  pthread_mutex_lock(&mm->mm_tables_lock);
+  mpegts_table_destroy_(mt);
+  pthread_mutex_unlock(&mm->mm_tables_lock);
+}
+
 /**
  * Determine table type
  */
@@ -271,13 +285,8 @@ mpegts_table_flush_all ( mpegts_mux_t *mm )
   }
   while ((mt = LIST_FIRST(&mm->mm_tables))) {
     mt->mt_flags &= ~MT_DEFER; /* force destroy */
-    mt->mt_destroyed = 1;      /* early destroy mark */
-    mpegts_table_grab(mt);
     mpegts_table_consistency_check(mm);
-    pthread_mutex_unlock(&mm->mm_tables_lock);
-    mpegts_table_destroy(mt);
-    mpegts_table_release(mt);
-    pthread_mutex_lock(&mm->mm_tables_lock);
+    mpegts_table_destroy_(mt);
     mpegts_table_consistency_check(mm);
   }
   assert(mm->mm_num_tables == 0);