main: moved the save_state timer to state_file.c

The state_file library should manage its own regular saves.
This commit is contained in:
Max Kellermann 2009-01-18 18:10:15 +01:00
parent 84de45afba
commit 0dd2dfff9d
2 changed files with 26 additions and 20 deletions

View File

@ -165,14 +165,6 @@ initialize_decoder_and_player(void)
dc_init(); 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 * event_pipe callback function for PIPE_EVENT_IDLE
*/ */
@ -190,8 +182,6 @@ int main(int argc, char *argv[])
{ {
Options options; Options options;
clock_t start; clock_t start;
GTimer *save_state_timer;
guint save_state_source_id;
daemonize_close_stdin(); daemonize_close_stdin();
@ -265,11 +255,6 @@ int main(int argc, char *argv[])
state_file_init(config_get_path(CONF_STATE_FILE)); 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 */ /* run the main loop */
g_main_loop_run(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_main_loop_unref(main_loop);
g_source_remove(save_state_source_id);
g_timer_destroy(save_state_timer);
state_file_finish(); state_file_finish();
playerKill(); playerKill();
finishZeroconf(); finishZeroconf();

View File

@ -22,6 +22,7 @@
#include "volume.h" #include "volume.h"
#include <glib.h> #include <glib.h>
#include <assert.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
@ -39,7 +40,11 @@ static struct _sf_cb {
static char *state_file_path; 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; unsigned int i;
FILE *fp; FILE *fp;
@ -68,6 +73,8 @@ state_file_read(void)
assert(state_file_path != NULL); assert(state_file_path != NULL);
g_debug("Saving state file");
fp = fopen(state_file_path, "r"); fp = fopen(state_file_path, "r");
if (G_UNLIKELY(!fp)) { if (G_UNLIKELY(!fp)) {
g_warning("failed to open %s: %s", g_warning("failed to open %s: %s",
@ -82,6 +89,17 @@ state_file_read(void)
while(fclose(fp) && errno == EINTR) /* nothing */; 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 void
state_file_init(const char *path) state_file_init(const char *path)
{ {
@ -92,13 +110,19 @@ state_file_init(const char *path)
state_file_path = g_strdup(path); state_file_path = g_strdup(path);
state_file_read(); state_file_read();
save_state_source_id = g_timeout_add(5 * 60 * 1000,
timer_save_state_file, NULL);
} }
void void
state_file_finish(void) state_file_finish(void)
{ {
if (save_state_source_id != 0)
g_source_remove(save_state_source_id);
if (state_file_path != NULL) if (state_file_path != NULL)
write_state_file(); state_file_write();
g_free(state_file_path); g_free(state_file_path);
} }