示例#1
0
        private void CheckExpirations(DateTime now, ref TTNode node)
        {
            if (node == null)
            {
                return;
            }

            if (node.ExpirationTime <= now)
            {
                // remove node and its left subtree
                TTNode toRemove = node;

                // put the right subtree into its place
                node = node.rNode;
                CheckExpirations(now, ref node);


                //
                ClearNode(toRemove, false);
                ClearNode(toRemove.lNode, true);
            }
            else
            {
                CheckExpirations(now, ref node.lNode);
            }
        }
示例#2
0
        /// <summary>
        /// Add the value into the specified sub-tree.
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <param name="expiration"></param>
        /// <param name="node"></param>
        private void Add(TKey key, TValue value, DateTime expiration, ref TTNode node, object parentLocker)
        {
            if (node == null)
            {
                lock (parentLocker)
                    if (node == null)
                    {
                        node = new TTNode(expiration);
                    }
            }

            if (expiration < node.ExpirationTime)
            {
                Add(key, value, expiration, ref node.lNode, node);
            }
            else if (expiration > node.ExpirationTime)
            {
                Add(key, value, expiration, ref node.rNode, node);
            }
            else
            {
                lock (node)
                {
                    // add the item in to the current node
                    Items[key] = new DictionaryValue()
                    {
                        treeNode = node, listNode = node.AddFirst(new KeyValuePair <TKey, TValue>(key, value))
                    };
                }
            }
        }
示例#3
0
        /// <summary>
        /// Properly removes all items from the given tree node.
        /// </summary>
        /// <param name="node"></param>
        private void ClearNode(TTNode node, bool wholeSubtree)
        {
            if (node == null)
            {
                return;
            }

            foreach (var x in node)
            {
                Items.Remove(x.Key);
            }

            if (wholeSubtree)
            {
                ClearNode(node.lNode, true);
                ClearNode(node.rNode, true);
            }
        }