commit 3f0b85db1d4eedd3fdc9db0832e114215812d15c Author: Miroslav Lichvar Date: Wed Jan 10 15:55:05 2018 +0100 don't remove timeout after each main context iteration With glib2-2.54.3 adding a new timeout causes g_main_context_iteration() to immediately return FALSE, which triggered an infinite loop removing and adding the timeout. Instead of removing the timeout after all iterations, use a flag to remove the timeout only when a valid call was handled. This fixes issue #4. diff --git a/timedatex.c b/timedatex.c index 28e562c..e671bb5 100644 --- a/timedatex.c +++ b/timedatex.c @@ -120,7 +120,7 @@ struct hwclock_call { /* Global variables */ static GDBusProxy *systemd_proxy, *polkit_proxy; -static gboolean main_quit, running_auth_checks; +static gboolean main_quit, running_auth_checks, had_activity; static GArray *ntp_units; @@ -948,6 +948,8 @@ static void handle_method_call(GDBusConnection *connection, const gchar *caller, } else { g_assert_not_reached(); } + + had_activity = TRUE; } static const GDBusInterfaceVTable interface_vtable = { @@ -1022,19 +1024,24 @@ int main(int argc, char **argv) { read_ntp_units(); main_quit = FALSE; + had_activity = FALSE; /* This is the main loop. Quit when idle for QUIT_TIMEOUT seconds. */ while (!main_quit) { /* Add timeout when not waiting for an authorization check */ - if (!running_auth_checks) + if (!timeout_id && !running_auth_checks) timeout_id = g_timeout_add(QUIT_TIMEOUT * 1000, stop_main_loop, NULL); g_main_context_iteration(g_main_context_default(), TRUE); - if (timeout_id) - g_source_remove(timeout_id); - timeout_id = 0; + if (had_activity || running_auth_checks) { + had_activity = FALSE; + + if (timeout_id) + g_source_remove(timeout_id); + timeout_id = 0; + } } ret = 0;