]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts input: protect global variable mpegts_pid_skel using mutex
authorJaroslav Kysela <perex@perex.cz>
Sat, 15 Nov 2014 15:29:57 +0000 (16:29 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sat, 15 Nov 2014 15:30:05 +0000 (16:30 +0100)
- the skel variable is shared in multiple thread
- also remove mpegts_pid_sub_skel, it's not used frequently

src/input/mpegts/dvb.h
src/input/mpegts/dvb_support.c
src/input/mpegts/mpegts_input.c
src/input/mpegts/mpegts_mux.c
src/main.c

index c994fae0c7fc3cc0bb819d64934b7f7c4960976b..ed0a5e4a666ffa86c42e11056f3546eb6297c62d 100644 (file)
@@ -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 */
index e69c21a681606c10e73e78fe2837db6d314c7752..bd4e84e670b1a0d5e77233bb8a945260dda61368 100644 (file)
@@ -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);
 }
index 82d9cb3736565c434a01717772cbd882057f8428..8f6d6b8dc8cac6660c407b25a8411a3dfacf223a 100644 (file)
@@ -30,8 +30,6 @@
 #include <pthread.h>
 #include <assert.h>
 
-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;
index ddb800234d7ce397a0be3c662094575cbc863091..bb77ae6f449addaaec4fb48a6a4686f2b21abd4a 100644 (file)
@@ -28,6 +28,7 @@
 
 #include <assert.h>
 
+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;
index a193bab655f5f2f38a8b15250ad6526b71226736..c3fd56b46ee43a67b66501042d5755a1d16ac9f3 100644 (file)
@@ -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