diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 0d775397..d16e7b2b 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -709,29 +709,24 @@ mpegts_mux_open_table ( mpegts_mux_t *mm, mpegts_table_t *mt, int subscribe ) { mpegts_input_t *mi; - pthread_mutex_lock(&mm->mm_tables_lock); - if (mt->mt_destroyed) { - pthread_mutex_unlock(&mm->mm_tables_lock); + lock_assert(&mm->mm_tables_lock); + + if (mt->mt_destroyed) return; - } if (!mm->mm_active || !mm->mm_active->mmi_input) { mt->mt_subscribed = 0; LIST_INSERT_HEAD(&mm->mm_tables, mt, mt_link); mm->mm_num_tables++; - pthread_mutex_unlock(&mm->mm_tables_lock); return; } if (mt->mt_flags & MT_DEFER) { - if (mt->mt_defer_cmd == MT_DEFER_OPEN_PID) { - pthread_mutex_unlock(&mm->mm_tables_lock); + if (mt->mt_defer_cmd == MT_DEFER_OPEN_PID) return; - } mpegts_table_grab(mt); /* thread will release the table */ LIST_INSERT_HEAD(&mm->mm_tables, mt, mt_link); mm->mm_num_tables++; mt->mt_defer_cmd = MT_DEFER_OPEN_PID; TAILQ_INSERT_TAIL(&mm->mm_defer_tables, mt, mt_defer_link); - pthread_mutex_unlock(&mm->mm_tables_lock); return; } mi = mm->mm_active->mmi_input; @@ -744,6 +739,7 @@ mpegts_mux_open_table ( mpegts_mux_t *mm, mpegts_table_t *mt, int subscribe ) mt->mt_subscribed = 1; } pthread_mutex_unlock(&mi->mi_output_lock); + pthread_mutex_lock(&mm->mm_tables_lock); } void @@ -751,7 +747,8 @@ mpegts_mux_close_table ( mpegts_mux_t *mm, mpegts_table_t *mt ) { mpegts_input_t *mi; - pthread_mutex_lock(&mm->mm_tables_lock); + lock_assert(&mm->mm_tables_lock); + if (!mm->mm_active || !mm->mm_active->mmi_input) { if (mt->mt_defer_cmd) { TAILQ_REMOVE(&mm->mm_defer_tables, mt, mt_defer_link); @@ -760,27 +757,22 @@ mpegts_mux_close_table ( mpegts_mux_t *mm, mpegts_table_t *mt ) mt->mt_subscribed = 0; LIST_REMOVE(mt, mt_link); mm->mm_num_tables--; - pthread_mutex_unlock(&mm->mm_tables_lock); return; } if (mt->mt_flags & MT_DEFER) { - if (mt->mt_defer_cmd == MT_DEFER_CLOSE_PID) { - pthread_mutex_unlock(&mm->mm_tables_lock); + if (mt->mt_defer_cmd == MT_DEFER_CLOSE_PID) return; - } LIST_REMOVE(mt, mt_link); mm->mm_num_tables--; if (mt->mt_defer_cmd == MT_DEFER_OPEN_PID) { TAILQ_REMOVE(&mm->mm_defer_tables, mt, mt_defer_link); mt->mt_defer_cmd = 0; - pthread_mutex_unlock(&mm->mm_tables_lock); mpegts_table_release(mt); return; } mpegts_table_grab(mt); /* thread will free the table */ mt->mt_defer_cmd = MT_DEFER_CLOSE_PID; TAILQ_INSERT_TAIL(&mm->mm_defer_tables, mt, mt_defer_link); - pthread_mutex_unlock(&mm->mm_tables_lock); return; } mi = mm->mm_active->mmi_input; @@ -793,6 +785,7 @@ mpegts_mux_close_table ( mpegts_mux_t *mm, mpegts_table_t *mt ) mt->mt_subscribed = 0; } pthread_mutex_unlock(&mi->mi_output_lock); + pthread_mutex_lock(&mm->mm_tables_lock); } /* ************************************************************************** diff --git a/src/input/mpegts/mpegts_table.c b/src/input/mpegts/mpegts_table.c index 207e59ba..fe0e3c6c 100644 --- a/src/input/mpegts/mpegts_table.c +++ b/src/input/mpegts/mpegts_table.c @@ -122,8 +122,12 @@ mpegts_table_release_ ( mpegts_table_t *mt ) void mpegts_table_destroy ( mpegts_table_t *mt ) { + mpegts_mux_t *mm = mt->mt_mux; + + pthread_mutex_lock(&mm->mm_tables_lock); mt->mt_destroyed = 1; mt->mt_mux->mm_close_table(mt->mt_mux, mt); + pthread_mutex_unlock(&mm->mm_tables_lock); mpegts_table_release(mt); } @@ -173,17 +177,12 @@ mpegts_table_add } else { if (strcmp(mt->mt_name, name)) continue; - if (!(flags & MT_SKIPSUBS) && !mt->mt_subscribed) { - pthread_mutex_unlock(&mm->mm_tables_lock); + if (!(flags & MT_SKIPSUBS) && !mt->mt_subscribed) mm->mm_open_table(mm, mt, 1); - return mt; - } } pthread_mutex_unlock(&mm->mm_tables_lock); return mt; } - pthread_mutex_unlock(&mm->mm_tables_lock); - tvhtrace("mpegts", "add %s table %02X/%02X (%d) pid %04X (%d)", name, tableid, mask, tableid, pid, pid); @@ -210,6 +209,7 @@ mpegts_table_add subscribe = 0; } mm->mm_open_table(mm, mt, subscribe); + pthread_mutex_unlock(&mm->mm_tables_lock); return mt; }