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

List:       kde-commits
Subject:    koffice/libs/pigment
From:       Cyrille Berger <cyb () lepi ! org>
Date:       2010-06-14 14:43:23
Message-ID: 20100614144323.D0FF4AC8D3 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1137873 by berger:

make a few functions const, but more important make the registry thread-safe


 M  +5 -0      KoColorSpaceFactory.cpp  
 M  +32 -4     KoColorSpaceRegistry.cpp  
 M  +4 -4      KoColorSpaceRegistry.h  


--- trunk/koffice/libs/pigment/KoColorSpaceFactory.cpp #1137872:1137873
@@ -21,6 +21,8 @@
 
 #include "DebugPigment.h"
 
+#include <QMutexLocker>
+
 #include "KoColorProfile.h"
 #include "KoColorSpace.h"
 #include "KoColorSpaceRegistry.h"
@@ -29,6 +31,7 @@
     QList<KoColorProfile*> colorprofiles;
     QList<KoColorSpace*> colorspaces;
     QHash<QString, QList<KoColorSpace*> > availableColorspaces;
+    QMutex mutex;
 #ifndef NDEBUG
     QHash<KoColorSpace*, QString> stackInformation;
 #endif
@@ -85,6 +88,7 @@
 
 KoColorSpace* KoColorSpaceFactory::grabColorSpace(const KoColorProfile * profile)
 {
+    QMutexLocker l(&d->mutex);
     Q_ASSERT(profile);
     QList<KoColorSpace*>& csList = d->availableColorspaces[profile->name()];
     if (!csList.isEmpty()) {
@@ -103,6 +107,7 @@
 
 void KoColorSpaceFactory::releaseColorSpace(KoColorSpace * colorspace)
 {
+    QMutexLocker l(&d->mutex);
     // TODO it is probably worth to avoid caching too many color spaces
     const KoColorProfile* profile = colorspace->profile();
     Q_ASSERT(d->colorspaces.contains(colorspace));
--- trunk/koffice/libs/pigment/KoColorSpaceRegistry.cpp #1137872:1137873
@@ -58,6 +58,7 @@
     KoColorConversionCache* colorConversionCache;
     const KoColorSpace *rgbU8sRGB;
     const KoColorSpace *lab16sLAB;
+    QReadWriteLock registrylock;
 };
 
 KoColorSpaceRegistry* KoColorSpaceRegistry::instance()
@@ -140,12 +141,16 @@
 
 void KoColorSpaceRegistry::add(KoColorSpaceFactory* item)
 {
+    {
+        QWriteLocker l(&d->registrylock);
     d->colorsSpaceFactoryRegistry.add(item);
+    }
     d->colorConversionSystem->insertColorSpace(item);
 }
 
 void KoColorSpaceRegistry::remove(KoColorSpaceFactory* item)
 {
+    QWriteLocker l(&d->registrylock);
     QList<QString> toremove;
     foreach(const KoColorSpace * cs, d->csMap) {
         if (cs->id() == item->id()) {
@@ -162,6 +167,7 @@
 
 const KoColorProfile *  KoColorSpaceRegistry::profileByName(const QString & name) \
const  {
+    QReadLocker l(&d->registrylock);
     if (d->profileMap.find(name) == d->profileMap.end()) {
         return 0;
     }
@@ -169,7 +175,7 @@
     return d->profileMap[name];
 }
 
-QList<const KoColorProfile *>  KoColorSpaceRegistry::profilesFor(const QString &id)
+QList<const KoColorProfile *>  KoColorSpaceRegistry::profilesFor(const QString &id) \
const  {
     return profilesFor(d->colorsSpaceFactoryRegistry.value(id));
 }
@@ -189,8 +195,9 @@
     return colorSpace(colorSpaceId(colorModelId, colorDepthId), profileName);
 }
 
-QList<const KoColorProfile *>  KoColorSpaceRegistry::profilesFor(const \
KoColorSpaceFactory * csf) +QList<const KoColorProfile *>  \
KoColorSpaceRegistry::profilesFor(const KoColorSpaceFactory * csf) const  {
+    QReadLocker l(&d->registrylock);
     QList<const KoColorProfile *>  profiles;
     if (csf == 0)
         return profiles;
@@ -207,8 +214,9 @@
     return profiles;
 }
 
-QList<const KoColorSpaceFactory*> KoColorSpaceRegistry::colorSpacesFor(const \
KoColorProfile* _profile) +QList<const KoColorSpaceFactory*> \
KoColorSpaceRegistry::colorSpacesFor(const KoColorProfile* _profile) const  {
+    QReadLocker l(&d->registrylock);
     QList<const KoColorSpaceFactory*> csfs;
     foreach(KoColorSpaceFactory* csf, d->colorsSpaceFactoryRegistry.values()) {
         if (csf->profileIsCompatible(_profile)) {
@@ -218,7 +226,7 @@
     return csfs;
 }
 
-QList<const KoColorProfile *>  KoColorSpaceRegistry::profilesFor(const KoID& id)
+QList<const KoColorProfile *>  KoColorSpaceRegistry::profilesFor(const KoID& id) \
const  {
     return profilesFor(id.id());
 }
@@ -262,6 +270,7 @@
 
 KoColorSpace* KoColorSpaceRegistry::grabColorSpace(const KoColorSpace* colorSpace)
 {
+    QReadLocker l(&d->registrylock);
     if(d->colorsSpaceFactoryRegistry.contains(colorSpace->id()))
     {
         KoColorSpace* cs = \
d->colorsSpaceFactoryRegistry.value(colorSpace->id())->grabColorSpace(colorSpace->profile());
 @@ -273,6 +282,7 @@
 
 void KoColorSpaceRegistry::releaseColorSpace(KoColorSpace* colorSpace)
 {
+    QReadLocker l(&d->registrylock);
     if(d->colorsSpaceFactoryRegistry.contains(colorSpace->id()))
     {
         d->colorsSpaceFactoryRegistry.value(colorSpace->id())->releaseColorSpace(colorSpace);
 @@ -281,6 +291,7 @@
 
 const KoColorSpaceFactory* KoColorSpaceRegistry::colorSpaceFactory(const QString \
&colorSpaceId) const  {
+    QReadLocker l(&d->registrylock);
     return d->colorsSpaceFactoryRegistry.get(colorSpaceId);
 }
 
@@ -289,6 +300,7 @@
     QString profileName = pName;
 
     if (profileName.isEmpty()) {
+        QReadLocker l(&d->registrylock);
         KoColorSpaceFactory *csf = d->colorsSpaceFactoryRegistry.value(csID);
 
         if (!csf) {
@@ -302,7 +314,9 @@
     QString name = idsToCacheName(csID, profileName);
 
     if (!isCached(csID, profileName)) {
+        d->registrylock.lockForRead();
         KoColorSpaceFactory *csf = d->colorsSpaceFactoryRegistry.value(csID);
+        d->registrylock.unlock();
         if (!csf) {
             dbgPigmentCSRegistry << "Unknown color space type :" << csf;
             return 0;
@@ -332,10 +346,12 @@
             return 0;
         }
 
+        QWriteLocker l(&d->registrylock);
         d->csMap[name] = cs;
         cs->d->deletability = OwnedByRegistryDoNotDelete;
         dbgPigmentCSRegistry << "colorspace count: " << d->csMap.count() << ", \
adding name: " << name;  }
+    QReadLocker l(&d->registrylock);
 
     if (d->csMap.contains(name))
         return d->csMap[name];
@@ -358,7 +374,9 @@
 
         if (!cs) {
             // The profile was not stored and thus not the combination either
+            d->registrylock.lockForRead();
             KoColorSpaceFactory *csf = d->colorsSpaceFactoryRegistry.value(csID);
+            d->registrylock.unlock();
             if (!csf) {
                 dbgPigmentCSRegistry << "Unknown color space type :" << csf;
                 return 0;
@@ -371,6 +389,7 @@
             if (!cs)
                 return 0;
 
+            QWriteLocker l(&d->registrylock);
             QString name = csID + "<comb>" + profile->name();
             d->csMap[name] = cs;
             cs->d->deletability = OwnedByRegistryDoNotDelete;
@@ -447,6 +466,7 @@
 
 QList<KoID> KoColorSpaceRegistry::colorModelsList(ColorSpaceListVisibility option) \
const  {
+    QReadLocker l(&d->registrylock);
     QList<KoID> ids;
     QList<KoColorSpaceFactory*> factories = d->colorsSpaceFactoryRegistry.values();
     foreach(KoColorSpaceFactory* factory, factories) {
@@ -465,6 +485,7 @@
 
 QList<KoID> KoColorSpaceRegistry::colorDepthList(const QString & colorModelId, \
ColorSpaceListVisibility option) const  {
+    QReadLocker l(&d->registrylock);
     QList<KoID> ids;
     QList<KoColorSpaceFactory*> factories = d->colorsSpaceFactoryRegistry.values();
     foreach(KoColorSpaceFactory* factory, factories) {
@@ -479,6 +500,7 @@
 
 QString KoColorSpaceRegistry::colorSpaceId(const QString & colorModelId, const \
QString & colorDepthId) const  {
+    QReadLocker l(&d->registrylock);
     QList<KoColorSpaceFactory*> factories = d->colorsSpaceFactoryRegistry.values();
     foreach(KoColorSpaceFactory* factory, factories) {
         if (factory->colorModelId().id() == colorModelId && \
factory->colorDepthId().id() == colorDepthId) { @@ -495,6 +517,7 @@
 
 KoID KoColorSpaceRegistry::colorSpaceColorModelId(const QString & _colorSpaceId) \
const  {
+    QReadLocker l(&d->registrylock);
     KoColorSpaceFactory* factory = d->colorsSpaceFactoryRegistry.get(_colorSpaceId);
     if (factory) {
         return factory->colorModelId();
@@ -505,6 +528,7 @@
 
 KoID KoColorSpaceRegistry::colorSpaceColorDepthId(const QString & _colorSpaceId) \
const  {
+    QReadLocker l(&d->registrylock);
     KoColorSpaceFactory* factory = d->colorsSpaceFactoryRegistry.get(_colorSpaceId);
     if (factory) {
         return factory->colorDepthId();
@@ -539,6 +563,7 @@
 
 QList<KoID> KoColorSpaceRegistry::listKeys() const
 {
+    QReadLocker l(&d->registrylock);
     QList<KoID> answer;
     foreach(const QString key, d->colorsSpaceFactoryRegistry.keys()) {
         answer.append(KoID(key, d->colorsSpaceFactoryRegistry.get(key)->name()));
@@ -549,6 +574,7 @@
 
 const KoColorProfile* KoColorSpaceRegistry::createColorProfile(const QString& \
colorModelId, const QString& colorDepthId, const QByteArray& rawData)  {
+    QReadLocker l(&d->registrylock);
     KoColorSpaceFactory* factory_ = \
d->colorsSpaceFactoryRegistry.get(colorSpaceId(colorModelId, colorDepthId));  return \
factory_->colorProfile(rawData);  }
@@ -557,7 +583,9 @@
 {
     QList<const KoColorSpace*> colorSpaces;
 
+    d->registrylock.lockForRead();
     QList<KoColorSpaceFactory*> factories = d->colorsSpaceFactoryRegistry.values();
+    d->registrylock.unlock();
 
     foreach(KoColorSpaceFactory* factory, factories) {
         if (visibility == AllColorSpaces || factory->userVisible()) {
--- trunk/koffice/libs/pigment/KoColorSpaceRegistry.h #1137872:1137873
@@ -113,7 +113,7 @@
      * @param factory the factory with which all the returned profiles will work.
      * @return a list of profiles for the factory
      */
-    QList<const KoColorProfile *>  profilesFor(const KoColorSpaceFactory * factory);
+    QList<const KoColorProfile *>  profilesFor(const KoColorSpaceFactory * factory) \
const;  
     /**
      * Return the list of profiles for a colorspace with the argument id.
@@ -123,12 +123,12 @@
      * @param id the colorspace-id with which all the returned profiles will work.
      * @return a list of profiles for the factory
      */
-    QList<const KoColorProfile *>  profilesFor(const KoID& id);
+    QList<const KoColorProfile *>  profilesFor(const KoID& id) const;
 
     /**
      * @return a list of color spaces compatible with this profile
      */
-    QList<const KoColorSpaceFactory*> colorSpacesFor(const KoColorProfile* \
_profile); +    QList<const KoColorSpaceFactory*> colorSpacesFor(const \
KoColorProfile* _profile) const;  
     /**
      * Return the list of profiles for a colorspace with the argument id.
@@ -138,7 +138,7 @@
      * @param colorSpaceId the colorspace-id with which all the returned profiles \
                will work.
      * @return a list of profiles for the factory
      */
-    QList<const KoColorProfile *>  profilesFor(const QString &colorSpaceId);
+    QList<const KoColorProfile *>  profilesFor(const QString& id) const;
     const KoColorSpaceFactory* colorSpaceFactory(const QString &colorSpaceId) const;
 
     KoColorSpace* grabColorSpace(const KoColorSpace*);


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

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