File indexing completed on 2024-05-19 05:39:08
0001 /* 0002 SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-only 0005 */ 0006 0007 #include "sessiontrack.h" 0008 #include "signalhandler.h" 0009 #include <QCoreApplication> 0010 #include <QDBusConnection> 0011 #include <QDBusServiceWatcher> 0012 #include <signal.h> 0013 0014 SessionTrack::SessionTrack(const QList<QProcess *> &processes) 0015 : m_processes(processes) 0016 { 0017 SignalHandler::self()->addSignal(SIGTERM); 0018 connect(SignalHandler::self(), &SignalHandler::signalReceived, QCoreApplication::instance(), [](int signal) { 0019 if (signal == SIGTERM) { 0020 QCoreApplication::instance()->exit(0); 0021 } 0022 }); 0023 0024 for (auto process : std::as_const(m_processes)) { 0025 connect(process, &QProcess::finished, this, [this] { 0026 m_processes.removeAll(static_cast<QProcess *>(sender())); 0027 }); 0028 } 0029 0030 QObject::connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this, &SessionTrack::deleteLater); 0031 } 0032 0033 SessionTrack::~SessionTrack() 0034 { 0035 disconnect(this, nullptr, QCoreApplication::instance(), nullptr); 0036 0037 for (auto process : std::as_const(m_processes)) { 0038 process->terminate(); 0039 } 0040 0041 // copy before the loop as we remove finished processes from the vector 0042 const QList<QProcess *> processesCopy = m_processes; 0043 for (auto process : processesCopy) { 0044 if (process->state() == QProcess::Running && !process->waitForFinished(500)) { 0045 process->kill(); 0046 } else { 0047 delete process; 0048 } 0049 } 0050 }