Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
Signals.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#include "Stroika/Foundation/StroikaPreComp.h"
5
8
9#include "Signals.h"
10
11using namespace Stroika::Foundation;
13using namespace Stroika::Foundation::Execution;
14using namespace Stroika::Foundation::Memory;
15
16/*
17 ********************************************************************************
18 ************************** Execution::SignalToName *****************************
19 ********************************************************************************
20 */
21Characters::String Execution::SignalToName (SignalID signal)
22{
23 switch (signal) {
24 case SIGINT:
25 return "SIGINT"sv;
26 case SIGILL:
27 return "SIGILL"sv;
28 case SIGSEGV:
29 return "SIGSEGV"sv;
30#if defined(SIGTRAP)
31 case SIGTRAP:
32 return "SIGTRAP"sv;
33#endif
34 case SIGABRT:
35 return "SIGABRT"sv;
36 case SIGFPE:
37 return "SIGFPE"sv;
38#if defined(SIGSYS)
39 case SIGSYS:
40 return "SIGSYS"sv;
41#endif
42#if defined(SIGBUS)
43 case SIGBUS:
44 return "SIGBUS"sv;
45#endif
46#if defined(SIGUSR1)
47 case SIGUSR1:
48 return "SIGUSR1"sv;
49#endif
50#if defined(SIGUSR2)
51 case SIGUSR2:
52 return "SIGUSR2"sv;
53#endif
54#if defined(SIGHUP)
55 case SIGHUP:
56 return "SIGHUP"sv;
57#endif
58 case SIGTERM:
59 return "SIGTERM"sv;
60#if defined(SIGPIPE)
61 case SIGPIPE:
62 return "SIGPIPE"sv;
63#endif
64#if defined(SIGQUIT)
65 case SIGQUIT:
66 return "SIGQUIT"sv;
67#endif
68#if defined(SIGXCPU)
69 case SIGXCPU:
70 return "SIGXCPU"sv;
71#endif
72#if defined(SIGXFSZ)
73 case SIGXFSZ:
74 return "SIGXFSZ"sv;
75#endif
76
77 default:
78 return "Signal# {}"_f(signal);
79 }
80}
81
82/*
83 ********************************************************************************
84 **************************** Execution::SendSignal *****************************
85 ********************************************************************************
86 */
87errno_t Execution::SendSignal ([[maybe_unused]] std::thread::native_handle_type target, [[maybe_unused]] SignalID signal)
88{
89#if qStroika_Foundation_Common_Platform_POSIX
91 Stroika_Foundation_Debug_OptionalizeTraceArgs ("Stroika::Foundation::Execution::Signals::Execution::SendSignal",
92 "target = {:x} signal = {}"_f, (unsigned long long)(target), SignalToName (signal))};
93#else
95 "Stroika::Foundation::Execution::Signals::Execution::SendSignal", "signal = {}"_f, SignalToName (signal))};
96#endif
97#if qStroika_Foundation_Common_Platform_POSIX
98 errno_t e = ::pthread_kill (target, signal);
99 Verify (e == 0 or e == ESRCH);
100 if (e != 0) {
101 DbgTrace ("pthread_kill returned error {}"_f, e); // ESRCH can be OK, for example if abort sent to thread that already terminated
102 }
103 return e;
104#else
106 return 0;
107#endif
108}
#define AssertNotImplemented()
Definition Assertions.h:401
#define Verify(c)
Definition Assertions.h:419
#define DbgTrace
Definition Trace.h:309
#define Stroika_Foundation_Debug_OptionalizeTraceArgs(...)
Definition Trace.h:270
String is like std::u32string, except it is much easier to use, often much more space efficient,...
Definition String.h:201
errno_t SendSignal(thread::native_handle_type target, SignalID signal)