diff --git a/src/epggrab.c b/src/epggrab.c index d653e1af..1501d113 100644 --- a/src/epggrab.c +++ b/src/epggrab.c @@ -402,10 +402,8 @@ void epggrab_done ( void ) pthread_mutex_lock(&global_lock); while ((mod = LIST_FIRST(&epggrab_modules)) != NULL) { LIST_REMOVE(mod, link); - if (mod->type == EPGGRAB_OTA && ((epggrab_module_ota_t *)mod)->done) - ((epggrab_module_ota_t *)mod)->done((epggrab_module_ota_t *)mod); - if (mod->type == EPGGRAB_INT || mod->type == EPGGRAB_EXT) - free((void *)((epggrab_module_int_t *)mod)->path); + if (mod->done) + mod->done(mod); free((void *)mod->id); free((void *)mod->name); free(mod); diff --git a/src/epggrab.h b/src/epggrab.h index 61577ec0..1ab4ac2e 100644 --- a/src/epggrab.h +++ b/src/epggrab.h @@ -149,6 +149,9 @@ struct epggrab_module /* Enable/Disable */ int (*enable) ( void *m, uint8_t e ); + /* Free */ + void (*done) ( void *m ); + /* Channel listings */ void (*ch_add) ( void *m, struct channel *ch ); void (*ch_rem) ( void *m, struct channel *ch ); @@ -179,6 +182,8 @@ struct epggrab_module_ext epggrab_module_int_t ; ///< Parent object int sock; ///< Socket descriptor + + pthread_t tid; ///< Thread ID }; struct epggrab_ota_svc_link @@ -229,7 +234,6 @@ struct epggrab_module_ota /* Transponder tuning */ void (*start) ( epggrab_ota_map_t *map, struct mpegts_mux *mm ); - void (*done) ( epggrab_module_ota_t *m ); int (*tune) ( epggrab_ota_map_t *map, epggrab_ota_mux_t *om, struct mpegts_mux *mm ); }; diff --git a/src/epggrab/module.c b/src/epggrab/module.c index 86cec38d..b191f1a4 100644 --- a/src/epggrab/module.c +++ b/src/epggrab/module.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -107,8 +108,7 @@ epggrab_module_t *epggrab_module_create /* * Run the parse */ -void epggrab_module_parse - ( void *m, htsmsg_t *data ) +void epggrab_module_parse( void *m, htsmsg_t *data ) { time_t tm1, tm2; int save = 0; @@ -242,6 +242,13 @@ void epggrab_module_channels_load ( epggrab_module_t *mod ) * Internal module routines * *************************************************************************/ +static void +epggrab_module_int_done( void *m ) +{ + epggrab_module_int_t *mod = m; + free((char *)mod->path); +} + epggrab_module_int_t *epggrab_module_int_create ( epggrab_module_int_t *skel, const char *id, const char *name, int priority, @@ -264,6 +271,7 @@ epggrab_module_int_t *epggrab_module_int_create skel->grab = grab ?: epggrab_module_grab_spawn; skel->trans = trans ?: epggrab_module_trans_xml; skel->parse = parse; + skel->done = epggrab_module_int_done; return skel; } @@ -356,12 +364,36 @@ static void *_epggrab_socket_thread ( void *p ) return NULL; } +/* + * Shutdown socket module + */ +static void +epggrab_module_done_socket( void *m ) +{ + epggrab_module_ext_t *mod = (epggrab_module_ext_t*)m; + int sock; + + assert(mod->type == EPGGRAB_EXT); + mod->enabled = 0; + sock = mod->sock; + mod->sock = 0; + shutdown(sock, SHUT_RDWR); + close(sock); + if (mod->tid) { + pthread_kill(mod->tid, SIGTERM); + pthread_join(mod->tid, NULL); + } + mod->tid = 0; + if (mod->path) + unlink(mod->path); +} + /* * Enable socket module */ -int epggrab_module_enable_socket ( void *m, uint8_t e ) +static int +epggrab_module_enable_socket ( void *m, uint8_t e ) { - pthread_t tid; pthread_attr_t tattr; struct sockaddr_un addr; epggrab_module_ext_t *mod = (epggrab_module_ext_t*)m; @@ -372,10 +404,7 @@ int epggrab_module_enable_socket ( void *m, uint8_t e ) /* Disable */ if (!e) { - shutdown(mod->sock, SHUT_RDWR); - close(mod->sock); - unlink(mod->path); - mod->sock = 0; + epggrab_module_done_socket(m); /* Enable */ } else { @@ -405,10 +434,9 @@ int epggrab_module_enable_socket ( void *m, uint8_t e ) tvhlog(LOG_DEBUG, mod->id, "starting socket thread"); pthread_attr_init(&tattr); - pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED); - tvhthread_create(&tid, &tattr, _epggrab_socket_thread, mod, 1); + mod->enabled = 1; + tvhthread_create(&mod->tid, &tattr, _epggrab_socket_thread, mod, 0); } - mod->enabled = e; return 1; } @@ -437,6 +465,7 @@ epggrab_module_ext_t *epggrab_module_ext_create /* Local */ skel->type = EPGGRAB_EXT; skel->enable = epggrab_module_enable_socket; + skel->done = epggrab_module_done_socket; return skel; } diff --git a/src/epggrab/module/opentv.c b/src/epggrab/module/opentv.c index 74bf0dd9..eeafb0c2 100644 --- a/src/epggrab/module/opentv.c +++ b/src/epggrab/module/opentv.c @@ -685,7 +685,7 @@ static void _opentv_dict_load ( htsmsg_t *m ) htsmsg_destroy(m); } -static void _opentv_done( epggrab_module_ota_t *m ) +static void _opentv_done( void *m ) { opentv_module_t *mod = (opentv_module_t *)m; free(mod->channel); diff --git a/src/epggrab/private.h b/src/epggrab/private.h index 73ede82f..76319383 100644 --- a/src/epggrab/private.h +++ b/src/epggrab/private.h @@ -38,8 +38,6 @@ void epggrab_module_ch_rem ( void *m, struct channel *ch ); void epggrab_module_ch_mod ( void *m, struct channel *ch ); void epggrab_module_ch_save ( void *m, epggrab_channel_t *ec ); -int epggrab_module_enable_socket ( void *m, uint8_t e ); - void epggrab_module_parse ( void *m, htsmsg_t *data ); void epggrab_module_channels_load ( epggrab_module_t *m ); @@ -88,7 +86,7 @@ epggrab_module_ext_t *epggrab_module_ext_create typedef struct epggrab_ota_module_ops { void (*start) (epggrab_ota_map_t *map, struct mpegts_mux *mm); int (*enable) (void *m, uint8_t e ); - void (*done) (epggrab_module_ota_t*m); + void (*done) (void *m); int (*tune) (epggrab_ota_map_t *map, epggrab_ota_mux_t *om, struct mpegts_mux *mm); } epggrab_ota_module_ops_t;