Implement shutdown with parent for Mac and Linux

This commit is contained in:
Atlante45 2017-07-13 13:34:50 -07:00
parent 366ce69e66
commit 2d246d2563

View file

@ -47,6 +47,7 @@ extern "C" FILE * __cdecl __iob_func(void) {
#include <QtCore/QDebug>
#include <QDateTime>
#include <QElapsedTimer>
#include <QTimer>
#include <QProcess>
#include <QSysInfo>
#include <QThread>
@ -1077,14 +1078,20 @@ void setMaxCores(uint8_t maxCores) {
#endif
}
#ifdef Q_OS_WIN
VOID CALLBACK parentDiedCallback(PVOID lpParameter, BOOLEAN timerOrWaitFired) {
if (!timerOrWaitFired && qApp) {
void quitWithParentProcess() {
if (qApp) {
qDebug() << "Parent process died, quitting";
qApp->quit();
}
}
#ifdef Q_OS_WIN
VOID CALLBACK parentDiedCallback(PVOID lpParameter, BOOLEAN timerOrWaitFired) {
if (!timerOrWaitFired) {
quitWithParentProcess();
}
}
void watchParentProcess(int parentPID) {
DWORD processID = parentPID;
HANDLE procHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
@ -1092,8 +1099,17 @@ void watchParentProcess(int parentPID) {
HANDLE newHandle;
RegisterWaitForSingleObject(&newHandle, procHandle, parentDiedCallback, NULL, INFINITE, WT_EXECUTEONLYONCE);
}
#else
#elif defined(Q_OS_MAC) || defined(Q_OS_LINUX)
void watchParentProcess(int parentPID) {
qWarning() << "Parent PID option not implemented on this plateform";
auto timer = new QTimer(qApp);
timer->setInterval(MSECS_PER_SECOND);
QObject::connect(timer, &QTimer::timeout, qApp, [parentPID]() {
auto ppid = getppid();
if (parentPID != ppid) {
// If the PPID changed, then that means our parent process died.
quitWithParentProcess();
}
});
timer->start();
}
#endif // Q_OS_WIN
#endif