31 #include "fastjet/Error.hh"
32 #include "fastjet/config.h"
37 #ifdef FASTJET_HAVE_EXECINFO_H
40 #ifdef FASTJET_HAVE_DEMANGLING_SUPPORT
43 #endif // FASTJET_HAVE_DEMANGLING_SUPPORT
44 #endif // FASTJET_HAVE_EXECINFO_H
47 FASTJET_BEGIN_NAMESPACE
51 #ifdef FASTJET_HAVE_LIMITED_THREAD_SAFETY
52 atomic<bool> Error::_print_errors{
true};
53 atomic<bool> Error::_print_backtrace{
false};
54 atomic<ostream *> Error::_default_ostr{& cerr};
56 bool Error::_print_errors =
true;
57 bool Error::_print_backtrace =
false;
58 ostream * Error::_default_ostr = & cerr;
59 #endif // FASTJET_HAVE_LIMITED_THREAD_SAFETY
61 #if (!defined(FASTJET_HAVE_EXECINFO_H)) || defined(__FJCORE__)
62 LimitedWarning Error::_execinfo_undefined;
71 #if defined(FASTJET_HAVE_EXECINFO_H) && defined(FASTJET_HAVE_DEMANGLING_SUPPORT)
85 string Error::_demangle(
const char* symbol) {
98 if (1 == sscanf(symbol,
"%*[^(]%*[^_]%127[^)+]", temp)) {
100 if (NULL != (demangled = abi::__cxa_demangle(temp, NULL, &size, &status))) {
101 string result(demangled);
107 if (1 == sscanf(symbol,
"%127s", temp)) {
114 #endif // FASTJET_HAVE_DEMANGLING_SUPPORT && FASTJET_HAVE_EXECINFO_H
119 Error::Error(
const std::string & message_in) {
120 _message = message_in;
126 ostream* ostr = _default_ostr;
127 if (_print_errors && ostr){
129 oss <<
"fastjet::Error: "<< message_in << endl;
133 #ifdef FASTJET_HAVE_EXECINFO_H
134 if (_print_backtrace){
138 int size = backtrace(array, 10);
139 messages = backtrace_symbols(array, size);
141 oss <<
"stack:" << endl;
142 for (
int i = 1; i < size && messages != NULL; ++i){
143 #ifdef FASTJET_HAVE_DEMANGLING_SUPPORT
144 oss <<
" #" << i <<
": " << _demangle(messages[i])
145 <<
" [" << messages[i] <<
"]" << endl;
147 oss <<
" #" << i <<
": " << messages[i] << endl;
152 #endif // FASTJET_HAVE_EXECINFO_H
171 void Error::set_print_backtrace(
bool enabled) {
172 #if (!defined(FASTJET_HAVE_EXECINFO_H)) || defined(__FJCORE__)
174 _execinfo_undefined.warn(
"Error::set_print_backtrace(true) will not work with this build of FastJet");
177 _print_backtrace = enabled;
180 FASTJET_END_NAMESPACE