$treeview $search $mathjax $extrastylesheet
artdaq_core
v3_04_20a
$projectbrief
|
$projectbrief
|
$searchbox |
00001 #include "artdaq-core/Core/StatisticsCollection.hh" 00002 #include <iostream> 00003 00004 namespace artdaq 00005 { 00006 StatisticsCollection& StatisticsCollection::getInstance() 00007 { 00008 static StatisticsCollection singletonInstance; 00009 return singletonInstance; 00010 } 00011 00012 StatisticsCollection::StatisticsCollection() : calculationInterval_(1.0) 00013 { 00014 thread_stop_requested_ = false; 00015 try { 00016 calculation_thread_ = std::make_unique<boost::thread>(boost::bind(&StatisticsCollection::run, this)); 00017 } 00018 catch (const boost::exception& e) 00019 { 00020 std::cerr << "Caught boost::exception starting Statistics Collection thread: " << boost::diagnostic_information(e) << ", errno=" << errno << std::endl; 00021 exit(5); 00022 } 00023 } 00024 00025 StatisticsCollection::~StatisticsCollection() noexcept 00026 { 00027 // stop and clean up the thread 00028 requestStop(); 00029 00030 // Having issues where ~StatisticsCollection is being called from within thread due to signal handlers 00031 if(calculation_thread_ && calculation_thread_->joinable() && calculation_thread_->get_id() != boost::this_thread::get_id()) calculation_thread_->join(); 00032 } 00033 00034 void StatisticsCollection:: 00035 addMonitoredQuantity(const std::string& name, 00036 MonitoredQuantityPtr mqPtr) 00037 { 00038 std::lock_guard<std::mutex> scopedLock(map_mutex_); 00039 monitoredQuantityMap_[name] = mqPtr; 00040 } 00041 00042 MonitoredQuantityPtr 00043 StatisticsCollection::getMonitoredQuantity(const std::string& name) const 00044 { 00045 std::lock_guard<std::mutex> scopedLock(map_mutex_); 00046 MonitoredQuantityPtr emptyResult; 00047 std::map<std::string, MonitoredQuantityPtr>::const_iterator iter; 00048 iter = monitoredQuantityMap_.find(name); 00049 if (iter == monitoredQuantityMap_.end()) { return emptyResult; } 00050 return iter->second; 00051 } 00052 00053 void StatisticsCollection::reset() 00054 { 00055 std::lock_guard<std::mutex> scopedLock(map_mutex_); 00056 std::map<std::string, MonitoredQuantityPtr>::const_iterator iter; 00057 std::map<std::string, MonitoredQuantityPtr>::const_iterator iterEnd; 00058 iterEnd = monitoredQuantityMap_.end(); 00059 for (iter = monitoredQuantityMap_.begin(); iter != iterEnd; ++iter) 00060 { 00061 iter->second->reset(); 00062 } 00063 } 00064 00065 void StatisticsCollection::requestStop() 00066 { 00067 thread_stop_requested_ = true; 00068 } 00069 00070 void StatisticsCollection::run() 00071 { 00072 while (!thread_stop_requested_) 00073 { 00074 long useconds = static_cast<long>(calculationInterval_ * 1000000); 00075 usleep(useconds); 00076 { 00077 std::lock_guard<std::mutex> scopedLock(map_mutex_); 00078 std::map<std::string, MonitoredQuantityPtr>::const_iterator iter; 00079 std::map<std::string, MonitoredQuantityPtr>::const_iterator iterEnd; 00080 iterEnd = monitoredQuantityMap_.end(); 00081 for (iter = monitoredQuantityMap_.begin(); iter != iterEnd; ++iter) 00082 { 00083 iter->second->calculateStatistics(); 00084 } 00085 } 00086 } 00087 } 00088 }