X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fstructure%2Fsubsystem_mgr.hxx;h=a0e76809c8a3522ddff53b49927248442ab21eff;hb=5af8bb7c8e259f5bdda67beb87adcc453e0b32e7;hp=02332056a7dbda213890486a71368adf8e7e2e74;hpb=72f301c6558758c71c65f5a647be7efa034468dc;p=simgear.git diff --git a/simgear/structure/subsystem_mgr.hxx b/simgear/structure/subsystem_mgr.hxx index 02332056..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 @@ -29,32 +30,30 @@ #include #include -using std::map; -using std::vector; -using std::string; - -#include #include -#include "SGSmplstat.hxx" +#include class TimingInfo { private: - string eventName; + std::string eventName; SGTimeStamp time; public: - TimingInfo(const string& name, const SGTimeStamp &t) : + TimingInfo(const std::string& name, const SGTimeStamp &t) : eventName(name), time(t) { } - const string& getName() const { return eventName; } + const std::string& getName() const { return eventName; } const SGTimeStamp& getTime() const { return time; } }; -typedef vector eventTimeVec; -typedef vector::iterator eventTimeVecIterator; +class SampleStatistic; + +typedef std::vector eventTimeVec; +typedef std::vector::iterator eventTimeVecIterator; +typedef void (*SGSubsystemTimingCb)(void* userData, const std::string& name, SampleStatistic* pStatistic); /** @@ -173,6 +172,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. * @@ -221,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. @@ -247,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 string& name); - - + void stamp(const std::string& name); protected: bool _suspended; eventTimeVec timingInfo; - //int test; + static SGSubsystemTimingCb reportTimingCb; + static void* reportTimingUserData; }; @@ -301,6 +292,7 @@ public: virtual void init (); virtual void postinit (); virtual void reinit (); + virtual void shutdown (); virtual void bind (); virtual void unbind (); virtual void update (double delta_time_sec); @@ -308,47 +300,25 @@ public: virtual void resume (); virtual bool is_suspended () const; - virtual void set_subsystem (const string &name, + virtual void set_subsystem (const std::string &name, SGSubsystem * subsystem, double min_step_sec = 0); - virtual SGSubsystem * get_subsystem (const string &name); - virtual void remove_subsystem (const string &name); - virtual bool has_subsystem (const string &name) const; + virtual SGSubsystem * get_subsystem (const std::string &name); + 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); 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; - string name; - SGSubsystem * subsystem; - double min_step_sec; - double elapsed_sec; - bool collectTimeStats; - }; - - Member * get_member (const string &name, bool create = false); + class Member; + Member* get_member (const std::string &name, bool create = false); - vector _members; + std::vector _members; double _fixedUpdateTime; double _updateTimeRemainder; @@ -383,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 }; @@ -395,6 +366,7 @@ public: virtual void init (); virtual void postinit (); virtual void reinit (); + virtual void shutdown (); virtual void bind (); virtual void unbind (); virtual void update (double delta_time_sec); @@ -407,17 +379,24 @@ public: GroupType group = GENERAL, double min_time_sec = 0); + /** + * remove a subsystem, and return a pointer to it. + * returns NULL if the subsystem was not found. + */ + virtual SGSubsystem* remove(const char* name); + virtual SGSubsystemGroup * get_group (GroupType group); - virtual SGSubsystem * get_subsystem(const string &name); + 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]; - map _subsystem_map; - + typedef std::map SubsystemDict; + SubsystemDict _subsystem_map; };