Patch for crash on closing

Boudewijn Rempt boud at valdyas.org
Fri Oct 23 10:41:42 CEST 2009


On Friday 23 October 2009, Cyrille Berger wrote:
> Hi,
> 
> On Friday 23 October 2009, Sven Langkamp wrote:
> > Can you have a look at it?
> 
> I disagree with the removal of the Q_ASSERT(!d->ownedByRegistry);
> It's there for a reason. So we can either add an other boolean, replaced
> ownedByRegistry by an enum or use a permanent color space in the cache,
>  which would remove the need to call colorSpaceIsDestroyed.
> 

I've got the following variant:

diff --git a/libs/pigment/KoColorSpace.cpp b/libs/pigment/KoColorSpace.cpp
index c8a33ab..670be3a 100644
--- a/libs/pigment/KoColorSpace.cpp
+++ b/libs/pigment/KoColorSpace.cpp
 -56,19 +56,23 @@ KoColorSpace::KoColorSpace(const QString &id, const QString 
&name, KoMixColorsOp
     d->transfoFromRGBA16 = 0;
     d->transfoToLABA16 = 0;
     d->transfoFromLABA16 = 0;
+    d->deletability = NotOwnedByRegistry;
 }
 
 KoColorSpace::~KoColorSpace()
 {
-    Q_ASSERT(!d->ownedByRegistry);
+    Q_ASSERT(d->deletability != OwnedByRegistryDoNotDelete);
+
     qDeleteAll(d->compositeOps);
     foreach(KoChannelInfo * channel, d->channels)
     {
         delete channel;
     }
-    KoColorConversionCache* cache = KoColorSpaceRegistry::instance()-
>colorConversionCache();
-    if (cache) {
-        cache->colorSpaceIsDestroyed(this);
+    if (d->deletability == NotOwnedByRegistry) {
+        KoColorConversionCache* cache = KoColorSpaceRegistry::instance()-
>colorConversionCache();
+        if (cache) {
+            cache->colorSpaceIsDestroyed(this);
+        }
     }
     delete d->mixColorsOp;
     delete d->convolutionOp;
diff --git a/libs/pigment/KoColorSpace.h b/libs/pigment/KoColorSpace.h
index a1d0c4d..b4d357c 100644
--- a/libs/pigment/KoColorSpace.h
+++ b/libs/pigment/KoColorSpace.h
 -42,6 +42,12 @@ class KoColorTransformation;
 class KoColorConversionTransformationFactory;
 class QBitArray;
 
+enum Deletability {
+    OwnedByRegistryDoNotDelete,
+    OwnedByRegistryRegistyDeletes,
+    NotOwnedByRegistry
+};
+
 enum ColorSpaceIndependence {
     FULLY_INDEPENDENT,
     TO_LAB16,
diff --git a/libs/pigment/KoColorSpaceRegistry.cpp 
b/libs/pigment/KoColorSpaceRegistry.cpp
index 7cdf69f..349bf5a 100644
--- a/libs/pigment/KoColorSpaceRegistry.cpp
+++ b/libs/pigment/KoColorSpaceRegistry.cpp
 -137,7 +137,7 @@ void KoColorSpaceRegistry::init()
 
     // Create the built-in colorspaces
     d->alphaCs = new KoAlphaColorSpace();
-    d->alphaCs->d->ownedByRegistry = true;
+    d->alphaCs->d->deletability = OwnedByRegistryDoNotDelete;
 
     KoPluginLoader::PluginsConfig config;
     config.whiteList = "ColorSpacePlugins";
 -160,7 +160,6 @@ KoColorSpaceRegistry::KoColorSpaceRegistry() : d(new 
Private())
 
 KoColorSpaceRegistry::~KoColorSpaceRegistry()
 {
-    d->alphaCs->d->ownedByRegistry = false;
 
     delete d->colorConversionSystem;
     foreach( KoColorProfile* profile, d->profileMap) {
 -168,7 +167,7 @@ KoColorSpaceRegistry::~KoColorSpaceRegistry()
     }
     d->profileMap.clear();
     foreach( const KoColorSpace * cs, d->csMap) {
-        cs->d->ownedByRegistry = false;
+        cs->d->deletability = OwnedByRegistryRegistyDeletes;
         delete cs;
     }
     d->csMap.clear();
 -176,6 +175,7 @@ KoColorSpaceRegistry::~KoColorSpaceRegistry()
     delete d->colorConversionCache;
     d->colorConversionCache = 0;
 
+    d->alphaCs->d->deletability = OwnedByRegistryRegistyDeletes;
     delete d->alphaCs;
     // Do not explicitly delete d->rgbU8sRGB and d->lab16sLAB, since they are 
contained in the d->csMap
     delete d;
 -319,7 +319,7 @@ const KoColorSpace * KoColorSpaceRegistry::colorSpace(const 
QString &csID, const
         }
 
         d->csMap[name] = cs;
-        cs->d->ownedByRegistry = true;
+        cs->d->deletability = OwnedByRegistryDoNotDelete;
         dbgPigmentCSRegistry << "colorspace count: " << d->csMap.count() << 
", adding name: " << name;
     }
 
 -361,7 +361,7 @@ const KoColorSpace * KoColorSpaceRegistry::colorSpace(const 
QString &csID, const
 
             QString name = csID + "<comb>" + profile->name();
             d->csMap[name] = cs;
-            cs->d->ownedByRegistry = true;
+            cs->d->deletability = OwnedByRegistryDoNotDelete;
             dbgPigmentCSRegistry << "colorspace count: " << d->csMap.count() 
<< ", adding name: " << name;
         }
 
 -508,7 +508,7 @@ KoColorConversionCache* 
KoColorSpaceRegistry::colorConversionCache() const
 
 const KoColorSpace* KoColorSpaceRegistry::permanentColorspace( const 
KoColorSpace* _colorSpace )
 {
-    if(_colorSpace->d->ownedByRegistry) return _colorSpace;
+    if(_colorSpace->d->deletability != NotOwnedByRegistry) return 
_colorSpace;
     else if(*_colorSpace == *d->alphaCs) return d->alphaCs;
     else {
         const KoColorSpace* cs = colorSpace(_colorSpace->id(), _colorSpace-
>profile());
diff --git a/libs/pigment/KoColorSpace_p.h b/libs/pigment/KoColorSpace_p.h
index 2491ef9..3c58c79 100644
--- a/libs/pigment/KoColorSpace_p.h
+++ b/libs/pigment/KoColorSpace_p.h
 -23,8 +23,6 @@
 #include "KoColorSpace.h"
 
 struct KoColorSpace::Private {
-    Private() : ownedByRegistry(false)
-    {}
 
     QString id;
     quint32 idNumber;
 -35,13 +33,12 @@ struct KoColorSpace::Private {
     KoConvolutionOp* convolutionOp;
     QThreadStorage< QVector<quint8>* > conversionCache;
 
-
     mutable KoColorConversionTransformation* transfoToRGBA16;
     mutable KoColorConversionTransformation* transfoFromRGBA16;
     mutable KoColorConversionTransformation* transfoToLABA16;
     mutable KoColorConversionTransformation* transfoFromLABA16;
 
-    bool ownedByRegistry;
+    Deletability deletability;
 };
 
 #endif

-- 
Boudewijn Rempt | http://www.valdyas.org


More information about the kimageshop mailing list