[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kdelibs/KDE/4.10] solid/solid/backends/upower: prevent crashes on suspend/resume when the battery v
From: Lukáš Tinkl <lukas () kde ! org>
Date: 2012-11-27 18:48:52
Message-ID: 20121127184852.06FF7A6091 () git ! kde ! org
[Download RAW message or body]
Git commit fb102411c4517cb9e62071ee92c6757d69ba3815 by Lukáš Tinkl.
Committed on 27/11/2012 at 19:47.
Pushed by lukas into branch 'KDE/4.10'.
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/fb102411c4517cb9e62071ee92c6757d69ba3815
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