From a68ed7d44f41b22f77b113ad3d63cd3ecf4d41b4 Mon Sep 17 00:00:00 2001 From: Murat Seker Date: Sun, 28 Jun 2020 23:42:57 +0200 Subject: [PATCH] fix: Delete order of threads (#846) * Fix #668 by fixing delete order of threads * update changelog Co-authored-by: Sersch --- CHANGELOG.md | 1 + libsrc/python/PythonInit.cpp | 2 +- src/hyperiond/hyperiond.cpp | 24 ++++++++++++++---------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26cd7904..0cd5ff53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - device: Nanoleaf (#829) - device: LPD8806 Problems fixed (#829) +- Possible crash on shutdown (#846). Issue #668 - Enumerate only V4L2 frame sizes & intervals for framesize type DISCRETE (fix BCM2835 ISP) (#820) - Fix systemd registration in debian for RPi4 (#820) - Fix missing define in Profiler & added header notes (#820) diff --git a/libsrc/python/PythonInit.cpp b/libsrc/python/PythonInit.cpp index 761cd462..10b98297 100644 --- a/libsrc/python/PythonInit.cpp +++ b/libsrc/python/PythonInit.cpp @@ -29,7 +29,7 @@ PythonInit::PythonInit() // set Python module path when exists wchar_t *pythonPath = Py_DecodeLocale((QDir::cleanPath(qApp->applicationDirPath() + "/../lib/python")).toLatin1().data(), nullptr); #ifdef _WIN32 - pythonPath = Py_DecodeLocale((QDir::cleanPath(qApp->applicationDirPath()) + "/python" + STRINGIFY(PYTHON_VERSION_MAJOR_MINOR) ".zip").toLatin1().data(), nullptr); + pythonPath = Py_DecodeLocale((QDir::cleanPath(qApp->applicationDirPath()) + "/python" + STRINGIFY(PYTHON_VERSION_MAJOR_MINOR) + ".zip").toLatin1().data(), nullptr); if(QFile(QString::fromWCharArray(pythonPath)).exists()) #else if(QDir(QString::fromWCharArray(pythonPath)).exists()) diff --git a/src/hyperiond/hyperiond.cpp b/src/hyperiond/hyperiond.cpp index 626c1076..e9746161 100644 --- a/src/hyperiond/hyperiond.cpp +++ b/src/hyperiond/hyperiond.cpp @@ -170,15 +170,29 @@ void HyperionDaemon::freeObjects() delete _jsonServer; _flatBufferServer->thread()->quit(); _flatBufferServer->thread()->wait(1000); + _flatBufferServer->deleteLater(); + _flatBufferServer->thread()->deleteLater(); + _protoServer->thread()->quit(); _protoServer->thread()->wait(1000); + _protoServer->deleteLater(); + _protoServer->thread()->deleteLater(); + //ssdp before webserver _ssdp->thread()->quit(); _ssdp->thread()->wait(1000); + _ssdp->deleteLater(); + _ssdp->thread()->deleteLater(); + _webserver->thread()->quit(); _webserver->thread()->wait(1000); + _webserver->deleteLater(); + _webserver->thread()->deleteLater(); + _sslWebserver->thread()->quit(); _sslWebserver->thread()->wait(1000); + _sslWebserver->deleteLater(); + _sslWebserver->thread()->deleteLater(); // stop Hyperions (non blocking) _instanceManager->stopAll(); @@ -221,8 +235,6 @@ void HyperionDaemon::startNetworkServices() QThread *fbThread = new QThread(this); _flatBufferServer->moveToThread(fbThread); connect(fbThread, &QThread::started, _flatBufferServer, &FlatBufferServer::initServer); - connect(fbThread, &QThread::finished, _flatBufferServer, &QObject::deleteLater); - connect(fbThread, &QThread::finished, fbThread, &QObject::deleteLater); connect(this, &HyperionDaemon::settingsChanged, _flatBufferServer, &FlatBufferServer::handleSettingsUpdate); fbThread->start(); @@ -231,8 +243,6 @@ void HyperionDaemon::startNetworkServices() QThread *pThread = new QThread(this); _protoServer->moveToThread(pThread); connect(pThread, &QThread::started, _protoServer, &ProtoServer::initServer); - connect(pThread, &QThread::finished, _protoServer, &QObject::deleteLater); - connect(pThread, &QThread::finished, pThread, &QObject::deleteLater); connect(this, &HyperionDaemon::settingsChanged, _protoServer, &ProtoServer::handleSettingsUpdate); pThread->start(); @@ -241,8 +251,6 @@ void HyperionDaemon::startNetworkServices() QThread *wsThread = new QThread(this); _webserver->moveToThread(wsThread); connect(wsThread, &QThread::started, _webserver, &WebServer::initServer); - connect(wsThread, &QThread::finished, _webserver, &QObject::deleteLater); - connect(wsThread, &QThread::finished, wsThread, &QObject::deleteLater); connect(this, &HyperionDaemon::settingsChanged, _webserver, &WebServer::handleSettingsUpdate); wsThread->start(); @@ -251,8 +259,6 @@ void HyperionDaemon::startNetworkServices() QThread *sslWsThread = new QThread(this); _sslWebserver->moveToThread(sslWsThread); connect(sslWsThread, &QThread::started, _sslWebserver, &WebServer::initServer); - connect(sslWsThread, &QThread::finished, _sslWebserver, &QObject::deleteLater); - connect(sslWsThread, &QThread::finished, sslWsThread, &QObject::deleteLater); connect(this, &HyperionDaemon::settingsChanged, _sslWebserver, &WebServer::handleSettingsUpdate); sslWsThread->start(); @@ -261,8 +267,6 @@ void HyperionDaemon::startNetworkServices() QThread *ssdpThread = new QThread(this); _ssdp->moveToThread(ssdpThread); connect(ssdpThread, &QThread::started, _ssdp, &SSDPHandler::initServer); - connect(ssdpThread, &QThread::finished, _ssdp, &QObject::deleteLater); - connect(ssdpThread, &QThread::finished, ssdpThread, &QObject::deleteLater); connect(_webserver, &WebServer::stateChange, _ssdp, &SSDPHandler::handleWebServerStateChange); connect(this, &HyperionDaemon::settingsChanged, _ssdp, &SSDPHandler::handleSettingsUpdate); ssdpThread->start();