X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fstructure%2Fsubsystem_mgr.hxx;h=1919db4b458d1a116a88a4bd2b8b37e9315ac86b;hb=a60d293759ef26d03d3dc7198561808e56db9b61;hp=212ce58455330b4d2db7e0e48ea6c3758d08f344;hpb=df19feac3472535149885c91cc7b1751caca0b68;p=simgear.git diff --git a/simgear/structure/subsystem_mgr.hxx b/simgear/structure/subsystem_mgr.hxx index 212ce584..1919db4b 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 @@ -29,10 +30,9 @@ #include #include -#include #include -#include "SGSmplstat.hxx" - +#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. @@ -169,6 +179,16 @@ public: virtual void reinit (); + /** + * Shutdown the subsystem. + * + *

Release any state associated with subsystem. Shutdown happens in + * the reverse order to init(), so this is the correct place to do + * shutdown that depends on other subsystems. + *

+ */ + virtual void shutdown (); + /** * Acquire the subsystem's property bindings. * @@ -217,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. @@ -243,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; }; @@ -294,9 +296,11 @@ public: SGSubsystemGroup (); virtual ~SGSubsystemGroup (); - virtual void init (); + virtual void init(); + virtual InitStatus incrementalInit (); virtual void postinit (); virtual void reinit (); + virtual void shutdown (); virtual void bind (); virtual void unbind (); virtual void update (double delta_time_sec); @@ -311,44 +315,30 @@ public: virtual void remove_subsystem (const std::string &name); virtual bool has_subsystem (const std::string &name) const; - void collectDebugTiming(bool collect); + 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 { - - private: - Member (const Member &member); - public: - Member (); - virtual ~Member (); - - virtual void update (double delta_time_sec); - void printTimingInformation(double time); - void printTimingStatistics(); - 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; double _fixedUpdateTime; double _updateTimeRemainder; + + /// index of the member we are currently init-ing + unsigned int _initPosition; }; @@ -380,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 }; @@ -390,8 +381,10 @@ public: virtual ~SGSubsystemMgr (); virtual void init (); + virtual InitStatus incrementalInit (); virtual void postinit (); virtual void reinit (); + virtual void shutdown (); virtual void bind (); virtual void unbind (); virtual void update (double delta_time_sec); @@ -414,15 +407,15 @@ public: virtual SGSubsystem * get_subsystem(const std::string &name) const; - void collectDebugTiming(bool collect); + void reportTiming(); + void setReportTimingCb(void* userData,SGSubsystemTimingCb cb) {reportTimingCb = cb;reportTimingUserData = userData;} private: - - SGSubsystemGroup _groups[MAX_GROUPS]; - + SGSubsystemGroup* _groups[MAX_GROUPS]; + unsigned int _initPosition; + typedef std::map SubsystemDict; SubsystemDict _subsystem_map; - };