Fix AllocationFailure when multiple instances

This commit is contained in:
Léa Saviot
2018-06-28 17:59:06 +02:00
parent bd61298374
commit cb77fbe2ff
10 changed files with 133 additions and 39 deletions

View File

@@ -8,23 +8,31 @@
void TreeNode::release() {
m_referenceCounter--;
if (m_referenceCounter == 0) {
if (numberOfChildren() != 0) {
int lastIdentifier = lastChild()->identifier();
TreeNode * child = next();
bool lastChildReleased = false;
while (!lastChildReleased) {
lastChildReleased = child->identifier() == lastIdentifier;
int nextSiblingIdentifier = lastChildReleased ? -1 : child->nextSibling()->identifier();
child->release();
if (nextSiblingIdentifier != -1) {
child = TreePool::sharedPool()->node(nextSiblingIdentifier);
}
releaseChildrenAndDestroy();
}
}
void TreeNode::releaseChildren() {
if (numberOfChildren() != 0) {
int lastIdentifier = lastChild()->identifier();
TreeNode * child = next();
bool lastChildReleased = false;
while (!lastChildReleased) {
lastChildReleased = child->identifier() == lastIdentifier;
int nextSiblingIdentifier = lastChildReleased ? -1 : child->nextSibling()->identifier();
child->release();
if (nextSiblingIdentifier != -1) {
child = TreePool::sharedPool()->node(nextSiblingIdentifier);
}
}
TreePool::sharedPool()->discardTreeNode(this);
}
}
void TreeNode::releaseChildrenAndDestroy() {
releaseChildren();
TreePool::sharedPool()->discardTreeNode(this);
}
// Hierarchy
TreeNode * TreeNode::parentTree() const {