aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/poco/Foundation/include/Poco/SignalHandler.h
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/poco/Foundation/include/Poco/SignalHandler.h
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/poco/Foundation/include/Poco/SignalHandler.h')
-rw-r--r--contrib/libs/poco/Foundation/include/Poco/SignalHandler.h129
1 files changed, 129 insertions, 0 deletions
diff --git a/contrib/libs/poco/Foundation/include/Poco/SignalHandler.h b/contrib/libs/poco/Foundation/include/Poco/SignalHandler.h
new file mode 100644
index 0000000000..22b5f16734
--- /dev/null
+++ b/contrib/libs/poco/Foundation/include/Poco/SignalHandler.h
@@ -0,0 +1,129 @@
+//
+// SignalHandler.h
+//
+// Library: Foundation
+// Package: Threading
+// Module: SignalHandler
+//
+// Definition of the SignalHandler class.
+//
+// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Foundation_SignalHandler_INCLUDED
+#define Foundation_SignalHandler_INCLUDED
+
+
+#include "Poco/Foundation.h"
+
+
+#if defined(POCO_OS_FAMILY_UNIX) && !defined(POCO_VXWORKS)
+
+
+#include <vector>
+#include <setjmp.h>
+
+
+namespace Poco {
+
+
+class Foundation_API SignalHandler
+ /// This helper class simplifies the handling of POSIX signals.
+ ///
+ /// The class provides a signal handler (installed with
+ /// installHandlers()) that translates certain POSIX
+ /// signals (SIGILL, SIGBUS, SIGSEGV, SIGSYS) into
+ /// C++ exceptions.
+ ///
+ /// Internally, a stack of sigjmp_buf structs is maintained for
+ /// each thread. The constructor pushes a new sigjmp_buf onto
+ /// the current thread's stack. The destructor pops the sigjmp_buf
+ /// from the stack.
+ ///
+ /// The poco_throw_on_signal macro creates an instance of SignalHandler
+ /// on the stack, which results in a new sigjmp_buf being created.
+ /// The sigjmp_buf is then set-up with sigsetjmp().
+ ///
+ /// The handleSignal() method, which is invoked when a signal arrives,
+ /// checks if a sigjmp_buf is available for the current thread.
+ /// If so, siglongjmp() is used to jump out of the signal handler.
+ ///
+ /// Typical usage is as follows:
+ ///
+ /// try
+ /// {
+ /// poco_throw_on_signal;
+ /// ...
+ /// }
+ /// catch (Poco::SignalException&)
+ /// {
+ /// ...
+ /// }
+ ///
+ /// The best way to deal with a SignalException is to log as much context
+ /// information as possible, to aid in debugging, and then to exit.
+ ///
+ /// The SignalHandler can be disabled globally by compiling POCO and client
+ /// code with the POCO_NO_SIGNAL_HANDLER macro defined.
+{
+public:
+ SignalHandler();
+ /// Creates the SignalHandler.
+
+ ~SignalHandler();
+ /// Destroys the SignalHandler.
+
+ sigjmp_buf& jumpBuffer();
+ /// Returns the top-most sigjmp_buf for the current thread.
+
+ static void throwSignalException(int sig);
+ /// Throws a SignalException with a textual description
+ /// of the given signal as argument.
+
+ static void install();
+ /// Installs signal handlers for SIGILL, SIGBUS, SIGSEGV
+ /// and SIGSYS.
+
+protected:
+ static void handleSignal(int sig);
+ /// The actual signal handler.
+
+ struct JumpBuffer
+ /// sigjmp_buf cannot be used to instantiate a std::vector,
+ /// so we provide a wrapper struct.
+ {
+ sigjmp_buf buf;
+ };
+ typedef std::vector<JumpBuffer> JumpBufferVec;
+
+ static JumpBufferVec& jumpBufferVec();
+ /// Returns the JumpBufferVec for the current thread.
+
+private:
+ static JumpBufferVec _jumpBufferVec;
+
+ friend class ThreadImpl;
+};
+
+
+#ifndef POCO_NO_SIGNAL_HANDLER
+#define poco_throw_on_signal \
+ Poco::SignalHandler _poco_signalHandler; \
+ int _poco_signal = sigsetjmp(_poco_signalHandler.jumpBuffer(), 1); \
+ if (_poco_signal) _poco_signalHandler.throwSignalException(_poco_signal);
+#else
+#define poco_throw_on_signal
+#endif
+
+
+} // namespace Poco
+
+
+#endif // POCO_OS_FAMILY_UNIX
+
+
+#endif // Foundation_SignalHandler_INCLUDED