[dss-commits] r8765 - dss/trunk/core

dss-commits at forum.digitalstrom.org dss-commits at forum.digitalstrom.org
Wed Sep 16 15:06:59 CEST 2009


Author: pstaehlin
Date: 2009-09-16 15:06:59 +0200 (Wed, 16 Sep 2009)
New Revision: 8765

Modified:
   dss/trunk/core/propertysystem.cpp
   dss/trunk/core/propertysystem.h
Log:
Don't crash when destroying a PropertyNode with listener still attached to it.


Modified: dss/trunk/core/propertysystem.cpp
===================================================================
--- dss/trunk/core/propertysystem.cpp	2009-09-15 16:18:03 UTC (rev 8764)
+++ dss/trunk/core/propertysystem.cpp	2009-09-16 13:06:59 UTC (rev 8765)
@@ -325,7 +325,7 @@
     for(std::vector<PropertyListener*>::iterator it = m_Listeners.begin();
         it != m_Listeners.end();)
     {
-      (*it)->unregisterProperty(shared_from_this());
+      (*it)->unregisterProperty(this);
       it = m_Listeners.erase(it);
     }
     clearValue();
@@ -710,6 +710,7 @@
   } // getAsString
 
   void PropertyNode::addListener(PropertyListener* _listener) {
+    _listener->registerProperty(this);
     m_Listeners.push_back(_listener);
   } // addListener
 
@@ -717,7 +718,7 @@
     std::vector<PropertyListener*>::iterator it = std::find(m_Listeners.begin(), m_Listeners.end(), _listener);
     if(it != m_Listeners.end()) {
       m_Listeners.erase(it);
-      _listener->unregisterProperty(shared_from_this());
+      _listener->unregisterProperty(this);
     }
   } // removeListener
 
@@ -882,9 +883,10 @@
   //=============================================== PropertyListener
 
   PropertyListener::~PropertyListener() {
-    std::vector<PropertyNode*>::iterator it;
-    for(it = m_Properties.begin(); it != m_Properties.end(); ++it) {
-      (*it)->removeListener(this);
+    // while this does look like an infinite loop it isn't
+    // as the property will call unregisterProperty in removeListener
+    while(!m_Properties.empty()) {
+      m_Properties.front()->removeListener(this);
     }
   } // dtor
 
@@ -897,12 +899,12 @@
   void PropertyListener::propertyAdded(PropertyNodePtr _parent, PropertyNodePtr _child) {
   } // propertyAdded
 
-  void PropertyListener::registerProperty(PropertyNodePtr _node) {
-    m_Properties.push_back(_node.get());
+  void PropertyListener::registerProperty(PropertyNode* _node) {
+    m_Properties.push_back(_node);
   } // registerProperty
 
-  void PropertyListener::unregisterProperty(PropertyNodePtr _node) {
-    std::vector<PropertyNode*>::iterator it = std::find(m_Properties.begin(), m_Properties.end(), _node.get());
+  void PropertyListener::unregisterProperty(PropertyNode* _node) {
+    std::vector<PropertyNode*>::iterator it = std::find(m_Properties.begin(), m_Properties.end(), _node);
     if(it != m_Properties.end()) {
       m_Properties.erase(it);
     }

Modified: dss/trunk/core/propertysystem.h
===================================================================
--- dss/trunk/core/propertysystem.h	2009-09-15 16:18:03 UTC (rev 8764)
+++ dss/trunk/core/propertysystem.h	2009-09-16 13:06:59 UTC (rev 8765)
@@ -311,9 +311,9 @@
     virtual void propertyAdded(PropertyNodePtr _parent, PropertyNodePtr _child);
 
     /** Add a property node to the notifiers. */
-    void registerProperty(PropertyNodePtr _node);
+    void registerProperty(PropertyNode* _node);
     /** Remove a property from the notifiers */
-    void unregisterProperty(PropertyNodePtr _node);
+    void unregisterProperty(PropertyNode* _node);
   public:
     virtual ~PropertyListener();
   }; // PropertyListener



More information about the dss-commits mailing list