From b0c48bbe79bf6e3d247d64090b444991cf943970 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Tue, 14 May 2019 22:55:09 +0000 Subject: [PATCH] kdecore: replace QThreadStorage with thread_local Signed-off-by: Ivailo Monev --- kdecore/io/kdebug.cpp | 1 - kdecore/services/kmimetypefactory.cpp | 13 +++-- kdecore/services/kservicefactory.cpp | 13 +++-- kdecore/services/kservicegroupfactory.cpp | 13 +++-- kdecore/services/kservicetypefactory.cpp | 13 +++-- kdecore/sycoca/kprotocolinfofactory.cpp | 13 +++-- kdecore/sycoca/ksycoca.h | 5 +- kdecore/sycoca/ksycocadict_p.h | 1 - kdecore/sycoca/ksycocafactory.h | 71 ++--------------------- 9 files changed, 46 insertions(+), 97 deletions(-) diff --git a/kdecore/io/kdebug.cpp b/kdecore/io/kdebug.cpp index 5c645353..24660d8b 100644 --- a/kdecore/io/kdebug.cpp +++ b/kdecore/io/kdebug.cpp @@ -52,7 +52,6 @@ #include #include #include -#include #include #include // abort diff --git a/kdecore/services/kmimetypefactory.cpp b/kdecore/services/kmimetypefactory.cpp index 0812fe46..c31d467f 100644 --- a/kdecore/services/kmimetypefactory.cpp +++ b/kdecore/services/kmimetypefactory.cpp @@ -24,23 +24,26 @@ extern int servicesDebugArea(); -K_GLOBAL_STATIC(KSycocaFactorySingleton, kMimeTypeFactoryInstance) +thread_local KMimeTypeFactory* kMimeTypeFactoryInstance = 0; KMimeTypeFactory::KMimeTypeFactory() : KSycocaFactory( KST_KMimeTypeFactory ) { - kMimeTypeFactoryInstance->instanceCreated(this); + kMimeTypeFactoryInstance = this; } KMimeTypeFactory::~KMimeTypeFactory() { - if (kMimeTypeFactoryInstance.exists()) - kMimeTypeFactoryInstance->instanceDestroyed(this); + if (kMimeTypeFactoryInstance) { + kMimeTypeFactoryInstance = 0; + } } KMimeTypeFactory * KMimeTypeFactory::self() { - return kMimeTypeFactoryInstance->self(); + if (!kMimeTypeFactoryInstance) + kMimeTypeFactoryInstance = new KMimeTypeFactory(); + return kMimeTypeFactoryInstance; } int KMimeTypeFactory::entryOffset(const QString& mimeTypeName) diff --git a/kdecore/services/kservicefactory.cpp b/kdecore/services/kservicefactory.cpp index dc3958de..b410237d 100644 --- a/kdecore/services/kservicefactory.cpp +++ b/kdecore/services/kservicefactory.cpp @@ -29,7 +29,7 @@ extern int servicesDebugArea(); -K_GLOBAL_STATIC(KSycocaFactorySingleton, kServiceFactoryInstance) +thread_local KServiceFactory* kServiceFactoryInstance = 0; KServiceFactory::KServiceFactory() : KSycocaFactory( KST_KServiceFactory ), @@ -37,7 +37,7 @@ KServiceFactory::KServiceFactory() m_relNameDict(0), m_menuIdDict(0) { - kServiceFactoryInstance->instanceCreated(this); + kServiceFactoryInstance = this; m_offerListOffset = 0; m_nameDictOffset = 0; m_relNameDictOffset = 0; @@ -71,8 +71,9 @@ KServiceFactory::KServiceFactory() KServiceFactory::~KServiceFactory() { - if (kServiceFactoryInstance.exists()) - kServiceFactoryInstance->instanceDestroyed(this); + if (kServiceFactoryInstance) { + kServiceFactoryInstance = 0; + } delete m_nameDict; delete m_relNameDict; delete m_menuIdDict; @@ -80,7 +81,9 @@ KServiceFactory::~KServiceFactory() KServiceFactory * KServiceFactory::self() { - return kServiceFactoryInstance->self(); + if (!kServiceFactoryInstance) + kServiceFactoryInstance = new KServiceFactory(); + return kServiceFactoryInstance; } KService::Ptr KServiceFactory::findServiceByName(const QString &_name) diff --git a/kdecore/services/kservicegroupfactory.cpp b/kdecore/services/kservicegroupfactory.cpp index 09915df1..4c075614 100644 --- a/kdecore/services/kservicegroupfactory.cpp +++ b/kdecore/services/kservicegroupfactory.cpp @@ -29,12 +29,12 @@ #include #include -K_GLOBAL_STATIC(KSycocaFactorySingleton, kServiceGroupFactoryInstance) +thread_local KServiceGroupFactory* kServiceGroupFactoryInstance = 0; KServiceGroupFactory::KServiceGroupFactory() : KSycocaFactory( KST_KServiceGroupFactory ) { - kServiceGroupFactoryInstance->instanceCreated(this); + kServiceGroupFactoryInstance = this; m_baseGroupDictOffset = 0; if (!KSycoca::self()->isBuilding()) { QDataStream* str = stream(); @@ -53,13 +53,16 @@ KServiceGroupFactory::KServiceGroupFactory() KServiceGroupFactory::~KServiceGroupFactory() { delete m_baseGroupDict; - if (kServiceGroupFactoryInstance.exists()) - kServiceGroupFactoryInstance->instanceDestroyed(this); + if (kServiceGroupFactoryInstance) { + kServiceGroupFactoryInstance = 0; + } } KServiceGroupFactory * KServiceGroupFactory::self() { - return kServiceGroupFactoryInstance->self(); + if (!kServiceGroupFactoryInstance) + kServiceGroupFactoryInstance = new KServiceGroupFactory(); + return kServiceGroupFactoryInstance; } KServiceGroup::Ptr KServiceGroupFactory::findGroupByDesktopPath(const QString &_name, bool deep) diff --git a/kdecore/services/kservicetypefactory.cpp b/kdecore/services/kservicetypefactory.cpp index 29ae6e53..0bc6e765 100644 --- a/kdecore/services/kservicetypefactory.cpp +++ b/kdecore/services/kservicetypefactory.cpp @@ -25,12 +25,12 @@ #include #include -K_GLOBAL_STATIC(KSycocaFactorySingleton, kServiceTypeFactoryInstance) +thread_local KServiceTypeFactory* kServiceTypeFactoryInstance = 0; KServiceTypeFactory::KServiceTypeFactory() : KSycocaFactory( KST_KServiceTypeFactory ) { - kServiceTypeFactoryInstance->instanceCreated(this); + kServiceTypeFactoryInstance = this; if (!KSycoca::self()->isBuilding()) { QDataStream* str = stream(); Q_ASSERT(str); @@ -56,13 +56,16 @@ KServiceTypeFactory::KServiceTypeFactory() KServiceTypeFactory::~KServiceTypeFactory() { KServiceTypeProfile::clearCache(); - if (kServiceTypeFactoryInstance.exists()) - kServiceTypeFactoryInstance->instanceDestroyed(this); + if (kServiceTypeFactoryInstance) { + kServiceTypeFactoryInstance = 0; + } } KServiceTypeFactory * KServiceTypeFactory::self() { - return kServiceTypeFactoryInstance->self(); + if (!kServiceTypeFactoryInstance) + kServiceTypeFactoryInstance = new KServiceTypeFactory(); + return kServiceTypeFactoryInstance; } KServiceType::Ptr KServiceTypeFactory::findServiceTypeByName(const QString &_name) diff --git a/kdecore/sycoca/kprotocolinfofactory.cpp b/kdecore/sycoca/kprotocolinfofactory.cpp index 812c86a8..f93282e4 100644 --- a/kdecore/sycoca/kprotocolinfofactory.cpp +++ b/kdecore/sycoca/kprotocolinfofactory.cpp @@ -24,17 +24,18 @@ #include #include -K_GLOBAL_STATIC(KSycocaFactorySingleton, kProtocolInfoFactoryInstance) +thread_local KProtocolInfoFactory* kProtocolInfoFactoryInstance = 0; KProtocolInfoFactory::KProtocolInfoFactory() : KSycocaFactory( KST_KProtocolInfoFactory ) { - kProtocolInfoFactoryInstance->instanceCreated(this); + kProtocolInfoFactoryInstance = this; } KProtocolInfoFactory::~KProtocolInfoFactory() { - if (kProtocolInfoFactoryInstance.exists()) - kProtocolInfoFactoryInstance->instanceDestroyed(this); + if (kProtocolInfoFactoryInstance) { + kProtocolInfoFactoryInstance = 0; + } } KProtocolInfo* @@ -109,5 +110,7 @@ KProtocolInfo::Ptr KProtocolInfoFactory::findProtocol(const QString &protocol) KProtocolInfoFactory* KProtocolInfoFactory::self() { - return kProtocolInfoFactoryInstance->self(); + if (!kProtocolInfoFactoryInstance) + kProtocolInfoFactoryInstance = new KProtocolInfoFactory(); + return kProtocolInfoFactoryInstance; } diff --git a/kdecore/sycoca/ksycoca.h b/kdecore/sycoca/ksycoca.h index 5bb9fdd5..6957ed55 100644 --- a/kdecore/sycoca/ksycoca.h +++ b/kdecore/sycoca/ksycoca.h @@ -22,13 +22,12 @@ #include #include +#include #include #include +#include -#include -class KSycocaFactory; -class KSycocaFactoryList; class KSycocaPrivate; /** diff --git a/kdecore/sycoca/ksycocadict_p.h b/kdecore/sycoca/ksycocadict_p.h index 6a1610a2..02cec627 100644 --- a/kdecore/sycoca/ksycocadict_p.h +++ b/kdecore/sycoca/ksycocadict_p.h @@ -23,7 +23,6 @@ #include "ksycocaentry.h" #include - #include #include diff --git a/kdecore/sycoca/ksycocafactory.h b/kdecore/sycoca/ksycocafactory.h index 48928c9a..96591e7b 100644 --- a/kdecore/sycoca/ksycocafactory.h +++ b/kdecore/sycoca/ksycocafactory.h @@ -22,11 +22,12 @@ #include #include -class KSycocaDict; -class KSycocaResourceList; #include #include +class KSycocaDict; +class KSycocaResourceList; + typedef QHash KSycocaEntryDict; /** @@ -134,70 +135,6 @@ private: class Private; Private* const d; }; - -/** - * This, instead of a typedef, allows to declare "class ..." in header files. - * @internal - */ -class KDECORE_EXPORT KSycocaFactoryList : public QList //krazy:exclude=dpointer (acts as a typedef) -{ -public: - KSycocaFactoryList() { } -}; - -#include -/** - * Workaround for the lack of QThreadStorage::setAutoDelete(false). - * Container for KSycocaFactory that doesn't delete it when it is deleted. - */ -template class KSycocaFactoryContainer -{ -public: - KSycocaFactoryContainer(F* factory) : m_factory(factory) {} - F* factory() { return m_factory; } -private: - F* m_factory; -}; - -/** - * Template for making it easier to define a threadsafe singleton - * for each factory, with support for kbuildsycoca providing a - * subclass of the factory. - * - * @since 4.3 - * @internal - */ -template class KSycocaFactorySingleton -{ -public: - typedef KSycocaFactoryContainer C; - KSycocaFactorySingleton() { - } - ~KSycocaFactorySingleton() { - // Do not delete the factory here. - // All factories are owned by KSycoca, and deleted by it. - } - void instanceCreated(F* newFactory) { - // This can also register a subclass created by kbuildsycoca - Q_ASSERT(!m_factories.hasLocalData()); - Q_ASSERT(newFactory); - m_factories.setLocalData(new C(newFactory)); - } - void instanceDestroyed(F* factory) { - if (m_factories.hasLocalData()) { // could be false on thread exit - Q_ASSERT(m_factories.localData()->factory() == factory); Q_UNUSED(factory) - m_factories.setLocalData(0); - } - } - F* self() { - if (!m_factories.hasLocalData()) { - new F; // calls instanceCreated, which calls setLocalData - Q_ASSERT(m_factories.hasLocalData()); - } - return m_factories.localData()->factory(); - } -private: - QThreadStorage m_factories; -}; +typedef QList KSycocaFactoryList; #endif