diff options
author | Max Kellermann <max@duempel.org> | 2013-04-08 22:31:51 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-04-08 23:11:36 +0200 |
commit | dca111519627813608807b60b98f3d5133880120 (patch) | |
tree | e19e6733975211a71a0b5b646c4a086be03d7bd1 | |
parent | 96882175f15230fe2cf9b4e7f3a7f29b5697fe26 (diff) | |
download | mpd-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-- | NEWS | 2 | ||||
-rw-r--r-- | src/Main.cxx | 3 | ||||
-rw-r--r-- | src/StateFile.cxx | 21 | ||||
-rw-r--r-- | src/StateFile.hxx | 7 |
4 files changed, 15 insertions, 18 deletions
@@ -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; }; |