142 lines
4.2 KiB
Diff
142 lines
4.2 KiB
Diff
From a4632124ca32374fd1ab728f30be9aaa79186ba5 Mon Sep 17 00:00:00 2001
|
|
From: MilhouseVH <milhouseVH.github@nmacleod.com>
|
|
Date: Tue, 19 Mar 2019 18:06:56 +0000
|
|
Subject: [PATCH] handle SIGTERM
|
|
|
|
0. CApplication::Stop cant be trusted. (deadlocks crashes and boo)
|
|
|
|
so, when shutdown/reboot is requested:
|
|
|
|
1. save an exit code (for CEC...)
|
|
2. call CPowerManager::{Reboot,PowerDown}
|
|
3. ... then systemd sends TERM and waits xx seconds before sending KILL
|
|
4. CApplication::Stop has xx seconds to save guisettings.xml and boo
|
|
5. CEC thread has xx seconds to switch off after it received OnQuit
|
|
6. addons / pvrmanager / cec / everything else.. are free to deadlock / crash now, we dont care
|
|
7. KILL
|
|
---
|
|
xbmc/Application.cpp | 23 ++++++++++++++-----
|
|
xbmc/Application.h | 1 +
|
|
xbmc/XBApplicationEx.cpp | 1 +
|
|
xbmc/XBApplicationEx.h | 1 +
|
|
.../powermanagement/LogindUPowerSyscall.cpp | 2 --
|
|
5 files changed, 20 insertions(+), 8 deletions(-)
|
|
|
|
--- a/xbmc/Application.cpp
|
|
+++ b/xbmc/Application.cpp
|
|
@@ -2118,12 +2118,12 @@ void CApplication::OnApplicationMessage(
|
|
switch (msg)
|
|
{
|
|
case TMSG_POWERDOWN:
|
|
- Stop(EXITCODE_POWERDOWN);
|
|
+ SetExitCode(EXITCODE_POWERDOWN);
|
|
CServiceBroker::GetPowerManager().Powerdown();
|
|
break;
|
|
|
|
case TMSG_QUIT:
|
|
- Stop(EXITCODE_QUIT);
|
|
+ SetExitCode(EXITCODE_QUIT);
|
|
break;
|
|
|
|
case TMSG_SHUTDOWN:
|
|
@@ -2144,12 +2144,13 @@ void CApplication::OnApplicationMessage(
|
|
|
|
case TMSG_RESTART:
|
|
case TMSG_RESET:
|
|
- Stop(EXITCODE_REBOOT);
|
|
+ SetExitCode(EXITCODE_REBOOT);
|
|
CServiceBroker::GetPowerManager().Reboot();
|
|
break;
|
|
|
|
case TMSG_RESTARTAPP:
|
|
#if defined(TARGET_WINDOWS) || defined(TARGET_LINUX)
|
|
+ SetExitCode(EXITCODE_RESTARTAPP);
|
|
Stop(EXITCODE_RESTARTAPP);
|
|
#endif
|
|
break;
|
|
@@ -2635,6 +2636,17 @@ bool CApplication::Cleanup()
|
|
}
|
|
}
|
|
|
|
+void CApplication::SetExitCode(int exitCode)
|
|
+{
|
|
+ if (!m_ExitCodeSet)
|
|
+ {
|
|
+ CLog::Log(LOGINFO, "Saving exitCode %d", exitCode);
|
|
+ // save it for CEC
|
|
+ m_ExitCode = exitCode;
|
|
+ m_ExitCodeSet = true;
|
|
+ }
|
|
+}
|
|
+
|
|
void CApplication::Stop(int exitCode)
|
|
{
|
|
CLog::Log(LOGINFO, "Stopping player");
|
|
@@ -2661,7 +2673,7 @@ void CApplication::Stop(int exitCode)
|
|
m_frameMoveGuard.unlock();
|
|
|
|
CVariant vExitCode(CVariant::VariantTypeObject);
|
|
- vExitCode["exitcode"] = exitCode;
|
|
+ vExitCode["exitcode"] = m_ExitCode;
|
|
CServiceBroker::GetAnnouncementManager()->Announce(ANNOUNCEMENT::System, "OnQuit", vExitCode);
|
|
|
|
// Abort any active screensaver
|
|
@@ -2693,7 +2705,6 @@ void CApplication::Stop(int exitCode)
|
|
// Needs cleaning up
|
|
CApplicationMessenger::GetInstance().Stop();
|
|
m_AppFocused = false;
|
|
- m_ExitCode = exitCode;
|
|
CLog::Log(LOGINFO, "Stopping all");
|
|
|
|
// cancel any jobs from the jobmanager
|
|
@@ -4344,7 +4355,7 @@ void CApplication::ProcessSlow()
|
|
if (CPlatformPosix::TestQuitFlag())
|
|
{
|
|
CLog::Log(LOGINFO, "Quitting due to POSIX signal");
|
|
- CApplicationMessenger::GetInstance().PostMsg(TMSG_QUIT);
|
|
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_RESTARTAPP);
|
|
}
|
|
#endif
|
|
|
|
--- a/xbmc/Application.h
|
|
+++ b/xbmc/Application.h
|
|
@@ -156,6 +156,7 @@ public:
|
|
bool StartServer(enum ESERVERS eServer, bool bStart, bool bWait = false);
|
|
|
|
bool IsCurrentThread() const;
|
|
+ void SetExitCode(int exitCode);
|
|
void Stop(int exitCode);
|
|
void UnloadSkin();
|
|
bool LoadCustomWindows();
|
|
--- a/xbmc/XBApplicationEx.cpp
|
|
+++ b/xbmc/XBApplicationEx.cpp
|
|
@@ -23,6 +23,7 @@ CXBApplicationEx::CXBApplicationEx()
|
|
m_bStop = false;
|
|
m_AppFocused = true;
|
|
m_ExitCode = EXITCODE_QUIT;
|
|
+ m_ExitCodeSet = false;
|
|
m_renderGUI = false;
|
|
}
|
|
|
|
--- a/xbmc/XBApplicationEx.h
|
|
+++ b/xbmc/XBApplicationEx.h
|
|
@@ -29,6 +29,7 @@ public:
|
|
// Variables for timing
|
|
bool m_bStop;
|
|
int m_ExitCode;
|
|
+ bool m_ExitCodeSet;
|
|
bool m_AppFocused;
|
|
bool m_renderGUI;
|
|
|
|
--- a/xbmc/platform/linux/powermanagement/LogindUPowerSyscall.cpp
|
|
+++ b/xbmc/platform/linux/powermanagement/LogindUPowerSyscall.cpp
|
|
@@ -78,8 +78,6 @@ CLogindUPowerSyscall::~CLogindUPowerSysc
|
|
|
|
bool CLogindUPowerSyscall::Powerdown()
|
|
{
|
|
- // delay shutdown so that the app can close properly
|
|
- InhibitDelayLockShutdown();
|
|
return LogindSetPowerState("PowerOff");
|
|
}
|
|
|