timemory 3.3.0
Modular C++ Toolkit for Performance Analysis and Logging. Profiling API and Tools for C, C++, CUDA, Fortran, and Python. The C++ template API is essentially a framework to creating tools: it is designed to provide a unifying interface for recording various performance measurements alongside data logging and interfaces to other tools.
tim::signal_settings Class Reference

#include "timemory/utility/declaration.hpp"

+ Collaboration diagram for tim::signal_settings:

Classes

struct  signals_data
 

Public Types

using signal_set_t = std::set< sys_signal >
 
using signal_function_t = std::function< void(int)>
 

Static Public Member Functions

static bool & allow ()
 
static bool is_active ()
 
static void set_active (bool val)
 
static void enable (const sys_signal &)
 
static void disable (const sys_signal &)
 
static std::string str (const sys_signal &)
 
static std::string str (bool report_disabled=false)
 
static void check_environment ()
 
static void set_exit_action (signal_function_t _f)
 
static void exit_action (int errcode)
 
static signal_set_t get_enabled ()
 
static signal_set_t get_disabled ()
 
static signal_set_t get_default ()
 
static bool & enable_all ()
 
static bool & disable_all ()
 

Static Protected Member Functions

static signals_dataf_signals ()
 

Detailed Description

Definition at line 97 of file declaration.hpp.

Member Typedef Documentation

◆ signal_function_t

using tim::signal_settings::signal_function_t = std::function<void(int)>

Definition at line 101 of file declaration.hpp.

◆ signal_set_t

Definition at line 100 of file declaration.hpp.

Member Function Documentation

◆ allow()

bool & tim::signal_settings::allow ( )
inlinestatic

Definition at line 160 of file declaration.hpp.

161{
162 static bool _instance = true;
163 return _instance;
164}

Referenced by tim::update_signal_detection().

◆ check_environment()

void tim::signal_settings::check_environment ( )
inlinestatic

Definition at line 90 of file signals.hpp.

91{
92 using match_t = std::pair<std::string, sys_signal>;
93
94 auto _list = {
95 match_t("HANGUP", sys_signal::Hangup),
96 match_t("INTERRUPT", sys_signal::Interrupt),
97 match_t("QUIT", sys_signal::Quit),
98 match_t("ILLEGAL", sys_signal::Illegal),
99 match_t("TRAP", sys_signal::Trap),
100 match_t("ABORT", sys_signal::Abort),
101 match_t("EMULATE", sys_signal::Emulate),
102 match_t("FPE", sys_signal::FPE),
103 match_t("KILL", sys_signal::Kill),
104 match_t("BUS", sys_signal::Bus),
105 match_t("SEGFAULT", sys_signal::SegFault),
106 match_t("SYSTEM", sys_signal::System),
107 match_t("PIPE", sys_signal::Pipe),
108 match_t("ALARM", sys_signal::Alarm),
109 match_t("TERMINATE", sys_signal::Terminate),
110 match_t("URGENT", sys_signal::Urgent),
111 match_t("STOP", sys_signal::Stop),
112 match_t("CPUTIME", sys_signal::CPUtime),
113 match_t("FILESIZE", sys_signal::FileSize),
114 match_t("VIRTUALALARM", sys_signal::VirtualAlarm),
115 match_t("PROFILEALARM", sys_signal::ProfileAlarm),
116 match_t("USER1", sys_signal::User1),
117 match_t("USER2", sys_signal::User2),
118 };
119
120 for(const auto& itr : _list)
121 {
122 auto _enable = get_env("SIGNAL_ENABLE_" + itr.first, false);
123 auto _disable = get_env("SIGNAL_DISABLE_" + itr.first, false);
124
125 if(_enable)
126 signal_settings::enable(itr.second);
127 if(_disable)
128 signal_settings::disable(itr.second);
129 }
130
131 if(enable_all())
132 {
133 for(const auto& itr : _list)
134 signal_settings::enable(itr.second);
135 }
136
137 if(disable_all())
138 {
139 for(const auto& itr : _list)
140 signal_settings::disable(itr.second);
141 }
142}
static void enable(const sys_signal &)
Definition: signals.hpp:74
static bool & enable_all()
Definition: signals.hpp:256
static void disable(const sys_signal &)
Definition: signals.hpp:82
static bool & disable_all()
Definition: signals.hpp:264
Tp get_env(const std::string &env_id, Tp _default, bool _store)

References tim::Abort, tim::Alarm, tim::Bus, tim::CPUtime, disable(), disable_all(), tim::Emulate, enable(), enable_all(), tim::FileSize, tim::FPE, tim::get_env(), tim::Hangup, tim::Illegal, tim::Interrupt, tim::Kill, tim::Pipe, tim::ProfileAlarm, tim::Quit, tim::SegFault, tim::Stop, tim::System, tim::Terminate, tim::Trap, tim::Urgent, tim::User1, tim::User2, and tim::VirtualAlarm.

◆ disable()

void tim::signal_settings::disable ( const sys_signal _type)
inlinestatic

Definition at line 82 of file signals.hpp.

83{
84 insert_and_remove(_type, &f_signals().signals_disabled, &f_signals().signals_enabled);
85}
static signals_data & f_signals()
void insert_and_remove(const sys_signal &_type, signal_settings::signal_set_t *_ins, signal_settings::signal_set_t *_rem)
Definition: signals.hpp:58

References f_signals(), and tim::insert_and_remove().

Referenced by check_environment().

◆ disable_all()

bool & tim::signal_settings::disable_all ( )
inlinestatic

Definition at line 264 of file signals.hpp.

References tim::signal_settings::signals_data::disable_all, and f_signals().

Referenced by check_environment().

◆ enable()

void tim::signal_settings::enable ( const sys_signal _type)
inlinestatic

Definition at line 74 of file signals.hpp.

75{
76 insert_and_remove(_type, &f_signals().signals_enabled, &f_signals().signals_disabled);
77}

References f_signals(), and tim::insert_and_remove().

Referenced by check_environment(), and tim::if().

◆ enable_all()

bool & tim::signal_settings::enable_all ( )
inlinestatic

Definition at line 256 of file signals.hpp.

References tim::signal_settings::signals_data::enable_all, and f_signals().

Referenced by check_environment().

◆ exit_action()

void tim::signal_settings::exit_action ( int  errcode)
inlinestatic

Definition at line 288 of file signals.hpp.

289{
290 f_signals().signals_exit_func(errcode);
291}

References f_signals(), and tim::signal_settings::signals_data::signals_exit_func.

◆ f_signals()

static signals_data & tim::signal_settings::f_signals ( )
inlinestaticprotected

Definition at line 150 of file declaration.hpp.

151 {
152 static signal_settings::signals_data instance{};
153 return instance;
154 }

Referenced by disable(), disable_all(), enable(), enable_all(), exit_action(), get_default(), get_disabled(), get_enabled(), is_active(), set_active(), and set_exit_action().

◆ get_default()

signal_settings::signal_set_t tim::signal_settings::get_default ( )
inlinestatic

Definition at line 312 of file signals.hpp.

313{
314 return f_signals().signals_default;
315}

References f_signals(), and tim::signal_settings::signals_data::signals_default.

Referenced by tim::if().

◆ get_disabled()

signal_settings::signal_set_t tim::signal_settings::get_disabled ( )
inlinestatic

Definition at line 304 of file signals.hpp.

305{
307}

References f_signals(), and tim::signal_settings::signals_data::signals_disabled.

◆ get_enabled()

signal_settings::signal_set_t tim::signal_settings::get_enabled ( )
inlinestatic

Definition at line 296 of file signals.hpp.

297{
298 return f_signals().signals_enabled;
299}

References f_signals(), and tim::signal_settings::signals_data::signals_enabled.

Referenced by tim::if().

◆ is_active()

bool tim::signal_settings::is_active ( )
inlinestatic

◆ set_active()

void tim::signal_settings::set_active ( bool  val)
inlinestatic

Definition at line 272 of file signals.hpp.

273{
275}

References f_signals(), and tim::signal_settings::signals_data::signals_active.

◆ set_exit_action()

void tim::signal_settings::set_exit_action ( signal_function_t  _f)
inlinestatic

Definition at line 280 of file signals.hpp.

281{
282 f_signals().signals_exit_func = std::move(_f);
283}

References f_signals(), and tim::signal_settings::signals_data::signals_exit_func.

Referenced by tim::if().

◆ str() [1/2]

std::string tim::signal_settings::str ( bool  report_disabled = false)
inlinestatic

Definition at line 212 of file signals.hpp.

213{
214 std::stringstream ss;
215 auto spacer = []() { return " "; };
216
217#if defined(SIGNAL_AVAILABLE)
218
219 ss << std::endl
220 << spacer() << "Signal detection activated. Signal exception settings:\n"
221 << std::endl;
222
223 if(report_disabled)
224 ss << spacer() << "Enabled:" << std::endl;
225 for(const auto& itr : f_signals().signals_enabled)
226 ss << spacer() << spacer() << signal_settings::str(itr) << '\n';
227
228 if(report_disabled)
229 {
230 ss << "\n" << spacer() << "Disabled:" << std::endl;
231 for(const auto& itr : f_signals().signals_disabled)
232 ss << spacer() << spacer() << signal_settings::str(itr) << '\n';
233 }
234
235#else
236
237 ss << std::endl << spacer() << "Signal detection not available" << std::endl;
238
239 (void) report_disabled;
240#endif
241
242 return ss.str();
243}
static std::string str(const sys_signal &)
Definition: signals.hpp:147

◆ str() [2/2]

std::string tim::signal_settings::str ( const sys_signal _type)
inlinestatic

Definition at line 147 of file signals.hpp.

148{
149 using descript_tuple_t = std::tuple<std::string, int, std::string>;
150
151 std::stringstream ss;
152 auto _descript = [&](const descript_tuple_t& _data) {
153 ss << " Signal: " << std::setw(10) << std::get<0>(_data)
154 << " (error code: " << std::setw(3) << std::get<1>(_data) << ") "
155 << std::setw(40) << std::get<2>(_data);
156 };
157
158 // some of these signals are not handled but added in case they are
159 // enabled in the future
160 static std::vector<descript_tuple_t> descript_data = {
161 descript_tuple_t("SIGHUP", SIGHUP, "terminal line hangup"),
162 descript_tuple_t("SIGINT", SIGINT, "interrupt program"),
163 descript_tuple_t("SIGQUIT", SIGQUIT, "quit program"),
164 descript_tuple_t("SIGILL", SIGILL, "illegal instruction"),
165 descript_tuple_t("SIGTRAP", SIGTRAP, "trace trap"),
166 descript_tuple_t("SIGABRT", SIGABRT, "abort program (formerly SIGIOT)"),
167 descript_tuple_t("SIGEMT", SIGEMT, "emulate instruction executed"),
168 descript_tuple_t("SIGFPE", SIGFPE, "floating-point exception"),
169 descript_tuple_t("SIGKILL", SIGKILL, "kill program"),
170 descript_tuple_t("SIGBUS", SIGBUS, "bus error"),
171 descript_tuple_t("SIGSEGV", SIGSEGV, "segmentation violation"),
172 descript_tuple_t("SIGSYS", SIGSYS, "non-existent system call invoked"),
173 descript_tuple_t("SIGPIPE", SIGPIPE, "write on a pipe with no reader"),
174 descript_tuple_t("SIGALRM", SIGALRM, "real-time timer expired"),
175 descript_tuple_t("SIGTERM", SIGTERM, "software termination signal"),
176 descript_tuple_t("SIGURG", SIGURG, "urgent condition present on socket"),
177 descript_tuple_t("SIGSTOP", SIGSTOP, "stop (cannot be caught or ignored)"),
178 descript_tuple_t("SIGTSTP", SIGTSTP, "stop signal generated from keyboard"),
179 descript_tuple_t("SIGCONT", SIGCONT, "continue after stop"),
180 descript_tuple_t("SIGCHLD", SIGCHLD, "child status has changed"),
181 descript_tuple_t("SIGTTIN", SIGTTIN,
182 "background read attempted from control terminal"),
183 descript_tuple_t("SIGTTOU", SIGTTOU,
184 "background write attempted to control terminal"),
185 descript_tuple_t("SIGIO ", SIGIO, "I/O is possible on a descriptor"),
186 descript_tuple_t("SIGXCPU", SIGXCPU, "cpu time limit exceeded"),
187 descript_tuple_t("SIGXFSZ", SIGXFSZ, "file size limit exceeded"),
188 descript_tuple_t("SIGVTALRM", SIGVTALRM, "virtual time alarm"),
189 descript_tuple_t("SIGPROF", SIGPROF, "profiling timer alarm"),
190 descript_tuple_t("SIGWINCH", SIGWINCH, "Window size change"),
191 descript_tuple_t("SIGINFO", SIGINFO, "status request from keyboard"),
192 descript_tuple_t("SIGUSR1", SIGUSR1, "User defined signal 1"),
193 descript_tuple_t("SIGUSR2", SIGUSR2, "User defined signal 2")
194 };
195
196 int key = (int) _type;
197 for(const auto& itr : descript_data)
198 {
199 if(std::get<1>(itr) == key)
200 {
201 _descript(itr);
202 break;
203 }
204 }
205
206 return ss.str();
207}

Referenced by tim::if().


The documentation for this class was generated from the following files: