startplasma: Ensure SIGTERM signals are propagated

wilder-5.24
Aleix Pol 4 years ago committed by Aleix Pol Gonzalez
parent b97a632c94
commit 3177a12248
  1. 2
      startkde/startplasma-wayland.cpp
  2. 2
      startkde/startplasma-waylandsession.cpp
  3. 33
      startkde/startplasma.cpp
  4. 8
      startkde/startplasma.h

@ -9,6 +9,7 @@
#include <KConfigGroup>
#include <QDBusConnection>
#include <QDBusInterface>
#include <signal.h>
int main(int argc, char **argv)
{
@ -16,6 +17,7 @@ int main(int argc, char **argv)
createConfigDirectory();
setupCursor(true);
signal(SIGTERM, sigtermHandler);
{
KConfig fonts(QStringLiteral("kcmfonts"));

@ -5,10 +5,12 @@
*/
#include "startplasma.h"
#include <signal.h>
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
signal(SIGTERM, sigtermHandler);
QScopedPointer<QProcess, KillBeforeDeleter> ksplash;

@ -36,6 +36,14 @@
QTextStream out(stderr);
void sigtermHandler(int signalNumber)
{
Q_UNUSED(signalNumber)
if (QCoreApplication::instance()) {
QCoreApplication::instance()->exit(-1);
}
}
void messageBox(const QString &text)
{
out << text;
@ -66,6 +74,24 @@ QStringList allServices(const QLatin1String &prefix)
return names;
}
void gentleTermination(QProcess *p)
{
if (p->state() != QProcess::Running) {
return;
}
p->close();
p->terminate();
// Wait longer for a session than a greeter
if (!p->waitForFinished(5000)) {
p->kill();
if (!p->waitForFinished(5000)) {
qWarning() << "Could not fully finish the process" << p->program();
}
}
}
int runSync(const QString &program, const QStringList &args, const QStringList &env)
{
QProcess p;
@ -73,6 +99,10 @@ int runSync(const QString &program, const QStringList &args, const QStringList &
p.setEnvironment(QProcess::systemEnvironment() << env);
p.setProcessChannelMode(QProcess::ForwardedChannels);
p.start(program, args);
QObject::connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, &p, [&p] {
gentleTermination(&p);
});
// qCDebug(PLASMA_STARTUP) << "started..." << program << args;
p.waitForFinished(-1);
if (p.exitCode()) {
@ -529,7 +559,7 @@ bool startPlasmaSession(bool wayland)
QObject::connect(&startPlasmaSession, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), [&rc, &e](int exitCode, QProcess::ExitStatus) {
if (exitCode == 255) {
// Startup error
messageBox(QStringLiteral("startkde: Could not start ksmserver. Check your installation.\n"));
messageBox(QStringLiteral("startkde: Could not start plasma_session. Check your installation.\n"));
rc = false;
e.quit();
}
@ -556,6 +586,7 @@ bool startPlasmaSession(bool wayland)
}
if (rc) {
playStartupSound(e);
QObject::connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, &e, &QEventLoop::quit);
e.exec();
}
return rc;

@ -13,6 +13,7 @@
extern QTextStream out;
void sigtermHandler(int signalNumber);
QStringList allServices(const QLatin1String &prefix);
int runSync(const QString &program, const QStringList &args, const QStringList &env = {});
void sourceFiles(const QStringList &files);
@ -41,11 +42,14 @@ static bool useSystemdBoot();
static void migrateUserScriptsAutostart();
static void playStartupSound(QObject &parent);
void gentleTermination(QProcess *process);
struct KillBeforeDeleter {
static inline void cleanup(QProcess *pointer)
{
if (pointer)
pointer->kill();
if (pointer) {
gentleTermination(pointer);
}
delete pointer;
}
};

Loading…
Cancel
Save