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