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