aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2013-07-06 23:42:41 +0800
committerMatthew Barnes <mbarnes@redhat.com>2013-07-06 23:57:57 +0800
commit682328cded9d509f121fcd0fc550919e9532ffb9 (patch)
treefb98bfd0227a82ea4790073347f39c45859d442c
parent427d93b3dfab0e7fcf3ac820dbce2d2f182a9b19 (diff)
downloadgsoc2013-evolution-682328cded9d509f121fcd0fc550919e9532ffb9.tar.gz
gsoc2013-evolution-682328cded9d509f121fcd0fc550919e9532ffb9.tar.zst
gsoc2013-evolution-682328cded9d509f121fcd0fc550919e9532ffb9.zip
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")
-rw-r--r--doc/reference/evolution-util/evolution-util-sections.txt1
-rw-r--r--e-util/e-activity.c32
-rw-r--r--e-util/e-activity.h1
-rw-r--r--shell/e-shell-backend.c6
4 files changed, 40 insertions, 0 deletions
diff --git a/doc/reference/evolution-util/evolution-util-sections.txt b/doc/reference/evolution-util/evolution-util-sections.txt
index 7ea056988f..8e0c917638 100644
--- a/doc/reference/evolution-util/evolution-util-sections.txt
+++ b/doc/reference/evolution-util/evolution-util-sections.txt
@@ -43,6 +43,7 @@ e_activity_get_state
e_activity_set_state
e_activity_get_text
e_activity_set_text
+e_activity_get_last_known_text
e_activity_handle_cancellation
<SUBSECTION Standard>
E_ACTIVITY
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 <stdarg.h>
#include <glib/gi18n.h>
#include <camel/camel.h>
+#include <libedataserver/libedataserver.h>
#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,10 +739,37 @@ 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 <emphasis>was</emphasis> 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
* @error: a #GError, or %NULL
diff --git a/e-util/e-activity.h b/e-util/e-activity.h
index 9309fe1fb0..1c2cc4e7d3 100644
--- a/e-util/e-activity.h
+++ b/e-util/e-activity.h
@@ -90,6 +90,7 @@ void e_activity_set_state (EActivity *activity,
const gchar * e_activity_get_text (EActivity *activity);
void e_activity_set_text (EActivity *activity,
const gchar *text);
+const gchar * e_activity_get_last_known_text (EActivity *activity);
gboolean e_activity_handle_cancellation (EActivity *activity,
const GError *error);
diff --git a/shell/e-shell-backend.c b/shell/e-shell-backend.c
index 5f7666b238..e4926c5c0a 100644
--- a/shell/e-shell-backend.c
+++ b/shell/e-shell-backend.c
@@ -105,12 +105,18 @@ shell_backend_debug_list_activities (EShellBackend *shell_backend)
for (link = head; link != NULL; link = g_list_next (link)) {
EActivity *activity = E_ACTIVITY (link->data);
gchar *description;
+ const gchar *was;
description = e_activity_describe (activity);
+ was = e_activity_get_last_known_text (activity);
+
if (description != NULL)
g_debug ("* %s", description);
+ else if (was != NULL)
+ g_debug ("* (was \"%s\")", was);
else
g_debug ("* (no description)");
+
g_free (description);
}
}