[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdelibs/KDE/4.9] solid/solid/backends/upower: prevent crashes on suspend/resume when the battery va
From:       Lukáš Tinkl <lukas () kde ! org>
Date:       2012-11-27 18:49:29
Message-ID: 20121127184929.5DD56A6091 () git ! kde ! org
[Download RAW message or body]

Git commit 44adb502ff0b78cdf90a49d0b6ba2f027bd6d3a7 by Lukáš Tinkl.
Committed on 27/11/2012 at 19:47.
Pushed by lukas into branch 'KDE/4.9'.

prevent crashes on suspend/resume when the battery vanishes

by guarding the m_device pointer with QWeakPointer

BUG: 288410
FIXED-IN: 4.9.4

M  +10   -6    solid/solid/backends/upower/upoweracadapter.cpp
M  +27   -26   solid/solid/backends/upower/upowerbattery.cpp
M  +2    -1    solid/solid/backends/upower/upowerdeviceinterface.h
M  +3    -3    solid/solid/backends/upower/upowergenericinterface.cpp

http://commits.kde.org/kdelibs/44adb502ff0b78cdf90a49d0b6ba2f027bd6d3a7

diff --git a/solid/solid/backends/upower/upoweracadapter.cpp \
b/solid/solid/backends/upower/upoweracadapter.cpp index 46cf70c..aa9296b 100644
--- a/solid/solid/backends/upower/upoweracadapter.cpp
+++ b/solid/solid/backends/upower/upoweracadapter.cpp
@@ -37,17 +37,21 @@ AcAdapter::~AcAdapter()
 
 bool AcAdapter::isPlugged() const
 {
-    return m_device->prop("Online").toBool();
+    return m_device.data()->prop("Online").toBool();
 }
 
 void AcAdapter::slotChanged()
 {
-    const bool old_isPlugged = m_isPlugged;
-    updateCache();
+    QSharedPointer<UPowerDevice> strong = m_device.toStrongRef();
+
+    if (strong) {
+        const bool old_isPlugged = m_isPlugged;
+        updateCache();
 
-    if (old_isPlugged != m_isPlugged)
-    {
-        emit plugStateChanged(m_isPlugged, m_device->udi());
+        if (old_isPlugged != m_isPlugged)
+        {
+            emit plugStateChanged(m_isPlugged, m_device.data()->udi());
+        }
     }
 }
 
diff --git a/solid/solid/backends/upower/upowerbattery.cpp \
b/solid/solid/backends/upower/upowerbattery.cpp index ab555d4..55948e0 100644
--- a/solid/solid/backends/upower/upowerbattery.cpp
+++ b/solid/solid/backends/upower/upowerbattery.cpp
@@ -37,13 +37,13 @@ Battery::~Battery()
 
 bool Battery::isPlugged() const
 {
-    return m_device->prop("IsPresent").toBool();
+    return m_device.data()->prop("IsPresent").toBool();
 }
 
 Solid::Battery::BatteryType Battery::type() const
 {
     Solid::Battery::BatteryType result = Solid::Battery::UnknownBattery;
-    const uint t = m_device->prop("Type").toUInt();
+    const uint t = m_device.data()->prop("Type").toUInt();
     switch (t)
     {
         case 1: // TODO "Line Power"
@@ -75,18 +75,18 @@ Solid::Battery::BatteryType Battery::type() const
 
 int Battery::chargePercent() const
 {
-    return qRound(m_device->prop("Percentage").toDouble());
+    return qRound(m_device.data()->prop("Percentage").toDouble());
 }
 
 bool Battery::isRechargeable() const
 {
-    return m_device->prop("IsRechargeable").toBool();
+    return m_device.data()->prop("IsRechargeable").toBool();
 }
 
 Solid::Battery::ChargeState Battery::chargeState() const
 {
     Solid::Battery::ChargeState result = Solid::Battery::NoCharge;
-    const uint state = m_device->prop("State").toUInt();
+    const uint state = m_device.data()->prop("State").toUInt();
     switch (state)
     {
         case 0:
@@ -112,27 +112,28 @@ Solid::Battery::ChargeState Battery::chargeState() const
 
 void Battery::slotChanged()
 {
-    if (!m_device)
-        return;
-
-    const bool old_isPlugged = m_isPlugged;
-    const int old_chargePercent = m_chargePercent;
-    const Solid::Battery::ChargeState old_chargeState = m_chargeState;
-    updateCache();
-
-    if (old_chargePercent != m_chargePercent)
-    {
-        emit chargePercentChanged(m_chargePercent, m_device->udi());
-    }
-
-    if (old_chargeState != m_chargeState)
-    {
-        emit chargeStateChanged(m_chargeState, m_device->udi());
-    }
-
-    if (old_isPlugged != m_isPlugged)
-    {
-        emit plugStateChanged(m_isPlugged, m_device->udi());
+    QSharedPointer<UPowerDevice> strong = m_device.toStrongRef();
+
+    if (strong) {
+        const bool old_isPlugged = m_isPlugged;
+        const int old_chargePercent = m_chargePercent;
+        const Solid::Battery::ChargeState old_chargeState = m_chargeState;
+        updateCache();
+
+        if (old_chargePercent != m_chargePercent)
+        {
+            emit chargePercentChanged(m_chargePercent, m_device.data()->udi());
+        }
+
+        if (old_chargeState != m_chargeState)
+        {
+            emit chargeStateChanged(m_chargeState, m_device.data()->udi());
+        }
+
+        if (old_isPlugged != m_isPlugged)
+        {
+            emit plugStateChanged(m_isPlugged, m_device.data()->udi());
+        }
     }
 }
 
diff --git a/solid/solid/backends/upower/upowerdeviceinterface.h \
b/solid/solid/backends/upower/upowerdeviceinterface.h index 721bb07..f8270cf 100644
--- a/solid/solid/backends/upower/upowerdeviceinterface.h
+++ b/solid/solid/backends/upower/upowerdeviceinterface.h
@@ -27,6 +27,7 @@
 
 #include <QtCore/QObject>
 #include <QtCore/QStringList>
+#include <QtCore/QWeakPointer>
 
 namespace Solid
 {
@@ -44,7 +45,7 @@ public:
     virtual ~DeviceInterface();
 
 protected:
-    UPowerDevice *m_device;
+    QWeakPointer<UPowerDevice> m_device;
 
 public:
     inline static QStringList toStringList(Solid::DeviceInterface::Type type)
diff --git a/solid/solid/backends/upower/upowergenericinterface.cpp \
b/solid/solid/backends/upower/upowergenericinterface.cpp index 5c4c8c4..217f34b \
                100644
--- a/solid/solid/backends/upower/upowergenericinterface.cpp
+++ b/solid/solid/backends/upower/upowergenericinterface.cpp
@@ -35,17 +35,17 @@ GenericInterface::~GenericInterface()
 
 QVariant GenericInterface::property(const QString &key) const
 {
-    return m_device->prop(key);
+    return m_device.data()->prop(key);
 }
 
 QMap<QString, QVariant> GenericInterface::allProperties() const
 {
-    return m_device->allProperties();
+    return m_device.data()->allProperties();
 }
 
 bool GenericInterface::propertyExists(const QString &key) const
 {
-    return m_device->propertyExists(key);
+    return m_device.data()->propertyExists(key);
 }
 
 #include "backends/upower/upowergenericinterface.moc"


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic