31 #include "fastjet/LimitedWarning.hh" 
   37 FASTJET_BEGIN_NAMESPACE
 
   39 #ifdef FASTJET_HAVE_LIMITED_THREAD_SAFETY 
   40 atomic<ostream *> LimitedWarning::_default_ostr{&cerr};
 
   41 atomic<int> LimitedWarning::_max_warn_default{5};
 
   42 std::mutex LimitedWarning::_global_warnings_summary_mutex;
 
   44 ostream * LimitedWarning::_default_ostr = &cerr;
 
   45 int LimitedWarning::_max_warn_default = 5;
 
   46 #endif // FASTJET_HAVE_LIMITED_THREAD_SAFETY 
   48 std::list< LimitedWarning::Summary > LimitedWarning::_global_warnings_summary;
 
   57 int LimitedWarning::n_warn_so_far()
 const{
 
   61   if (((LimitedWarning::Summary *)_this_warning_summary) == 0) 
return 0;
 
   62   return (*_this_warning_summary).second;
 
   66 void LimitedWarning::warn(
const char * warning, std::ostream * ostr) {
 
   68   if (((LimitedWarning::Summary *)_this_warning_summary) == 0){
 
   69 #ifdef FASTJET_HAVE_LIMITED_THREAD_SAFETY 
   78     std::lock_guard<std::mutex> guard(_global_warnings_summary_mutex);
 
   83     if (((LimitedWarning::Summary *)_this_warning_summary) == 0){
 
   85       _global_warnings_summary.push_back(Summary(warning, 0));
 
   86       _this_warning_summary = & (_global_warnings_summary.back());
 
   91     _global_warnings_summary.push_back(Summary(warning, 0));
 
   92     _this_warning_summary = & (_global_warnings_summary.back());
 
   93 #endif // FASTJET_HAVE_LIMITED_THREAD_SAFETY 
   98   unsigned int count = (*_this_warning_summary).second.step();
 
  101   if ((_max_warn<0) || (count < (
unsigned int)_max_warn)) {
 
  103     ostringstream warnstr;
 
  104     warnstr << 
"WARNING from FastJet: ";
 
  106     if ((_max_warn>0) && (count+1 == (
unsigned int)_max_warn))
 
  107       warnstr << 
" (LAST SUCH WARNING)";
 
  108     warnstr << std::endl;
 
  113       (*ostr) << warnstr.str();
 
  121 string LimitedWarning::summary() {
 
  123 #ifdef FASTJET_HAVE_LIMITED_THREAD_SAFETY 
  129     std::lock_guard<std::mutex> guard(_global_warnings_summary_mutex);
 
  131   for (list<Summary>::const_iterator it = _global_warnings_summary.begin();
 
  132        it != _global_warnings_summary.end(); it++) {
 
  133     str << it->second << 
" times: " << it->first << endl;
 
  135 #ifdef FASTJET_HAVE_LIMITED_THREAD_SAFETY 
  141 FASTJET_END_NAMESPACE