private void Promote(MTNameTableNode node) { // count number of times promotion requested node.counter++; if (node != rootNode && node.counter > threshhold && node.counter > node.parentNode.counter * 2) { if (rwLock != null) { LockCookie lc = rwLock.UpgradeToWriterLock(timeout); // recheck for failsafe against race-condition if (node != rootNode && node.counter > threshhold && node.counter > node.parentNode.counter * 2) { InternalPromote(node); } rwLock.DowngradeFromWriterLock(ref lc); } else { InternalPromote(node); } } }
// <doc> // <desc> // Adds the a node to the right of the specified node, given a string. // </desc> // </doc> // private MTNameTableNode AddRight(MTNameTableNode node, ref MTNameTableName name, bool fLock) { MTNameTableNode newNode = null; if (fLock) { LockCookie lc = rwLock.UpgradeToWriterLock(timeout); // recheck for failsafe against race-condition if (node.rightNode == null) { newNode = new MTNameTableNode(ref name); node.rightNode = newNode; newNode.parentNode = node; } else { // try again, with write-lock active newNode = Add(ref name, false); } rwLock.DowngradeFromWriterLock(ref lc); } else { newNode = new MTNameTableNode(ref name); node.rightNode = newNode; newNode.parentNode = node; } return(newNode); }
private MTNameTableNode Add(ref MTNameTableName name, bool fLock) { if (fLock) { rwLock.AcquireReaderLock(timeout); } MTNameTableNode currentNode = rootNode; while (true) { if (currentNode == null) { currentNode = AddRoot(ref name, fLock); break; } else { Int64 d = currentNode.Compare(ref name); if (d == 0) { Promote(currentNode); break; } else if (d < 0) { if (currentNode.leftNode == null) { currentNode = AddLeft(currentNode, ref name, fLock); break; } else { currentNode = currentNode.leftNode; } } else { if (currentNode.rightNode == null) { currentNode = AddRight(currentNode, ref name, fLock); break; } else { currentNode = currentNode.rightNode; } } } } if (fLock) { rwLock.ReleaseReaderLock(); } return(currentNode); }
private void InternalPromote(MTNameTableNode node) { MTNameTableNode parent = node.parentNode; if (parent != null) { MTNameTableNode grandParent = parent.parentNode; if (parent.leftNode == node) { parent.leftNode = node.rightNode; node.rightNode = parent; // update lineage if (parent.leftNode != null) { parent.leftNode.parentNode = parent; } node.parentNode = grandParent; parent.parentNode = node; } else { parent.rightNode = node.leftNode; node.leftNode = parent; // update lineage if (parent.rightNode != null) { parent.rightNode.parentNode = parent; } node.parentNode = grandParent; parent.parentNode = node; } // fixup pointer to promoted node in grand parent if (grandParent == null) { rootNode = node; } else { if (grandParent.leftNode == parent) { grandParent.leftNode = node; } else { grandParent.rightNode = node; } } } }
private String Get(ref MTNameTableName nn) { String name = null; if (rootNode != null) { if (rwLock != null) { rwLock.AcquireReaderLock(timeout); } MTNameTableNode currentNode = rootNode; while (true) { Int64 d = currentNode.Compare(ref nn); if (d == 0) { Promote(currentNode); name = currentNode.value; break; } else if (d < 0) { if (currentNode.leftNode == null) { break; } currentNode = currentNode.leftNode; } else { if (currentNode.rightNode == null) { break; } currentNode = currentNode.rightNode; } } if (rwLock != null) { rwLock.ReleaseReaderLock(); } } return(name); }
internal void Walk(MTNameTableNode node) { if (node != null) { if (node.leftNode != null) { Walk(node.leftNode); } names.Add(node.value); if (node.rightNode != null) { Walk(node.rightNode); } } }
internal void Walk( MTNameTableNode node ) { if (node != null) { if (node.leftNode != null) Walk( node.leftNode ); names.Add( node.value ); if (node.rightNode != null) Walk( node.rightNode ); } }