]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
cwc/cccam: fix another mutex dead-lock
authorJaroslav Kysela <perex@perex.cz>
Tue, 20 Jun 2017 13:14:44 +0000 (15:14 +0200)
committerJaroslav Kysela <perex@perex.cz>
Tue, 20 Jun 2017 13:14:44 +0000 (15:14 +0200)
src/descrambler/cccam.c
src/descrambler/cwc.c

index 410deae838b4c6057b19f05247eea88512226ec7..9a708ff2085e4410028a0f58e5fd568412c4b834 100644 (file)
@@ -1591,13 +1591,12 @@ cccam_service_pid_free(cccam_service_t *ct)
  * cccam_mutex is held
  */
 static void
-cccam_service_destroy(th_descrambler_t *td)
+cccam_service_destroy0(th_descrambler_t *td)
 {
   cccam_service_t *ct = (cccam_service_t *)td;
   cccam_t *cccam = ct->cs_cccam;
   int i;
 
-  pthread_mutex_lock(&cccam->cccam_mutex);
   for (i = 0; i < CCCAM_ES_PIDS; i++)
     if (ct->cs_epids[i])
       descrambler_close_pid(ct->cs_mux, ct,
@@ -1611,6 +1610,16 @@ cccam_service_destroy(th_descrambler_t *td)
 
   free(ct->td_nicename);
   free(ct);
+}
+
+/**
+ *
+ */
+static void
+cccam_service_destroy(th_descrambler_t *td)
+{
+  pthread_mutex_lock(&cccam->cccam_mutex);
+  cccam_service_destroy0(td);
   pthread_mutex_unlock(&cccam->cccam_mutex);
 }
 
@@ -1635,11 +1644,9 @@ cccam_service_start(caclient_t *cac, service_t *t)
   if (!idnode_is_instance(&t->s_id, &mpegts_service_class))
     return;
 
-
   pthread_mutex_lock(&cccam->cccam_mutex);
   pthread_mutex_lock(&t->s_stream_mutex);
 
-
   LIST_FOREACH(ct, &cccam->cccam_services, cs_link) {
     if (ct->td_service == t && ct->cs_cccam == cccam)
       break;
@@ -1663,7 +1670,7 @@ cccam_service_start(caclient_t *cac, service_t *t)
     if (st) break;
   }
   if (!pcard) {
-    if (ct) cccam_service_destroy((th_descrambler_t*)ct);
+    if (ct) cccam_service_destroy0((th_descrambler_t*)ct);
     goto end;
   }
   if (ct) {
index 2a245564fa597ea894239393509bad1c1c215f3a..32f62e9912e9b63595765d0c4ff0c4029e4c9615 100644 (file)
@@ -1517,13 +1517,11 @@ cwc_service_pid_free(cwc_service_t *ct)
  * cwc_mutex is held
  */
 static void
-cwc_service_destroy(th_descrambler_t *td)
+cwc_service_destroy0(th_descrambler_t *td)
 {
   cwc_service_t *ct = (cwc_service_t *)td;
   cwc_t *cwc = ct->cs_cwc;
-  int i;
 
-  pthread_mutex_lock(&cwc->cwc_mutex);
   for (i = 0; i < CWC_ES_PIDS; i++)
     if (ct->cs_epids[i])
       descrambler_close_pid(ct->cs_mux, ct,
@@ -1537,6 +1535,16 @@ cwc_service_destroy(th_descrambler_t *td)
 
   free(ct->td_nicename);
   free(ct);
+}
+
+/**
+ * cwc_mutex is held
+ */
+static void
+cwc_service_destroy(th_descrambler_t *td)
+{
+  pthread_mutex_lock(&cwc->cwc_mutex);
+  cwc_service_destroy0(td);
   pthread_mutex_unlock(&cwc->cwc_mutex);
 }
 
@@ -1586,7 +1594,7 @@ cwc_service_start(caclient_t *cac, service_t *t)
     if (st) break;
   }
   if (!pcard) {
-    if (ct) cwc_service_destroy((th_descrambler_t*)ct);
+    if (ct) cwc_service_destroy0((th_descrambler_t*)ct);
     goto end;
   }
   if (ct) {