From 348d0c944e92e8dfb361190b97a168f27a7333b8 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 10 Jan 2014 23:40:05 +0100 Subject: Stats: lazy initialization Ask the DatabasePlugin for stats when the first client requests them, not at startup. --- src/DatabaseGlue.cxx | 2 -- src/Stats.cxx | 41 ++++++++++++++++++++++++++++++++++------- src/Stats.hxx | 3 ++- src/UpdateGlue.cxx | 2 +- 4 files changed, 37 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/DatabaseGlue.cxx b/src/DatabaseGlue.cxx index bc99baa4f..f64b31738 100644 --- a/src/DatabaseGlue.cxx +++ b/src/DatabaseGlue.cxx @@ -137,8 +137,6 @@ DatabaseGlobalOpen(Error &error) db_is_open = true; - stats_update(); - return true; } diff --git a/src/Stats.cxx b/src/Stats.cxx index e22f1a995..1764516ef 100644 --- a/src/Stats.cxx +++ b/src/Stats.cxx @@ -39,6 +39,12 @@ static unsigned start_time; static DatabaseStats stats; +enum class StatsValidity : uint8_t { + INVALID, VALID, FAILED, +}; + +static StatsValidity stats_validity = StatsValidity::INVALID; + void stats_global_init(void) { #ifndef WIN32 @@ -46,21 +52,39 @@ void stats_global_init(void) #endif } -void stats_update(void) +void +stats_invalidate() { assert(GetDatabase() != nullptr); - Error error; + stats_validity = StatsValidity::INVALID; +} + +static bool +stats_update() +{ + switch (stats_validity) { + case StatsValidity::INVALID: + break; + + case StatsValidity::VALID: + return true; + + case StatsValidity::FAILED: + return false; + } - DatabaseStats stats2; + Error error; const DatabaseSelection selection("", true); - if (GetDatabase()->GetStats(selection, stats2, error)) { - stats = stats2; + if (GetDatabase()->GetStats(selection, stats, error)) { + stats_validity = StatsValidity::VALID; + return true; } else { LogError(error); - stats.Clear(); + stats_validity = StatsValidity::FAILED; + return true; } } @@ -74,7 +98,10 @@ db_stats_print(Client &client) database plugin */ /* TODO: move this into the "proxy" database plugin as an "idle" handler */ - stats_update(); + stats_invalidate(); + + if (!stats_update()) + return; client_printf(client, "artists: %u\n" diff --git a/src/Stats.hxx b/src/Stats.hxx index 63b96c4d6..e11be0d68 100644 --- a/src/Stats.hxx +++ b/src/Stats.hxx @@ -24,7 +24,8 @@ class Client; void stats_global_init(void); -void stats_update(void); +void +stats_invalidate(); void stats_print(Client &client); diff --git a/src/UpdateGlue.cxx b/src/UpdateGlue.cxx index 12ea126a9..52a5802ce 100644 --- a/src/UpdateGlue.cxx +++ b/src/UpdateGlue.cxx @@ -163,7 +163,7 @@ static void update_finished_event(void) } else { progress = UPDATE_PROGRESS_IDLE; - stats_update(); + stats_invalidate(); } } -- cgit v1.2.3