]> git.mxchange.org Git - simgear.git/blobdiff - simgear/structure/subsystem_mgr.cxx
Merge branch 'ehofman/sound'
[simgear.git] / simgear / structure / subsystem_mgr.cxx
index 00f17b38acefee08a24c03af5ea797e3d98b8021..ee9c15d1750dab1ab90d5e02b1612f1a4712fa1d 100644 (file)
@@ -5,6 +5,8 @@
 #include "exception.hxx"
 #include "subsystem_mgr.hxx"
 
+#include <simgear/math/SGMath.hxx>
+
 
 \f
 ////////////////////////////////////////////////////////////////////////
@@ -74,29 +76,27 @@ SGSubsystem::is_suspended () const
 void
 SGSubsystem::printTimingInformation ()
 {
-  SGTimeStamp startTime, endTime;
-   long duration;
+   SGTimeStamp startTime;
    for ( eventTimeVecIterator i = timingInfo.begin();
           i != timingInfo.end();
           i++) {
        if (i == timingInfo.begin()) {
            startTime = i->getTime();
        } else {
-           endTime = i->getTime();
-           duration = (endTime - startTime);
+           SGTimeStamp endTime = i->getTime();
+           SG_LOG(SG_GENERAL, SG_ALERT, "- Getting to timestamp :   "
+                  << i->getName() << " takes " << endTime - startTime
+                  << " sec.");
           startTime = endTime;
-           SG_LOG(SG_GENERAL, SG_ALERT, "- Getting to timestamp :   " << i->getName() << " takes " << duration << " usec.");
        }
    }
 }
 
 
 
-void SGSubsystem::stamp(string name)
+void SGSubsystem::stamp(const string& name)
 {
-    SGTimeStamp now;
-    now.stamp();
-    timingInfo.push_back(TimingInfo(name, now));
+    timingInfo.push_back(TimingInfo(name, SGTimeStamp::now()));
 }
 
 \f
@@ -110,10 +110,11 @@ SGSubsystemGroup::SGSubsystemGroup ()
 
 SGSubsystemGroup::~SGSubsystemGroup ()
 {
-    for (unsigned int i = 0; i < _members.size(); i++)
+    // reverse order to prevent order dependency problems
+    for (unsigned int i = _members.size(); i > 0; i--)
     {
-        _members[i]->printTimingStatistics();
-        delete _members[i];
+        _members[i-1]->printTimingStatistics();
+        delete _members[i-1];
     }
 }
 
@@ -148,8 +149,9 @@ SGSubsystemGroup::bind ()
 void
 SGSubsystemGroup::unbind ()
 {
-    for (unsigned int i = 0; i < _members.size(); i++)
-        _members[i]->subsystem->unbind();
+    // reverse order to prevent order dependency problems
+    for (unsigned int i = _members.size(); i > 0; i--)
+       _members[i-1]->subsystem->unbind();
 }
 
 void
@@ -157,11 +159,10 @@ SGSubsystemGroup::update (double delta_time_sec)
 {
     for (unsigned int i = 0; i < _members.size(); i++)
     {
-         SGTimeStamp start, now;
-         start.stamp();
+         SGTimeStamp timeStamp = SGTimeStamp::now();
          _members[i]->update(delta_time_sec); // indirect call
-         now.stamp();
-         long b = ( now - start );
+         timeStamp = timeStamp - SGTimeStamp::now();
+         double b = timeStamp.toUSecs();
          _members[i]->updateExecutionTime(b);
          double threshold = _members[i]->getTimeWarningThreshold();
          if (( b > threshold ) && (b > 10000)) {
@@ -290,9 +291,9 @@ SGSubsystemGroup::Member::Member ()
 {
 }
 
+// This shouldn't be called due to subsystem pointer ownership issues.
 SGSubsystemGroup::Member::Member (const Member &)
 {
-    Member();
 }
 
 SGSubsystemGroup::Member::~Member ()
@@ -382,7 +383,8 @@ SGSubsystemMgr::bind ()
 void
 SGSubsystemMgr::unbind ()
 {
-    for (int i = 0; i < MAX_GROUPS; i++)
+    // reverse order to prevent order dependency problems
+    for (int i = MAX_GROUPS-1; i >= 0; i--)
         _groups[i].unbind();
 }