summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Roquetto <rafael.roquetto.qnx@kdab.com>2013-01-09 17:49:08 -0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-01-14 16:28:21 +0100
commit791eb399d2a4c585352930b7b6757a4b29ddda9d (patch)
tree43b6ba3c164c03c509460bb0f024df5b1cd8b757
parentd5257644302e349fec8df5750d100fd4918ddd6b (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.h5
-rw-r--r--src/corelib/tools/qlocale_unix.cpp27
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