]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
service: introduce s_unref callback for late free calls
authorJaroslav Kysela <perex@perex.cz>
Wed, 9 Dec 2015 13:07:52 +0000 (14:07 +0100)
committerJaroslav Kysela <perex@perex.cz>
Wed, 9 Dec 2015 13:07:52 +0000 (14:07 +0100)
src/input/mpegts.h
src/input/mpegts/iptv/iptv_service.c
src/input/mpegts/mpegts_service.c
src/service.c
src/service.h

index 5b52ed802eeb35ad9ddc7b63ecaa079f2f944310..97097d0a6c54590a1ac82c38586950c1b1405cab 100644 (file)
@@ -1040,6 +1040,8 @@ mpegts_service_find_by_pid ( mpegts_mux_t *mm, int pid );
 static inline mpegts_service_t *mpegts_service_find_by_uuid(const char *uuid)
   { return idnode_find(uuid, &mpegts_service_class, NULL); }
 
+void mpegts_service_unref ( service_t *s );
+
 void mpegts_service_delete ( service_t *s, int delconf );
 
 
index 31c54af351acb1b495ab1d59b9e0768b844a2b38..54a80c83263477da782db72a75668a26897a517d 100644 (file)
@@ -49,7 +49,7 @@ iptv_service_delete ( service_t *s, int delconf )
   char ubuf2[UUID_HEX_SIZE];
 
   /* Remove config */
-  if (delconf)
+  if (delconf && s->s_type == STYPE_STD)
     hts_settings_remove("input/iptv/networks/%s/muxes/%s/services/%s",
                         idnode_uuid_as_str(&mm->mm_network->mn_id, ubuf0),
                         idnode_uuid_as_str(&mm->mm_id, ubuf1),
index 12acdc19cdb268fbd063971be03445036d426a62..5d6e2e21755efb820bd079cdba29b84fafc1f847 100644 (file)
@@ -650,6 +650,17 @@ mpegts_service_mapped ( service_t *t )
   epggrab_ota_queue_mux(((mpegts_service_t *)t)->s_dvb_mux);
 }
 
+void
+mpegts_service_unref ( service_t *t )
+{
+  mpegts_service_t *ms = (mpegts_service_t*)t;
+
+  free(ms->s_dvb_svcname);
+  free(ms->s_dvb_provider);
+  free(ms->s_dvb_cridauth);
+  free(ms->s_dvb_charset);
+}
+
 void
 mpegts_service_delete ( service_t *t, int delconf )
 {
@@ -659,6 +670,8 @@ mpegts_service_delete ( service_t *t, int delconf )
   char ubuf1[UUID_HEX_SIZE];
   char ubuf2[UUID_HEX_SIZE];
 
+  tvherror("service", "mpegts service destroy: %s", t->s_nicename);
+
   /* Remove config */
   if (delconf && t->s_type == STYPE_STD)
     hts_settings_remove("input/dvb/networks/%s/muxes/%s/services/%s",
@@ -667,10 +680,6 @@ mpegts_service_delete ( service_t *t, int delconf )
                       idnode_uuid_as_str(&t->s_id, ubuf2));
 
   /* Free memory */
-  free(ms->s_dvb_svcname);
-  free(ms->s_dvb_provider);
-  free(ms->s_dvb_cridauth);
-  free(ms->s_dvb_charset);
   if (t->s_type == STYPE_STD)
     LIST_REMOVE(ms, s_dvb_mux_link);
   sbuf_free(&ms->s_tsbuf);
@@ -732,6 +741,7 @@ mpegts_service_create0
   LIST_INSERT_HEAD(&mm->mm_services, s, s_dvb_mux_link);
   
   s->s_delete         = mpegts_service_delete;
+  s->s_unref          = mpegts_service_unref;
   s->s_is_enabled     = mpegts_service_is_enabled;
   s->s_config_save    = mpegts_service_config_save;
   s->s_enlist         = mpegts_service_enlist;
index fbaa8b66c003bc8a6cf5877e2c5d6f31e628d6d9..093526b99cdfad80df714b77ea9b01be8c75a44e 100644 (file)
@@ -782,6 +782,8 @@ void
 service_unref(service_t *t)
 {
   if((atomic_add(&t->s_refcount, -1)) == 1) {
+    if (t->s_unref)
+      t->s_unref(t);
     free(t->s_nicename);
     free(t);
   }
@@ -809,11 +811,11 @@ service_destroy(service_t *t, int delconf)
   th_subscription_t *s;
   idnode_list_mapping_t *ilm;
 
+  lock_assert(&global_lock);
+
   if(t->s_delete != NULL)
     t->s_delete(t, delconf);
 
-  lock_assert(&global_lock);
-  
   service_mapper_remove(t);
 
   while((s = LIST_FIRST(&t->s_subscriptions)) != NULL)
index 64312fc969adf623e2d457edf486e29b1076ff42..bb6822aaed3cb61256160817cfebcfd0be8ab2b4 100644 (file)
@@ -310,6 +310,8 @@ typedef struct service {
 
   void (*s_delete)(struct service *t, int delconf);
 
+  void (*s_unref)(struct service *t);
+
   int (*s_satip_source)(struct service *t);
 
   /**