This is an automated email from the ASF dual-hosted git repository.

nightowl888 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucenenet.git

commit ddfb7b2108f0d72fd03c563c4bfc2f3479cdf91f
Author: Shad Storhaug <[email protected]>
AuthorDate: Fri Aug 13 04:40:20 2021 +0700

    Lucene.Net.Support.WeakDictionary: Changed backing collection from 
J2N.Collections.Generic.Dictionary<TKey, TValue> to ConcurrentDictionary<TKey, 
TValue> to allow reap to function while doing a forward iteration through the 
collection.
---
 src/Lucene.Net/Support/WeakDictionary.cs | 17 ++++++-----------
 1 file changed, 6 insertions(+), 11 deletions(-)

diff --git a/src/Lucene.Net/Support/WeakDictionary.cs 
b/src/Lucene.Net/Support/WeakDictionary.cs
index 1633499..bc2667b 100644
--- a/src/Lucene.Net/Support/WeakDictionary.cs
+++ b/src/Lucene.Net/Support/WeakDictionary.cs
@@ -22,6 +22,7 @@
 #if !FEATURE_CONDITIONALWEAKTABLE_ENUMERATOR
 using System;
 using System.Collections;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
 using JCG = J2N.Collections.Generic;
 
@@ -49,7 +50,9 @@ namespace Lucene.Net.Support
 
         private WeakDictionary(int initialCapacity, 
IEnumerable<KeyValuePair<TKey, TValue>> otherDict)
         {
-            _hm = new JCG.Dictionary<WeakKey<TKey>, TValue>(initialCapacity);
+            // LUCENENET specific - using ConcurrentDictionary here not 
because we need concurrency, but because
+            // it allows removing items while iterating forward.
+            _hm = new ConcurrentDictionary<WeakKey<TKey>, 
TValue>(concurrencyLevel: 10, capacity: initialCapacity);
             foreach (var kvp in otherDict)
             {
                 _hm.Add(new WeakKey<TKey>(kvp.Key), kvp.Value);
@@ -63,19 +66,11 @@ namespace Lucene.Net.Support
         private void Clean()
         {
             if (_hm.Count == 0) return;
-            var newHm = new JCG.Dictionary<WeakKey<TKey>, TValue>(_hm.Count);
             foreach (var kvp in _hm)
             {
-                if (kvp.Key.TryGetTarget(out TKey _))
-                {
-                    // LUCENENET: There is a tiny chance that a call to remove 
the item
-                    // from the dictionary can happen before this line is 
executed. Therefore,
-                    // just discard the reference and add it as is, even if it 
is no longer valid
-                    // in this edge case. It is far more efficient to re-use 
the same instances, anyway.
-                    newHm.Add(kvp.Key, kvp.Value);
-                }
+                if (!kvp.Key.TryGetTarget(out TKey _))
+                    _hm.Remove(kvp.Key);
             }
-            _hm = newHm;
         }
 
         private void CleanIfNeeded()

Reply via email to