1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-12-04 14:46:47 -05:00
elinks/src/config/timer.c

90 lines
2.1 KiB
C
Raw Normal View History

/* Periodic saving module */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "elinks.h"
#include "config/options.h"
#include "config/timer.h"
#include "intl/libintl.h"
#include "main/event.h"
#include "main/module.h"
#include "main/timer.h"
#include "util/time.h"
/* Timer for periodically saving configuration files to disk */
static timer_id_T periodic_save_timer = TIMER_ID_UNDEF;
/* Timer callback for @periodic_save_timer. As explained in @install_timer,
* this function must erase the expired timer ID from all variables. */
static void
periodic_save_handler(void *xxx)
{
static int periodic_save_event_id = EVENT_NONE;
milliseconds_T interval;
if (get_cmd_opt_bool("anonymous")) return;
/* Don't trigger anything at startup */
if (periodic_save_event_id == EVENT_NONE)
set_event_id(periodic_save_event_id, "periodic-saving");
else
trigger_event(periodic_save_event_id);
interval = sec_to_ms(get_opt_int("infofiles.save_interval", NULL));
if (!interval) {
/* We should get here only if @periodic_save_handler
* is being called from @periodic_save_change_hook or
* @init_timer, rather than from the timer system. */
assert(periodic_save_timer == TIMER_ID_UNDEF);
return;
}
install_timer(&periodic_save_timer, interval, periodic_save_handler, NULL);
/* The expired timer ID has now been erased. */
}
static int
periodic_save_change_hook(struct session *ses, struct option *current,
struct option *changed)
{
if (get_cmd_opt_bool("anonymous")) return 0;
kill_timer(&periodic_save_timer);
periodic_save_handler(NULL);
return 0;
}
static void
init_timer(struct module *module)
{
static const struct change_hook_info timer_change_hooks[] = {
{ "infofiles.save_interval", periodic_save_change_hook },
{ NULL, NULL },
};
register_change_hooks(timer_change_hooks);
periodic_save_handler(NULL);
}
static void
done_timer(struct module *module)
{
kill_timer(&periodic_save_timer);
}
struct module periodic_saving_module = struct_module(
/* name: */ N_("Periodic Saving"),
/* options: */ NULL,
/* hooks: */ NULL,
/* submodules: */ NULL,
/* data: */ NULL,
/* init: */ init_timer,
/* done: */ done_timer
);