From 3b5721d77e988eea80751a151d16afd1f5bd19d1 Mon Sep 17 00:00:00 2001
From: James Turner <zakalawe@mac.com>
Date: Tue, 11 Aug 2020 18:30:44 +0100
Subject: [PATCH] Fix leaking of dynamics/AI traffic

Use a weak-ref for ParkingAssignment to refer to its owning dynamics,
to avoid a circular dependency.
---
 src/Airports/dynamics.cxx | 15 ++++++++++-----
 src/Airports/dynamics.hxx |  4 ++--
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/src/Airports/dynamics.cxx b/src/Airports/dynamics.cxx
index d67247a9d..6280ddc7d 100644
--- a/src/Airports/dynamics.cxx
+++ b/src/Airports/dynamics.cxx
@@ -18,15 +18,14 @@
 //
 // $Id$
 
-#ifdef HAVE_CONFIG_H
-#  include <config.h>
-#endif
+#include <config.h>
 
 #include <algorithm>
 #include <string>
 #include <vector>
 
 #include <simgear/compiler.h>
+#include <simgear/structure/SGWeakPtr.hxx>
 
 #include <Environment/environment_mgr.hxx>
 #include <Environment/environment.hxx>
@@ -67,7 +66,10 @@ public:
 
   ~ParkingAssignmentPrivate()
   {
-    dynamics->releaseParking(parking);
+      FGAirportDynamicsRef strongRef = dynamics.lock();
+      if (strongRef) {
+          strongRef->releaseParking(parking);
+      }
   }
 
   void release()
@@ -84,7 +86,10 @@ public:
 
   unsigned int refCount;
   FGParkingRef parking;
-  FGAirportDynamicsRef dynamics;
+    
+// we don't want an owning ref here, otherwise we
+// have a circular ownership from AirportDynamics -> us
+  SGWeakPtr<FGAirportDynamics> dynamics;
 };
 
 ParkingAssignment::ParkingAssignment() :
diff --git a/src/Airports/dynamics.hxx b/src/Airports/dynamics.hxx
index 02e4a6190..7327c3bc7 100644
--- a/src/Airports/dynamics.hxx
+++ b/src/Airports/dynamics.hxx
@@ -24,7 +24,7 @@
 
 #include <set>
 
-#include <simgear/structure/SGReferenced.hxx>
+#include <simgear/structure/SGWeakReferenced.hxx>
 #include <simgear/timing/timestamp.hxx>
 
 #include <ATC/trafficcontrol.hxx>
@@ -57,7 +57,7 @@ private:
   ParkingAssignmentPrivate* _sharedData;
 };
 
-class FGAirportDynamics : public SGReferenced
+class FGAirportDynamics : public SGWeakReferenced
 {
 
 private: