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
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);
}
/* **************************************************************************
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);
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
*/
}
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);