00001 #include "artdaq-core/Core/StatisticsCollection.hh"
00002
00003 namespace artdaq
00004 {
00005 StatisticsCollection& StatisticsCollection::getInstance()
00006 {
00007 static StatisticsCollection singletonInstance;
00008 return singletonInstance;
00009 }
00010
00011 StatisticsCollection::StatisticsCollection() : calculationInterval_(1.0)
00012 {
00013 thread_stop_requested_ = false;
00014 calculation_thread_ = std::make_unique<std::thread>(std::bind(&StatisticsCollection::run, this));
00015 }
00016
00017 StatisticsCollection::~StatisticsCollection() noexcept
00018 {
00019
00020 requestStop();
00021 calculation_thread_->join();
00022 }
00023
00024 void StatisticsCollection::
00025 addMonitoredQuantity(const std::string& name,
00026 MonitoredQuantityPtr mqPtr)
00027 {
00028 std::lock_guard<std::mutex> scopedLock(map_mutex_);
00029 monitoredQuantityMap_[name] = mqPtr;
00030 }
00031
00032 MonitoredQuantityPtr
00033 StatisticsCollection::getMonitoredQuantity(const std::string& name) const
00034 {
00035 std::lock_guard<std::mutex> scopedLock(map_mutex_);
00036 MonitoredQuantityPtr emptyResult;
00037 std::map<std::string, MonitoredQuantityPtr>::const_iterator iter;
00038 iter = monitoredQuantityMap_.find(name);
00039 if (iter == monitoredQuantityMap_.end()) { return emptyResult; }
00040 return iter->second;
00041 }
00042
00043 void StatisticsCollection::reset()
00044 {
00045 std::lock_guard<std::mutex> scopedLock(map_mutex_);
00046 std::map<std::string, MonitoredQuantityPtr>::const_iterator iter;
00047 std::map<std::string, MonitoredQuantityPtr>::const_iterator iterEnd;
00048 iterEnd = monitoredQuantityMap_.end();
00049 for (iter = monitoredQuantityMap_.begin(); iter != iterEnd; ++iter)
00050 {
00051 iter->second->reset();
00052 }
00053 }
00054
00055 void StatisticsCollection::requestStop()
00056 {
00057 thread_stop_requested_ = true;
00058 }
00059
00060 void StatisticsCollection::run()
00061 {
00062 while (!thread_stop_requested_)
00063 {
00064 long useconds = static_cast<long>(calculationInterval_ * 1000000);
00065 usleep(useconds);
00066 {
00067 std::lock_guard<std::mutex> scopedLock(map_mutex_);
00068 std::map<std::string, MonitoredQuantityPtr>::const_iterator iter;
00069 std::map<std::string, MonitoredQuantityPtr>::const_iterator iterEnd;
00070 iterEnd = monitoredQuantityMap_.end();
00071 for (iter = monitoredQuantityMap_.begin(); iter != iterEnd; ++iter)
00072 {
00073 iter->second->calculateStatistics();
00074 }
00075 }
00076 }
00077 }
00078 }