From: Jaroslav Kysela Date: Sat, 15 Nov 2014 15:29:57 +0000 (+0100) Subject: mpegts input: protect global variable mpegts_pid_skel using mutex X-Git-Tag: v4.1~770 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f1d851a404a84cbe266923cfeecb92995291b8b;p=thirdparty%2Ftvheadend.git mpegts input: protect global variable mpegts_pid_skel using mutex - the skel variable is shared in multiple thread - also remove mpegts_pid_sub_skel, it's not used frequently --- diff --git a/src/input/mpegts/dvb.h b/src/input/mpegts/dvb.h index c994fae0c..ed0a5e4a6 100644 --- a/src/input/mpegts/dvb.h +++ b/src/input/mpegts/dvb.h @@ -511,6 +511,7 @@ const int dvb_sat_position_from_str( const char *buf ); #endif /* ENABLE_MPEGTS_DVB */ +void dvb_init ( void ); void dvb_done ( void ); #endif /* DVB_SUPPORT_H */ diff --git a/src/input/mpegts/dvb_support.c b/src/input/mpegts/dvb_support.c index e69c21a68..bd4e84e67 100644 --- a/src/input/mpegts/dvb_support.c +++ b/src/input/mpegts/dvb_support.c @@ -899,13 +899,19 @@ dvb_sat_position_from_str( const char *buf ) /** * */ +extern pthread_mutex_t mpegts_pid_skel_mutex; + +void dvb_init( void ) +{ + pthread_mutex_init(&mpegts_pid_skel_mutex, NULL); +} + void dvb_done( void ) { extern SKEL_DECLARE(mpegts_table_state_skel, struct mpegts_table_state); - extern SKEL_DECLARE(mpegts_pid_sub_skel, mpegts_pid_sub_t); extern SKEL_DECLARE(mpegts_pid_skel, mpegts_pid_t); SKEL_FREE(mpegts_table_state_skel); - SKEL_FREE(mpegts_pid_sub_skel); SKEL_FREE(mpegts_pid_skel); + pthread_mutex_destroy(&mpegts_pid_skel_mutex); } diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index 82d9cb373..8f6d6b8dc 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -30,8 +30,6 @@ #include #include -SKEL_DECLARE(mpegts_pid_sub_skel, mpegts_pid_sub_t); - static void mpegts_input_del_network ( mpegts_network_link_t *mnl ); @@ -338,17 +336,19 @@ mpegts_input_open_pid { char buf[512]; mpegts_pid_t *mp; + mpegts_pid_sub_t *mps; assert(owner != NULL); lock_assert(&mi->mi_output_lock); if ((mp = mpegts_mux_find_pid(mm, pid, 1))) { - SKEL_ALLOC(mpegts_pid_sub_skel); - mpegts_pid_sub_skel->mps_type = type; - mpegts_pid_sub_skel->mps_owner = owner; - if (!RB_INSERT_SORTED(&mp->mp_subs, mpegts_pid_sub_skel, mps_link, mps_cmp)) { + mps = calloc(1, sizeof(*mps)); + mps->mps_type = type; + mps->mps_owner = owner; + if (!RB_INSERT_SORTED(&mp->mp_subs, mps, mps_link, mps_cmp)) { mpegts_mux_nice_name(mm, buf, sizeof(buf)); tvhdebug("mpegts", "%s - open PID %04X (%d) [%d/%p]", buf, mp->mp_pid, mp->mp_pid, type, owner); - SKEL_USED(mpegts_pid_sub_skel); + } else { + free(mps); } } return mp; diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index ddb800234..bb77ae6f4 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -28,6 +28,7 @@ #include +pthread_mutex_t mpegts_pid_skel_mutex; SKEL_DECLARE(mpegts_pid_skel, mpegts_pid_t); static void mpegts_mux_scan_timeout ( void *p ); @@ -1143,6 +1144,7 @@ mpegts_mux_find_pid_ ( mpegts_mux_t *mm, int pid, int create ) skel.mp_pid = pid; mp = RB_FIND(&mm->mm_pids, &skel, mp_link, mp_cmp); } else { + pthread_mutex_lock(&mpegts_pid_skel_mutex); SKEL_ALLOC(mpegts_pid_skel); mpegts_pid_skel->mp_pid = pid; mp = RB_INSERT_SORTED(&mm->mm_pids, mpegts_pid_skel, mp_link, mp_cmp); @@ -1152,6 +1154,7 @@ mpegts_mux_find_pid_ ( mpegts_mux_t *mm, int pid, int create ) mp->mp_fd = -1; mp->mp_cc = -1; } + pthread_mutex_unlock(&mpegts_pid_skel_mutex); } if (mp) { mm->mm_last_pid = pid; diff --git a/src/main.c b/src/main.c index a193bab65..c3fd56b46 100644 --- a/src/main.c +++ b/src/main.c @@ -818,6 +818,8 @@ main(int argc, char **argv) service_init(); + dvb_init(); + #if ENABLE_MPEGTS mpegts_init(adapter_mask, &opt_satip_xml, &opt_tsfile, opt_tsfile_tuner); #endif