Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
idnode: delayed save (3 seconds)
  • Loading branch information
perexg committed Feb 11, 2016
1 parent 1cf3f2a commit f5c85bc
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 3 deletions.
21 changes: 18 additions & 3 deletions src/idnode.c
Expand Up @@ -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);

Expand Down Expand Up @@ -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 )
{
Expand All @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand All @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions src/idnode.h
Expand Up @@ -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))

/*
Expand Down Expand Up @@ -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;

/*
Expand Down

0 comments on commit f5c85bc

Please sign in to comment.