]> git.mxchange.org Git - simgear.git/blobdiff - simgear/structure/subsystem_mgr.hxx
Some Linux platforms need <cstdio> for snprintf.
[simgear.git] / simgear / structure / subsystem_mgr.hxx
index f5f918f65a924ca24a74c229da4ced9c73434ea1..caa804e8edaadbad68fc7e80b3153483211063eb 100644 (file)
@@ -1,4 +1,3 @@
-
 // Written by David Megginson, started 2000-12
 //
 // Copyright (C) 2000  David Megginson, david@megginson.com
@@ -32,7 +31,7 @@
 
 #include <simgear/timing/timestamp.hxx>
 #include <simgear/structure/SGSharedPtr.hxx>
-
+#include <simgear/misc/strutils.hxx>
 
 class TimingInfo
 {
@@ -55,7 +54,6 @@ typedef std::vector<TimingInfo>::iterator eventTimeVecIterator;
 
 typedef void (*SGSubsystemTimingCb)(void* userData, const std::string& name, SampleStatistic* pStatistic);
 
-\f
 /**
  * Basic interface for all FlightGear subsystems.
  *
@@ -150,6 +148,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.
@@ -277,8 +282,8 @@ protected:
   static void* reportTimingUserData;
 };
 
+typedef SGSharedPtr<SGSubsystem> SGSubsystemRef;
 
-\f
 /**
  * A group of FlightGear subsystems.
  */
@@ -289,7 +294,8 @@ public:
     SGSubsystemGroup ();
     virtual ~SGSubsystemGroup ();
 
-    virtual void init ();
+    virtual void init();
+    virtual InitStatus incrementalInit ();
     virtual void postinit ();
     virtual void reinit ();
     virtual void shutdown ();
@@ -307,25 +313,38 @@ public:
     virtual void remove_subsystem (const std::string &name);
     virtual bool has_subsystem (const std::string &name) const;
 
+    /**
+     * Remove all subsystems.
+     */
+    virtual void clearSubsystems();
+
     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;
     Member* get_member (const std::string &name, bool create = false);
 
-    std::vector<Member *> _members;
+    typedef std::vector<Member *> MemberVec;
+    MemberVec _members;
     
     double _fixedUpdateTime;
     double _updateTimeRemainder;
+    
+  /// index of the member we are currently init-ing
+    unsigned int _initPosition;
 };
 
-
-\f
 /**
  * Manage subsystems for FlightGear.
  *
@@ -353,9 +372,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
     };
 
@@ -363,6 +383,7 @@ public:
     virtual ~SGSubsystemMgr ();
 
     virtual void init ();
+    virtual InitStatus incrementalInit ();
     virtual void postinit ();
     virtual void reinit ();
     virtual void shutdown ();
@@ -382,24 +403,22 @@ public:
      * remove a subsystem, and return a pointer to it.
      * returns NULL if the subsystem was not found.
      */
-    virtual SGSubsystem* remove(const char* name);
+    virtual void remove(const char* name);
 
     virtual SGSubsystemGroup * get_group (GroupType group);
 
-    virtual SGSubsystem * get_subsystem(const std::string &name) const;
+    virtual SGSubsystem* get_subsystem(const std::string &name) const;
 
     void reportTiming();
     void setReportTimingCb(void* userData,SGSubsystemTimingCb cb) {reportTimingCb = cb;reportTimingUserData = userData;}
 
 private:
-
     SGSubsystemGroup* _groups[MAX_GROUPS];
-
+    unsigned int _initPosition;
+  
+    // non-owning reference
     typedef std::map<std::string, SGSubsystem*> SubsystemDict;
     SubsystemDict _subsystem_map;
 };
 
-
-
 #endif // __SUBSYSTEM_MGR_HXX
-