From 0dd2dfff9d7fd8208d87eae98c6cd8976d4b2e38 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sun, 18 Jan 2009 18:10:15 +0100 Subject: main: moved the save_state timer to state_file.c The state_file library should manage its own regular saves. --- src/main.c | 18 ------------------ src/state_file.c | 28 ++++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/main.c b/src/main.c index 399a4f2a4..aeb067f9b 100644 --- a/src/main.c +++ b/src/main.c @@ -165,14 +165,6 @@ initialize_decoder_and_player(void) dc_init(); } -static gboolean -timer_save_state_file(G_GNUC_UNUSED gpointer data) -{ - g_debug("Saving state file"); - write_state_file(); - return true; -} - /** * event_pipe callback function for PIPE_EVENT_IDLE */ @@ -190,8 +182,6 @@ int main(int argc, char *argv[]) { Options options; clock_t start; - GTimer *save_state_timer; - guint save_state_source_id; daemonize_close_stdin(); @@ -265,11 +255,6 @@ int main(int argc, char *argv[]) state_file_init(config_get_path(CONF_STATE_FILE)); - save_state_timer = g_timer_new(); - - save_state_source_id = g_timeout_add(5 * 60 * 1000, - timer_save_state_file, NULL); - /* run the main loop */ g_main_loop_run(main_loop); @@ -278,9 +263,6 @@ int main(int argc, char *argv[]) g_main_loop_unref(main_loop); - g_source_remove(save_state_source_id); - g_timer_destroy(save_state_timer); - state_file_finish(); playerKill(); finishZeroconf(); diff --git a/src/state_file.c b/src/state_file.c index 1139c7548..64fd67c4c 100644 --- a/src/state_file.c +++ b/src/state_file.c @@ -22,6 +22,7 @@ #include "volume.h" #include +#include #include #include @@ -39,7 +40,11 @@ static struct _sf_cb { static char *state_file_path; -void write_state_file(void) +/** the GLib source id for the save timer */ +static guint save_state_source_id; + +static void +state_file_write(void) { unsigned int i; FILE *fp; @@ -68,6 +73,8 @@ state_file_read(void) assert(state_file_path != NULL); + g_debug("Saving state file"); + fp = fopen(state_file_path, "r"); if (G_UNLIKELY(!fp)) { g_warning("failed to open %s: %s", @@ -82,6 +89,17 @@ state_file_read(void) while(fclose(fp) && errno == EINTR) /* nothing */; } +/** + * This function is called every 5 minutes by the GLib main loop, and + * saves the state file. + */ +static gboolean +timer_save_state_file(G_GNUC_UNUSED gpointer data) +{ + state_file_write(); + return true; +} + void state_file_init(const char *path) { @@ -92,13 +110,19 @@ state_file_init(const char *path) state_file_path = g_strdup(path); state_file_read(); + + save_state_source_id = g_timeout_add(5 * 60 * 1000, + timer_save_state_file, NULL); } void state_file_finish(void) { + if (save_state_source_id != 0) + g_source_remove(save_state_source_id); + if (state_file_path != NULL) - write_state_file(); + state_file_write(); g_free(state_file_path); } -- cgit v1.2.3