]> git.mxchange.org Git - flightgear.git/blobdiff - src/ATC/trafficcontrol.cxx
Different fix for traffic shutdown crash.
[flightgear.git] / src / ATC / trafficcontrol.cxx
index 3b84411997b173d54b4a468c5a901d4130417edb..6b77890a0acc5d461ea85eb97c2c7fce92e53010 100644 (file)
@@ -58,6 +58,30 @@ using std::string;
 using std::cout;
 using std::endl;
 
+namespace {
+
+TrafficVectorIterator findTraffic(TrafficVector& vec, int id)
+{
+    TrafficVectorIterator it = vec.begin();
+    for (; it != vec.end(); ++it) {
+        if (it->getId() == id) {
+            return it;
+        }
+    }
+
+    return it; // vec.end, effectively
+}
+
+void clearTrafficControllers(TrafficVector& vec)
+{
+    TrafficVectorIterator it = vec.begin();
+    for (; it != vec.end(); ++it) {
+        it->getAircraft()->clearATCController();
+    }
+}
+
+} // of anonymous namespace
+
 /***************************************************************************
  * ActiveRunway
  **************************************************************************/
@@ -190,9 +214,6 @@ FGTrafficRecord::FGTrafficRecord():
 
 FGTrafficRecord::~FGTrafficRecord()
 {
-    //if (aircraft) {
-    //    aircraft->clearATCController();
-    //}
 }
 
 void FGTrafficRecord::setPositionAndIntentions(int pos,
@@ -828,6 +849,15 @@ FGTowerController::FGTowerController(FGAirportDynamics *par) :
     parent = par;
 }
 
+FGTowerController::~FGTowerController()
+{
+    // to avoid the exception described in:
+    // https://sourceforge.net/p/flightgear/codetickets/1864/
+    // we want to ensure AI aircraft signing-off is a no-op now
+
+    clearTrafficControllers(activeTraffic);
+}
+
 //
 void FGTowerController::announcePosition(int id,
         FGAIFlightPlan * intendedRoute,
@@ -1093,6 +1123,11 @@ FGStartupController::FGStartupController(FGAirportDynamics *par):
     parent = par;
 }
 
+FGStartupController::~FGStartupController()
+{
+    clearTrafficControllers(activeTraffic);
+}
+
 void FGStartupController::announcePosition(int id,
         FGAIFlightPlan * intendedRoute,
         int currentPosition, double lat,
@@ -1552,6 +1587,11 @@ FGApproachController::FGApproachController(FGAirportDynamics *par):
     parent = par;
 }
 
+FGApproachController::~FGApproachController()
+{
+    clearTrafficControllers(activeTraffic);
+}
+
 //
 void FGApproachController::announcePosition(int id,
         FGAIFlightPlan * intendedRoute,