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

List:       kde-commits
Subject:    KDE/kdelibs/solid
From:       Kevin Ottens <ervin () kde ! org>
Date:       2010-03-06 16:00:50
Message-ID: 1267891250.834184.327.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1100029 by ervin:

Have one DeviceManager per thread, isolation provided by QThreadStorage.


 M  +30 -6     solid/devicemanager.cpp  
 M  +15 -0     solid/devicemanager_p.h  
 M  +14 -0     tests/solidmttest.cpp  


--- trunk/KDE/kdelibs/solid/solid/devicemanager.cpp #1100028:1100029
@@ -29,7 +29,7 @@
 
 #include "soliddefs_p.h"
 
-SOLID_GLOBAL_STATIC(Solid::DeviceManagerPrivate, globalDeviceManager)
+SOLID_GLOBAL_STATIC(Solid::DeviceManagerStorage, globalDeviceStorage)
 
 Solid::DeviceManagerPrivate::DeviceManagerPrivate()
     : m_nullDevice(new DevicePrivate(QString()))
@@ -62,7 +62,7 @@
 QList<Solid::Device> Solid::Device::allDevices()
 {
     QList<Device> list;
-    QList<QObject*> backends = globalDeviceManager->managerBackends();
+    QList<QObject*> backends = globalDeviceStorage->managerBackends();
 
     foreach (QObject *backendObj, backends) {
         Ifaces::DeviceManager *backend = qobject_cast<Ifaces::DeviceManager \
*>(backendObj); @@ -98,7 +98,7 @@
                                                  const QString &parentUdi)
 {
     QList<Device> list;
-    QList<QObject*> backends = globalDeviceManager->managerBackends();
+    QList<QObject*> backends = globalDeviceStorage->managerBackends();
 
     foreach (QObject *backendObj, backends) {
         Ifaces::DeviceManager *backend = qobject_cast<Ifaces::DeviceManager \
*>(backendObj); @@ -120,7 +120,7 @@
                                                   const QString &parentUdi)
 {
     QList<Device> list;
-    QList<QObject*> backends = globalDeviceManager->managerBackends();
+    QList<QObject*> backends = globalDeviceStorage->managerBackends();
     QSet<DeviceInterface::Type> usedTypes = predicate.usedTypes();
 
     foreach (QObject *backendObj, backends) {
@@ -166,7 +166,7 @@
 
 Solid::DeviceNotifier *Solid::DeviceNotifier::instance()
 {
-    return globalDeviceManager;
+    return globalDeviceStorage->notifier();
 }
 
 void Solid::DeviceManagerPrivate::_k_deviceAdded(const QString &udi)
@@ -238,7 +238,7 @@
 
 Solid::Ifaces::Device *Solid::DeviceManagerPrivate::createBackendObject(const \
QString &udi)  {
-    QList<QObject*> backends = globalDeviceManager->managerBackends();
+    QList<QObject*> backends = globalDeviceStorage->managerBackends();
 
     foreach (QObject *backendObj, backends) {
         Ifaces::DeviceManager *backend = qobject_cast<Ifaces::DeviceManager \
*>(backendObj); @@ -261,6 +261,30 @@
     return 0;
 }
 
+Solid::DeviceManagerStorage::DeviceManagerStorage()
+{
+
+}
+
+QList<QObject*> Solid::DeviceManagerStorage::managerBackends()
+{
+    ensureManagerCreated();
+    return m_storage.localData()->managerBackends();
+}
+
+Solid::DeviceNotifier *Solid::DeviceManagerStorage::notifier()
+{
+    ensureManagerCreated();
+    return m_storage.localData();
+}
+
+void Solid::DeviceManagerStorage::ensureManagerCreated()
+{
+    if (!m_storage.hasLocalData()) {
+        m_storage.setLocalData(new DeviceManagerPrivate());
+    }
+}
+
 #include "devicenotifier.moc"
 #include "devicemanager_p.moc"
 
--- trunk/KDE/kdelibs/solid/solid/devicemanager_p.h #1100028:1100029
@@ -27,6 +27,7 @@
 #include <QtCore/QMap>
 #include <QtCore/QWeakPointer>
 #include <QtCore/QSharedData>
+#include <QtCore/QThreadStorage>
 
 namespace Solid
 {
@@ -58,6 +59,20 @@
         QMap<QString, QWeakPointer<DevicePrivate> > m_devicesMap;
         QMap<QObject *, QString> m_reverseMap;
     };
+
+    class DeviceManagerStorage
+    {
+    public:
+        DeviceManagerStorage();
+
+        QList<QObject*> managerBackends();
+        DeviceNotifier *notifier();
+
+    private:
+        void ensureManagerCreated();
+
+        QThreadStorage<DeviceManagerPrivate*> m_storage;
+    };
 }
 
 
--- trunk/KDE/kdelibs/solid/tests/solidmttest.cpp #1100028:1100029
@@ -27,6 +27,8 @@
 #include <solid/device.h>
 #include <solid/predicate.h>
 #include <solid/storagevolume.h>
+#include <solid/storagedrive.h>
+#include <solid/genericinterface.h>
 
 
 class SolidMtTest : public QObject
@@ -44,6 +46,11 @@
     virtual void run()
     {
         Solid::Device dev("/org/freedesktop/Hal/devices/computer");
+
+        QList<Solid::Device> driveList = \
Solid::Device::listFromType(Solid::DeviceInterface::StorageDrive); +        foreach \
(const Solid::Device &solidDevice, driveList) { +            const \
Solid::StorageDrive* solidDrive = solidDevice.as<Solid::StorageDrive>(); +        }
     }
 };
 
@@ -65,9 +72,16 @@
 void SolidMtTest::testWorkerThread()
 {
     Solid::Device dev("/org/freedesktop/Hal/devices/acpi_ADP1");
+
     WorkerThread *wt = new WorkerThread;
     wt->start();
     wt->wait();
+
+    const QList<Solid::Device> driveList = \
Solid::Device::listFromType(Solid::DeviceInterface::StorageDrive); +    foreach \
(const Solid::Device &solidDevice, driveList) { +        const \
Solid::GenericInterface* solidDrive = solidDevice.as<Solid::GenericInterface>(); +    \
} +
     delete wt;
 }
 


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

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