00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __SUBSYSTEM_MGR_HXX
00023 #define __SUBSYSTEM_MGR_HXX 1
00024
00025
00026 #include <simgear/compiler.h>
00027
00028 #include <string>
00029 #include <map>
00030 #include <vector>
00031
00032 using std::map;
00033 using std::vector;
00034 using std::string;
00035
00036 #include <simgear/props/props.hxx>
00037 #include <simgear/timing/timestamp.hxx>
00038 #include "SGSmplstat.hxx"
00039
00040
00041 class TimingInfo
00042 {
00043 private:
00044 string eventName;
00045 SGTimeStamp time;
00046
00047 public:
00048 TimingInfo(string name, SGTimeStamp &t) { eventName = name; time = t;};
00049 string getName() { return eventName; };
00050 SGTimeStamp getTime() { return time; };
00051 };
00052
00053 typedef vector<TimingInfo> eventTimeVec;
00054 typedef vector<TimingInfo>::iterator eventTimeVecIterator;
00055
00056
00057
00126 class SGSubsystem : public SGReferenced
00127 {
00128 public:
00129
00133 SGSubsystem ();
00134
00138 virtual ~SGSubsystem ();
00139
00140
00150 virtual void init ();
00151
00152
00162 virtual void postinit ();
00163
00164
00171 virtual void reinit ();
00172
00173
00181 virtual void bind ();
00182
00183
00191 virtual void unbind ();
00192
00193
00203 virtual void update (double delta_time_sec) = 0;
00204
00205
00218 virtual void suspend ();
00219
00220
00227 virtual void suspend (bool suspended);
00228
00229
00238 virtual void resume ();
00239
00240
00246 virtual bool is_suspended () const;
00247
00248
00256 void updateExecutionTime(double time);
00257
00268 void printTimingInformation();
00269
00274 void stamp(string name);
00275
00276
00277
00278 protected:
00279
00280 bool _suspended;
00281
00282 eventTimeVec timingInfo;
00283
00284
00285 };
00286
00287
00288
00292 class SGSubsystemGroup : public SGSubsystem
00293 {
00294 public:
00295
00296 SGSubsystemGroup ();
00297 virtual ~SGSubsystemGroup ();
00298
00299 virtual void init ();
00300 virtual void postinit ();
00301 virtual void reinit ();
00302 virtual void bind ();
00303 virtual void unbind ();
00304 virtual void update (double delta_time_sec);
00305 virtual void suspend ();
00306 virtual void resume ();
00307 virtual bool is_suspended () const;
00308
00309 virtual void set_subsystem (const string &name,
00310 SGSubsystem * subsystem,
00311 double min_step_sec = 0);
00312 virtual SGSubsystem * get_subsystem (const string &name);
00313 virtual void remove_subsystem (const string &name);
00314 virtual bool has_subsystem (const string &name) const;
00315
00316 void collectDebugTiming(bool collect);
00317
00318 private:
00319
00320 struct Member {
00321
00322 Member ();
00323 Member (const Member &member);
00324 virtual ~Member ();
00325
00326 virtual void update (double delta_time_sec);
00327 void printTimingInformation(double time);
00328 void printTimingStatistics();
00329 void updateExecutionTime(double time);
00330 double getTimeWarningThreshold();
00331 void collectDebugTiming (bool collect) { collectTimeStats = collect; };
00332
00333 SampleStatistic timeStat;
00334 string name;
00335 SGSubsystem * subsystem;
00336 double min_step_sec;
00337 double elapsed_sec;
00338 bool collectTimeStats;
00339 };
00340
00341 Member * get_member (const string &name, bool create = false);
00342
00343 vector<Member *> _members;
00344 };
00345
00346
00347
00365 class SGSubsystemMgr : public SGSubsystem
00366 {
00367 public:
00368
00372 enum GroupType {
00373 INIT = 0,
00374 GENERAL,
00375 MAX_GROUPS
00376 };
00377
00378 SGSubsystemMgr ();
00379 virtual ~SGSubsystemMgr ();
00380
00381 virtual void init ();
00382 virtual void postinit ();
00383 virtual void reinit ();
00384 virtual void bind ();
00385 virtual void unbind ();
00386 virtual void update (double delta_time_sec);
00387 virtual void suspend ();
00388 virtual void resume ();
00389 virtual bool is_suspended () const;
00390
00391 virtual void add (const char * name,
00392 SGSubsystem * subsystem,
00393 GroupType group = GENERAL,
00394 double min_time_sec = 0);
00395
00396 virtual SGSubsystemGroup * get_group (GroupType group);
00397
00398 virtual SGSubsystem * get_subsystem(const string &name);
00399
00400 void collectDebugTiming(bool collect);
00401
00402 private:
00403
00404 SGSubsystemGroup _groups[MAX_GROUPS];
00405 map<string,SGSubsystem *> _subsystem_map;
00406
00407 };
00408
00409
00410
00411 #endif // __SUBSYSTEM_MGR_HXX
00412