summaryrefslogtreecommitdiff
path: root/zen/shutdown.cpp
diff options
context:
space:
mode:
authorB. Stack <bgstack15@gmail.com>2022-04-18 13:48:31 +0000
committerB. Stack <bgstack15@gmail.com>2022-04-18 13:48:31 +0000
commit8a551d2eff24bdd23bc25caeb8d17207409aae38 (patch)
tree84e67ca0a1fb045a12d015fcffca9cd8087c9332 /zen/shutdown.cpp
parentMerge branch 'b11.18' into 'master' (diff)
parentadd upstream 11.20 (diff)
downloadFreeFileSync-8a551d2eff24bdd23bc25caeb8d17207409aae38.tar.gz
FreeFileSync-8a551d2eff24bdd23bc25caeb8d17207409aae38.tar.bz2
FreeFileSync-8a551d2eff24bdd23bc25caeb8d17207409aae38.zip
Merge branch 'b11.20' into 'master'11.20
add upstream 11.20 See merge request opensource-tracking/FreeFileSync!43
Diffstat (limited to 'zen/shutdown.cpp')
-rw-r--r--zen/shutdown.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/zen/shutdown.cpp b/zen/shutdown.cpp
index f46caf6b..a812d6ae 100644
--- a/zen/shutdown.cpp
+++ b/zen/shutdown.cpp
@@ -5,6 +5,7 @@
// *****************************************************************************
#include "shutdown.h"
+#include "thread.h"
#include <zen/process_exec.h>
@@ -15,6 +16,9 @@ using namespace zen;
void zen::shutdownSystem() //throw FileError
{
+ assert(runningOnMainThread());
+ if (runningOnMainThread())
+ onSystemShutdownRunTasks();
try
{
//https://linux.die.net/man/2/reboot => needs admin rights!
@@ -62,3 +66,40 @@ void zen::terminateProcess(int exitCode)
// alternative requiring admin: sudo killall Xorg
// alternative without admin: dbus-send --session --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.Logout uint32:1
+
+
+namespace
+{
+using ShutdownTaskList = std::vector<std::weak_ptr<const std::function<void()>>>;
+constinit Global<ShutdownTaskList> globalShutdownTasks;
+GLOBAL_RUN_ONCE(globalShutdownTasks.set(std::make_unique<ShutdownTaskList>()));
+}
+
+
+void zen::onSystemShutdownRegister(const SharedRef<std::function<void()>>& task)
+{
+ assert(runningOnMainThread());
+
+ const auto& tasks = globalShutdownTasks.get();
+ assert(tasks);
+ if (tasks)
+ tasks->push_back(task.ptr());
+}
+
+
+void zen::onSystemShutdownRunTasks()
+{
+ assert(runningOnMainThread()); //no multithreading! else: after taskWeak.lock() task() references may go out of scope! (e.g. "this")
+
+ const auto& tasks = globalShutdownTasks.get();
+ assert(tasks);
+ if (tasks)
+ for (const std::weak_ptr<const std::function<void()>>& taskWeak : *tasks)
+ if (const std::shared_ptr<const std::function<void()>>& task = taskWeak.lock();
+ task)
+ try
+ { (*task)(); }
+ catch (...) { assert(false); }
+
+ globalShutdownTasks.set(nullptr); //trigger assert in onSystemShutdownRegister(), just in case...
+}
bgstack15