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 }