libreoffice-online/common/SigUtil.hpp
Tor Lillqvist d9e5a47058 Introduce new flag to speed up shutdown of the Online plumbing in the iOS app
Spent hours on trying to cleverly use the existing TerminationFlag
(with minor modifications to the code that checks it, and some
additional code to set and reset it), but could not get it to work.
This is simpler, but sure, using a global variable is ugly of course.
At least the new MobileTerminationFlag is very specific in semantics
and only used in the mobile apps.

Change-Id: I0775fdfa7880750ca12c6fd7ec41d3d3ceb2f0ad
2019-05-16 11:44:41 +03:00

78 lines
2.1 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#ifndef INCLUDED_SIGNALUTIL_HPP
#define INCLUDED_SIGNALUTIL_HPP
#include <atomic>
#include <mutex>
#if !MOBILEAPP
/// Flag to commence clean shutdown
extern std::atomic<bool> ShutdownRequestFlag;
#else
static constexpr bool ShutdownRequestFlag(false);
#endif
/// Flag to stop pump loops.
extern std::atomic<bool> TerminationFlag;
/// Flag to dump internal state
extern std::atomic<bool> DumpGlobalState;
#if MOBILEAPP
extern std::atomic<bool> MobileTerminationFlag;
#endif
#if !MOBILEAPP
/// Mutex to trap signal handler, if any,
/// and prevent _Exit while collecting backtrace.
extern std::mutex SigHandlerTrap;
namespace SigUtil
{
/// Returns the name of the signal.
const char* signalName(int signo);
/// Register a wakeup function when changing
/// Trap signals to cleanup and exit the process gracefully.
void setTerminationSignals();
/// Trap all fatal signals to assist debugging.
void setFatalSignals();
/// Trap generally useful signals
void setUserSignals();
/// Requests the server to initiate graceful shutdown.
/// Shutting down is a multi-stage process, because
/// it can be requested via signals.
/// Since we need to notify clients, we can't
/// invoke the sockets while in a signal handler.
/// This flags the server to notify clients first
/// then flags for shutdown.
void requestShutdown();
/// Kills a child process and returns true when
/// child pid is removed from the process table
/// after a certain (short) timeout.
bool killChild(const int pid);
/// Dump a signal-safe back-trace
void dumpBacktrace();
} // end namespace SigUtil
#endif // !MOBILEAPP
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */