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
Edward Welbourne 2018-07-04 14:50:49 +02:00
parent 5d92f1793a
commit d5891036de
4 changed files with 30 additions and 19 deletions

View File

@ -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());
}

View File

@ -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;

View File

@ -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()
{

View File

@ -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