[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