[Goodies-commits] r7135 - in xfce4-power-manager/trunk: . libxfpm src

Ali Abdallah aliov at xfce.org
Wed Apr 8 00:23:35 CEST 2009


Author: aliov
Date: 2009-04-07 22:23:35 +0000 (Tue, 07 Apr 2009)
New Revision: 7135

Modified:
   xfce4-power-manager/trunk/ChangeLog
   xfce4-power-manager/trunk/libxfpm/hal-battery.c
   xfce4-power-manager/trunk/libxfpm/hal-power.c
   xfce4-power-manager/trunk/src/xfpm-battery.c
   xfce4-power-manager/trunk/src/xfpm-supply.c
   xfce4-power-manager/trunk/src/xfpm-tray-icon.c
Log:
Fix issue with battery ref count that was causing a crash when hald restarts

Modified: xfce4-power-manager/trunk/ChangeLog
===================================================================
--- xfce4-power-manager/trunk/ChangeLog	2009-04-07 22:15:20 UTC (rev 7134)
+++ xfce4-power-manager/trunk/ChangeLog	2009-04-07 22:23:35 UTC (rev 7135)
@@ -1,4 +1,7 @@
 
+2009-04-08  0:23 Ali aliov at xfce.org 
+	 * : Fix issue with battery ref count that was causing a crash when hald restarts
+
 2009-04-07 13:23 Ali aliov at xfce.org 
 	 * : Implement a clean way to restart HAL related objects when HALD restarts
 

Modified: xfce4-power-manager/trunk/libxfpm/hal-battery.c
===================================================================
--- xfce4-power-manager/trunk/libxfpm/hal-battery.c	2009-04-07 22:15:20 UTC (rev 7134)
+++ xfce4-power-manager/trunk/libxfpm/hal-battery.c	2009-04-07 22:23:35 UTC (rev 7135)
@@ -23,19 +23,9 @@
 #endif
 
 #include <stdio.h>
-
-#ifdef HAVE_STDLIB_H
 #include <stdlib.h>
-#endif
-
-#ifdef HAVE_STRING_H
 #include <string.h>
-#endif
 
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-
 #include <glib.h>
 #include <glib/gi18n.h>
 
@@ -58,8 +48,6 @@
 
 struct HalBatteryPrivate
 {
-    HalManager *manager;
-    
     /* Properties read-only */
     HalDeviceType type;
     
@@ -242,8 +230,6 @@
 
     battery->priv = HAL_BATTERY_GET_PRIVATE(battery);
     
-    battery->priv->manager = hal_manager_new ();
-    
     battery->priv->is_present      = FALSE;
     battery->priv->is_charging     = FALSE;
     battery->priv->is_discharging  = FALSE;
@@ -327,9 +313,6 @@
 
     battery = HAL_BATTERY(object);
     
-    if ( battery->priv->manager )
-    	g_object_unref(battery->priv->manager);
-	
     if ( battery->priv->technology )
     	g_free (battery->priv->technology);
 	

Modified: xfce4-power-manager/trunk/libxfpm/hal-power.c
===================================================================
--- xfce4-power-manager/trunk/libxfpm/hal-power.c	2009-04-07 22:15:20 UTC (rev 7134)
+++ xfce4-power-manager/trunk/libxfpm/hal-power.c	2009-04-07 22:23:35 UTC (rev 7135)
@@ -44,6 +44,9 @@
 {
     GHashTable *hash  	;
     HalManager *manager ;
+    
+    gulong      sig_1;
+    gulong      sig_2;
 };
 
 enum
@@ -130,7 +133,7 @@
 {
     g_signal_emit (power, signals[BATTERY_REMOVED], 0, battery);
     
-    g_object_unref(battery );
+    //g_object_unref (battery);
     
     if (!g_hash_table_remove(power->priv->hash, udi))
     	g_warning ("Unable to removed object from hash\n");
@@ -172,7 +175,7 @@
 {
     HalBattery *battery  = hal_power_get_battery_from_hash (power, udi);
     
-    if (battery )
+    if (battery)
     {
 	hal_power_remove_battery (power, battery , udi);
     }
@@ -243,15 +246,14 @@
     power->priv = HAL_POWER_GET_PRIVATE(power);
     
     power->priv->manager = hal_manager_new ();
-    power->priv->hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+    power->priv->hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
     
-    g_signal_connect (power->priv->manager, "device-added", 
-		      G_CALLBACK(hal_power_device_added_cb), power);
+    power->priv->sig_1 = g_signal_connect (power->priv->manager, "device-added", 
+					   G_CALLBACK(hal_power_device_added_cb), power);
     
-    g_signal_connect (power->priv->manager, "device-removed",
-		      G_CALLBACK(hal_power_device_removed_cb), power);
+    power->priv->sig_2 = g_signal_connect (power->priv->manager, "device-removed",
+					    G_CALLBACK(hal_power_device_removed_cb), power);
    
-    
     hal_power_get_batteries_internal (power);
 }
 
@@ -262,11 +264,15 @@
     
     power = HAL_POWER(object);
     
-    if (power->priv->hash)
-    	g_hash_table_unref(power->priv->hash);
+    if ( g_signal_handler_is_connected (power->priv->manager, power->priv->sig_1 ) )
+	g_signal_handler_disconnect (power->priv->manager, power->priv->sig_1 );
+	
+    if ( g_signal_handler_is_connected (power->priv->manager, power->priv->sig_2 ) )
+	g_signal_handler_disconnect (power->priv->manager, power->priv->sig_2 );
     
-    if ( power->priv->manager )
-    	g_object_unref(power->priv->manager);
+    g_hash_table_destroy (power->priv->hash);
+    
+    g_object_unref (power->priv->manager);
 	
     G_OBJECT_CLASS(hal_power_parent_class)->finalize(object);
 }
@@ -302,7 +308,6 @@
     for ( i=0; i < g_list_length (list); i++)
     {
        battery = g_list_nth_data (list, i);
-       g_object_ref (battery );
        g_ptr_array_add (array, battery);
     }
    

Modified: xfce4-power-manager/trunk/src/xfpm-battery.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-battery.c	2009-04-07 22:15:20 UTC (rev 7134)
+++ xfce4-power-manager/trunk/src/xfpm-battery.c	2009-04-07 22:23:35 UTC (rev 7135)
@@ -68,6 +68,9 @@
     
     gboolean         adapter_present;
     XfpmBatteryState state;
+    
+    gulong	     sig_1;
+    gulong           sig_2;
 };
 
 enum
@@ -527,9 +530,9 @@
     
     battery->priv->adapter_present = xfpm_adapter_get_present (battery->priv->adapter);
     
-    g_signal_connect (battery->priv->adapter ,"adapter-changed",
-		      G_CALLBACK (xfpm_battery_adapter_changed_cb), battery);
-		      
+    battery->priv->sig_1 = g_signal_connect (battery->priv->adapter ,"adapter-changed",
+					     G_CALLBACK (xfpm_battery_adapter_changed_cb), battery);
+    
     g_signal_connect (battery->priv->icon, "show-information", 
 		      G_CALLBACK (xfpm_battery_show_info), battery);
 }
@@ -539,7 +542,13 @@
 {
     XfpmBattery *battery;
     battery = XFPM_BATTERY(object);
-    
+ 
+    if ( g_signal_handler_is_connected (battery->priv->adapter, battery->priv->sig_1 ) )
+	g_signal_handler_disconnect (G_OBJECT (battery->priv->adapter), battery->priv->sig_1);
+	
+    if ( g_signal_handler_is_connected (battery->priv->conf, battery->priv->sig_2 ) )
+	g_signal_handler_disconnect (G_OBJECT (battery->priv->conf), battery->priv->sig_2);
+
     g_object_unref (battery->priv->icon);
     
     g_object_unref (battery->priv->device);
@@ -574,8 +583,8 @@
     g_signal_connect (G_OBJECT(battery->priv->device), "battery-changed",
 		      G_CALLBACK(xfpm_battery_device_changed_cb), battery);
 		      
-    g_signal_connect (G_OBJECT(battery->priv->conf), "tray-icon-settings-changed",
-		      G_CALLBACK(xfpm_battery_tray_icon_settings_changed), battery);
+    battery->priv->sig_2 = g_signal_connect (G_OBJECT(battery->priv->conf), "tray-icon-settings-changed",
+					     G_CALLBACK(xfpm_battery_tray_icon_settings_changed), battery);
     
     return battery;
 }

Modified: xfce4-power-manager/trunk/src/xfpm-supply.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-supply.c	2009-04-07 22:15:20 UTC (rev 7134)
+++ xfce4-power-manager/trunk/src/xfpm-supply.c	2009-04-07 22:23:35 UTC (rev 7135)
@@ -394,9 +394,10 @@
     if ( battery )
     {
 	TRACE("Removing battery %s", udi);
-	if (!g_hash_table_remove(supply->priv->hash, udi))
+	if (!g_hash_table_remove (supply->priv->hash, udi))
 		g_critical ("Unable to remove battery object from hash");
     }
+//    g_object_unref (battery);
     xfpm_supply_refresh_tray_icon (supply);
 }
 
@@ -415,7 +416,6 @@
 static gboolean
 xfpm_supply_monitor_start (XfpmSupply *supply)
 {
-    //FIXME: Check the system formfactor
     supply->priv->adapter_present = xfpm_adapter_get_present (supply->priv->adapter);
     
     GPtrArray *array = hal_power_get_batteries (supply->priv->power);
@@ -430,6 +430,12 @@
     
     g_ptr_array_free(array, TRUE);
     
+    g_signal_connect(supply->priv->power, "battery-added",
+		     G_CALLBACK(xfpm_supply_battery_added_cb), supply);
+		     
+    g_signal_connect(supply->priv->power, "battery-removed",
+		     G_CALLBACK(xfpm_supply_battery_removed_cb), supply);
+    
     return FALSE;
 }
 
@@ -462,14 +468,7 @@
       
     xfpm_supply_monitor_start (supply);
     
-    g_signal_connect(supply->priv->power, "battery-added",
-		     G_CALLBACK(xfpm_supply_battery_added_cb), supply);
-		     
-    g_signal_connect(supply->priv->power, "battery-removed",
-		     G_CALLBACK(xfpm_supply_battery_removed_cb), supply);
-		     
     xfpm_supply_refresh_tray_icon (supply);
-    
 }
 
 gboolean xfpm_supply_on_low_battery (XfpmSupply *supply)
@@ -484,6 +483,7 @@
     g_return_if_fail (XFPM_IS_SUPPLY (supply));
     
     g_object_unref (supply->priv->power);
+    
     g_hash_table_destroy (supply->priv->hash);
     
     supply->priv->power = hal_power_new ();

Modified: xfce4-power-manager/trunk/src/xfpm-tray-icon.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-tray-icon.c	2009-04-07 22:15:20 UTC (rev 7134)
+++ xfce4-power-manager/trunk/src/xfpm-tray-icon.c	2009-04-07 22:23:35 UTC (rev 7135)
@@ -62,6 +62,7 @@
     GQuark         icon_quark;
     gboolean       info_menu;
     gboolean       inhibited;
+    gulong         sig;
 };
 
 enum
@@ -383,8 +384,8 @@
     g_signal_connect (tray->priv->icon, "popup-menu",
 		      G_CALLBACK (xfpm_tray_icon_popup_menu_cb), tray);
 		      
-    g_signal_connect (tray->priv->inhibit, "has-inhibit-changed",
-		      G_CALLBACK (xfpm_tray_icon_inhibit_changed_cb), tray);
+    tray->priv->sig = g_signal_connect (tray->priv->inhibit, "has-inhibit-changed",
+					G_CALLBACK (xfpm_tray_icon_inhibit_changed_cb), tray);
 }
 
 static void
@@ -393,7 +394,10 @@
     XfpmTrayIcon *tray;
 
     tray = XFPM_TRAY_ICON(object);
-
+    
+    if ( g_signal_handler_is_connected (tray->priv->inhibit, tray->priv->sig ) )
+	g_signal_handler_disconnect (G_OBJECT (tray->priv->inhibit), tray->priv->sig);
+    
     g_object_unref (tray->priv->icon);
 	
     g_object_unref (tray->priv->shutdown);




More information about the Goodies-commits mailing list