]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
linuxdvb ca: small optimizations - do not arm timer when not enabled
authorJaroslav Kysela <perex@perex.cz>
Sun, 20 Aug 2017 14:14:13 +0000 (16:14 +0200)
committerJaroslav Kysela <perex@perex.cz>
Thu, 31 Aug 2017 13:58:33 +0000 (15:58 +0200)
src/input/mpegts/linuxdvb/linuxdvb_ca.c

index 1d9af24d9dcb78ad24619311fbf28f07324e0ac1..565b790aa17312f99b0c6cf4e3fad22d8a288812 100644 (file)
@@ -20,9 +20,6 @@
 #include "tvheadend.h"
 #include "linuxdvb_private.h"
 #include "notify.h"
-#include "atomic.h"
-#include "tvhpoll.h"
-#include "streaming.h"
 
 #include <sys/ioctl.h>
 #include <sys/types.h>
@@ -37,6 +34,8 @@
 #include "descrambler/caid.h"
 #include "descrambler/dvbcam.h"
 
+static void linuxdvb_ca_monitor ( void *aux );
+
 typedef enum {
   CA_SLOT_STATE_EMPTY = 0,
   CA_SLOT_STATE_MODULE_PRESENT,
@@ -131,22 +130,28 @@ linuxdvb_ca_class_enabled_notify ( void *p, const char *lang )
       lca->lca_ca_fd = tvh_open(lca->lca_ca_path, O_RDWR | O_NONBLOCK, 0);
       tvhtrace(LS_LINUXDVB, "opening ca%u %s (fd %d)",
                lca->lca_number, lca->lca_ca_path, lca->lca_ca_fd);
+      if (lca->lca_ca_fd >= 0)
+        mtimer_arm_rel(&lca->lca_monitor_timer, linuxdvb_ca_monitor, lca, ms2mono(250));
     }
   } else {
     tvhtrace(LS_LINUXDVB, "closing ca%u %s (fd %d)",
              lca->lca_number, lca->lca_ca_path, lca->lca_ca_fd);
 
+    mtimer_disarm(&lca->lca_monitor_timer);
+
     if (lca->lca_en50221_thread_running) {
       lca->lca_en50221_thread_running = 0;
       pthread_join(lca->lca_en50221_thread, NULL);
     }
 
-    if (ioctl(lca->lca_ca_fd, CA_RESET, NULL))
-      tvherror(LS_LINUXDVB, "unable to reset ca%u %s",
-               lca->lca_number, lca->lca_ca_path);
+    if (lca->lca_ca_fd >= 0) {
+      if (ioctl(lca->lca_ca_fd, CA_RESET, NULL))
+        tvherror(LS_LINUXDVB, "unable to reset ca%u %s",
+                 lca->lca_number, lca->lca_ca_path);
 
-    close(lca->lca_ca_fd);
-    lca->lca_ca_fd = -1;
+      close(lca->lca_ca_fd);
+      lca->lca_ca_fd = -1;
+    }
 
     idnode_notify_title_changed(&lca->lca_id, lang);
   }
@@ -744,42 +749,40 @@ linuxdvb_ca_monitor ( void *aux )
   ca_slot_info_t csi;
   int state;
 
-  csi.num = 0;
+  if (lca->lca_ca_fd < 0)
+    return;
 
-  if (lca->lca_ca_fd >= 0) {
-    if ((ioctl(lca->lca_ca_fd, CA_GET_SLOT_INFO, &csi)) != 0) {
-      tvherror(LS_LINUXDVB, "failed to get CAM slot %u info [e=%s]",
-               csi.num, strerror(errno));
-    }
-    if (csi.flags & CA_CI_MODULE_READY)
-      state = CA_SLOT_STATE_MODULE_READY;
-    else if (csi.flags & CA_CI_MODULE_PRESENT)
-      state = CA_SLOT_STATE_MODULE_PRESENT;
-    else
-      state = CA_SLOT_STATE_EMPTY;
-
-    lca->lca_state_str = ca_slot_state2str(state);
-
-    if (lca->lca_state != state) {
-      tvhnotice(LS_LINUXDVB, "CAM slot %u status changed to %s",
-                csi.num, lca->lca_state_str);
-      idnode_notify_title_changed(&lca->lca_id, NULL);
-      lca->lca_state = state;
-    }
+  memset(&csi, 0, sizeof(csi));
 
-    if ((!lca->lca_en50221_thread_running) &&
-        (state == CA_SLOT_STATE_MODULE_READY)) 
-    {
-      lca->lca_en50221_thread_running = 1;
-      tvhthread_create(&lca->lca_en50221_thread, NULL,
-                       linuxdvb_ca_en50221_thread, lca, "lnxdvb-ca");
-    } else if (lca->lca_en50221_thread_running &&
-               (state != CA_SLOT_STATE_MODULE_READY))
-    {
-      lca->lca_en50221_thread_running = 0;
-      pthread_join(lca->lca_en50221_thread, NULL);
-    }
+  if ((ioctl(lca->lca_ca_fd, CA_GET_SLOT_INFO, &csi)) != 0) {
+    tvherror(LS_LINUXDVB, "failed to get CAM slot %u info [e=%s]",
+             csi.num, strerror(errno));
+  }
+  if (csi.flags & CA_CI_MODULE_READY)
+    state = CA_SLOT_STATE_MODULE_READY;
+  else if (csi.flags & CA_CI_MODULE_PRESENT)
+    state = CA_SLOT_STATE_MODULE_PRESENT;
+  else
+    state = CA_SLOT_STATE_EMPTY;
 
+  lca->lca_state_str = ca_slot_state2str(state);
+
+  if (lca->lca_state != state) {
+    tvhnotice(LS_LINUXDVB, "CAM slot %u status changed to %s",
+              csi.num, lca->lca_state_str);
+    idnode_notify_title_changed(&lca->lca_id, NULL);
+    lca->lca_state = state;
+  }
+
+  if ((!lca->lca_en50221_thread_running) &&
+      (state == CA_SLOT_STATE_MODULE_READY)) {
+    lca->lca_en50221_thread_running = 1;
+    tvhthread_create(&lca->lca_en50221_thread, NULL,
+                     linuxdvb_ca_en50221_thread, lca, "lnxdvb-ca");
+  } else if (lca->lca_en50221_thread_running &&
+             (state != CA_SLOT_STATE_MODULE_READY)) {
+    lca->lca_en50221_thread_running = 0;
+    pthread_join(lca->lca_en50221_thread, NULL);
   }
 
   mtimer_arm_rel(&lca->lca_monitor_timer, linuxdvb_ca_monitor, lca, ms2mono(250));
@@ -823,8 +826,6 @@ linuxdvb_ca_create
 
   TAILQ_INIT(&lca->lca_capmt_queue);
 
-  mtimer_arm_rel(&lca->lca_monitor_timer, linuxdvb_ca_monitor, lca, ms2mono(250));
-
   return lca;
 }