]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
service/bouquet: fix the channel destroy when service associated to the bouquet is...
authorJaroslav Kysela <perex@perex.cz>
Thu, 12 Nov 2015 16:06:23 +0000 (17:06 +0100)
committerJaroslav Kysela <perex@perex.cz>
Thu, 12 Nov 2015 16:06:23 +0000 (17:06 +0100)
src/bouquet.c
src/bouquet.h
src/input/mpegts/iptv/iptv_auto.c
src/input/mpegts/iptv/iptv_mux.c
src/service.c

index f165d93eb53d27ddf47bd1558f368e4fa263ac0e..378ef9f45e18d079c9e148aa3223262656fb0d6d 100644 (file)
@@ -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 ?: "<unknown>");
   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 */
index 06f8d1630b7a32782b75f771bf833d4d231b2bdc..44b8a75bed2a6e3c86b414d4d7c81577e26fa482 100644 (file)
@@ -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);
index 7f1b5a9a545a319638e5a0de67ccba628de72d3e..965fad7b4267b9c67414a37a30538330e9865494 100644 (file)
@@ -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 {
index 432a5f7b16e2eceb9d591c678afd0f1a2e0a9a20..d06afb019c71a6f28ed1f82471bef7cf4a1b3ba9 100644 (file)
@@ -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
index 566945d10a5a04088d6b5fcb941dd9edd6188721..9d6c1cd85bd3805f7d7f19cb5d72de1693786345 100644 (file)
@@ -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);