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

List:       kde-commits
Subject:    KDE/kdelibs/solid/solid/backends/hal
From:       Aaron J. Seigo <aseigo () kde ! org>
Date:       2009-11-25 20:44:22
Message-ID: 1259181862.143296.1346.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1054295 by aseigo:

if a property changes, don't invalidate the whole cache until we actually care about \
that item. this allows us to keep the cache hot when something irrelevant (to us) is \
changing behind our backs, resulting in even fewer dbus trips in those situations \
CCMAIL:kde-hardware-devel@kde.org


 M  +39 -18    haldevice.cpp  


--- trunk/KDE/kdelibs/solid/solid/backends/hal/haldevice.cpp #1054294:1054295
@@ -105,10 +105,12 @@
                   "org.freedesktop.Hal.Device",
                   QDBusConnection::systemBus()),
           cacheSynced(false), parent(0) { }
+    void checkCache(const QString &key = QString());
 
     QDBusInterface device;
     QMap<QString,QVariant> cache;
     QMap<Solid::DeviceInterface::Type, bool> capListCache;
+    QSet<QString> invalidKeys;
 
     bool cacheSynced;
     HalDevice *parent;
@@ -348,33 +350,47 @@
 
 QVariant HalDevice::property(const QString &key) const
 {
-    return allProperties().value(key);
+    d->checkCache(key);
+    return d->cache.value(key);
 }
 
-QMap<QString, QVariant> HalDevice::allProperties() const
+void HalDevicePrivate::checkCache(const QString &key)
 {
-    if (!d->cacheSynced)
-    {
-        QDBusReply<QVariantMap> reply = d->device.call("GetAllProperties");
-
-        if (reply.isValid()) {
-            d->cache = reply;
-        } else {
-            qWarning() << Q_FUNC_INFO << " error: " << reply.error().name()
-                << ", " << reply.error().message() << endl;
-            d->cache = QVariantMap();
+    if (cacheSynced) {
+        if (key.isEmpty()) {
+            if (invalidKeys.isEmpty()) {
+                return;
+            }
+        } else if (!invalidKeys.contains(key)) {
+            return;
         }
+    }
 
-        d->cacheSynced = true;
-        //qDebug( )<< this << udi() << "failure";
+    QDBusReply<QVariantMap> reply = device.call("GetAllProperties");
+
+    if (reply.isValid()) {
+        cache = reply;
+    } else {
+        qWarning() << Q_FUNC_INFO << " error: " << reply.error().name()
+            << ", " << reply.error().message() << endl;
+        cache = QVariantMap();
     }
 
+    invalidKeys.clear();
+    cacheSynced = true;
+    //qDebug( )<< q << udi() << "failure";
+}
+
+QMap<QString, QVariant> HalDevice::allProperties() const
+{
+    d->checkCache();
     return d->cache;
 }
 
 bool HalDevice::propertyExists(const QString &key) const
 {
-    return allProperties().value(key).isValid();
+    d->checkCache(key);
+    return d->cache.value(key).isValid();
 }
 
 bool HalDevice::queryDeviceInterface(const Solid::DeviceInterface::Type &type) const
@@ -506,12 +522,17 @@
         }
 
         result[key] = type;
+        d->cache.remove(key);
+
+        if (d->cache.isEmpty()) {
+            d->cacheSynced = false;
+            d->invalidKeys.clear();
+        } else {
+            d->invalidKeys.insert(key);
+        }
     }
 
-    d->cache.clear();
     //qDebug() << this << "unsyncing the cache";
-    d->cacheSynced = false;
-
     emit propertyChanged(result);
 }
 


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

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