]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
idnode: delayed save (3 seconds)
authorJaroslav Kysela <perex@perex.cz>
Thu, 11 Feb 2016 15:31:54 +0000 (16:31 +0100)
committerJaroslav Kysela <perex@perex.cz>
Thu, 11 Feb 2016 15:31:54 +0000 (16:31 +0100)
src/idnode.c
src/idnode.h

index 66a02ab25f9abd4b28a89aa166b6e449214d130e..9c00319d0daa588f17088a528ca6e30c77387d1e 100644 (file)
@@ -49,6 +49,7 @@ static TAILQ_HEAD(,idnode_save) idnodes_save;
 pthread_cond_t save_cond;
 pthread_t save_tid;
 static int save_running;
+static gtimer_t save_timer;
 
 SKEL_DECLARE(idclasses_skel, idclass_link_t);
 
@@ -1092,6 +1093,12 @@ idnode_savefn ( idnode_t *self, char *filename, size_t fsize )
   return NULL;
 }
 
+static void
+idnode_save_trigger_thread_cb( void *aux )
+{
+  pthread_cond_signal(&save_cond);
+}
+
 static void
 idnode_save_queue ( idnode_t *self )
 {
@@ -1101,8 +1108,9 @@ idnode_save_queue ( idnode_t *self )
     return;
   ise = malloc(sizeof(*ise));
   ise->ise_node = self;
-  if (TAILQ_EMPTY(&idnodes_save))
-    pthread_cond_signal(&save_cond);
+  ise->ise_reqtime = dispatch_clock;
+  if (TAILQ_EMPTY(&idnodes_save) && save_running)
+    gtimer_arm(&save_timer, idnode_save_trigger_thread_cb, NULL, IDNODE_SAVE_DELAY);
   TAILQ_INSERT_TAIL(&idnodes_save, ise, ise_link);
   self->in_save = ise;
 }
@@ -1690,7 +1698,11 @@ save_thread ( void *aux )
   pthread_mutex_lock(&global_lock);
 
   while (save_running) {
-    if ((ise = TAILQ_FIRST(&idnodes_save)) == NULL) {
+    if ((ise = TAILQ_FIRST(&idnodes_save)) == NULL ||
+        (ise->ise_reqtime + IDNODE_SAVE_DELAY > dispatch_clock)) {
+      if (ise)
+        gtimer_arm(&save_timer, idnode_save_trigger_thread_cb, NULL,
+                   (ise->ise_reqtime + IDNODE_SAVE_DELAY) - dispatch_clock);
       pthread_cond_wait(&save_cond, &global_lock);
       continue;
     }
@@ -1706,6 +1718,8 @@ save_thread ( void *aux )
     pthread_mutex_lock(&global_lock);
   }
 
+  gtimer_disarm(&save_timer);
+
   while ((ise = TAILQ_FIRST(&idnodes_save)) != NULL) {
     m = idnode_savefn(ise->ise_node, filename, sizeof(filename));
     ise->ise_node->in_save = NULL;
@@ -1748,6 +1762,7 @@ idnode_done(void)
   save_running = 0;
   pthread_cond_signal(&save_cond);
   pthread_join(save_tid, NULL);
+  gtimer_disarm(&save_timer);
 
   while ((il = RB_FIRST(&idclasses)) != NULL) {
     RB_REMOVE(&idclasses, il, link);
index 19053b60ff9b7f5c341d33eab6fa649847576a10..a3e5cdd7a672d925bd38d50867ed41f754864518 100644 (file)
@@ -30,6 +30,8 @@ struct access;
 typedef struct idnode idnode_t;
 typedef struct idnode_save idnode_save_t;
 
+#define IDNODE_SAVE_DELAY 3
+
 #define SAVEPTR_OUTOFSERVICE ((void *)((intptr_t)-1LL))
 
 /*
@@ -105,6 +107,7 @@ struct idnode {
 typedef struct idnode_save {
   TAILQ_ENTRY(idnode_save)  ise_link;       ///< List chain
   idnode_t                 *ise_node;       ///< Node owning this
+  time_t                    ise_reqtime;    ///< First request
 } idnode_save_t;
 
 /*