[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/KDE/4.3/kdelibs/kdecore
From:       David Faure <faure () kde ! org>
Date:       2009-09-30 23:44:02
Message-ID: 1254354242.670375.21417.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1029879 by dfaure:

Backport 1029862+1029870+1029871:
protect access to the list of catalogs (and other KLocalePrivate members) using a \
mutex. Fix will be in KDE-4.3.2.
CCBUG: 208178


 M  +23 -10    localization/klocale.cpp  
 M  +1 -0      tests/klocalizedstringtest.cpp  


--- branches/KDE/4.3/kdelibs/kdecore/localization/klocale.cpp #1029878:1029879
@@ -68,8 +68,6 @@
 
     KLocaleStaticData ();
 
-    QMutex mutex;
-
     QString maincatalog;
 
     // FIXME: Temporary until full language-sensitivity implemented.
@@ -77,7 +75,6 @@
 };
 
 KLocaleStaticData::KLocaleStaticData ()
-: mutex(QMutex::Recursive)
 {
     // Languages using non-Western Arabic digit sets.
     // FIXME: Temporary until full language-sensitivity implemented.
@@ -176,6 +173,8 @@
   /**
    * @internal evaluate the list of catalogs and check that all instances for all \
                languages are loaded
    * and that they are sorted according to the catalog names
+   *
+   * Callers must lock the mutex first.
    */
   void updateCatalogs( );
 
@@ -243,6 +242,7 @@
   // 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,8 +276,11 @@
 KLocalePrivate::KLocalePrivate(const QString& catalog, KConfig *config, const \
QString &language_, const QString &country_)  : language(language_),
       country(country_),
-      useTranscript(false), codecForEncoding(0),
-      languages(0), calendar(0), catalogName(catalog)
+      mutex(new QMutex(QMutex::Recursive)),
+      useTranscript(false),
+      codecForEncoding(0),
+      languages(0), calendar(0),
+      catalogName(catalog)
 {
     initEncoding();
     initFileNameEncoding();
@@ -308,6 +311,7 @@
 void KLocalePrivate::initMainCatalogs()
 {
   KLocaleStaticData *s = staticData;
+  QMutexLocker lock(mutex);
 
   if (!s->maincatalog.isEmpty()) {
       // If setMainCatalog was called, then we use that (e.g. korgac calls \
setMainCatalog("korganizer") to use korganizer.po) @@ -537,7 +541,8 @@
 
 bool KLocalePrivate::setLanguage(const QString & _language, KConfig *config)
 {
-    languageList.removeAll( _language );
+  QMutexLocker lock(mutex);
+  languageList.removeAll( _language );
   languageList.prepend( _language ); // let us consider this language to be the most \
important one  
   language = _language; // remember main language for shortcut evaluation
@@ -558,6 +563,7 @@
 
 bool KLocalePrivate::setLanguage(const QStringList & languages)
 {
+  QMutexLocker lock(mutex);
   // 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 @@ -679,6 +685,7 @@
 
 void KLocale::insertCatalog( const QString & catalog )
 {
+  QMutexLocker lock(d->mutex);
     int pos = d->catalogNames.indexOf(KCatalogName(catalog));
     if (pos != -1) {
         ++d->catalogNames[pos].loadCount;
@@ -729,6 +736,7 @@
 
 void KLocale::removeCatalog(const QString &catalog)
 {
+    QMutexLocker lock(d->mutex);
     int pos = d->catalogNames.indexOf(KCatalogName(catalog));
     if (pos == -1)
         return;
@@ -741,6 +749,7 @@
 
 void KLocale::setActiveCatalog(const QString &catalog)
 {
+    QMutexLocker lock(d->mutex);
     int pos = d->catalogNames.indexOf(KCatalogName(catalog));
     if (pos == -1)
         return;
@@ -750,9 +759,10 @@
 
 KLocale::~KLocale()
 {
-  delete d->calendar;
-  delete d->languages;
-  delete d;
+    delete d->mutex;
+    delete d->calendar;
+    delete d->languages;
+    delete d;
 }
 
 void KLocalePrivate::translate_priv(const char *msgctxt,
@@ -1359,7 +1369,7 @@
     //Kibi-byte             KiB             2^10    1,024 bytes
 
     if (d->byteSizeFmt.size() == 0) {
-        QMutexLocker lock(&staticData->mutex);
+        QMutexLocker lock(d->mutex);
         // Pretranslated format strings for byte sizes.
         #define CACHEBYTEFMT(x) { \
             QString s; \
@@ -2557,6 +2567,7 @@
 {
   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)
@@ -2571,6 +2582,8 @@
 
 void KLocale::copyCatalogsTo(KLocale *locale)
 {
+    QMutexLocker lock(d->mutex);
+    QMutexLocker lockOther(locale->d->mutex);
     locale->d->catalogNames = d->catalogNames;
     locale->d->updateCatalogs();
 }
--- branches/KDE/4.3/kdelibs/kdecore/tests/klocalizedstringtest.cpp #1029878:1029879
@@ -238,6 +238,7 @@
     futures << QtConcurrent::run(this, &KLocalizedStringTest::correctSubs);
     futures << QtConcurrent::run(this, &KLocalizedStringTest::translateQt);
     futures << QtConcurrent::run(this, &KLocalizedStringTest::translateQt);
+    KGlobal::locale()->removeCatalog("kdelibs4");
     Q_FOREACH(QFuture<void> f, futures)
         f.waitForFinished();
     QThreadPool::globalInstance()->setMaxThreadCount(1); // delete those threads


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic