Package: devicekit-power Version: 011-1ubuntu1 Severity: normal Tags: patch
As mentioned in the title, DkpClient has races in signals when multiple handles are used. One such example of this would be documented in Launchpad bug #425411[1], where gnome-power-manager ends up suspending twice because if the power supply status changes prior to resuming. The supplied patch which was extracted from upstream Git fixes this issue. [1] https://bugs.launchpad.net/bugs/425411 -- System Information: Debian Release: squeeze/sid APT prefers karmic-updates APT policy: (500, 'karmic-updates'), (500, 'karmic-security'), (500, 'karmic-proposed'), (500, 'karmic-backports'), (500, 'karmic') Architecture: amd64 (x86_64) Kernel: Linux 2.6.33-rc5-hyper2 (SMP w/2 CPU cores; PREEMPT) Locale: LANG=en_SG.UTF-8, LC_CTYPE=en_SG.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Versions of packages devicekit-power depends on: ii libc6 2.10.1-0ubuntu16 GNU C Library: Shared libraries ii libdbus-1-3 1.2.16-0ubuntu9 simple interprocess messaging syst ii libdbus-glib-1-2 0.80-4ubuntu1 simple interprocess messaging syst ii libdevkit-power-gobject 011-1ubuntu2 abstraction for power management - ii libglib2.0-0 2.22.3-0ubuntu1 The GLib library of C routines ii libgudev-1.0-0 1:147~-6.1 GObject-based wrapper library for ii libpolkit-gobject-1-0 0.94-1ubuntu1 PolicyKit Authorization API ii libusb-0.1-4 2:0.1.12-13 userspace USB programming library Versions of packages devicekit-power recommends: ii pm-utils 1.2.5-2ubuntu7 utilities and scripts for power ma ii policykit-1 0.94-1ubuntu1 framework for managing administrat devicekit-power suggests no packages. -- no debconf information
commit b8a200eb481a42adf26d639dbdc2224a6c99f841 Author: Richard Hughes <[email protected]> Date: Mon Jan 25 14:25:37 2010 +0000 Make DkpClient a singleton to avoid some weird race conditions diff --git a/devkit-power-gobject/dkp-client.c b/devkit-power-gobject/dkp-client.c index feac826..5cef4f9 100644 --- a/devkit-power-gobject/dkp-client.c +++ b/devkit-power-gobject/dkp-client.c @@ -74,6 +74,7 @@ enum { }; static guint signals [DKP_CLIENT_LAST_SIGNAL] = { 0 }; +static gpointer dkp_client_object = NULL; G_DEFINE_TYPE (DkpClient, dkp_client, G_TYPE_OBJECT) @@ -734,8 +735,12 @@ dkp_client_finalize (GObject *object) DkpClient * dkp_client_new (void) { - DkpClient *client; - client = g_object_new (DKP_TYPE_CLIENT, NULL); - return DKP_CLIENT (client); + if (dkp_client_object != NULL) { + g_object_ref (dkp_client_object); + } else { + dkp_client_object = g_object_new (DKP_TYPE_CLIENT, NULL); + g_object_add_weak_pointer (dkp_client_object, &dkp_client_object); + } + return DKP_CLIENT (dkp_client_object); }

