aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/changelog8
-rw-r--r--libindicator/indicator-service-manager.c12
-rw-r--r--libindicator/indicator-service.c16
3 files changed, 33 insertions, 3 deletions
diff --git a/debian/changelog b/debian/changelog
index bf71422..ccb0d37 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+libindicator (0.3.1-0ubuntu1~ppa2) UNRELEASED; urgency=low
+
+ * Upstream merge
+ * Various fixes to timeout handling in servcies and the
+ service manager.
+
+ -- Ted Gould <ted@ubuntu.com> Mon, 01 Feb 2010 23:57:52 -0800
+
libindicator (0.3.1-0ubuntu1~ppa1) karmic; urgency=low
* Upstream release 0.3.1
diff --git a/libindicator/indicator-service-manager.c b/libindicator/indicator-service-manager.c
index 7bb9a9b..20eddec 100644
--- a/libindicator/indicator-service-manager.c
+++ b/libindicator/indicator-service-manager.c
@@ -397,6 +397,15 @@ start_service_cb (DBusGProxy * proxy, guint status, GError * error, gpointer use
INDICATOR_SERVICE_OBJECT,
INDICATOR_SERVICE_INTERFACE,
&error);
+
+ if (error != NULL || priv->service_proxy == NULL) {
+ g_warning("Unable to create service proxy on '%s': %s", priv->name, error == NULL ? "(null)" : error->message);
+ priv->service_proxy = NULL; /* Should be already, but we want to be *really* sure. */
+ g_error_free(error);
+ start_service_again(INDICATOR_SERVICE_MANAGER(user_data));
+ return;
+ }
+
g_object_add_weak_pointer(G_OBJECT(priv->service_proxy), (gpointer *)&(priv->service_proxy));
g_signal_connect(G_OBJECT(priv->service_proxy), "destroy", G_CALLBACK(service_proxy_destroyed), user_data);
@@ -432,7 +441,7 @@ start_service (IndicatorServiceManager * service)
INDICATOR_SERVICE_INTERFACE,
&error);
- if (error != NULL) {
+ if (error != NULL || priv->service_proxy == NULL) {
/* We don't care about the error, just start the service anyway. */
g_error_free(error);
org_freedesktop_DBus_start_service_by_name_async (priv->dbus_proxy,
@@ -476,6 +485,7 @@ start_service_again_cb (gpointer data)
{
IndicatorServiceManagerPrivate * priv = INDICATOR_SERVICE_MANAGER_GET_PRIVATE(data);
priv->restart_count++;
+ g_debug("Restarting service '%s' count %d", priv->name, priv->restart_count);
start_service(INDICATOR_SERVICE_MANAGER(data));
priv->restart_source = 0;
return FALSE;
diff --git a/libindicator/indicator-service.c b/libindicator/indicator-service.c
index e2ec6b2..fc3c7de 100644
--- a/libindicator/indicator-service.c
+++ b/libindicator/indicator-service.c
@@ -316,7 +316,12 @@ get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspe
static gboolean
timeout_no_watchers (gpointer data)
{
- g_signal_emit(G_OBJECT(data), signals[SHUTDOWN], 0, TRUE);
+ g_warning("No watchers, service timing out.");
+ if (g_getenv("INDICATOR_ALLOW_NO_WATCHERS") == NULL) {
+ g_signal_emit(G_OBJECT(data), signals[SHUTDOWN], 0, TRUE);
+ } else {
+ g_warning("\tblocked by environment variable.");
+ }
return FALSE;
}
@@ -329,16 +334,23 @@ try_and_get_name_cb (DBusGProxy * proxy, guint status, GError * error, gpointer
IndicatorService * service = INDICATOR_SERVICE(data);
g_return_if_fail(service != NULL);
+ if (error != NULL) {
+ g_warning("Unable to send message to request name: %s", error->message);
+ g_signal_emit(G_OBJECT(data), signals[SHUTDOWN], 0, TRUE);
+ return;
+ }
+
if (status != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER && status != DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER) {
/* The already owner seems like it shouldn't ever
happen, but I have a hard time throwing an error
on it as we did achieve our goals. */
+ g_warning("Name request failed. Status returned: %d", status);
g_signal_emit(G_OBJECT(data), signals[SHUTDOWN], 0, TRUE);
return;
}
IndicatorServicePrivate * priv = INDICATOR_SERVICE_GET_PRIVATE(service);
- priv->timeout = g_timeout_add(500, timeout_no_watchers, service);
+ priv->timeout = g_timeout_add_seconds(1, timeout_no_watchers, service);
return;
}