From kde-commits Wed Oct 07 08:36:49 2009 From: David Faure Date: Wed, 07 Oct 2009 08:36:49 +0000 To: kde-commits Subject: branches/KDE/4.3/kdelibs/kdecore/localization Message-Id: <1254904609.429108.31819.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=125490461917828 SVN commit 1032185 by dfaure: Backport r1030572: Use the -same- mutex for KLocale and KLocalizedString, since they both call each other. This fixes a deadlock in KLocale. My fault for forgetting to backport the fix for KDE 4.3.2 :-( BUG: 209712 Packagers, please include this fix in 4.3.2 packages. CCMAIL: kde-packager@kde.org M +16 -14 klocale.cpp A klocale_p.h trunk/KDE/kdelibs/kdecore/localization/klocale_p.h#1030572 [License: UNKNOWN] M +11 -13 klocalizedstring.cpp --- branches/KDE/4.3/kdelibs/kdecore/localization/klocale.cpp #1032184: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(); +} --- branches/KDE/4.3/kdelibs/kdecore/localization/klocalizedstring.cpp #1032184: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.