From: Jaroslav Kysela Date: Wed, 9 Dec 2015 13:07:52 +0000 (+0100) Subject: service: introduce s_unref callback for late free calls X-Git-Tag: v4.2.1~1335 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ac4f34f5a9977ee1670101c31f439bcb8dc58402;p=thirdparty%2Ftvheadend.git service: introduce s_unref callback for late free calls --- diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 5b52ed802..97097d0a6 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -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 ); diff --git a/src/input/mpegts/iptv/iptv_service.c b/src/input/mpegts/iptv/iptv_service.c index 31c54af35..54a80c832 100644 --- a/src/input/mpegts/iptv/iptv_service.c +++ b/src/input/mpegts/iptv/iptv_service.c @@ -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), diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index 12acdc19c..5d6e2e217 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -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; diff --git a/src/service.c b/src/service.c index fbaa8b66c..093526b99 100644 --- a/src/service.c +++ b/src/service.c @@ -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) diff --git a/src/service.h b/src/service.h index 64312fc96..bb6822aae 100644 --- a/src/service.h +++ b/src/service.h @@ -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); /**