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


The following commit(s) were added to refs/heads/master by this push:
     new f68cbb3  Revert "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."
f68cbb3 is described below

commit f68cbb3ef79e0635397fcc367267ee252e2264c1
Author: Shad Storhaug <[email protected]>
AuthorDate: Mon Oct 25 21:59:56 2021 +0700

    Revert "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."
    
    This reverts commit ddfb7b2108f0d72fd03c563c4bfc2f3479cdf91f.
    
    This was causing occasional test failures of 
Lucene.Net.Support.TestWeakDictionary::C_TestMemLeakage().
---
 src/Lucene.Net/Support/WeakDictionary.cs | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/src/Lucene.Net/Support/WeakDictionary.cs 
b/src/Lucene.Net/Support/WeakDictionary.cs
index bc2667b..1633499 100644
--- a/src/Lucene.Net/Support/WeakDictionary.cs
+++ b/src/Lucene.Net/Support/WeakDictionary.cs
@@ -22,7 +22,6 @@
 #if !FEATURE_CONDITIONALWEAKTABLE_ENUMERATOR
 using System;
 using System.Collections;
-using System.Collections.Concurrent;
 using System.Collections.Generic;
 using JCG = J2N.Collections.Generic;
 
@@ -50,9 +49,7 @@ namespace Lucene.Net.Support
 
         private WeakDictionary(int initialCapacity, 
IEnumerable<KeyValuePair<TKey, TValue>> otherDict)
         {
-            // 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);
+            _hm = new JCG.Dictionary<WeakKey<TKey>, TValue>(initialCapacity);
             foreach (var kvp in otherDict)
             {
                 _hm.Add(new WeakKey<TKey>(kvp.Key), kvp.Value);
@@ -66,11 +63,19 @@ 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 _))
-                    _hm.Remove(kvp.Key);
+                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);
+                }
             }
+            _hm = newHm;
         }
 
         private void CleanIfNeeded()

Reply via email to