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 "signalhandler.h"
0008 #include "debug.h"
0009 
0010 #include <QDebug>
0011 #include <signal.h>
0012 #include <sys/socket.h>
0013 #include <unistd.h>
0014 
0015 int SignalHandler::signalFd[2];
0016 
0017 SignalHandler::SignalHandler()
0018 {
0019     if (::socketpair(AF_UNIX, SOCK_STREAM, 0, signalFd)) {
0020         qCWarning(PLASMA_SESSION) << "Couldn't create a socketpair";
0021         return;
0022     }
0023 
0024     m_handler = new QSocketNotifier(signalFd[1], QSocketNotifier::Read, this);
0025     connect(m_handler, &QSocketNotifier::activated, this, &SignalHandler::handleSignal);
0026 }
0027 
0028 SignalHandler::~SignalHandler()
0029 {
0030     for (int sig : std::as_const(m_signalsRegistered)) {
0031         signal(sig, nullptr);
0032     }
0033     close(signalFd[0]);
0034     close(signalFd[1]);
0035 }
0036 
0037 void SignalHandler::addSignal(int signalToTrack)
0038 {
0039     m_signalsRegistered.insert(signalToTrack);
0040     signal(signalToTrack, signalHandler);
0041 }
0042 
0043 void SignalHandler::signalHandler(int signal)
0044 {
0045     ::write(signalFd[0], &signal, sizeof(signal));
0046 }
0047 
0048 void SignalHandler::handleSignal()
0049 {
0050     m_handler->setEnabled(false);
0051     int signal;
0052     ::read(signalFd[1], &signal, sizeof(signal));
0053     m_handler->setEnabled(true);
0054 
0055     Q_EMIT signalReceived(signal);
0056 }
0057 
0058 SignalHandler *SignalHandler::self()
0059 {
0060     static SignalHandler s_self;
0061     return &s_self;
0062 }