From 682328cded9d509f121fcd0fc550919e9532ffb9 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sat, 6 Jul 2013 11:42:41 -0400 Subject: Add e_activity_get_last_known_text(). Evolution is still occasionally getting stuck on shutdown, and although the evolution-shell log domain shows debug messages for activities that are preventing shutdown, they frequently look like this: (evolution:13534): evolution-shell-DEBUG: 5 active 'mail' activities: (evolution:13534): evolution-shell-DEBUG: * (no description) (evolution:13534): evolution-shell-DEBUG: * (no description) (evolution:13534): evolution-shell-DEBUG: * (no description) (evolution:13534): evolution-shell-DEBUG: * (no description) (evolution:13534): evolution-shell-DEBUG: * (no description) I think the lack of descriptions is from CamelOperations popping all their pushed messages, which is correct behavior but doesn't help us debug the problem. e_activity_get_last_known_text() returns the most recent _non-empty_ text value set on the EActivity. So our debug message can fall back to that if the EActivity has no description at shutdown: (evolution:13534): evolution-shell-DEBUG: * (was "blah, blah, blah") --- e-util/e-activity.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'e-util/e-activity.c') diff --git a/e-util/e-activity.c b/e-util/e-activity.c index 87b84495db..e3beb59eaa 100644 --- a/e-util/e-activity.c +++ b/e-util/e-activity.c @@ -37,6 +37,7 @@ #include #include #include +#include #include "e-util-enumtypes.h" @@ -51,6 +52,7 @@ struct _EActivityPrivate { gchar *icon_name; gchar *text; + gchar *last_known_text; gdouble percent; /* Whether to emit a runtime warning if we @@ -214,6 +216,7 @@ activity_finalize (GObject *object) g_free (priv->icon_name); g_free (priv->text); + g_free (priv->last_known_text); /* Chain up to parent's finalize() method. */ G_OBJECT_CLASS (e_activity_parent_class)->finalize (object); @@ -726,6 +729,8 @@ void e_activity_set_text (EActivity *activity, const gchar *text) { + gchar *last_known_text = NULL; + g_return_if_fail (E_IS_ACTIVITY (activity)); if (g_strcmp0 (activity->priv->text, text) == 0) @@ -734,9 +739,36 @@ e_activity_set_text (EActivity *activity, g_free (activity->priv->text); activity->priv->text = g_strdup (text); + /* See e_activity_get_last_known_text(). */ + last_known_text = e_util_strdup_strip (text); + if (last_known_text != NULL) { + g_free (activity->priv->last_known_text); + activity->priv->last_known_text = last_known_text; + } + g_object_notify (G_OBJECT (activity), "text"); } +/** + * e_activity_get_last_known_text: + * @activity: an #EActivity + * + * Returns the last non-empty #EActivity:text value, so it's possible to + * identify what the @activity was doing even if it + * currently has no description. + * + * Mostly useful for debugging. + * + * Returns: a descriptive message, or %NULL + **/ +const gchar * +e_activity_get_last_known_text (EActivity *activity) +{ + g_return_val_if_fail (E_IS_ACTIVITY (activity), NULL); + + return activity->priv->last_known_text; +} + /** * e_activity_handle_cancellation: * @activity: an #EActivity -- cgit v1.2.3