From: Jaroslav Kysela Date: Thu, 11 Feb 2016 15:31:54 +0000 (+0100) Subject: idnode: delayed save (3 seconds) X-Git-Tag: v4.2.1~1034 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f5c85bcf7075ceb9c516a0ca510d2996cf8dafc9;p=thirdparty%2Ftvheadend.git idnode: delayed save (3 seconds) --- diff --git a/src/idnode.c b/src/idnode.c index 66a02ab25..9c00319d0 100644 --- a/src/idnode.c +++ b/src/idnode.c @@ -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); diff --git a/src/idnode.h b/src/idnode.h index 19053b60f..a3e5cdd7a 100644 --- a/src/idnode.h +++ b/src/idnode.h @@ -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; /*