Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
service: introduce s_unref callback for late free calls
  • Loading branch information
perexg committed Dec 9, 2015
1 parent 4bae878 commit ac4f34f
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 7 deletions.
2 changes: 2 additions & 0 deletions src/input/mpegts.h
Expand Up @@ -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 );


Expand Down
2 changes: 1 addition & 1 deletion src/input/mpegts/iptv/iptv_service.c
Expand Up @@ -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),
Expand Down
18 changes: 14 additions & 4 deletions src/input/mpegts/mpegts_service.c
Expand Up @@ -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 )
{
Expand All @@ -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",
Expand All @@ -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);
Expand Down Expand Up @@ -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;
Expand Down
6 changes: 4 additions & 2 deletions src/service.c
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions src/service.h
Expand Up @@ -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);

/**
Expand Down

0 comments on commit ac4f34f

Please sign in to comment.