aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorConor Curran <conor.curran@canonical.com>2011-08-31 13:09:57 +0100
committerConor Curran <conor.curran@canonical.com>2011-08-31 13:09:57 +0100
commite1a933792dbf2114d66a3132d2ce29107ed25130 (patch)
treeb4cc4eb85f04b4e48c14287a53a3a1d83902d5de
parent6ee7c05f5d8f4397c3111fe94ab7c742478b737e (diff)
downloadayatana-indicator-session-e1a933792dbf2114d66a3132d2ce29107ed25130.tar.gz
ayatana-indicator-session-e1a933792dbf2114d66a3132d2ce29107ed25130.tar.bz2
ayatana-indicator-session-e1a933792dbf2114d66a3132d2ce29107ed25130.zip
apt race condition handled
-rw-r--r--src/apt-watcher.c85
-rw-r--r--src/indicator-session.c1
-rw-r--r--src/session-dbus.xml2
3 files changed, 64 insertions, 24 deletions
diff --git a/src/apt-watcher.c b/src/apt-watcher.c
index a4298a8..e757896 100644
--- a/src/apt-watcher.c
+++ b/src/apt-watcher.c
@@ -27,6 +27,7 @@ static guint watcher_id;
struct _AptWatcher
{
GObject parent_instance;
+ guint reboot_query;
GCancellable * proxy_cancel;
GDBusProxy * proxy;
SessionDbus* session_dbus_interface;
@@ -64,6 +65,7 @@ static void apt_watcher_signal_cb (GDBusProxy* proxy,
gpointer user_data);
static void apt_watcher_manage_transactions (AptWatcher* self,
gchar* transaction_id);
+static gboolean apt_watcher_query_reboot_status (gpointer self);
@@ -75,6 +77,7 @@ apt_watcher_init (AptWatcher *self)
self->current_state = UP_TO_DATE;
self->proxy_cancel = g_cancellable_new();
self->proxy = NULL;
+ self->reboot_query = 0;
self->current_transaction = NULL;
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
@@ -141,7 +144,11 @@ fetch_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data)
g_signal_connect (self->proxy,
"g-signal",
G_CALLBACK(apt_watcher_signal_cb),
- self);
+ self);
+
+ /*self->reboot_query = g_timeout_add_seconds (5,
+ apt_watcher_query_reboot_status,
+ self);*/
}
@@ -245,7 +252,16 @@ apt_watcher_transaction_state_update_cb (AptTransaction* trans,
== SIMULATION){
g_object_unref (G_OBJECT(self->current_transaction));
self->current_transaction = NULL;
- }
+ }
+ if (self->reboot_query != 0){
+ g_source_remove (self->reboot_query);
+ self->reboot_query = 0;
+ }
+ // Wait a sec before querying for reboot status,
+ // race condition with Apt has been observed.
+ self->reboot_query = g_timeout_add_seconds (1,
+ apt_watcher_query_reboot_status,
+ self);
}
else if (state == UPDATES_AVAILABLE){
dbusmenu_menuitem_property_set (self->apt_item,
@@ -266,27 +282,20 @@ apt_watcher_transaction_state_update_cb (AptTransaction* trans,
_("Updates Installing…"));
}
else if (state == FINISHED){
- GVariant* reboot_result = g_dbus_proxy_get_cached_property (self->proxy,
- "RebootRequired");
- gboolean reboot;
- g_variant_get (reboot_result, "b", &reboot);
- if (reboot == FALSE){
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_LABEL,
- _("Software Up to Date"));
- }
- else{
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_LABEL,
- _("Reboot Required"));
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_DISPOSITION,
- DBUSMENU_MENUITEM_DISPOSITION_ALERT);
- session_dbus_restart_required (self->session_dbus_interface);
- }
- g_debug ("Finished with a reboot value of %i", reboot);
g_object_unref (G_OBJECT(self->current_transaction));
- self->current_transaction = NULL;
+ self->current_transaction = NULL;
+ if (self->reboot_query != 0){
+ g_source_remove (self->reboot_query);
+ self->reboot_query = 0;
+ }
+ // Wait a sec before querying for reboot status,
+ // race condition with Apt has been observed.
+ self->reboot_query = g_timeout_add_seconds (1,
+ apt_watcher_query_reboot_status,
+ self);
+ dbusmenu_menuitem_property_set (self->apt_item,
+ DBUSMENU_MENUITEM_PROP_LABEL,
+ _("Finished Updating…"));
}
self->current_state = state;
}
@@ -302,8 +311,38 @@ apt_watcher_manage_transactions (AptWatcher* self, gchar* transaction_id)
}
}
+static gboolean
+apt_watcher_query_reboot_status (gpointer data)
+{
+ g_return_val_if_fail (APT_IS_WATCHER (data), FALSE);
+ AptWatcher* self = APT_WATCHER (data);
+
+ GVariant* reboot_result = g_dbus_proxy_get_cached_property (self->proxy,
+ "RebootRequired");
+ gboolean reboot;
+ g_variant_get (reboot_result, "b", &reboot);
+ g_debug ("apt_watcher_query_reboot_status: reboot prop = %i", reboot);
+
+ if (reboot == FALSE){
+ dbusmenu_menuitem_property_set (self->apt_item,
+ DBUSMENU_MENUITEM_PROP_LABEL,
+ _("Software Up to Date"));
+ }
+ else{
+ dbusmenu_menuitem_property_set (self->apt_item,
+ DBUSMENU_MENUITEM_PROP_LABEL,
+ _("Reboot Required"));
+ dbusmenu_menuitem_property_set (self->apt_item,
+ DBUSMENU_MENUITEM_PROP_DISPOSITION,
+ DBUSMENU_MENUITEM_DISPOSITION_ALERT);
+ session_dbus_restart_required (self->session_dbus_interface);
+ }
+ self->reboot_query = 0;
+ return FALSE;
+}
+
// TODO - Ask MVO about this.
-// Signal is of type s not sas which is on d-feet !!!
+// Signal is of type s not sas which is on d-feet.
static void apt_watcher_signal_cb ( GDBusProxy* proxy,
gchar* sender_name,
gchar* signal_name,
diff --git a/src/indicator-session.c b/src/indicator-session.c
index fab47b3..0f44a36 100644
--- a/src/indicator-session.c
+++ b/src/indicator-session.c
@@ -499,6 +499,7 @@ receive_signal (GDBusProxy * proxy,
}
else if (g_strcmp0(signal_name, "RebootRequired") == 0) {
// TODO waiting on design to give me a name.
+ g_debug ("Reboot required, icon changed to %s", ICON_RESTART);
self->devices.image = indicator_image_helper (ICON_RESTART);
}
}
diff --git a/src/session-dbus.xml b/src/session-dbus.xml
index fd1859f..076e595 100644
--- a/src/session-dbus.xml
+++ b/src/session-dbus.xml
@@ -8,7 +8,7 @@
<method name="GetUserMenuVisibility">
<arg name="update" direction="out" type="b"/>
</method>
- <method name="IsUpdateNeeded">
+ <method name="IsRestartNeeded">
<arg name="update" direction="out" type="b"/>
</method>
<signal name="UserRealNameUpdated">