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 );
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),
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 )
{
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",
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);
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;
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);
}
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)