X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fstructure%2Fsubsystem_mgr.hxx;h=1919db4b458d1a116a88a4bd2b8b37e9315ac86b;hb=b0063f8db67066c1ad4d9481c33b4627a1c51d3b;hp=f1e2ad9af5e1ef0a0df572ba1aa30e28f22a35d9;hpb=63ccb3df4c195124acb660c2ac7e11a42677476a;p=simgear.git diff --git a/simgear/structure/subsystem_mgr.hxx b/simgear/structure/subsystem_mgr.hxx index f1e2ad9a..1919db4b 100644 --- a/simgear/structure/subsystem_mgr.hxx +++ b/simgear/structure/subsystem_mgr.hxx @@ -32,7 +32,7 @@ #include #include - +#include 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); /** @@ -147,6 +150,13 @@ public: */ virtual void init (); + typedef enum + { + INIT_DONE, ///< subsystem is fully initialised + INIT_CONTINUE ///< init should be called again + } InitStatus; + + virtual InitStatus incrementalInit (); /** * Initialize parts that depend on other subsystems having been initialized. @@ -227,7 +237,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 +263,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; }; @@ -304,7 +296,8 @@ public: SGSubsystemGroup (); virtual ~SGSubsystemGroup (); - virtual void init (); + virtual void init(); + virtual InitStatus incrementalInit (); virtual void postinit (); virtual void reinit (); virtual void shutdown (); @@ -322,13 +315,18 @@ 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); + + /** + * retrive list of member subsystem names + */ + string_list member_names() const; + private: class Member; @@ -338,6 +336,9 @@ private: double _fixedUpdateTime; double _updateTimeRemainder; + + /// index of the member we are currently init-ing + unsigned int _initPosition; }; @@ -369,9 +370,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 }; @@ -379,6 +381,7 @@ public: virtual ~SGSubsystemMgr (); virtual void init (); + virtual InitStatus incrementalInit (); virtual void postinit (); virtual void reinit (); virtual void shutdown (); @@ -404,16 +407,15 @@ 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]; - + unsigned int _initPosition; + typedef std::map SubsystemDict; SubsystemDict _subsystem_map; - };