lucenenet-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From nightowl...@apache.org
Subject [lucenenet] 04/07: Lucene.Net.Analysis.ICU.Collation: Added Dispose() to each class that clones its own ICU Collator, as it contains unmanaged disposable resources. Except for ICUCollationKeyFilter because IncrementToken() is called after Dispose(). See LUCENENET-611.
Date Sat, 13 Jul 2019 17:52:06 GMT
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 9f85b4fc2cc0d9bf27432e1f3f56c4ffc21bac0e
Author: Shad Storhaug <shad@shadstorhaug.com>
AuthorDate: Sat Jul 13 09:33:38 2019 +0700

    Lucene.Net.Analysis.ICU.Collation: Added Dispose() to each class that clones its own ICU
Collator, as it contains unmanaged disposable resources. Except for ICUCollationKeyFilter
because IncrementToken() is called after Dispose(). See LUCENENET-611.
---
 .../Collation/ICUCollationDocValuesField.cs             |  9 ++++++++-
 .../Collation/ICUCollationKeyFilter.cs                  |  3 +++
 .../Collation/ICUCollationKeyFilterFactory.cs           | 17 ++++++++++++++++-
 .../TokenAttributes/ICUCollatedTermAttributeImpl.cs     | 13 +++++++++----
 4 files changed, 36 insertions(+), 6 deletions(-)

diff --git a/src/Lucene.Net.Analysis.ICU/Collation/ICUCollationDocValuesField.cs b/src/Lucene.Net.Analysis.ICU/Collation/ICUCollationDocValuesField.cs
index 6b7e11c..70f8850 100644
--- a/src/Lucene.Net.Analysis.ICU/Collation/ICUCollationDocValuesField.cs
+++ b/src/Lucene.Net.Analysis.ICU/Collation/ICUCollationDocValuesField.cs
@@ -2,6 +2,7 @@
 using Lucene.Net.Documents;
 using Lucene.Net.Support;
 using Lucene.Net.Util;
+using System;
 #if NETSTANDARD
 using SortKey = Icu.SortKey;
 #else
@@ -39,7 +40,7 @@ namespace Lucene.Net.Collation
     /// and use less memory than FieldCache.
     /// </remarks>
     [ExceptionToClassNameConvention]
-    public sealed class ICUCollationDocValuesField : Field
+    public sealed class ICUCollationDocValuesField : Field, IDisposable
     {
         private readonly string name;
         private readonly Collator collator;
@@ -80,5 +81,11 @@ namespace Lucene.Net.Collation
             bytes.Offset = 0;
             bytes.Length = key.KeyData.Length;
         }
+
+        // LUCENENET specific - need to dispose collator
+        public void Dispose()
+        {
+            this.collator.Dispose();
+        }
     }
 }
diff --git a/src/Lucene.Net.Analysis.ICU/Collation/ICUCollationKeyFilter.cs b/src/Lucene.Net.Analysis.ICU/Collation/ICUCollationKeyFilter.cs
index afc92f7..1fd0b94 100644
--- a/src/Lucene.Net.Analysis.ICU/Collation/ICUCollationKeyFilter.cs
+++ b/src/Lucene.Net.Analysis.ICU/Collation/ICUCollationKeyFilter.cs
@@ -103,5 +103,8 @@ namespace Lucene.Net.Collation
                 return false;
             }
         }
+
+        // LUCENENET-611 - Dispose is being called and then IncrementToken() is called afterward,
so we cannot dispose our
+        // disposable collator instance here. Need to fix the bug, then override Dispose(bool).
     }
 }
diff --git a/src/Lucene.Net.Analysis.ICU/Collation/ICUCollationKeyFilterFactory.cs b/src/Lucene.Net.Analysis.ICU/Collation/ICUCollationKeyFilterFactory.cs
index 1609e14..040717e 100644
--- a/src/Lucene.Net.Analysis.ICU/Collation/ICUCollationKeyFilterFactory.cs
+++ b/src/Lucene.Net.Analysis.ICU/Collation/ICUCollationKeyFilterFactory.cs
@@ -64,7 +64,7 @@ namespace Lucene.Net.Collation
     /// LUCENENET NOTE: variableTop is not supported by icu.net
     [Obsolete("Use ICUCollationKeyAnalyzer instead.")]
     [ExceptionToClassNameConvention]
-    public class ICUCollationKeyFilterFactory : TokenFilterFactory, IMultiTermAwareComponent,
IResourceLoaderAware
+    public class ICUCollationKeyFilterFactory : TokenFilterFactory, IMultiTermAwareComponent,
IResourceLoaderAware, IDisposable
     {
         private Collator collator;
         private readonly string custom;
@@ -258,5 +258,20 @@ namespace Lucene.Net.Collation
             }
             return sb.ToString();
         }
+
+        // LUCENENET specific - must dispose collator
+        public void Dispose()
+        {
+            Dispose(true);
+            GC.SuppressFinalize(this);
+        }
+
+        protected virtual void Dispose(bool disposing)
+        {
+            if (disposing)
+            {
+                collator?.Dispose();
+            }
+        }
     }
 }
diff --git a/src/Lucene.Net.Analysis.ICU/Collation/TokenAttributes/ICUCollatedTermAttributeImpl.cs
b/src/Lucene.Net.Analysis.ICU/Collation/TokenAttributes/ICUCollatedTermAttributeImpl.cs
index 1dc44f8..6129d8c 100644
--- a/src/Lucene.Net.Analysis.ICU/Collation/TokenAttributes/ICUCollatedTermAttributeImpl.cs
+++ b/src/Lucene.Net.Analysis.ICU/Collation/TokenAttributes/ICUCollatedTermAttributeImpl.cs
@@ -2,6 +2,7 @@
 using Lucene.Net.Analysis.TokenAttributes;
 using Lucene.Net.Support;
 using Lucene.Net.Util;
+using System;
 #if NETSTANDARD
 using SortKey = Icu.SortKey;
 #else
@@ -32,11 +33,9 @@ namespace Lucene.Net.Collation.TokenAttributes
     /// text as a binary Unicode collation key instead of as UTF-8 bytes.
     /// </summary>
     [ExceptionToClassNameConvention]
-    public class ICUCollatedTermAttribute : CharTermAttribute
+    public sealed class ICUCollatedTermAttribute : CharTermAttribute, IDisposable
     {
         private readonly Collator collator;
-        //private readonly RawCollationKey key = new RawCollationKey();
-        private SortKey key;
 
         /// <summary>
         /// Create a new ICUCollatedTermAttribute
@@ -51,10 +50,16 @@ namespace Lucene.Net.Collation.TokenAttributes
         public override void FillBytesRef()
         {
             BytesRef bytes = this.BytesRef;
-            key = collator.GetSortKey(ToString());
+            SortKey key = collator.GetSortKey(ToString());
             bytes.Bytes = key.KeyData;
             bytes.Offset = 0;
             bytes.Length = key.KeyData.Length;
         }
+
+        // LUCENENET specific - must dispose collator
+        public void Dispose()
+        {
+            collator.Dispose();
+        }
     }
 }


Mime
View raw message