Commit fdaf8f62 authored by Siddharth Aggarwal's avatar Siddharth Aggarwal

With jon's bug fix for corner case where multiple inserts of different

sizes at the same starting block
parent 3b69e3c4
......@@ -106,7 +106,7 @@ int TrieInit(Trie ** trieOutPtr, BlockAllocateFunction blockAlloc,
result = 1;
if (trie == 0)
{
printf ("Error doing TrieInit! Not enough memory!\n");
printf ("Error allocating memory for TrieInit\n");
result = 0;
}
else
......@@ -316,7 +316,43 @@ static int insertWeak(Trie * triePtr, TrieNode * node, TrieKey key,
while (!done)
{
node = search(node, key, maxDepth);
if (isBranch(node))
if (node->depth == node->maxDepth && isLeaf(node))
{
/* The current node is larger than our insertion.
Nothing to do. */
total = 0;
done = 1;
}
else if (node->depth == maxDepth)
{
/* We don't want to go below this level.
We are weak, so we have to break up the range
and insert smaller blocks */
/* There are two possibilities at this point. Either the
node is a leaf and we are a superset of a single
range. Or the node is a branch and there are many
possible subranges which are being used. */
if (isLeaf(node))
{
/* The node is a leaf, so we have a single range to
work around. */
total = weakOverlap(triePtr, node, key, maxDepth);
}
else
{
/* The node is a branch, so there are many ranges to
work around. The easiest way to solve this is to
split the problem in two and try to
re-insert. Eventually, this should resolve itself
to the other cases as we recurse. */
insertWeak(triePtr, node, key, maxDepth+1);
insertWeak(triePtr, node, key + depthToSize(maxDepth+1),
maxDepth+1);
}
done = 1;
}
else if (isBranch(node))
{
/* If the node is a branch, we just insert ourselves. */
TrieValue value = (triePtr->blockAlloc)(depthToSize(maxDepth));
......@@ -333,21 +369,6 @@ static int insertWeak(Trie * triePtr, TrieNode * node, TrieKey key,
}
done = 1;
}
else if (node->depth == node->maxDepth)
{
/* The current node is larger than our insertion.
Nothing to do. */
total = 0;
done = 1;
}
else if (node->depth == maxDepth)
{
/* We don't want to go below this level.
We are weak, so we have to break up the range
and insert smaller blocks */
total = weakOverlap(triePtr, node, key, maxDepth);
done = 1;
}
else
{
/* The current node is a leaf. Push it down to the next level. */
......@@ -369,13 +390,7 @@ static int insertStrong(Trie * triePtr, TrieNode * node, TrieKey key,
while (!done)
{
node = search(node, key, maxDepth);
if (isBranch(node))
{
/* If the node is a branch, we just insert ourselves. */
total = addChild(triePtr, node, key, maxDepth, value);
done = 1;
}
else if (node->depth == maxDepth)
if (node->depth == maxDepth)
{
/* We don't want to go below this level.
We are strong, just replace whatever is here because
......@@ -383,6 +398,12 @@ static int insertStrong(Trie * triePtr, TrieNode * node, TrieKey key,
total = replace(triePtr, node, key, maxDepth, value, overlap);
done = 1;
}
else if (isBranch(node))
{
/* If the node is a branch, we just insert ourselves. */
total = addChild(triePtr, node, key, maxDepth, value);
done = 1;
}
else if (node->depth == node->maxDepth)
{
/* If the target node is already at its lowest level
......@@ -425,7 +446,7 @@ static int addChild(Trie * triePtr, TrieNode * parent, TrieKey key,
}
else
{
printf ("Error doing addChild for Trie! Not enough memory!\n");
printf ("Error allocating memory for addChild\n");
result = -1;
}
return result;
......@@ -476,6 +497,7 @@ static void freeChildren(Trie * triePtr, TrieNode * node, OverlapT overlap)
, M_DEVBUF
#endif
);
node->child[i] = 0;
}
}
}
......@@ -579,7 +601,7 @@ static TrieNode * pushDown(Trie * triePtr, TrieNode * node)
}
else
{
printf ("Error doing pushDown for Trie! Not enough memory!\n");
printf ("Error allocating memory for pushDown\n");
middle = 0;
}
return middle;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment