[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