[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