aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/main.c18
-rw-r--r--src/state_file.c28
2 files changed, 26 insertions, 20 deletions
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 <glib.h>
+#include <assert.h>
#include <string.h>
#include <errno.h>
@@ -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);
}