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); } }
/// <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)) }; } } }
/// <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); } }