epggrab: int/ext module - fix the shutdown

This commit is contained in:
Jaroslav Kysela 2014-07-07 17:05:46 +02:00
parent d8e9c2c91a
commit 2ecc8d0a8b
5 changed files with 49 additions and 20 deletions

View file

@ -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);

View file

@ -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 );
};

View file

@ -20,6 +20,7 @@
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
@ -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;
}

View file

@ -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);

View file

@ -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;