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);
return NULL;
}
+static void
+idnode_save_trigger_thread_cb( void *aux )
+{
+ pthread_cond_signal(&save_cond);
+}
+
static void
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;
}
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;
}
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;
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);
typedef struct idnode idnode_t;
typedef struct idnode_save idnode_save_t;
+#define IDNODE_SAVE_DELAY 3
+
#define SAVEPTR_OUTOFSERVICE ((void *)((intptr_t)-1LL))
/*
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;
/*