X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fstructure%2Fsubsystem_mgr.hxx;h=a0e76809c8a3522ddff53b49927248442ab21eff;hb=0a08ee836c817701dc4297d371e3e0a4662d470d;hp=60313fd4a3543a8f723f233dc66c660a0ecd2951;hpb=08ad449774b0b80dc19b7a55d82dc25a71ce1415;p=simgear.git diff --git a/simgear/structure/subsystem_mgr.hxx b/simgear/structure/subsystem_mgr.hxx index 60313fd4..a0e76809 100644 --- a/simgear/structure/subsystem_mgr.hxx +++ b/simgear/structure/subsystem_mgr.hxx @@ -1,3 +1,4 @@ + // Written by David Megginson, started 2000-12 // // Copyright (C) 2000 David Megginson, david@megginson.com @@ -31,7 +32,6 @@ #include #include -#include "SGSmplstat.hxx" class TimingInfo @@ -48,9 +48,12 @@ public: const SGTimeStamp& getTime() const { return time; } }; +class SampleStatistic; + typedef std::vector eventTimeVec; typedef std::vector::iterator eventTimeVecIterator; +typedef void (*SGSubsystemTimingCb)(void* userData, const std::string& name, SampleStatistic* pStatistic); /** @@ -227,7 +230,7 @@ public: /** - * Suspend or resum operation of this subsystem. + * Suspend or resume operation of this subsystem. * * @param suspended true if the subsystem should be suspended, false * otherwise. @@ -253,43 +256,25 @@ public: */ virtual bool is_suspended () const; - /** - * Keep track of execution time. - * - *

This method keeps track of timing statistics for each subsystem.

- * - * @param time execution time in ms of last call. + * Trigger the callback to report timing information for all subsystems. */ - void updateExecutionTime(double time); - - /** - * Print details of execution time. - * - *

For debugging purposes, developers can place stamp() calls - * at strategic points in the update() function of each subsystem, which - * record the time between the successive calls to stamp. This method, - * printExecutionTime() is called after exectution of the subsystem - * update function itself to conduct a post-hoc analysis of excecution - * time

- */ - void printTimingInformation(); + void reportTiming(void); /** * Place time stamps at strategic points in the execution of subsystems * update() member functions. Predominantly for debugging purposes. */ void stamp(const std::string& name); - - protected: bool _suspended; eventTimeVec timingInfo; - //int test; + static SGSubsystemTimingCb reportTimingCb; + static void* reportTimingUserData; }; @@ -322,40 +307,16 @@ public: virtual void remove_subsystem (const std::string &name); virtual bool has_subsystem (const std::string &name) const; - void collectDebugTiming(bool collect); - void printTimingStatistics(double minMaxTime=0.0,double minJitter=0.0); + void reportTiming(void); /** - * + * */ void set_fixed_update_time(double fixed_dt); private: - class Member { - - private: - Member (const Member &member); - public: - Member (); - virtual ~Member (); - - virtual void update (double delta_time_sec); - void printTimingInformation(double time); - void printTimingStatistics(double minMaxTime=0.0,double minJitter=0.0); - void updateExecutionTime(double time); - double getTimeWarningThreshold(); - void collectDebugTiming (bool collect) { collectTimeStats = collect; }; - - SampleStatistic timeStat; - std::string name; - SGSubsystem * subsystem; - double min_step_sec; - double elapsed_sec; - bool collectTimeStats; - int exceptionCount; - }; - - Member * get_member (const std::string &name, bool create = false); + class Member; + Member* get_member (const std::string &name, bool create = false); std::vector _members; @@ -392,9 +353,10 @@ public: enum GroupType { INIT = 0, GENERAL, - FDM, ///< flight model, autopilot, instruments that run coupled + FDM, ///< flight model, autopilot, instruments that run coupled POST_FDM, ///< certain subsystems depend on FDM data DISPLAY, ///< view, camera, rendering updates + SOUND/*I want to be last!*/, ///< needs to run AFTER display, to allow concurrent GPU/sound processing MAX_GROUPS }; @@ -427,16 +389,14 @@ public: virtual SGSubsystem * get_subsystem(const std::string &name) const; - void collectDebugTiming(bool collect); - void printTimingStatistics(double minMaxTime=0.0,double minJitter=0.0); + void reportTiming(); + void setReportTimingCb(void* userData,SGSubsystemTimingCb cb) {reportTimingCb = cb;reportTimingUserData = userData;} private: - SGSubsystemGroup* _groups[MAX_GROUPS]; - + typedef std::map SubsystemDict; SubsystemDict _subsystem_map; - };