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
00028 requestStop();
00029
00030
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 }