]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
epggrab: int/ext module - fix the shutdown
authorJaroslav Kysela <perex@perex.cz>
Mon, 7 Jul 2014 15:05:46 +0000 (17:05 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 7 Jul 2014 15:18:35 +0000 (17:18 +0200)
src/epggrab.c
src/epggrab.h
src/epggrab/module.c
src/epggrab/module/opentv.c
src/epggrab/private.h

index d653e1af13645886e8cc706137cf817fd097500b..1501d11334dc94f85d8ac177243be72511dfebd3 100644 (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);
index 61577ec0271e11a8a4f0f216276ee4d91c2a622f..1ab4ac2eb243588291eab992ba50452898bcaa7d 100644 (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 );
 };
index 86cec38df1857f99f46a083cf2e9242f03c99342..b191f1a40a78b0c7918b0d55d31ac74337779220 100644 (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;
 }
index 74bf0dd9435695c93e1f3ccbec70092066e4dfd3..eeafb0c222b55cdfc1c7b80d08984e864cf25ac4 100644 (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);
index 73ede82f0331ecc45b3864e5ce353ea400a46ba9..76319383773d94e3ed3b0d46386a9399eb36d6a9 100644 (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;