summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/text/qlocale.cpp3
-rw-r--r--src/corelib/text/qlocale_p.h2
-rw-r--r--src/corelib/text/qstring.cpp24
3 files changed, 25 insertions, 4 deletions
diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp
index d5cde8a69d..ca4f7733f3 100644
--- a/src/corelib/text/qlocale.cpp
+++ b/src/corelib/text/qlocale.cpp
@@ -780,9 +780,9 @@ QDataStream &operator>>(QDataStream &ds, QLocale &l)
}
#endif // QT_NO_DATASTREAM
-
static const int locale_data_size = sizeof(locale_data)/sizeof(QLocaleData) - 1;
+QBasicAtomicInt QLocalePrivate::s_generation = Q_BASIC_ATOMIC_INITIALIZER(0);
Q_GLOBAL_STATIC_WITH_ARGS(QSharedDataPointer<QLocalePrivate>, defaultLocalePrivate,
(new QLocalePrivate(defaultData(), defaultIndex())))
@@ -1206,6 +1206,7 @@ void QLocale::setDefault(const QLocale &locale)
// update the cached private
*defaultLocalePrivate = locale.d;
+ QLocalePrivate::s_generation.fetchAndAddRelaxed(1);
}
/*!
diff --git a/src/corelib/text/qlocale_p.h b/src/corelib/text/qlocale_p.h
index be495eaf43..a547dad7b7 100644
--- a/src/corelib/text/qlocale_p.h
+++ b/src/corelib/text/qlocale_p.h
@@ -424,6 +424,8 @@ public:
QBasicAtomicInt ref;
const uint m_index;
QLocale::NumberOptions m_numberOptions;
+
+ static QBasicAtomicInt s_generation;
};
#ifndef QT_NO_SYSTEMLOCALE
diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp
index 11caefc8ec..8d510dda6c 100644
--- a/src/corelib/text/qstring.cpp
+++ b/src/corelib/text/qstring.cpp
@@ -6141,7 +6141,25 @@ int QString::localeAwareCompare(const QString &other) const
}
#if QT_CONFIG(icu)
-Q_GLOBAL_STATIC(QThreadStorage<QCollator>, defaultCollator)
+namespace {
+class GenerationalCollator
+{
+ QCollator theCollator;
+ int generation = QLocalePrivate::s_generation.loadRelaxed();
+public:
+ QCollator &collator()
+ {
+ int currentGeneration = QLocalePrivate::s_generation.loadRelaxed();
+ if (Q_UNLIKELY(generation != currentGeneration)) {
+ // reinitialize the collator
+ generation = currentGeneration;
+ theCollator = QCollator();
+ }
+ return theCollator;
+ }
+};
+}
+Q_GLOBAL_STATIC(QThreadStorage<GenerationalCollator>, defaultCollator)
#endif
/*!
@@ -6163,8 +6181,8 @@ int QString::localeAwareCompare_helper(const QChar *data1, qsizetype length1,
#if QT_CONFIG(icu)
if (!defaultCollator()->hasLocalData())
- defaultCollator()->setLocalData(QCollator());
- return defaultCollator()->localData().compare(data1, length1, data2, length2);
+ defaultCollator()->setLocalData(GenerationalCollator());
+ return defaultCollator()->localData().collator().compare(data1, length1, data2, length2);
#else
const QString lhs = QString::fromRawData(data1, length1).normalized(QString::NormalizationForm_C);
const QString rhs = QString::fromRawData(data2, length2).normalized(QString::NormalizationForm_C);