Make updateSystemPrivate() local to qlocale.cpp
It's not thread-safe so should only be used within systemData()'s locked code. This eliminates the last callers of it by making it a local function of the compilation unit, exposing a method from QSystemLocale() to get round its use of private parts. Make the constructor for QSystemLocale only stomp its _systemLocale global if previously unset, but let instantiation still clear globalLocaleData.m_language_id, so that it can be used as a way to trigger an update to system locale data. Change-Id: I908dca9fd30bbf20f42321ab8f9094f2fa37b7b0 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>bb10
parent
5d92f1793a
commit
d5891036de
|
|
@ -620,13 +620,18 @@ static QLocalePrivate *c_private()
|
|||
*/
|
||||
|
||||
/*!
|
||||
Constructs a QSystemLocale object. The constructor will automatically
|
||||
install this object as the system locale and remove any earlier installed
|
||||
system locales.
|
||||
Constructs a QSystemLocale object.
|
||||
|
||||
The constructor will automatically install this object as the system locale,
|
||||
if there's not one active. It also resets the flag that'll prompt
|
||||
QLocale::system() to re-initialize its data, so that instantiating a
|
||||
QSystemLocale transiently (doesn't install the transient as system locale if
|
||||
there was one already and) triggers an update to the system locale's data.
|
||||
*/
|
||||
QSystemLocale::QSystemLocale()
|
||||
{
|
||||
_systemLocale = this;
|
||||
if (!_systemLocale)
|
||||
_systemLocale = this;
|
||||
|
||||
globalLocaleData.m_language_id = 0;
|
||||
}
|
||||
|
|
@ -656,15 +661,17 @@ static const QSystemLocale *systemLocale()
|
|||
return QSystemLocale_globalSystemLocale();
|
||||
}
|
||||
|
||||
void QLocalePrivate::updateSystemPrivate()
|
||||
static void updateSystemPrivate()
|
||||
{
|
||||
// this function is NOT thread-safe!
|
||||
// This function is NOT thread-safe!
|
||||
// It *should not* be called by anything but systemData()
|
||||
const QSystemLocale *sys_locale = systemLocale();
|
||||
|
||||
// tell the object that the system locale has changed.
|
||||
sys_locale->query(QSystemLocale::LocaleChanged, QVariant());
|
||||
|
||||
globalLocaleData = *sys_locale->fallbackUiLocale().d->m_data;
|
||||
// Populate global with fallback as basis:
|
||||
globalLocaleData = *sys_locale->fallbackUiLocaleData();
|
||||
|
||||
QVariant res = sys_locale->query(QSystemLocale::LanguageId, QVariant());
|
||||
if (!res.isNull()) {
|
||||
|
|
@ -715,7 +722,7 @@ static const QLocaleData *systemData()
|
|||
static QBasicMutex systemDataMutex;
|
||||
systemDataMutex.lock();
|
||||
if (globalLocaleData.m_language_id == 0)
|
||||
QLocalePrivate::updateSystemPrivate();
|
||||
updateSystemPrivate();
|
||||
systemDataMutex.unlock();
|
||||
}
|
||||
|
||||
|
|
@ -2351,7 +2358,6 @@ QString QLocale::toString(double i, char f, int prec) const
|
|||
|
||||
QLocale QLocale::system()
|
||||
{
|
||||
// this function is NOT thread-safe!
|
||||
QT_PREPEND_NAMESPACE(systemData)(); // trigger updating of the system data if necessary
|
||||
return QLocale(*systemLocalePrivate->data());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1096,6 +1096,7 @@ public:
|
|||
private:
|
||||
QLocale(QLocalePrivate &dd);
|
||||
friend class QLocalePrivate;
|
||||
friend class QSystemLocale;
|
||||
friend Q_CORE_EXPORT uint qHash(const QLocale &key, uint seed) Q_DECL_NOTHROW;
|
||||
|
||||
QSharedDataPointer<QLocalePrivate> d;
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@
|
|||
QT_BEGIN_NAMESPACE
|
||||
|
||||
#ifndef QT_NO_SYSTEMLOCALE
|
||||
struct QLocaleData;
|
||||
class Q_CORE_EXPORT QSystemLocale
|
||||
{
|
||||
public:
|
||||
|
|
@ -126,6 +127,7 @@ public:
|
|||
virtual QVariant query(QueryType type, QVariant in) const;
|
||||
virtual QLocale fallbackUiLocale() const;
|
||||
|
||||
inline const QLocaleData *fallbackUiLocaleData() const;
|
||||
private:
|
||||
QSystemLocale(bool);
|
||||
friend class QSystemLocaleSingleton;
|
||||
|
|
@ -364,8 +366,6 @@ public:
|
|||
|
||||
QLocale::MeasurementSystem measurementSystem() const;
|
||||
|
||||
static void updateSystemPrivate();
|
||||
|
||||
QString dateTimeToString(QStringView format, const QDateTime &datetime,
|
||||
const QDate &dateOnly, const QTime &timeOnly,
|
||||
const QLocale *q) const;
|
||||
|
|
@ -375,6 +375,10 @@ public:
|
|||
QLocale::NumberOptions m_numberOptions;
|
||||
};
|
||||
|
||||
#ifndef QT_NO_SYSTEMLOCALE
|
||||
const QLocaleData *QSystemLocale::fallbackUiLocaleData() const { return fallbackUiLocale().d->m_data; }
|
||||
#endif
|
||||
|
||||
template <>
|
||||
inline QLocalePrivate *QSharedDataPointer<QLocalePrivate>::clone()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1870,9 +1870,11 @@ static void setWinLocaleInfo(LCTYPE type, const QString &value)
|
|||
# define LOCALE_SSHORTTIME 0x00000079
|
||||
#endif
|
||||
|
||||
class RestoreLocaleHelper {
|
||||
class RestoreLocaleHelper
|
||||
{
|
||||
public:
|
||||
RestoreLocaleHelper() {
|
||||
RestoreLocaleHelper()
|
||||
{
|
||||
m_decimal = getWinLocaleInfo(LOCALE_SDECIMAL);
|
||||
m_thousand = getWinLocaleInfo(LOCALE_STHOUSAND);
|
||||
m_sdate = getWinLocaleInfo(LOCALE_SSHORTDATE);
|
||||
|
|
@ -1880,7 +1882,8 @@ public:
|
|||
m_time = getWinLocaleInfo(LOCALE_SSHORTTIME);
|
||||
}
|
||||
|
||||
~RestoreLocaleHelper() {
|
||||
~RestoreLocaleHelper()
|
||||
{
|
||||
// restore these, or the user will get a surprise
|
||||
setWinLocaleInfo(LOCALE_SDECIMAL, m_decimal);
|
||||
setWinLocaleInfo(LOCALE_STHOUSAND, m_thousand);
|
||||
|
|
@ -1888,12 +1891,10 @@ public:
|
|||
setWinLocaleInfo(LOCALE_SLONGDATE, m_ldate);
|
||||
setWinLocaleInfo(LOCALE_SSHORTTIME, m_time);
|
||||
|
||||
// make sure QLocale::system() gets updated
|
||||
QLocalePrivate::updateSystemPrivate();
|
||||
QSystemLocale dummy; // to provoke a refresh of the system locale
|
||||
}
|
||||
|
||||
QString m_decimal, m_thousand, m_sdate, m_ldate, m_time;
|
||||
|
||||
};
|
||||
|
||||
void tst_QLocale::windowsDefaultLocale()
|
||||
|
|
@ -1909,8 +1910,7 @@ void tst_QLocale::windowsDefaultLocale()
|
|||
const QString shortTimeFormat = QStringLiteral("h^m^s");
|
||||
setWinLocaleInfo(LOCALE_SSHORTTIME, shortTimeFormat);
|
||||
|
||||
// make sure QLocale::system() gets updated
|
||||
QLocalePrivate::updateSystemPrivate();
|
||||
QSystemLocale dummy; // to provoke a refresh of the system locale
|
||||
QLocale locale = QLocale::system();
|
||||
|
||||
// make sure we are seeing the system's format strings
|
||||
|
|
|
|||
Loading…
Reference in New Issue