Пример #1
0
        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);
                }
            }
        }
Пример #2
0
        // <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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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;
                    }
                }
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
        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 );
            }
        }