Skip to content

Commit

Permalink
Merge branch 'jb41249' into 'master'
Browse files Browse the repository at this point in the history
[lipstick] Handle unix signals more properly. Contribute to JB#41249

See merge request mer-core/lipstick!82
  • Loading branch information
pvuorela committed May 2, 2018
2 parents 2cd4c57 + 3aa3561 commit 9fdafa7
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 11 deletions.
56 changes: 51 additions & 5 deletions src/homeapplication.cpp
Expand Up @@ -10,6 +10,7 @@
**
****************************************************************************/

#include <QSocketNotifier>
#include <QQmlComponent>
#include <QQmlContext>
#include <QQmlEngine>
Expand All @@ -23,6 +24,8 @@
#include <QDebug>
#include <QEvent>
#include <systemd/sd-daemon.h>
#include <sys/eventfd.h>
#include <unistd.h>

#include "notifications/notificationmanager.h"
#include "notifications/notificationpreviewpresenter.h"
Expand Down Expand Up @@ -53,9 +56,13 @@

void HomeApplication::quitSignalHandler(int)
{
qApp->quit();
uint64_t a = 1;
ssize_t unused = ::write(s_quitSignalFd, &a, sizeof(a));
Q_UNUSED(unused);
}

int HomeApplication::s_quitSignalFd = -1;

static void registerDBusObject(QDBusConnection &bus, const char *path, QObject *object)
{
if (!bus.registerObject(path, object)) {
Expand All @@ -65,15 +72,16 @@ static void registerDBusObject(QDBusConnection &bus, const char *path, QObject *

HomeApplication::HomeApplication(int &argc, char **argv, const QString &qmlPath)
: QGuiApplication(argc, argv)
, m_quitSignalNotifier(0)
, m_mainWindowInstance(0)
, m_qmlPath(qmlPath)
, m_originalSigIntHandler(signal(SIGINT, quitSignalHandler))
, m_originalSigTermHandler(signal(SIGTERM, quitSignalHandler))
, m_homeReadySent(false)
, m_screenshotService(0)
, m_connmanVpn(0)
, m_online(false)
{
setUpSignalHandlers();

QTranslator *engineeringEnglish = new QTranslator(this);
engineeringEnglish->load("lipstick_eng_en", "/usr/share/translations");
installTranslator(engineeringEnglish);
Expand Down Expand Up @@ -200,10 +208,48 @@ HomeApplication *HomeApplication::instance()
return qobject_cast<HomeApplication *>(qApp);
}

void HomeApplication::setUpSignalHandlers()
{
s_quitSignalFd = ::eventfd(0, 0);
if (s_quitSignalFd == -1)
qFatal("Failed to create eventfd object for signal handling");

m_quitSignalNotifier = new QSocketNotifier(s_quitSignalFd, QSocketNotifier::Read, this);
connect(m_quitSignalNotifier, &QSocketNotifier::activated, this, [this]() {
uint64_t tmp;
ssize_t unused = ::read(s_quitSignalFd, &tmp, sizeof(tmp));
Q_UNUSED(unused);

quit();
});

struct sigaction action;
action.sa_handler = quitSignalHandler;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
action.sa_flags |= SA_RESTART;

if (sigaction(SIGINT, &action, &m_originalSigIntAction))
qFatal("Failed to set up SIGINT handling");
if (sigaction(SIGTERM, &action, &m_originalSigTermAction))
qFatal("Failed to set up SIGTERM handling");
}

void HomeApplication::restoreSignalHandlers()
{
signal(SIGINT, m_originalSigIntHandler);
signal(SIGTERM, m_originalSigTermHandler);
if (s_quitSignalFd == -1) {
qWarning() << "HomeApplication::restoreSignalHandlers: called multiple times?";
return;
}

if (sigaction(SIGINT, &m_originalSigIntAction, nullptr))
qFatal("Failed to restore original SIGINT handling");
if (sigaction(SIGTERM, &m_originalSigTermAction, nullptr))
qFatal("Failed to restore original SIGTERM handling");

delete m_quitSignalNotifier, m_quitSignalNotifier = nullptr;

::close(s_quitSignalFd), s_quitSignalFd = -1;
}

void HomeApplication::sendHomeReadySignalIfNotAlreadySent()
Expand Down
18 changes: 12 additions & 6 deletions src/homeapplication.h
Expand Up @@ -18,6 +18,7 @@
#include "lipstickglobal.h"
#include <touchscreen.h>

class QSocketNotifier;
class QQmlEngine;
class HomeWindow;
class ScreenLock;
Expand Down Expand Up @@ -126,6 +127,9 @@ class LIPSTICK_EXPORT HomeApplication : public QGuiApplication
protected:
virtual bool event(QEvent *);

private:
void setUpSignalHandlers();

private slots:
/*!
* Emits the homeReady() signal unless it has already been sent
Expand All @@ -149,17 +153,19 @@ private slots:

//! A signal handler that quits the QApplication
static void quitSignalHandler(int);
//! An eventfd object for signal handling
static int s_quitSignalFd;
//! Socket notifier for signal handling
QSocketNotifier *m_quitSignalNotifier;
//! The original SIGINT action
struct sigaction m_originalSigIntAction;
//! The original SIGTERM action
struct sigaction m_originalSigTermAction;

HomeWindow *m_mainWindowInstance;
QString m_qmlPath;
QString m_compositorPath;

//! The original SIGINT handler
sighandler_t m_originalSigIntHandler;

//! The original SIGTERM handler
sighandler_t m_originalSigTermHandler;

//! QML Engine instance
QQmlEngine *m_qmlEngine;

Expand Down

0 comments on commit 9fdafa7

Please sign in to comment.