diff options
author | Rafael Roquetto <rafael.roquetto.qnx@kdab.com> | 2013-01-09 17:49:08 -0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-01-14 16:28:21 +0100 |
commit | 791eb399d2a4c585352930b7b6757a4b29ddda9d (patch) | |
tree | 43b6ba3c164c03c509460bb0f024df5b1cd8b757 | |
parent | d5257644302e349fec8df5750d100fd4918ddd6b (diff) |
Split QQNXLocaleData::readPPSLocale()
Because this method creates a QSocketNotifier, it needs
to be split into a part that is run on initialization, namely
QQNXLocaleData::initialize(), and one that is run delayed
through event loop invocation, namely QQNXLocaleData::installSocketNotifier().
Task-number: QTBUG-28701
Change-Id: Ib60000902692bbca4820d3d0bc7719212668dfa9
Reviewed-by: Laszlo Papp <lpapp@kde.org>
Reviewed-by: Kevin Krammer <kevin.krammer@kdab.com>
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r-- | src/corelib/tools/qlocale_p.h | 5 | ||||
-rw-r--r-- | src/corelib/tools/qlocale_unix.cpp | 27 |
2 files changed, 26 insertions, 6 deletions
diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h index 65201374a9..ca1b6f8b07 100644 --- a/src/corelib/tools/qlocale_p.h +++ b/src/corelib/tools/qlocale_p.h @@ -380,10 +380,13 @@ class QQNXLocaleData: public QObject public: QQNXLocaleData(); virtual ~QQNXLocaleData(); - void readPPSLocale(); public Q_SLOTS: void updateMeasurementSystem(); + void installSocketNotifier(); + +private: + void initialize(); public: uint ppsMeasurement; diff --git a/src/corelib/tools/qlocale_unix.cpp b/src/corelib/tools/qlocale_unix.cpp index 088e40b176..49bed37075 100644 --- a/src/corelib/tools/qlocale_unix.cpp +++ b/src/corelib/tools/qlocale_unix.cpp @@ -66,7 +66,12 @@ QQNXLocaleData::QQNXLocaleData() :ppsNotifier(0) ,ppsFd(-1) { - readPPSLocale(); + initialize(); + + // we cannot call this directly, because by the time this constructor is + // called, the event dispatcher has not yet been created, causing the + // subsequent call to QSocketNotifier constructor to fail. + QMetaObject::invokeMethod(this, "installSocketNotifier", Qt::QueuedConnection); } QQNXLocaleData::~QQNXLocaleData() @@ -106,7 +111,7 @@ void QQNXLocaleData::updateMeasurementSystem() ppsMeasurement = QLocale::MetricSystem; } -void QQNXLocaleData::readPPSLocale() +void QQNXLocaleData::initialize() { errno = 0; ppsFd = qt_safe_open(ppsServicePath, O_RDONLY); @@ -116,10 +121,22 @@ void QQNXLocaleData::readPPSLocale() } updateMeasurementSystem(); - if (QCoreApplication::instance()) { - ppsNotifier = new QSocketNotifier(ppsFd, QSocketNotifier::Read, this); - QObject::connect(ppsNotifier, SIGNAL(activated(int)), this, SLOT(updateMeasurementSystem())); +} + +void QQNXLocaleData::installSocketNotifier() +{ + if (!QCoreApplication::instance() || ppsFd == -1) { + qWarning("QQNXLocaleData: Failed to create socket notifier, locale updates may not work."); + return; } + + if (ppsNotifier) { + qWarning("QQNXLocaleData: socket notifier already created."); + return; + } + + ppsNotifier = new QSocketNotifier(ppsFd, QSocketNotifier::Read, this); + QObject::connect(ppsNotifier, SIGNAL(activated(int)), this, SLOT(updateMeasurementSystem())); } #endif |