From: Jaroslav Kysela Date: Thu, 12 Nov 2015 16:06:23 +0000 (+0100) Subject: service/bouquet: fix the channel destroy when service associated to the bouquet is... X-Git-Tag: v4.2.1~1564 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6b11d91f13d494e2e957a93046a1b7ce5add5034;p=thirdparty%2Ftvheadend.git service/bouquet: fix the channel destroy when service associated to the bouquet is destroyed, fixes #3245 --- diff --git a/src/bouquet.c b/src/bouquet.c index f165d93eb..378ef9f45 100644 --- a/src/bouquet.c +++ b/src/bouquet.c @@ -33,7 +33,7 @@ typedef struct bouquet_download { bouquet_tree_t bouquets; -static void bouquet_remove_service(bouquet_t *bq, service_t *s); +static void bouquet_remove_service(bouquet_t *bq, service_t *s, int delconf); static uint64_t bouquet_get_channel_number0(bouquet_t *bq, service_t *t); static void bouquet_download_trigger(bouquet_t *bq); static void bouquet_download_stop(void *aux); @@ -155,7 +155,7 @@ bouquet_destroy(bouquet_t *bq) * */ void -bouquet_destroy_by_service(service_t *t) +bouquet_destroy_by_service(service_t *t, int delconf) { bouquet_t *bq; service_lcn_t *sl; @@ -164,7 +164,7 @@ bouquet_destroy_by_service(service_t *t) RB_FOREACH(bq, &bouquets, bq_link) if (idnode_set_exists(bq->bq_services, &t->s_id)) - bouquet_remove_service(bq, t); + bouquet_remove_service(bq, t, delconf); while ((sl = LIST_FIRST(&t->s_lcns)) != NULL) { LIST_REMOVE(sl, sl_link); free(sl); @@ -398,12 +398,13 @@ bouquet_notify_service_enabled(service_t *t) * */ static void -bouquet_remove_service(bouquet_t *bq, service_t *s) +bouquet_remove_service(bouquet_t *bq, service_t *s, int delconf) { tvhtrace("bouquet", "remove service %s from %s", s->s_nicename, bq->bq_name ?: ""); idnode_set_remove(bq->bq_services, &s->s_id); - bouquet_unmap_channel(bq, s); + if (delconf) + bouquet_unmap_channel(bq, s); } /* @@ -438,7 +439,7 @@ bouquet_completed(bouquet_t *bq, uint32_t seen) if (!idnode_set_exists(bq->bq_active_services, bq->bq_services->is_array[z])) idnode_set_add(remove, bq->bq_services->is_array[z], NULL, NULL); for (z = 0; z < remove->is_count; z++) - bouquet_remove_service(bq, (service_t *)remove->is_array[z]); + bouquet_remove_service(bq, (service_t *)remove->is_array[z], 1); idnode_set_free(remove); /* Remove no longer used LCNs */ diff --git a/src/bouquet.h b/src/bouquet.h index 06f8d1630..44b8a75be 100644 --- a/src/bouquet.h +++ b/src/bouquet.h @@ -77,7 +77,7 @@ bouquet_t * bouquet_create(const char *uuid, htsmsg_t *conf, void bouquet_delete(bouquet_t *bq); -void bouquet_destroy_by_service(service_t *t); +void bouquet_destroy_by_service(service_t *t, int delconf); void bouquet_destroy_by_channel_tag(channel_tag_t *ct); void bouquet_notify_service_enabled(service_t *t); diff --git a/src/input/mpegts/iptv/iptv_auto.c b/src/input/mpegts/iptv/iptv_auto.c index 7f1b5a9a5..965fad7b4 100644 --- a/src/input/mpegts/iptv/iptv_auto.c +++ b/src/input/mpegts/iptv/iptv_auto.c @@ -298,7 +298,7 @@ iptv_auto_network_process(void *aux, const char *last_url, { auto_private_t *ap = aux; iptv_network_t *in = ap->in_network; - mpegts_mux_t *mm; + mpegts_mux_t *mm, *mm2; int r = -1, count, n, i; http_arg_list_t remove_args; char *argv[10]; @@ -328,11 +328,13 @@ iptv_auto_network_process(void *aux, const char *last_url, if (r == 0) { count = 0; - LIST_FOREACH(mm, &in->mn_muxes, mm_network_link) + for (mm = LIST_FIRST(&in->mn_muxes); mm; mm = mm2) { + mm2 = LIST_NEXT(mm, mm_network_link); if (((iptv_mux_t *)mm)->im_delete_flag) { mm->mm_delete(mm, 1); count++; } + } if (count > 0) tvhinfo("iptv", "removed %d mux(es) from network '%s'", count, in->mn_network_name); } else { diff --git a/src/input/mpegts/iptv/iptv_mux.c b/src/input/mpegts/iptv/iptv_mux.c index 432a5f7b1..d06afb019 100644 --- a/src/input/mpegts/iptv/iptv_mux.c +++ b/src/input/mpegts/iptv/iptv_mux.c @@ -250,8 +250,7 @@ iptv_mux_config_save ( mpegts_mux_t *mm ) static void iptv_mux_delete ( mpegts_mux_t *mm, int delconf ) { - char *url, *url_sane, *url_raw, *muxname; - iptv_mux_t *im = (iptv_mux_t*)mm; + iptv_mux_t *im = (iptv_mux_t*)mm, copy; char ubuf[UUID_HEX_SIZE]; if (delconf) @@ -259,22 +258,19 @@ iptv_mux_delete ( mpegts_mux_t *mm, int delconf ) idnode_uuid_as_sstr(&mm->mm_network->mn_id), idnode_uuid_as_str(&mm->mm_id, ubuf)); - url = im->mm_iptv_url; // Workaround for silly printing error - url_sane = im->mm_iptv_url_sane; - url_raw = im->mm_iptv_url_raw; - muxname = im->mm_iptv_muxname; - free(im->mm_iptv_interface); - free(im->mm_iptv_svcname); - free(im->mm_iptv_env); - free(im->mm_iptv_hdr); - free(im->mm_iptv_tags); - free(im->mm_iptv_icon); - free(im->mm_iptv_epgid); + copy = *im; /* keep pointers */ mpegts_mux_delete(mm, delconf); - free(url); - free(url_sane); - free(url_raw); - free(muxname); + free(copy.mm_iptv_url); + free(copy.mm_iptv_url_sane); + free(copy.mm_iptv_url_raw); + free(copy.mm_iptv_muxname); + free(copy.mm_iptv_interface); + free(copy.mm_iptv_svcname); + free(copy.mm_iptv_env); + free(copy.mm_iptv_hdr); + free(copy.mm_iptv_tags); + free(copy.mm_iptv_icon); + free(copy.mm_iptv_epgid); } static void diff --git a/src/service.c b/src/service.c index 566945d10..9d6c1cd85 100644 --- a/src/service.c +++ b/src/service.c @@ -806,6 +806,8 @@ service_destroy(service_t *t, int delconf) while((s = LIST_FIRST(&t->s_subscriptions)) != NULL) subscription_unlink_service(s, SM_CODE_SOURCE_DELETED); + bouquet_destroy_by_service(t, delconf); + while ((ilm = LIST_FIRST(&t->s_channels))) idnode_list_unlink(ilm, delconf ? t : NULL); @@ -815,8 +817,6 @@ service_destroy(service_t *t, int delconf) t->s_status = SERVICE_ZOMBIE; - bouquet_destroy_by_service(t); - TAILQ_INIT(&t->s_filt_components); while((st = TAILQ_FIRST(&t->s_components)) != NULL) service_stream_destroy(t, st);