]> git.mxchange.org Git - flightgear.git/commitdiff
Reset: listener cleanup
authorJames Turner <zakalawe@mac.com>
Wed, 4 Dec 2013 09:11:26 +0000 (09:11 +0000)
committerJames Turner <zakalawe@mac.com>
Wed, 4 Dec 2013 09:11:26 +0000 (09:11 +0000)
src/Main/globals.cxx
src/Main/globals.hxx
src/Main/main.cxx
src/Main/positioninit.cxx
src/Viewer/fg_os_osgviewer.cxx
src/Viewer/renderer.cxx
src/Viewer/renderer.hxx

index acfb0d6299576f48cfd8e5f85f5fc2a724d17b02..c083f326f965b631906ea49f8a280c3571a8e8ca 100644 (file)
@@ -232,6 +232,8 @@ FGGlobals::~FGGlobals()
     delete locale;
     locale = NULL;
     
+    cleanupListeners();
+    
     props.clear();
     
     delete commands;
@@ -525,9 +527,26 @@ FGGlobals::resetPropertyRoot()
 {
     delete locale;
     
+    cleanupListeners();
+    
+    // we don't strictly need to clear these (they will be reset when we
+    // initProperties again), but trying to reduce false-positives when dumping
+    // ref-counts.
+    positionLon.clear();
+    positionLat.clear();
+    positionAlt.clear();
+    viewLon.clear();
+    viewLat.clear();
+    viewAlt.clear();
+    orientPitch.clear();
+    orientHeading.clear();
+    orientRoll.clear();
+    
     SG_LOG(SG_GENERAL, SG_INFO, "root props refcount:" << props.getNumRefs());
     treeDumpRefCounts(0, props);
 
+    //BaseStackSnapshot::dumpAll(std::cout);
+    
     props = new SGPropertyNode;
     initProperties();
     locale = new FGLocale(props);
@@ -709,4 +728,18 @@ void FGGlobals::set_chatter_queue(FGSampleQueue* queue)
     _chatter_queue = queue;
 }
 
+void FGGlobals::addListenerToCleanup(SGPropertyChangeListener* l)
+{
+    _listeners_to_cleanup.push_back(l);
+}
+
+void FGGlobals::cleanupListeners()
+{
+    SGPropertyChangeListenerVec::iterator i = _listeners_to_cleanup.begin();
+    for (; i != _listeners_to_cleanup.end(); ++i) {
+        delete *i;
+    }
+    _listeners_to_cleanup.clear();
+}
+
 // end of globals.cxx
index 3f8ae0689d738933c8d0c97d37d1bcb8e5db2dfb..8f1736f146b125697138e43feb1638487bedbc12 100644 (file)
@@ -163,6 +163,12 @@ private:
     void initProperties();
     
     SGSharedPtr<FGSampleQueue> _chatter_queue;
+    
+    void cleanupListeners();
+    
+    typedef std::vector<SGPropertyChangeListener*> SGPropertyChangeListenerVec;
+    SGPropertyChangeListenerVec _listeners_to_cleanup;
+    
 public:
 
     FGGlobals();
@@ -346,6 +352,8 @@ public:
     
     FGSampleQueue* get_chatter_queue() const;
     void set_chatter_queue(FGSampleQueue* queue);
+    
+    void addListenerToCleanup(SGPropertyChangeListener* l);
 };
 
 
index 8b7083470435939304af740facfe3a38fa6db73c..7756a6d0cdeae0118688b3f40f38915957bf6f6d 100644 (file)
@@ -299,7 +299,9 @@ static void upper_case_property(const char *name)
         else
             assert(t == props::STRING);
     }
-    p->addChangeListener(new FGMakeUpperCase);
+    SGPropertyChangeListener* muc = new FGMakeUpperCase;
+    globals->addListenerToCleanup(muc);
+    p->addChangeListener(muc);
 }
 
 // see http://code.google.com/p/flightgear-bugs/issues/detail?id=385
index ee45af4989f1bcdbe1137458e9c415a8a99782d5..cd5130db6abbd10f10c8d9a80275c13fa5dcb1b8 100644 (file)
@@ -65,7 +65,8 @@ static bool fgSetTowerPosFromAirportID( const string& id) {
   
 }
 
-struct FGTowerLocationListener : SGPropertyChangeListener {
+class FGTowerLocationListener : public SGPropertyChangeListener {
+    
   void valueChanged(SGPropertyNode* node) {
     string id(node->getStringValue());
     if (fgGetBool("/sim/tower/auto-position",true))
@@ -82,7 +83,7 @@ struct FGTowerLocationListener : SGPropertyChangeListener {
   }
 };
 
-struct FGClosestTowerLocationListener : SGPropertyChangeListener
+class FGClosestTowerLocationListener : public SGPropertyChangeListener
 {
   void valueChanged(SGPropertyNode* )
   {
@@ -98,9 +99,14 @@ struct FGClosestTowerLocationListener : SGPropertyChangeListener
 };
 
 void initTowerLocationListener() {
+    
+  SGPropertyChangeListener* tll = new FGTowerLocationListener();
+  globals->addListenerToCleanup(tll);
   fgGetNode("/sim/tower/airport-id",  true)
-  ->addChangeListener( new FGTowerLocationListener(), true );
+  ->addChangeListener( tll, true );
+    
   FGClosestTowerLocationListener* ntcl = new FGClosestTowerLocationListener();
+  globals->addListenerToCleanup(ntcl);
   fgGetNode("/sim/airport/closest-airport-id", true)
   ->addChangeListener(ntcl , true );
   fgGetNode("/sim/tower/auto-position", true)
index 976b3d753e96fe86ff562f74f87a54d03574e0b6..5d85dcabae07d491451cdde652f94c73f36ce628 100644 (file)
@@ -286,7 +286,9 @@ void fgOSOpenWindow(bool stencil)
 void fgOSResetProperties()
 {
     SGPropertyNode* osgLevel = fgGetNode("/sim/rendering/osg-notify-level", true);
-    osgLevel->addChangeListener(new NotifyLevelListener, true);
+    NotifyLevelListener* l = new NotifyLevelListener;
+    globals->addListenerToCleanup(l);
+    osgLevel->addChangeListener(l, true);
     
     osg::Camera* guiCamera = getGUICamera(CameraGroup::getDefault());
     if (guiCamera) {
index d195d42b58f408903227f9da08aa001c2e9b9eb9..81b135bc470eb29207c0469a068608fabe3595cc 100644 (file)
@@ -430,6 +430,11 @@ FGRenderer::FGRenderer() :
 
 FGRenderer::~FGRenderer()
 {
+    SGPropertyChangeListenerVec::iterator i = _listeners.begin();
+    for (; i != _listeners.end(); ++i) {
+        delete *i;
+    }
+    
     DeletionManager::uninstall(mRealRoot.get());
 #ifdef FG_JPEG_SERVER
    jpgRenderFrame = NULL;
@@ -498,6 +503,13 @@ public:
     }
 };
 
+void
+FGRenderer::addChangeListener(SGPropertyChangeListener* l, const char* path)
+{
+    _listeners.push_back(l);
+    fgAddChangeListener(l, path);
+}
+                                    
 void
 FGRenderer::init( void )
 {
@@ -508,14 +520,14 @@ FGRenderer::init( void )
 
     _classicalRenderer = !fgGetBool("/sim/rendering/rembrandt/enabled", false);
     _shadowMapSize    = fgGetInt( "/sim/rendering/shadows/map-size", 4096 );
-    fgAddChangeListener( new ShadowMapSizeListener, "/sim/rendering/shadows/map-size" );
-    fgAddChangeListener( new ShadowEnabledListener, "/sim/rendering/shadows/enabled" );
+    addChangeListener( new ShadowMapSizeListener, "/sim/rendering/shadows/map-size" );
+    addChangeListener( new ShadowEnabledListener, "/sim/rendering/shadows/enabled" );
     ShadowRangeListener* srl = new ShadowRangeListener;
-    fgAddChangeListener(srl, "/sim/rendering/shadows/cascade-far-m[0]");
+    addChangeListener(srl, "/sim/rendering/shadows/cascade-far-m[0]");
     fgAddChangeListener(srl, "/sim/rendering/shadows/cascade-far-m[1]");
     fgAddChangeListener(srl, "/sim/rendering/shadows/cascade-far-m[2]");
     fgAddChangeListener(srl, "/sim/rendering/shadows/cascade-far-m[3]");
-    fgAddChangeListener(new ShadowNumListener, "/sim/rendering/shadows/num-cascades");
+    addChangeListener(new ShadowNumListener, "/sim/rendering/shadows/num-cascades");
     _numCascades = fgGetInt("/sim/rendering/shadows/num-cascades", 4);
     _cascadeFar[0] = fgGetFloat("/sim/rendering/shadows/cascade-far-m[0]", 5.0f);
     _cascadeFar[1] = fgGetFloat("/sim/rendering/shadows/cascade-far-m[1]", 50.0f);
index 959847408b14eabd4ef6c2642c1be91b7d79c39d..f6a51b5299dc767a0be5e7d5a8ef5dc8afbef049 100644 (file)
@@ -138,6 +138,9 @@ protected:
     float _cascadeFar[4];
     bool _useColorForDepth;
 
+    typedef std::vector<SGPropertyChangeListener*> SGPropertyChangeListenerVec;
+    SGPropertyChangeListenerVec _listeners;
+    
     flightgear::CameraInfo* buildCameraFromRenderingPipeline(FGRenderingPipeline* rpipe, flightgear::CameraGroup* cgroup, unsigned flags, osg::Camera* camera,
                                         const osg::Matrix& view, const osg::Matrix& projection, osg::GraphicsContext* gc);
 
@@ -168,6 +171,8 @@ protected:
     osg::ref_ptr<osg::Uniform> _depthInColor;
 
     osg::ref_ptr<FGRenderingPipeline> _pipeline;
+    
+    void addChangeListener(SGPropertyChangeListener* l, const char* path);
 };
 
 bool fgDumpSceneGraphToFile(const char* filename);