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