From: Jaroslav Kysela Date: Tue, 20 Jun 2017 13:14:44 +0000 (+0200) Subject: cwc/cccam: fix another mutex dead-lock X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5c51fb537b5ca9816202e5200317d3fa368047ab;p=thirdparty%2Ftvheadend.git cwc/cccam: fix another mutex dead-lock --- diff --git a/src/descrambler/cccam.c b/src/descrambler/cccam.c index 410deae83..9a708ff20 100644 --- a/src/descrambler/cccam.c +++ b/src/descrambler/cccam.c @@ -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) { diff --git a/src/descrambler/cwc.c b/src/descrambler/cwc.c index 2a245564f..32f62e991 100644 --- a/src/descrambler/cwc.c +++ b/src/descrambler/cwc.c @@ -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) {