X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fstructure%2Fsubsystem_mgr.cxx;h=df2c0ef38349bcc60f124a6b9869ae3da07e9574;hb=0908f867145683be76d2c26274451a44a7b1d5b0;hp=387d097a091bd855ebfe189aeb38b092135ded59;hpb=5f2f95676c4b46e0c2ef3764baa2fd8c87abd238;p=simgear.git diff --git a/simgear/structure/subsystem_mgr.cxx b/simgear/structure/subsystem_mgr.cxx index 387d097a..df2c0ef3 100644 --- a/simgear/structure/subsystem_mgr.cxx +++ b/simgear/structure/subsystem_mgr.cxx @@ -1,3 +1,26 @@ +// Written by David Megginson, started 2000-12 +// +// Copyright (C) 2000 David Megginson, david@megginson.com +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// $Id$ + +#ifdef HAVE_CONFIG_H +# include +#endif #include #include @@ -6,13 +29,16 @@ #include "subsystem_mgr.hxx" #include +#include "SGSmplstat.hxx" +const int SG_MAX_SUBSYSTEM_EXCEPTIONS = 4; -const int SG_MAX_SUBSYSTEM_EXCEPTIONS = 4; //////////////////////////////////////////////////////////////////////// // Implementation of SGSubsystem //////////////////////////////////////////////////////////////////////// +SGSubsystemTimingCb SGSubsystem::reportTimingCb = NULL; +void* SGSubsystem::reportTimingUserData = NULL; SGSubsystem::SGSubsystem () : _suspended(false) @@ -77,28 +103,6 @@ SGSubsystem::is_suspended () const return _suspended; } - -void -SGSubsystem::printTimingInformation () -{ - SGTimeStamp startTime; - for ( eventTimeVecIterator i = timingInfo.begin(); - i != timingInfo.end(); - i++) { - if (i == timingInfo.begin()) { - startTime = i->getTime(); - } else { - SGTimeStamp endTime = i->getTime(); - SG_LOG(SG_GENERAL, SG_ALERT, "- Getting to timestamp : " - << i->getName() << " takes " << endTime - startTime - << " sec."); - startTime = endTime; - } - } -} - - - void SGSubsystem::stamp(const string& name) { timingInfo.push_back(TimingInfo(name, SGTimeStamp::now())); @@ -109,6 +113,30 @@ void SGSubsystem::stamp(const string& name) // Implementation of SGSubsystemGroup. //////////////////////////////////////////////////////////////////////// +class SGSubsystemGroup::Member +{ +private: + Member (const Member &member); +public: + Member (); + virtual ~Member (); + + virtual void update (double delta_time_sec); + + void reportTiming(void) { if (reportTimingCb) reportTimingCb(reportTimingUserData, name, &timeStat); } + void updateExecutionTime(double time) { timeStat += time;} + + SampleStatistic timeStat; + std::string name; + SGSubsystem * subsystem; + double min_step_sec; + double elapsed_sec; + bool collectTimeStats; + int exceptionCount; +}; + + + SGSubsystemGroup::SGSubsystemGroup () : _fixedUpdateTime(-1.0), _updateTimeRemainder(0.0) @@ -120,7 +148,6 @@ SGSubsystemGroup::~SGSubsystemGroup () // reverse order to prevent order dependency problems for (unsigned int i = _members.size(); i > 0; i--) { - _members[i-1]->printTimingStatistics(); delete _members[i-1]; } } @@ -183,28 +210,31 @@ SGSubsystemGroup::update (double delta_time_sec) delta_time_sec = _fixedUpdateTime; } + bool recordTime = (reportTimingCb != NULL); + SGTimeStamp timeStamp; while (loopCount-- > 0) { for (unsigned int i = 0; i < _members.size(); i++) { - SGTimeStamp timeStamp = SGTimeStamp::now(); - _members[i]->update(delta_time_sec); // indirect call - timeStamp = timeStamp - SGTimeStamp::now(); - double b = timeStamp.toUSecs(); - _members[i]->updateExecutionTime(b); - double threshold = _members[i]->getTimeWarningThreshold(); - if (( b > threshold ) && (b > 10000)) { - _members[i]->printTimingInformation(b); - } + if (recordTime) + timeStamp = SGTimeStamp::now(); + + _members[i]->update(delta_time_sec); // indirect call + + if ((recordTime)&&(reportTimingCb)) + { + timeStamp = SGTimeStamp::now() - timeStamp; + _members[i]->updateExecutionTime(timeStamp.toUSecs()); + } } } // of multiple update loop } -void -SGSubsystemGroup::collectDebugTiming(bool collect) +void +SGSubsystemGroup::reportTiming(void) { - for (unsigned int i = 0; i < _members.size(); i++) + for (unsigned int i = _members.size(); i > 0; i--) { - _members[i]->collectDebugTiming(collect); + _members[i-1]->reportTiming(); } } @@ -267,26 +297,6 @@ SGSubsystemGroup::set_fixed_update_time(double dt) _fixedUpdateTime = dt; } -void -SGSubsystemGroup::Member::printTimingStatistics () -{ - if (collectTimeStats) { - double minTime = timeStat.min() / 1000; - double maxTime = timeStat.max() / 1000; - double meanTime = timeStat.mean() / 1000; - double stddev = timeStat.stdDev() / 1000; - - char buffer[256]; - snprintf(buffer, 256, "Timing summary for %20s.\n" - "- mean time: %04.2f ms.\n" - "- min time : %04.2f ms.\n" - "- max time : %04.2f ms.\n" - "- stddev : %04.2f ms.\n", name.c_str(), meanTime, minTime, maxTime, stddev); - SG_LOG(SG_GENERAL, SG_ALERT, buffer); - } -} - - bool SGSubsystemGroup::has_subsystem (const string &name) const { @@ -321,7 +331,6 @@ SGSubsystemGroup::Member::Member () subsystem(0), min_step_sec(0), elapsed_sec(0), - collectTimeStats(false), exceptionCount(0) { } @@ -364,31 +373,6 @@ SGSubsystemGroup::Member::update (double delta_time_sec) } -void -SGSubsystemGroup::Member::printTimingInformation(double time) -{ - if (collectTimeStats) { - SG_LOG(SG_GENERAL, SG_ALERT, "Subsystem Timing Alert : " << time << " " << name); - subsystem->printTimingInformation(); - } -} - -double SGSubsystemGroup::Member::getTimeWarningThreshold() -{ - return (timeStat.mean() + 3 * timeStat.stdDev()); -} - -void SGSubsystemGroup::Member::updateExecutionTime(double time) -{ - if (collectTimeStats) { - timeStat += time; - } -} - - - - - //////////////////////////////////////////////////////////////////////// // Implementation of SGSubsystemMgr. //////////////////////////////////////////////////////////////////////// @@ -465,14 +449,6 @@ SGSubsystemMgr::update (double delta_time_sec) } } -void -SGSubsystemMgr::collectDebugTiming(bool collect) -{ - for (int i = 0; i < MAX_GROUPS; i++) { - _groups[i]->collectDebugTiming(collect); - } -} - void SGSubsystemMgr::suspend () { @@ -547,4 +523,13 @@ SGSubsystemMgr::get_subsystem (const string &name) const return s->second; } -// end of fgfs.cxx +/** Trigger the timing callback to report data for all subsystems. */ +void +SGSubsystemMgr::reportTiming() +{ + for (int i = 0; i < MAX_GROUPS; i++) { + _groups[i]->reportTiming(); + } // of groups iteration +} + +// end of subsystem_mgr.cxx