aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2013-04-08 22:31:51 +0200
committerMax Kellermann <max@duempel.org>2013-04-08 23:11:36 +0200
commitdca111519627813608807b60b98f3d5133880120 (patch)
treee19e6733975211a71a0b5b646c4a086be03d7bd1
parent96882175f15230fe2cf9b4e7f3a7f29b5697fe26 (diff)
downloadmpd-dca111519627813608807b60b98f3d5133880120.tar.gz
mpd-dca111519627813608807b60b98f3d5133880120.tar.xz
mpd-dca111519627813608807b60b98f3d5133880120.zip
StateFile: schedule timer only after a change
Save the state file 2 minutes after the last change. This reduces the disruptions by an idle MPD, and MPD can be paged out permanently until it is used.
-rw-r--r--NEWS2
-rw-r--r--src/Main.cxx3
-rw-r--r--src/StateFile.cxx21
-rw-r--r--src/StateFile.hxx7
4 files changed, 15 insertions, 18 deletions
diff --git a/NEWS b/NEWS
index 1ab1c37f4..d8c2674bf 100644
--- a/NEWS
+++ b/NEWS
@@ -13,7 +13,7 @@ ver 0.18 (2012/??/??)
- new option "tags" may be used to disable sending tags to output
- alsa: workaround for noise after manual song change
* improved decoder/output error reporting
-
+* eliminate timer wakeup on idle MPD
ver 0.17.4 (2013/??/??)
* protocol:
diff --git a/src/Main.cxx b/src/Main.cxx
index 9b6630d60..322f4d618 100644
--- a/src/Main.cxx
+++ b/src/Main.cxx
@@ -347,6 +347,9 @@ idle_event_emitted(void)
unsigned flags = idle_get();
if (flags != 0)
client_list->IdleAdd(flags);
+
+ if (flags & (IDLE_PLAYLIST|IDLE_PLAYER|IDLE_MIXER|IDLE_OUTPUT))
+ state_file->CheckModified();
}
/**
diff --git a/src/StateFile.cxx b/src/StateFile.cxx
index 301ae9abb..ae782335d 100644
--- a/src/StateFile.cxx
+++ b/src/StateFile.cxx
@@ -41,7 +41,6 @@ StateFile::StateFile(Path &&_path, const char *_path_utf8,
prev_volume_version(0), prev_output_version(0),
prev_playlist_version(0)
{
- ScheduleSeconds(5 * 60);
}
void
@@ -110,24 +109,16 @@ StateFile::Read()
RememberVersions();
}
-inline void
-StateFile::AutoWrite()
+void
+StateFile::CheckModified()
{
- if (!IsModified())
- /* nothing has changed - don't save the state file,
- don't spin up the hard disk */
- return;
-
- Write();
+ if (!IsActive() && IsModified())
+ ScheduleSeconds(2 * 60);
}
-/**
- * This function is called every 5 minutes by the GLib main loop, and
- * saves the state file.
- */
bool
StateFile::OnTimeout()
{
- AutoWrite();
- return true;
+ Write();
+ return false;
}
diff --git a/src/StateFile.hxx b/src/StateFile.hxx
index 7d57d5422..79693c70b 100644
--- a/src/StateFile.hxx
+++ b/src/StateFile.hxx
@@ -48,6 +48,11 @@ public:
void Read();
void Write();
+ /**
+ * Schedules a write if MPD's state was modified.
+ */
+ void CheckModified();
+
private:
/**
* Save the current state versions for use with IsModified().
@@ -61,8 +66,6 @@ private:
gcc_pure
bool IsModified() const;
- void AutoWrite();
-
/* virtual methods from TimeoutMonitor */
virtual bool OnTimeout() override;
};