[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: branches/KDE/4.3/kdelibs/kdecore/localization
From: David Faure <faure () kde ! org>
Date: 2009-10-07 8:36:49
Message-ID: 1254904609.429108.31819.nullmailer () svn ! kde ! org
[Download RAW message or body]
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 <config.h>
@@ -242,7 +243,6 @@
// Handling of translation catalogs
QStringList languageList;
- QMutex* mutex;
QList<KCatalogName> catalogNames; // list of all catalogs (regardless of language)
QList<KCatalog> 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 <kglobal.h>
#include <kdebug.h>
#include <klocale.h>
+#include <klocale_p.h>
#include <kcomponentdata.h>
#include <klibrary.h>
#include <kstandarddirs.h>
@@ -126,8 +127,6 @@
QHash<QString, KuitSemantics*> 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.
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic