OSDN Git Service

de-couple the global socket handlers mutex from the list
authorIvailo Monev <xakepa10@gmail.com>
Wed, 9 Feb 2022 16:06:17 +0000 (18:06 +0200)
committerIvailo Monev <xakepa10@gmail.com>
Wed, 9 Feb 2022 16:06:17 +0000 (18:06 +0200)
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
src/network/socket/qabstractsocketengine.cpp

index 74fc05a..c72495a 100644 (file)
 
 QT_BEGIN_NAMESPACE
 
-class QSocketEngineHandlerList : public QList<QSocketEngineHandler*>
-{
-public:
-    QMutex mutex;
-};
-
-Q_GLOBAL_STATIC(QSocketEngineHandlerList, socketHandlers)
+Q_GLOBAL_STATIC(QMutex, qGlobalSocketMutex)
+Q_GLOBAL_STATIC(QList<QSocketEngineHandler*>, qGlobalSocketHandlers)
 
 QSocketEngineHandler::QSocketEngineHandler()
 {
-    if (!socketHandlers())
-        return;
-    QMutexLocker locker(&socketHandlers()->mutex);
-    socketHandlers()->prepend(this);
+    QMutexLocker locker(qGlobalSocketMutex());
+    qGlobalSocketHandlers()->prepend(this);
 }
 
 QSocketEngineHandler::~QSocketEngineHandler()
 {
-    if (!socketHandlers())
-        return;
-    QMutexLocker locker(&socketHandlers()->mutex);
-    socketHandlers()->removeAll(this);
+    QMutexLocker locker(qGlobalSocketMutex());
+    qGlobalSocketHandlers()->removeAll(this);
 }
 
 QAbstractSocketEnginePrivate::QAbstractSocketEnginePrivate()
@@ -83,9 +74,9 @@ QAbstractSocketEngine *QAbstractSocketEngine::createSocketEngine(QAbstractSocket
         return 0;
 #endif
 
-    QMutexLocker locker(&socketHandlers()->mutex);
-    for (int i = 0; i < socketHandlers()->size(); i++) {
-        if (QAbstractSocketEngine *ret = socketHandlers()->at(i)->createSocketEngine(socketType, proxy, parent))
+    QMutexLocker locker(qGlobalSocketMutex());
+    for (int i = 0; i < qGlobalSocketHandlers()->size(); i++) {
+        if (QAbstractSocketEngine *ret = qGlobalSocketHandlers()->at(i)->createSocketEngine(socketType, proxy, parent))
             return ret;
     }
 
@@ -100,9 +91,9 @@ QAbstractSocketEngine *QAbstractSocketEngine::createSocketEngine(QAbstractSocket
 
 QAbstractSocketEngine *QAbstractSocketEngine::createSocketEngine(int socketDescripter, QObject *parent)
 {
-    QMutexLocker locker(&socketHandlers()->mutex);
-    for (int i = 0; i < socketHandlers()->size(); i++) {
-        if (QAbstractSocketEngine *ret = socketHandlers()->at(i)->createSocketEngine(socketDescripter, parent))
+    QMutexLocker locker(qGlobalSocketMutex());
+    for (int i = 0; i < qGlobalSocketHandlers()->size(); i++) {
+        if (QAbstractSocketEngine *ret = qGlobalSocketHandlers()->at(i)->createSocketEngine(socketDescripter, parent))
             return ret;
     }
     return new QNativeSocketEngine(parent);