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