Ensure we send ::Sleeping() if clients do not call AboutToSleep()

This commit is contained in:
Richard Hughes 2010-05-07 20:52:00 +01:00
parent 43fd837e00
commit ab1bc59e56

View file

@ -85,6 +85,7 @@ struct UpDaemonPrivate
gboolean hibernate_has_swap_space;
gboolean hibernate_has_encrypted_swap;
gboolean during_coldplug;
gboolean sent_sleeping_signal;
guint battery_poll_id;
guint battery_poll_count;
GTimer *about_to_sleep_timer;
@ -330,9 +331,11 @@ up_daemon_about_to_sleep (UpDaemon *daemon, DBusGMethodInvocation *context)
if (!up_polkit_check_auth (priv->polkit, subject, "org.freedesktop.upower.suspend", context))
goto out;
/* we've told the clients we're going down */
egg_debug ("emitting sleeping");
g_signal_emit (daemon, signals[SIGNAL_SLEEPING], 0);
g_timer_start (priv->about_to_sleep_timer);
daemon->priv->sent_sleeping_signal = TRUE;
dbus_g_method_return (context, NULL);
out:
@ -387,6 +390,7 @@ up_daemon_deferred_sleep_cb (UpDaemonDeferredSleep *sleep)
out:
/* clear timer */
priv->about_to_sleep_id = 0;
priv->sent_sleeping_signal = FALSE;
g_free (stdout);
g_free (stderr);
@ -415,13 +419,22 @@ up_daemon_deferred_sleep (UpDaemon *daemon, const gchar *command, DBusGMethodInv
sleep->context = context;
sleep->command = g_strdup (command);
/* we didn't use AboutToSleep() so send the signal for clients now */
if (!priv->sent_sleeping_signal) {
egg_debug ("no AboutToSleep(), so emitting ::Sleeping()");
g_signal_emit (daemon, signals[SIGNAL_SLEEPING], 0);
priv->about_to_sleep_id = g_timeout_add (priv->conf_sleep_timeout,
(GSourceFunc) up_daemon_deferred_sleep_cb, sleep);
return;
}
/* about to sleep */
elapsed = 1000.0f * g_timer_elapsed (priv->about_to_sleep_timer, NULL);
egg_debug ("between AboutToSleep() and %s was %fms", sleep->command, elapsed);
if (elapsed < priv->conf_sleep_timeout) {
/* we have to wait for a little bit */
/* we have to wait for the difference in time */
priv->about_to_sleep_id = g_timeout_add (priv->conf_sleep_timeout - elapsed,
(GSourceFunc) up_daemon_deferred_sleep_cb, sleep);
(GSourceFunc) up_daemon_deferred_sleep_cb, sleep);
} else {
/* we can do this straight away */
priv->about_to_sleep_id = g_idle_add ((GSourceFunc) up_daemon_deferred_sleep_cb, sleep);
@ -930,6 +943,7 @@ up_daemon_init (UpDaemon *daemon)
daemon->priv->on_battery = FALSE;
daemon->priv->on_low_battery = FALSE;
daemon->priv->during_coldplug = FALSE;
daemon->priv->sent_sleeping_signal = FALSE;
daemon->priv->battery_poll_id = 0;
daemon->priv->battery_poll_count = 0;
daemon->priv->about_to_sleep_id = 0;