Index: kdecore/localization/klocale_p.h =================================================================== --- kdecore/localization/klocale_p.h (Revision 0) +++ kdecore/localization/klocale_p.h (Revision 1032185) @@ -0,0 +1,10 @@ +#ifndef KLOCALE_P_H +#define KLOCALE_P_H + +class QMutex; + +// Used by both KLocale and KLocalizedString, since they call each other. +QMutex* kLocaleMutex(); + +#endif /* KLOCALE_P_H */ + Index: kdecore/localization/klocalizedstring.cpp =================================================================== --- kdecore/localization/klocalizedstring.cpp (Revision 1032184) +++ kdecore/localization/klocalizedstring.cpp (Revision 1032185) @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -126,8 +127,6 @@ QHash formatters; - QMutex mutex; - KLocalizedStringPrivateStatics () : theFence("|/|"), startInterp("$["), @@ -144,9 +143,7 @@ translits(), - formatters(), - - mutex(QMutex::Recursive) + formatters() {} ~KLocalizedStringPrivateStatics () @@ -216,7 +213,7 @@ QString KLocalizedStringPrivate::toString (const KLocale *locale) const { KLocalizedStringPrivateStatics *s = staticsKLSP; - QMutexLocker lock(&s->mutex); + QMutexLocker lock(kLocaleMutex()); // Assure the message has been supplied. if (msg.isEmpty()) @@ -474,7 +471,7 @@ const QString &ctxt) const { KLocalizedStringPrivateStatics *s = staticsKLSP; - QMutexLocker lock(&s->mutex); + QMutexLocker lock(kLocaleMutex()); QString final = text; @@ -499,7 +496,7 @@ bool &fallback) const { KLocalizedStringPrivateStatics *s = staticsKLSP; - QMutexLocker lock(&s->mutex); + QMutexLocker lock(kLocaleMutex()); if (s->ktrs == NULL) // Scripting engine not available. @@ -564,7 +561,7 @@ // fallback is set to true if Transcript evaluation requested so. KLocalizedStringPrivateStatics *s = staticsKLSP; - QMutexLocker lock(&s->mutex); + QMutexLocker lock(kLocaleMutex()); result.clear(); fallback = false; @@ -716,7 +713,7 @@ QVariant KLocalizedStringPrivate::segmentToValue (const QString &seg) const { KLocalizedStringPrivateStatics *s = staticsKLSP; - QMutexLocker lock(&s->mutex); + QMutexLocker lock(kLocaleMutex()); // Return invalid variant if segment is either not a proper // value reference, or the reference is out of bounds. @@ -751,7 +748,7 @@ const QString &final) const { KLocalizedStringPrivateStatics *s = staticsKLSP; - QMutexLocker lock(&s->mutex); + QMutexLocker lock(kLocaleMutex()); if (s->ktrs == NULL) // Scripting engine not available. @@ -945,7 +942,7 @@ void KLocalizedStringPrivate::loadTranscript () { KLocalizedStringPrivateStatics *s = staticsKLSP; - QMutexLocker lock(&s->mutex); + QMutexLocker lock(kLocaleMutex()); s->loadTranscriptCalled = true; s->ktrs = NULL; // null indicates that Transcript is not available @@ -979,7 +976,8 @@ return; } KLocalizedStringPrivateStatics *s = staticsKLSP; - QMutexLocker lock(&s->mutex); + // Very important: do not the mutex here. + //QMutexLocker lock(kLocaleMutex()); // Find script modules for all included language/catalogs that have them, // and remember their paths. Index: kdecore/localization/klocale.cpp =================================================================== --- kdecore/localization/klocale.cpp (Revision 1032184) +++ kdecore/localization/klocale.cpp (Revision 1032185) @@ -22,6 +22,7 @@ */ #include "klocale.h" +#include "klocale_p.h" #include @@ -242,7 +243,6 @@ // Handling of translation catalogs QStringList languageList; - QMutex* mutex; QList catalogNames; // list of all catalogs (regardless of language) QList catalogs; // list of all found catalogs, one instance per catalog name and language int numberOfSysCatalogs; // number of catalogs that each app draws from @@ -276,7 +276,6 @@ KLocalePrivate::KLocalePrivate(const QString& catalog, KConfig *config, const QString &language_, const QString &country_) : language(language_), country(country_), - mutex(new QMutex(QMutex::Recursive)), useTranscript(false), codecForEncoding(0), languages(0), calendar(0), @@ -311,7 +310,7 @@ void KLocalePrivate::initMainCatalogs() { KLocaleStaticData *s = staticData; - QMutexLocker lock(mutex); + QMutexLocker lock(kLocaleMutex()); if (!s->maincatalog.isEmpty()) { // If setMainCatalog was called, then we use that (e.g. korgac calls setMainCatalog("korganizer") to use korganizer.po) @@ -541,7 +540,7 @@ bool KLocalePrivate::setLanguage(const QString & _language, KConfig *config) { - QMutexLocker lock(mutex); + QMutexLocker lock(kLocaleMutex()); languageList.removeAll( _language ); languageList.prepend( _language ); // let us consider this language to be the most important one @@ -563,7 +562,7 @@ bool KLocalePrivate::setLanguage(const QStringList & languages) { - QMutexLocker lock(mutex); + QMutexLocker lock(kLocaleMutex()); // This list might contain // 1) some empty strings that we have to eliminate // 2) duplicate entries like in de:fr:de, where we have to keep the first occurrence of a language in order @@ -685,7 +684,7 @@ void KLocale::insertCatalog( const QString & catalog ) { - QMutexLocker lock(d->mutex); + QMutexLocker lock(kLocaleMutex()); int pos = d->catalogNames.indexOf(KCatalogName(catalog)); if (pos != -1) { ++d->catalogNames[pos].loadCount; @@ -736,7 +735,7 @@ void KLocale::removeCatalog(const QString &catalog) { - QMutexLocker lock(d->mutex); + QMutexLocker lock(kLocaleMutex()); int pos = d->catalogNames.indexOf(KCatalogName(catalog)); if (pos == -1) return; @@ -749,7 +748,7 @@ void KLocale::setActiveCatalog(const QString &catalog) { - QMutexLocker lock(d->mutex); + QMutexLocker lock(kLocaleMutex()); int pos = d->catalogNames.indexOf(KCatalogName(catalog)); if (pos == -1) return; @@ -759,7 +758,6 @@ KLocale::~KLocale() { - delete d->mutex; delete d->calendar; delete d->languages; delete d; @@ -788,7 +786,7 @@ << "Fix the program" << endl; } - QMutexLocker locker(mutex); + QMutexLocker locker(kLocaleMutex()); // determine the fallback string QString fallback; if ( msgid_plural == NULL ) @@ -1370,7 +1368,7 @@ //Kibi-byte KiB 2^10 1,024 bytes if (d->byteSizeFmt.size() == 0) { - QMutexLocker lock(d->mutex); + QMutexLocker lock(kLocaleMutex()); // Pretranslated format strings for byte sizes. #define CACHEBYTEFMT(x) { \ QString s; \ @@ -2568,7 +2566,6 @@ { d->languages = 0; // Don't copy languages d->calendar = 0; // Don't copy the calendar - d->mutex = 0; // Don't copy the mutex } KLocale & KLocale::operator=(const KLocale & rhs) @@ -2583,8 +2580,7 @@ void KLocale::copyCatalogsTo(KLocale *locale) { - QMutexLocker lock(d->mutex); - QMutexLocker lockOther(locale->d->mutex); + QMutexLocker lock(kLocaleMutex()); locale->d->catalogNames = d->catalogNames; locale->d->updateCatalogs(); } @@ -2656,3 +2652,9 @@ { return d->dateTimeDigitSet; } + +Q_GLOBAL_STATIC_WITH_ARGS(QMutex, s_kLocaleMutex, (QMutex::Recursive)) +QMutex* kLocaleMutex() +{ + return s_kLocaleMutex(); +}