epggrab: int/ext module - fix the shutdown
This commit is contained in:
parent
d8e9c2c91a
commit
2ecc8d0a8b
5 changed files with 49 additions and 20 deletions
|
@ -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);
|
||||
|
|
|
@ -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 );
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue