From eb5bef5fbaba0b87b952c9d10e40600f387c879b Mon Sep 17 00:00:00 2001 From: sawinglogz <3787776-sawinglogz@users.noreply.gitlab.com> Date: Fri, 10 Jul 2020 12:50:34 -0400 Subject: [PATCH] Move DeviceConnectionManager's global static variable into a local static. This fixes the same issue that was just fixed in XmlReplayEvent, though this one hadn't yet caused a crash. --- oscar/SleepLib/deviceconnection.cpp | 14 +++++++++----- oscar/SleepLib/deviceconnection.h | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/oscar/SleepLib/deviceconnection.cpp b/oscar/SleepLib/deviceconnection.cpp index 90f8933c..06da68bc 100644 --- a/oscar/SleepLib/deviceconnection.cpp +++ b/oscar/SleepLib/deviceconnection.cpp @@ -106,7 +106,7 @@ DeviceConnectionManager::DeviceConnectionManager() DeviceConnection* DeviceConnectionManager::openConnection(const QString & type, const QString & name) { - if (!s_factories.contains(type)) { + if (!factories().contains(type)) { qWarning() << "Unknown device connection type:" << type; return nullptr; } @@ -116,7 +116,7 @@ DeviceConnection* DeviceConnectionManager::openConnection(const QString & type, } // Recording/replay (if any) is handled by the connection. - DeviceConnection* conn = s_factories[type](name, m_record, m_replay); + DeviceConnection* conn = factories()[type](name, m_record, m_replay); if (conn) { if (conn->open()) { m_connections[name] = conn; @@ -156,15 +156,19 @@ SerialPortConnection* DeviceConnectionManager::openSerialPortConnection(const QS } -QHash DeviceConnectionManager::s_factories; +QHash & DeviceConnectionManager::factories() +{ + static QHash s_factories; + return s_factories; +} bool DeviceConnectionManager::registerClass(const QString & type, DeviceConnection::FactoryMethod factory) { - if (s_factories.contains(type)) { + if (factories().contains(type)) { qWarning() << "Connection class already registered for type" << type; return false; } - s_factories[type] = factory; + factories()[type] = factory; return true; } diff --git a/oscar/SleepLib/deviceconnection.h b/oscar/SleepLib/deviceconnection.h index b5b452ef..10f48cab 100644 --- a/oscar/SleepLib/deviceconnection.h +++ b/oscar/SleepLib/deviceconnection.h @@ -127,7 +127,7 @@ public: // DeviceConnection subclasses registration, not intended for client use. protected: - static QHash s_factories; + static QHash & factories(); public: static bool registerClass(const QString & type, DeviceConnection::FactoryMethod factory); static class DeviceConnection* createInstance(const QString & type);