You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by cc...@apache.org on 2012/02/19 10:54:45 UTC

[Lucene.Net] svn commit: r1290981 [1/2] - in /incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk: src/core/ src/core/Analysis/ src/core/Index/ src/core/Search/ src/core/Store/ src/core/Util/ src/core/Util/Cache/ test/core/ test/core/Analysis/ test/core/Index/ tes...

Author: ccurrens
Date: Sun Feb 19 09:54:42 2012
New Revision: 1290981

URL: http://svn.apache.org/viewvc?rev=1290981&view=rev
Log:
[LUCENENET-468] - Implemented dispose on all classes that had void Close
Fixed a few tests failing only in release

Modified:
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Analysis/NumericTokenStream.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Analysis/TeeSinkTokenFilter.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Analysis/TokenStream.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/AbstractAllTermDocs.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/AllTermDocs.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/CompoundFileWriter.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/ConcurrentMergeScheduler.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/DirectoryReader.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/DocumentsWriter.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FieldsReader.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FieldsWriter.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FilterIndexReader.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsDocsWriter.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsFieldsWriter.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsPositionsWriter.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsTermsWriter.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/IndexFileDeleter.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/IndexReader.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/IndexWriter.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/LogByteSizeMergePolicy.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/LogDocMergePolicy.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/LogMergePolicy.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MergePolicy.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MergeScheduler.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MultiLevelSkipListReader.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MultipleTermPositions.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/ParallelReader.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/ReusableStringReader.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentMergeInfo.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentMergeQueue.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentMerger.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentReader.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentTermDocs.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentTermEnum.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentTermPositions.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SerialMergeScheduler.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/StoredFieldsWriter.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermDocs.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermEnum.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermInfosReader.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermInfosWriter.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermPositions.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermVectorsReader.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermVectorsWriter.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Lucene.Net.csproj
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Search/FilteredTermEnum.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Search/FuzzyTermEnum.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Search/IndexSearcher.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Search/MultiSearcher.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Search/NumericRangeQuery.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Search/Searchable.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Search/Searcher.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Search/SimilarityDelegator.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Search/SingleTermEnum.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Store/BufferedIndexInput.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Store/BufferedIndexOutput.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Store/CheckSumIndexOutput.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Store/IndexOutput.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Store/RAMOutputStream.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Store/SimpleFSDirectory.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Util/Cache/Cache.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Util/Cache/SimpleMapCache.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Util/CloseableThreadLocal.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/test/core/Analysis/TestCachingTokenFilter.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/test/core/App.config
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/test/core/Index/TestDocumentWriter.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/test/core/Index/TestFieldsReader.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/test/core/Index/TestIndexWriter.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/test/core/Index/TestPayloads.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/test/core/Index/TestTermVectorsReader.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/test/core/Index/TestTermdocPerf.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/test/core/Lucene.Net.Test.csproj
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/test/core/QueryParser/TestMultiFieldQueryParser.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/test/core/Search/JustCompileSearch.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/test/core/Search/TestPositionIncrement.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/test/core/Search/TestSort.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/test/core/Store/MockRAMOutputStream.cs
    incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/test/core/TestMergeSchedulerExternal.cs

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Analysis/NumericTokenStream.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Analysis/NumericTokenStream.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Analysis/NumericTokenStream.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Analysis/NumericTokenStream.cs Sun Feb 19 09:54:42 2012
@@ -84,7 +84,7 @@ namespace Lucene.Net.Analysis
 	/// might change in incompatible ways in the next release.</font>
 	///   Since 2.9
 	/// </summary>
-	public sealed class NumericTokenStream:TokenStream
+	public sealed class NumericTokenStream : TokenStream
 	{
 		private void  InitBlock()
 		{
@@ -209,6 +209,11 @@ namespace Lucene.Net.Analysis
 				throw new System.SystemException("call set???Value() before usage");
 			shift = 0;
 		}
+
+        protected override void Dispose(bool disposing)
+        {
+            // Do nothing.
+        }
 		
 		// @Override
 		public override bool IncrementToken()

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Analysis/TeeSinkTokenFilter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Analysis/TeeSinkTokenFilter.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Analysis/TeeSinkTokenFilter.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Analysis/TeeSinkTokenFilter.cs Sun Feb 19 09:54:42 2012
@@ -188,13 +188,13 @@ namespace Lucene.Net.Analysis
 			}
 		}
 		
-		public sealed class SinkTokenStream:TokenStream
+		public sealed class SinkTokenStream : TokenStream
 		{
             private LinkedList<AttributeSource.State> cachedStates = new LinkedList<AttributeSource.State>();
 			private AttributeSource.State finalState;
 			private IEnumerator<AttributeSource.State> it = null;
 			private SinkFilter filter;
-			
+
 			internal SinkTokenStream(AttributeSource source, SinkFilter filter)
                 : base(source)
 			{
@@ -250,6 +250,11 @@ namespace Lucene.Net.Analysis
 			{
 				it = cachedStates.GetEnumerator();
 			}
+
+		    protected override void Dispose(bool disposing)
+		    {
+		        // Do nothing.
+		    }
 		}
 		
 		private static readonly SinkFilter ACCEPT_ALL_FILTER;

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Analysis/TokenStream.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Analysis/TokenStream.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Analysis/TokenStream.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Analysis/TokenStream.cs Sun Feb 19 09:54:42 2012
@@ -159,7 +159,6 @@ namespace Lucene.Net.Analysis
             Dispose(true);
         }
 
-	    protected virtual void Dispose(bool disposing)
-	    { }
+	    protected abstract void Dispose(bool disposing);
 	}
 }
\ No newline at end of file

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/AbstractAllTermDocs.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/AbstractAllTermDocs.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/AbstractAllTermDocs.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/AbstractAllTermDocs.cs Sun Feb 19 09:54:42 2012
@@ -113,10 +113,7 @@ namespace Lucene.Net.Index
             Dispose(true);
         }
 
-        protected virtual void Dispose(bool disposing)
-        {
-            
-        }
+        protected abstract void Dispose(bool disposing);
 
         public abstract bool IsDeleted(int doc);
     }

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/AllTermDocs.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/AllTermDocs.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/AllTermDocs.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/AllTermDocs.cs Sun Feb 19 09:54:42 2012
@@ -34,6 +34,11 @@ namespace Lucene.Net.Index
 			}
 		}
 
+        protected override void Dispose(bool disposing)
+        {
+            // Do nothing.
+        }
+
         public override bool IsDeleted(int doc)
         {
             return deletedDocs != null && deletedDocs.Get(doc);

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/CompoundFileWriter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/CompoundFileWriter.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/CompoundFileWriter.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/CompoundFileWriter.cs Sun Feb 19 09:54:42 2012
@@ -44,7 +44,7 @@ namespace Lucene.Net.Index
 	/// contains a long pointer to the start of this file's data section, and a String
 	/// with that file's name.
 	/// </summary>
-	public sealed class CompoundFileWriter
+	public sealed class CompoundFileWriter : IDisposable
 	{
 		
 		private sealed class FileEntry
@@ -131,92 +131,102 @@ namespace Lucene.Net.Index
 			entries.AddLast(entry);
 		}
 		
-		/// <summary>Merge files with the extensions added up to now.
-		/// All files with these extensions are combined sequentially into the
-		/// compound stream. After successful merge, the source files
-		/// are deleted.
-		/// </summary>
-		/// <throws>  IllegalStateException if close() had been called before or </throws>
-		/// <summary>   if no file has been added to this object
-		/// </summary>
+        [Obsolete("Use Dispose() instead")]
 		public void  Close()
 		{
-			if (merged)
-				throw new System.SystemException("Merge already performed");
-			
-			if ((entries.Count == 0))
-				throw new System.SystemException("No entries to merge have been defined");
-			
-			merged = true;
-			
-			// open the compound stream
-			IndexOutput os = null;
-			try
-			{
-				os = directory.CreateOutput(fileName);
-				
-				// Write the number of entries
-				os.WriteVInt(entries.Count);
-				
-				// Write the directory with all offsets at 0.
-				// Remember the positions of directory entries so that we can
-				// adjust the offsets later
-				long totalSize = 0;
-				foreach(FileEntry fe in entries)
-				{
-					fe.directoryOffset = os.GetFilePointer();
-					os.WriteLong(0); // for now
-					os.WriteString(fe.file);
-					totalSize += directory.FileLength(fe.file);
-				}
-				
-				// Pre-allocate size of file as optimization --
-				// this can potentially help IO performance as
-				// we write the file and also later during
-				// searching.  It also uncovers a disk-full
-				// situation earlier and hopefully without
-				// actually filling disk to 100%:
-				long finalLength = totalSize + os.GetFilePointer();
-				os.SetLength(finalLength);
-				
-				// Open the files and copy their data into the stream.
-				// Remember the locations of each file's data section.
-				byte[] buffer = new byte[16384];
-				foreach(FileEntry fe in entries)
-				{
-					fe.dataOffset = os.GetFilePointer();
-					CopyFile(fe, os, buffer);
-				}
-				
-				// Write the data offsets into the directory of the compound stream
-				foreach(FileEntry fe in entries)
-				{
-					os.Seek(fe.directoryOffset);
-					os.WriteLong(fe.dataOffset);
-				}
-				
-				System.Diagnostics.Debug.Assert(finalLength == os.Length());
-				
-				// Close the output stream. Set the os to null before trying to
-				// close so that if an exception occurs during the close, the
-				// finally clause below will not attempt to close the stream
-				// the second time.
-				IndexOutput tmp = os;
-				os = null;
-				tmp.Close();
-			}
-			finally
-			{
-				if (os != null)
-					try
-					{
-						os.Close();
-					}
-					catch (System.IO.IOException e)
-					{
-					}
-			}
+		    Dispose();
 		}
+
+        /// <summary>Merge files with the extensions added up to now.
+        /// All files with these extensions are combined sequentially into the
+        /// compound stream. After successful merge, the source files
+        /// are deleted.
+        /// </summary>
+        /// <throws>  IllegalStateException if close() had been called before or </throws>
+        /// <summary>   if no file has been added to this object
+        /// </summary>
+        public void Dispose()
+        {
+            // Extract into protected method if class ever becomes unsealed
+
+            // TODO: Dispose shouldn't throw exceptions!
+            if (merged)
+                throw new System.SystemException("Merge already performed");
+
+            if ((entries.Count == 0))
+                throw new System.SystemException("No entries to merge have been defined");
+
+            merged = true;
+
+            // open the compound stream
+            IndexOutput os = null;
+            try
+            {
+                os = directory.CreateOutput(fileName);
+
+                // Write the number of entries
+                os.WriteVInt(entries.Count);
+
+                // Write the directory with all offsets at 0.
+                // Remember the positions of directory entries so that we can
+                // adjust the offsets later
+                long totalSize = 0;
+                foreach (FileEntry fe in entries)
+                {
+                    fe.directoryOffset = os.GetFilePointer();
+                    os.WriteLong(0); // for now
+                    os.WriteString(fe.file);
+                    totalSize += directory.FileLength(fe.file);
+                }
+
+                // Pre-allocate size of file as optimization --
+                // this can potentially help IO performance as
+                // we write the file and also later during
+                // searching.  It also uncovers a disk-full
+                // situation earlier and hopefully without
+                // actually filling disk to 100%:
+                long finalLength = totalSize + os.GetFilePointer();
+                os.SetLength(finalLength);
+
+                // Open the files and copy their data into the stream.
+                // Remember the locations of each file's data section.
+                byte[] buffer = new byte[16384];
+                foreach (FileEntry fe in entries)
+                {
+                    fe.dataOffset = os.GetFilePointer();
+                    CopyFile(fe, os, buffer);
+                }
+
+                // Write the data offsets into the directory of the compound stream
+                foreach (FileEntry fe in entries)
+                {
+                    os.Seek(fe.directoryOffset);
+                    os.WriteLong(fe.dataOffset);
+                }
+
+                System.Diagnostics.Debug.Assert(finalLength == os.Length());
+
+                // Close the output stream. Set the os to null before trying to
+                // close so that if an exception occurs during the close, the
+                // finally clause below will not attempt to close the stream
+                // the second time.
+                IndexOutput tmp = os;
+                os = null;
+                tmp.Close();
+            }
+            finally
+            {
+                if (os != null)
+                    try
+                    {
+                        os.Close();
+                    }
+                    catch (System.IO.IOException e)
+                    {
+                    }
+            }
+        }
+
 		
 		/// <summary>Copy the contents of the file with specified extension into the
 		/// provided output stream. Use the provided buffer for moving data

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/ConcurrentMergeScheduler.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/ConcurrentMergeScheduler.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/ConcurrentMergeScheduler.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/ConcurrentMergeScheduler.cs Sun Feb 19 09:54:42 2012
@@ -137,10 +137,13 @@ namespace Lucene.Net.Index
 			}
 		}
 		
-		public override void  Close()
-		{
-			closed = true;
-		}
+        protected override void Dispose(bool disposing)
+        {
+            //if (disposing)
+            //{
+                closed = true;
+            //}
+        }
 		
 		public virtual void  Sync()
 		{

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/DirectoryReader.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/DirectoryReader.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/DirectoryReader.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/DirectoryReader.cs Sun Feb 19 09:54:42 2012
@@ -964,7 +964,7 @@ namespace Lucene.Net.Index
                 // Have the deleter remove any now unreferenced
                 // files due to this commit:
                 deleter.Checkpoint(segmentInfos, true);
-                deleter.Close();
+                deleter.Dispose();
 
                 maxIndexVersion = segmentInfos.GetVersion();
                 
@@ -1243,7 +1243,7 @@ namespace Lucene.Net.Index
                         queue.Add(smi);
                     // initialize queue
                     else
-                        smi.Close();
+                        smi.Dispose();
                 }
                 
                 if (t != null && queue.Size() > 0)
@@ -1262,7 +1262,7 @@ namespace Lucene.Net.Index
                     if (smi.Next())
                         queue.Add(smi);
                     else
-                        smi.Close(); // done with segment
+                        smi.Dispose(); // done with segment
                 }
                 
                 int numMatchingSegments = 0;
@@ -1301,14 +1301,12 @@ namespace Lucene.Net.Index
                 return docFreq;
             }
             
-            public override void  Close()
+            protected override void Dispose(bool disposing)
             {
-                Dispose();
-            }
-
-            public override void Dispose()
-            {
-                queue.Close();
+                if (disposing)
+                {
+                    queue.Dispose();
+                }
             }
         }
         
@@ -1503,10 +1501,18 @@ namespace Lucene.Net.Index
 
             public virtual void Dispose()
             {
-                for (int i = 0; i < readerTermDocs.Length; i++)
+                Dispose(true);
+            }
+
+            protected virtual void Dispose(bool disposing)
+            {
+                if (disposing)
                 {
-                    if (readerTermDocs[i] != null)
-                        readerTermDocs[i].Close();
+                    for (int i = 0; i < readerTermDocs.Length; i++)
+                    {
+                        if (readerTermDocs[i] != null)
+                            readerTermDocs[i].Close();
+                    }
                 }
             }
         }

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/DocumentsWriter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/DocumentsWriter.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/DocumentsWriter.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/DocumentsWriter.cs Sun Feb 19 09:54:42 2012
@@ -100,7 +100,7 @@ namespace Lucene.Net.Index
 	/// or none") added to the index.
 	/// </summary>
 	
-	public sealed class DocumentsWriter
+	public sealed class DocumentsWriter : IDisposable
 	{
 		internal class AnonymousClassIndexingChain:IndexingChain
 		{
@@ -873,14 +873,15 @@ namespace Lucene.Net.Index
 			}
 		}
 		
-		internal void  Close()
-		{
-			lock (this)
-			{
-				closed = true;
-				System.Threading.Monitor.PulseAll(this);
-			}
-		}
+        public void Dispose()
+        {
+            // Move to protected method if class becomes unsealed
+            lock (this)
+            {
+                closed = true;
+                System.Threading.Monitor.PulseAll(this);
+            }
+        }
 		
 		internal void  InitSegmentName(bool onlyDocStore)
 		{

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FieldsReader.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FieldsReader.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FieldsReader.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FieldsReader.cs Sun Feb 19 09:54:42 2012
@@ -34,7 +34,7 @@ namespace Lucene.Net.Index
 	/// It uses &lt;segment&gt;.fdt and &lt;segment&gt;.fdx; files.
 	/// 
 	/// </summary>
-	public sealed class FieldsReader : System.ICloneable
+	public sealed class FieldsReader : ICloneable, IDisposable
 	{
 		private FieldInfos fieldInfos;
 		
@@ -159,7 +159,7 @@ namespace Lucene.Net.Index
 				// wait for a GC to do so.
 				if (!success)
 				{
-					Close();
+					Dispose();
 				}
 			}
 		}
@@ -178,33 +178,34 @@ namespace Lucene.Net.Index
 		/// 
 		/// </summary>
 		/// <throws>  IOException </throws>
-		public /*internal*/ void  Close()
-		{
-			if (!closed)
-			{
-				if (fieldsStream != null)
-				{
-					fieldsStream.Close();
-				}
-				if (isOriginal)
-				{
-					if (cloneableFieldsStream != null)
-					{
-						cloneableFieldsStream.Close();
-					}
-					if (cloneableIndexStream != null)
-					{
-						cloneableIndexStream.Close();
-					}
-				}
-				if (indexStream != null)
-				{
-					indexStream.Close();
-				}
-				fieldsStreamTL.Close();
-				closed = true;
-			}
-		}
+        public void Dispose()
+        {
+            // Move to protected method if class becomes unsealed
+            if (!closed)
+            {
+                if (fieldsStream != null)
+                {
+                    fieldsStream.Close();
+                }
+                if (isOriginal)
+                {
+                    if (cloneableFieldsStream != null)
+                    {
+                        cloneableFieldsStream.Close();
+                    }
+                    if (cloneableIndexStream != null)
+                    {
+                        cloneableIndexStream.Close();
+                    }
+                }
+                if (indexStream != null)
+                {
+                    indexStream.Close();
+                }
+                fieldsStreamTL.Close();
+                closed = true;
+            }
+        }
 		
 		public /*internal*/ int Size()
 		{

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FieldsWriter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FieldsWriter.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FieldsWriter.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FieldsWriter.cs Sun Feb 19 09:54:42 2012
@@ -28,7 +28,7 @@ using RAMOutputStream = Lucene.Net.Store
 namespace Lucene.Net.Index
 {
 	
-	sealed class FieldsWriter
+	sealed class FieldsWriter : IDisposable
 	{
 		internal const byte FIELD_IS_TOKENIZED = (0x1);
 		internal const byte FIELD_IS_BINARY = (0x2);
@@ -75,7 +75,7 @@ namespace Lucene.Net.Index
 				{
 					try
 					{
-						Close();
+						Dispose();
 					}
 					catch (System.Exception t)
 					{
@@ -106,7 +106,7 @@ namespace Lucene.Net.Index
 				{
 					try
 					{
-						Close();
+						Dispose();
 					}
 					catch (System.IO.IOException ioe)
 					{
@@ -169,11 +169,11 @@ namespace Lucene.Net.Index
 			fieldsStream.Flush();
 		}
 		
-		internal void  Close()
+		public void Dispose()
 		{
+            // Move to protected method if class becomes unsealed
 			if (doClose)
 			{
-				
 				try
 				{
 					if (fieldsStream != null)
@@ -208,7 +208,7 @@ namespace Lucene.Net.Index
 					{
 						// Ignore so we throw only first IOException hit
 					}
-					throw ioe;
+					throw;
 				}
 				finally
 				{

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FilterIndexReader.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FilterIndexReader.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FilterIndexReader.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FilterIndexReader.cs Sun Feb 19 09:54:42 2012
@@ -74,13 +74,23 @@ namespace Lucene.Net.Index
 			{
 				return in_Renamed.SkipTo(i);
 			}
-			public virtual void  Close()
+
+			public void Close()
 			{
 				Dispose();
 			}
-            public virtual void Dispose()
+
+            public void Dispose()
+            {
+                Dispose(true);
+            }
+
+            protected virtual void Dispose(bool disposing)
             {
-                in_Renamed.Close();
+                if (disposing)
+                {
+                    in_Renamed.Close();
+                }
             }
 		}
 		
@@ -129,21 +139,23 @@ namespace Lucene.Net.Index
 			{
 				return in_Renamed.Next();
 			}
+
 			public override Term Term()
 			{
 				return in_Renamed.Term();
 			}
+
 			public override int DocFreq()
 			{
 				return in_Renamed.DocFreq();
 			}
-			public override void  Close()
-			{
-				Dispose();
-			}
-            public override void Dispose()
+
+            protected override void Dispose(bool disposing)
             {
-                in_Renamed.Close();
+                if (disposing)
+                {
+                    in_Renamed.Close();
+                }
             }
 		}
 		

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsDocsWriter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsDocsWriter.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsDocsWriter.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsDocsWriter.cs Sun Feb 19 09:54:42 2012
@@ -24,7 +24,7 @@ namespace Lucene.Net.Index
     /// <summary>Consumes doc and freq, writing them using the current
     /// index file format 
     /// </summary>
-	sealed class FormatPostingsDocsWriter:FormatPostingsDocsConsumer
+	sealed class FormatPostingsDocsWriter : FormatPostingsDocsConsumer, IDisposable
 	{
 		
 		internal IndexOutput out_Renamed;
@@ -123,11 +123,12 @@ namespace Lucene.Net.Index
 			lastDocID = 0;
 			df = 0;
 		}
-		
-		internal void  Close()
-		{
-			out_Renamed.Close();
-			posWriter.Close();
-		}
+
+        public void Dispose()
+        {
+            // Move to protected method if class becomes unsealed
+            out_Renamed.Dispose();
+            posWriter.Dispose();
+        }
 	}
 }
\ No newline at end of file

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsFieldsWriter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsFieldsWriter.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsFieldsWriter.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsFieldsWriter.cs Sun Feb 19 09:54:42 2012
@@ -64,8 +64,8 @@ namespace Lucene.Net.Index
 		/// <summary>Called when we are done adding everything. </summary>
 		internal override void  Finish()
 		{
-			termsOut.Close();
-			termsWriter.Close();
+			termsOut.Dispose();
+			termsWriter.Dispose();
 		}
 	}
 }
\ No newline at end of file

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsPositionsWriter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsPositionsWriter.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsPositionsWriter.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsPositionsWriter.cs Sun Feb 19 09:54:42 2012
@@ -25,7 +25,6 @@ namespace Lucene.Net.Index
 	
 	sealed class FormatPostingsPositionsWriter:FormatPostingsPositionsConsumer
 	{
-		
 		internal FormatPostingsDocsWriter parent;
 		internal IndexOutput out_Renamed;
 		
@@ -92,10 +91,11 @@ namespace Lucene.Net.Index
 			lastPayloadLength = - 1;
 		}
 		
-		internal void  Close()
-		{
-			if (out_Renamed != null)
-				out_Renamed.Close();
-		}
+        public void Dispose()
+        {
+            // Move to protected method if class becomes unsealed
+            if (out_Renamed != null)
+                out_Renamed.Close();
+        }
 	}
 }
\ No newline at end of file

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsTermsWriter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsTermsWriter.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsTermsWriter.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/FormatPostingsTermsWriter.cs Sun Feb 19 09:54:42 2012
@@ -20,9 +20,8 @@ using System;
 namespace Lucene.Net.Index
 {
 	
-	sealed class FormatPostingsTermsWriter:FormatPostingsTermsConsumer
+	sealed class FormatPostingsTermsWriter : FormatPostingsTermsConsumer, IDisposable
 	{
-		
 		internal FormatPostingsFieldsWriter parent;
 		internal FormatPostingsDocsWriter docsWriter;
 		internal TermInfosWriter termsOut;
@@ -70,9 +69,9 @@ namespace Lucene.Net.Index
 		{
 		}
 		
-		internal void  Close()
-		{
-			docsWriter.Close();
-		}
+        public void Dispose()
+        {
+            docsWriter.Dispose();
+        }
 	}
 }
\ No newline at end of file

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/IndexFileDeleter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/IndexFileDeleter.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/IndexFileDeleter.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/IndexFileDeleter.cs Sun Feb 19 09:54:42 2012
@@ -60,7 +60,7 @@ namespace Lucene.Net.Index
     /// directly with no retry logic.</para>
     /// </summary>
 	
-	public sealed class IndexFileDeleter
+	public sealed class IndexFileDeleter : IDisposable
 	{
 		
 		//// Files that we tried to delete but failed (likely
@@ -381,8 +381,9 @@ namespace Lucene.Net.Index
 			Refresh(null);
 		}
 		
-		public void  Close()
+		public void Dispose()
 		{
+            // Move to protected method if class becomes unsealed
 			// DecRef old files from the last checkpoint, if any:
 			int size = lastFiles.Count;
 			if (size > 0)

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/IndexReader.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/IndexReader.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/IndexReader.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/IndexReader.cs Sun Feb 19 09:54:42 2012
@@ -1124,29 +1124,35 @@ namespace Lucene.Net.Index
 		/// <summary>Implements commit.</summary>
 	    protected internal abstract void DoCommit(System.Collections.Generic.IDictionary<string, string> commitUserData);
 
-		/// <summary> Closes files associated with this index.
-		/// Also saves any new deletions to disk.
-		/// No other methods should be called after this has been called.
-		/// </summary>
-		/// <throws>  IOException if there is a low-level IO error </throws>
-		public void  Close()
+        [Obsolete("Use Dispose() instead")]
+		public void Close()
 		{
-			lock (this)
-			{
-				if (!closed)
-				{
-					DecRef();
-					closed = true;
-				}
-			}
+		    Dispose();
 		}
 
-        /// <summary>
-        /// .NET
+        /// <summary> Closes files associated with this index.
+        /// Also saves any new deletions to disk.
+        /// No other methods should be called after this has been called.
         /// </summary>
+        /// <throws>  IOException if there is a low-level IO error </throws>
         public void Dispose()
         {
-            Close();
+            Dispose(true);
+        }
+
+        protected virtual void Dispose(bool disposing)
+        {
+            if (disposing)
+            {
+                lock (this)
+                {
+                    if (!closed)
+                    {
+                        DecRef();
+                        closed = true;
+                    }
+                }
+            }
         }
 		
 		/// <summary>Implements close. </summary>

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/IndexWriter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/IndexWriter.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/IndexWriter.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/IndexWriter.cs Sun Feb 19 09:54:42 2012
@@ -402,7 +402,7 @@ namespace Lucene.Net.Index
 		/// has been called on this instance). 
 		/// </summary>
 		
-		internal class ReaderPool
+		internal class ReaderPool : IDisposable
 		{
 			public ReaderPool(IndexWriter enclosingInstance)
 			{
@@ -544,45 +544,54 @@ namespace Lucene.Net.Index
 					}
 				}
 			}
-			
-			/// <summary>Remove all our references to readers, and commits
-			/// any pending changes. 
-			/// </summary>
-			internal virtual void  Close()
-			{
-                // We invoke deleter.checkpoint below, so we must be
-                // sync'd on IW:
-                // TODO: assert Thread.holdsLock(IndexWriter.this);
-				lock (this)
-				{
-				    var toRemove = new List<SegmentInfo>();
-				    var iter = readerMap.GetEnumerator();
-					while (iter.MoveNext())
-					{
-					    KeyValuePair<SegmentInfo, SegmentReader> ent = iter.Current;
-						SegmentReader sr = ent.Value;
-						if (sr.hasChanges)
-						{
-							System.Diagnostics.Debug.Assert(InfoIsLive(sr.GetSegmentInfo()));
-							sr.DoCommit(null);
-                            // Must checkpoint w/ deleter, because this
-                            // segment reader will have created new _X_N.del
-                            // file.
-                            enclosingInstance.deleter.Checkpoint(enclosingInstance.segmentInfos, false);
-						}
 
-                        toRemove.Add(ent.Key); 
-						
-						// NOTE: it is allowed that this decRef does not
-						// actually close the SR; this can happen when a
-						// near real-time reader is kept open after the
-						// IndexWriter instance is closed
-						sr.DecRef();
-					}
-                    foreach (var key in toRemove)
-                        readerMap.Remove(key);
-				}
-			}
+            /// <summary>Remove all our references to readers, and commits
+            /// any pending changes. 
+            /// </summary>
+		    public void Dispose()
+		    {
+		        Dispose(true);
+		    }
+
+            protected void Dispose(bool disposing)
+            {
+                if (disposing)
+                {
+                    // We invoke deleter.checkpoint below, so we must be
+                    // sync'd on IW:
+                    // TODO: assert Thread.holdsLock(IndexWriter.this);
+                    // TODO: Should this class have bool _isDisposed?
+                    lock (this)
+                    {
+                        //var toRemove = new List<SegmentInfo>();
+                        foreach (var ent in readerMap)
+                        {
+                            SegmentReader sr = ent.Value;
+                            if (sr.hasChanges)
+                            {
+                                System.Diagnostics.Debug.Assert(InfoIsLive(sr.GetSegmentInfo()));
+                                sr.DoCommit(null);
+                                // Must checkpoint w/ deleter, because this
+                                // segment reader will have created new _X_N.del
+                                // file.
+                                enclosingInstance.deleter.Checkpoint(enclosingInstance.segmentInfos, false);
+                            }
+
+                            //toRemove.Add(ent.Key);
+
+                            // NOTE: it is allowed that this decRef does not
+                            // actually close the SR; this can happen when a
+                            // near real-time reader is kept open after the
+                            // IndexWriter instance is closed
+                            sr.DecRef();
+                        }
+
+                        //foreach (var key in toRemove)
+                        //    readerMap.Remove(key);
+                        readerMap.Clear();
+                    }
+                }
+            }
 			
 			/// <summary> Commit all segment reader in the pool.</summary>
 			/// <throws>  IOException </throws>
@@ -1851,17 +1860,102 @@ namespace Lucene.Net.Index
 		/// </summary>
 		/// <throws>  CorruptIndexException if the index is corrupt </throws>
 		/// <throws>  IOException if there is a low-level IO error </throws>
-		public virtual void  Close()
+		[Obsolete("Use Dispose() instead")]
+		public void Close()
 		{
-			Close(true);
+		    Dispose(true);
 		}
 
-        /// <summary>
-        /// .NET
+        /// <summary> Commits all changes to an index and closes all
+        /// associated files.  Note that this may be a costly
+        /// operation, so, try to re-use a single writer instead of
+        /// closing and opening a new one.  See <see cref="Commit()" /> for
+        /// caveats about write caching done by some IO devices.
+        /// 
+        /// <p/> If an Exception is hit during close, eg due to disk
+        /// full or some other reason, then both the on-disk index
+        /// and the internal state of the IndexWriter instance will
+        /// be consistent.  However, the close will not be complete
+        /// even though part of it (flushing buffered documents)
+        /// may have succeeded, so the write lock will still be
+        /// held.<p/>
+        /// 
+        /// <p/> If you can correct the underlying cause (eg free up
+        /// some disk space) then you can call close() again.
+        /// Failing that, if you want to force the write lock to be
+        /// released (dangerous, because you may then lose buffered
+        /// docs in the IndexWriter instance) then you can do
+        /// something like this:<p/>
+        /// 
+        /// <code>
+        /// try {
+        ///     writer.close();
+        /// } finally {
+        ///     if (IndexWriter.isLocked(directory)) {
+        ///         IndexWriter.unlock(directory);
+        ///     }
+        /// }
+        /// </code>
+        /// 
+        /// after which, you must be certain not to use the writer
+        /// instance anymore.<p/>
+        /// 
+        /// <p/><b>NOTE</b>: if this method hits an OutOfMemoryError
+        /// you should immediately close the writer, again.  See <a
+        /// href="#OOME">above</a> for details.<p/>
+        /// 
         /// </summary>
+        /// <throws>  CorruptIndexException if the index is corrupt </throws>
+        /// <throws>  IOException if there is a low-level IO error </throws>
         public virtual void Dispose()
         {
-            Close();
+            Dispose(true);
+        }
+
+        /// <summary> Closes the index with or without waiting for currently
+        /// running merges to finish.  This is only meaningful when
+        /// using a MergeScheduler that runs merges in background
+        /// threads.
+        /// 
+        /// <p/><b>NOTE</b>: if this method hits an OutOfMemoryError
+        /// you should immediately close the writer, again.  See <a
+        /// href="#OOME">above</a> for details.<p/>
+        /// 
+        /// <p/><b>NOTE</b>: it is dangerous to always call
+        /// close(false), especially when IndexWriter is not open
+        /// for very long, because this can result in "merge
+        /// starvation" whereby long merges will never have a
+        /// chance to finish.  This will cause too many segments in
+        /// your index over time.<p/>
+        /// 
+        /// </summary>
+        /// <param name="waitForMerges">if true, this call will block
+        /// until all merges complete; else, it will ask all
+        /// running merges to abort, wait until those merges have
+        /// finished (which should be at most a few seconds), and
+        /// then return.
+        /// </param>
+        public virtual void Dispose(bool waitForMerges)
+        {
+            Dispose(true, waitForMerges);
+        }
+
+        protected virtual void Dispose(bool disposing, bool waitForMerges)
+        {
+            if (disposing)
+            {
+                // Ensure that only one thread actually gets to do the closing:
+                if (ShouldClose())
+                {
+                    // If any methods have hit OutOfMemoryError, then abort
+                    // on close, in case the internal state of IndexWriter
+                    // or DocumentsWriter is corrupt
+                    if (hitOOM)
+                        RollbackInternal();
+                    else
+                        CloseInternal(waitForMerges);
+                }
+            }
         }
 		
 		/// <summary> Closes the index with or without waiting for currently
@@ -1887,20 +1981,10 @@ namespace Lucene.Net.Index
 		/// finished (which should be at most a few seconds), and
 		/// then return.
 		/// </param>
-		public virtual void  Close(bool waitForMerges)
+		[Obsolete("Use Dispose(bool) instead")]
+		public virtual void Close(bool waitForMerges)
 		{
-			
-			// Ensure that only one thread actually gets to do the closing:
-			if (ShouldClose())
-			{
-				// If any methods have hit OutOfMemoryError, then abort
-				// on close, in case the internal state of IndexWriter
-				// or DocumentsWriter is corrupt
-				if (hitOOM)
-					RollbackInternal();
-				else
-					CloseInternal(waitForMerges);
-			}
+		    Dispose(waitForMerges);
 		}
 		
 		// Returns true if this thread should attempt to close, or
@@ -1933,7 +2017,7 @@ namespace Lucene.Net.Index
 			}
 		}
 		
-		private void  CloseInternal(bool waitForMerges)
+		private void CloseInternal(bool waitForMerges)
 		{
 			
 			docWriter.PauseAllThreads();
@@ -1943,7 +2027,7 @@ namespace Lucene.Net.Index
 				if (infoStream != null)
 					Message("now flush at close");
 				
-				docWriter.Close();
+				docWriter.Dispose();
 				
 				// Only allow a new merge to be triggered if we are
 				// going to wait for merges:
@@ -1977,9 +2061,9 @@ namespace Lucene.Net.Index
 				
 				lock (this)
 				{
-					readerPool.Close();
+					readerPool.Dispose();
 					docWriter = null;
-					deleter.Close();
+					deleter.Dispose();
 				}
 				
 				if (writeLock != null)

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/LogByteSizeMergePolicy.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/LogByteSizeMergePolicy.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/LogByteSizeMergePolicy.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/LogByteSizeMergePolicy.cs Sun Feb 19 09:54:42 2012
@@ -47,6 +47,11 @@ namespace Lucene.Net.Index
 		{
 			return SizeBytes(info);
 		}
+
+        protected override void Dispose(bool disposing)
+        {
+            // Do nothing.
+        }
 		
 		/// <summary><p/>Determines the largest segment (measured by total
 		/// byte size of the segment's files, in MB) that may be

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/LogDocMergePolicy.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/LogDocMergePolicy.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/LogDocMergePolicy.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/LogDocMergePolicy.cs Sun Feb 19 09:54:42 2012
@@ -59,7 +59,12 @@ namespace Lucene.Net.Index
 		{
 			minMergeSize = minMergeDocs;
 		}
-		
+
+        protected override void Dispose(bool disposing)
+        {
+            // Do nothing.
+        }
+
 		/// <summary>Get the minimum size for a segment to remain
 		/// un-merged.
 		/// </summary>

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/LogMergePolicy.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/LogMergePolicy.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/LogMergePolicy.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/LogMergePolicy.cs Sun Feb 19 09:54:42 2012
@@ -206,17 +206,6 @@ namespace Lucene.Net.Index
 			return calibrateSizeByDeletes;
 		}
 		
-        [Obsolete("This method is being replaced by Dispose()")]
-		public override void  Close()
-		{
-            Dispose();
-		}
-
-        public override void Dispose()
-        {
-            //wow do nothing!
-        }
-		
 		abstract protected internal long Size(SegmentInfo info);
 		
 		protected internal virtual long SizeDocs(SegmentInfo info)

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MergePolicy.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MergePolicy.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MergePolicy.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MergePolicy.cs Sun Feb 19 09:54:42 2012
@@ -281,11 +281,19 @@ namespace Lucene.Net.Index
 		public abstract MergeSpecification FindMergesToExpungeDeletes(SegmentInfos segmentInfos);
 
         /// <summary> Release all resources for the policy.</summary>
-        [Obsolete("This method is being replaced by Dispose()")]
-		public abstract void  Close();
+        [Obsolete("Use Dispose() instead")]
+		public void Close()
+        {
+            Dispose();
+        }
 
         /// <summary> Release all resources for the policy.</summary>
-	    public abstract void Dispose();
+	    public void Dispose()
+	    {
+	        Dispose(true);
+	    }
+
+	    protected abstract void Dispose(bool disposing);
 		
 		/// <summary> Returns true if a newly flushed (not from merge)
 		/// segment should use the compound file format.

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MergeScheduler.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MergeScheduler.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MergeScheduler.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MergeScheduler.cs Sun Feb 19 09:54:42 2012
@@ -35,13 +35,24 @@ namespace Lucene.Net.Index
 	/// these APIs.
 	/// </summary>
 	
-	public abstract class MergeScheduler
+	public abstract class MergeScheduler : IDisposable
 	{
 		
 		/// <summary>Run the merges provided by <see cref="IndexWriter.GetNextMerge()" />. </summary>
 		public abstract void  Merge(IndexWriter writer);
 		
-		/// <summary>Close this MergeScheduler. </summary>
-		public abstract void  Close();
+        [Obsolete("Use Dispose() instead")]
+		public void Close()
+        {
+            Dispose();
+        }
+
+        public void Dispose()
+        {
+            Dispose(true);
+        }
+
+	    /// <summary>Close this MergeScheduler. </summary>
+	    protected abstract void Dispose(bool disposing);
 	}
 }
\ No newline at end of file

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MultiLevelSkipListReader.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MultiLevelSkipListReader.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MultiLevelSkipListReader.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MultiLevelSkipListReader.cs Sun Feb 19 09:54:42 2012
@@ -31,7 +31,7 @@ namespace Lucene.Net.Index
 	/// Subclasses must implement the abstract method <see cref="ReadSkipData(int, IndexInput)" />
 	/// which defines the actual format of the skip data.
 	/// </summary>
-	abstract class MultiLevelSkipListReader
+	abstract class MultiLevelSkipListReader : IDisposable
 	{
 		// the maximum number of skip levels possible for this index
 		private int maxNumberOfSkipLevels;
@@ -50,6 +50,8 @@ namespace Lucene.Net.Index
 		
 		private int docCount;
 		private bool haveSkipped;
+
+	    private bool isDisposed;
 		
 		private IndexInput[] skipStream; // skipStream for each level
 		private long[] skipPointer; // the start pointer of each skip level
@@ -175,17 +177,29 @@ namespace Lucene.Net.Index
 				childPointer[level] = skipStream[level].ReadVLong() + skipPointer[level - 1];
 			}
 		}
-		
-		internal virtual void  Close()
-		{
-			for (int i = 1; i < skipStream.Length; i++)
-			{
-				if (skipStream[i] != null)
-				{
-					skipStream[i].Close();
-				}
-			}
-		}
+
+        public void Dispose()
+        {
+            Dispose(true);
+        }
+
+        protected virtual void Dispose(bool disposing)
+        {
+            if (isDisposed) return;
+
+            if (disposing)
+            {
+                for (int i = 1; i < skipStream.Length; i++)
+                {
+                    if (skipStream[i] != null)
+                    {
+                        skipStream[i].Close();
+                    }
+                }
+            }
+
+            isDisposed = true;
+        }
 		
 		/// <summary>initializes the reader </summary>
 		internal virtual void  Init(long skipPointer, int df)

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MultipleTermPositions.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MultipleTermPositions.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MultipleTermPositions.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/MultipleTermPositions.cs Sun Feb 19 09:54:42 2012
@@ -107,7 +107,8 @@ namespace Lucene.Net.Index
 		private int _freq;
 		private TermPositionsQueue _termPositionsQueue;
 		private IntQueue _posList;
-		
+
+	    private bool isDisposed;
 		/// <summary> Creates a new <c>MultipleTermPositions</c> instance.
 		/// 
 		/// </summary>
@@ -184,6 +185,7 @@ namespace Lucene.Net.Index
 			return _freq;
 		}
 		
+        [Obsolete("Use Dispose() instead")]
 		public void  Close()
 		{
 		    Dispose();
@@ -191,8 +193,20 @@ namespace Lucene.Net.Index
 
         public void Dispose()
         {
-            while (_termPositionsQueue.Size() > 0)
-                _termPositionsQueue.Pop().Close();
+            Dispose(true);
+        }
+
+        protected virtual void Dispose(bool disposing)
+        {
+            if (isDisposed) return;
+            
+            if (disposing)
+            {
+                while (_termPositionsQueue.Size() > 0)
+                    _termPositionsQueue.Pop().Close();
+            }
+
+            isDisposed = true;
         }
 		
 		/// <summary> Not implemented.</summary>

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/ParallelReader.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/ParallelReader.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/ParallelReader.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/ParallelReader.cs Sun Feb 19 09:54:42 2012
@@ -535,7 +535,7 @@ namespace Lucene.Net.Index
 			return fieldSet;
 		}
 		
-		private class ParallelTermEnum:TermEnum
+		private class ParallelTermEnum : TermEnum
 		{
 			private void  InitBlock(ParallelReader enclosingInstance)
 			{
@@ -553,6 +553,8 @@ namespace Lucene.Net.Index
 			private System.String field;
 			private IEnumerator<string> fieldIterator;
 			private TermEnum termEnum;
+
+		    private bool isDisposed;
 			
 			public ParallelTermEnum(ParallelReader enclosingInstance)
 			{
@@ -632,16 +634,18 @@ namespace Lucene.Net.Index
 				
 				return termEnum.DocFreq();
 			}
-			
-			public override void  Close()
-			{
-			    Dispose();
-			}
 
-            public override void Dispose()
+            protected override void Dispose(bool disposing)
             {
-                if (termEnum != null)
-                    termEnum.Close();
+                if (isDisposed) return;
+
+                if (disposing)
+                {
+                    if (termEnum != null)
+                        termEnum.Close();
+                }
+
+                isDisposed = true;
             }
 		}
 		
@@ -662,6 +666,8 @@ namespace Lucene.Net.Index
 				
 			}
 			protected internal TermDocs termDocs;
+
+		    private bool isDisposed;
 			
 			public ParallelTermDocs(ParallelReader enclosingInstance)
 			{
@@ -721,16 +727,29 @@ namespace Lucene.Net.Index
 				
 				return termDocs.SkipTo(target);
 			}
-			
-			public virtual void  Close()
-			{
-			    Dispose();
-			}
 
-            public virtual void Dispose()
+            [Obsolete("Use Dispose() instead")]
+            public virtual void Close()
+            {
+                Dispose();
+            }
+
+		    public void Dispose()
+		    {
+		        Dispose(true);
+		    }
+
+            protected virtual void Dispose(bool disposing)
             {
-                if (termDocs != null)
-                    termDocs.Close();
+                if (isDisposed) return;
+
+                if (disposing)
+                {
+                    if (termDocs != null)
+                        termDocs.Close();
+                }
+
+                isDisposed = true;
             }
 		}
 		

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/ReusableStringReader.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/ReusableStringReader.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/ReusableStringReader.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/ReusableStringReader.cs Sun Feb 19 09:54:42 2012
@@ -36,10 +36,12 @@ namespace Lucene.Net.Index
             left = s.Length;
             this.upto = 0;
         }
+
         public int Read(char[] c)
         {
             return Read(c, 0, c.Length);
         }
+
         public override int Read(System.Char[] c, int off, int len)
         {
             if (left > len)
@@ -64,11 +66,13 @@ namespace Lucene.Net.Index
                 return r;
             }
         }
+
+        [Obsolete("Use Dispose() instead")]
         public override void Close()
         {
+            Dispose();
         }
 
-
         public override int Read()
         {
             if (left > 0)

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentMergeInfo.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentMergeInfo.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentMergeInfo.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentMergeInfo.cs Sun Feb 19 09:54:42 2012
@@ -20,7 +20,7 @@ using System;
 namespace Lucene.Net.Index
 {
 	
-	sealed class SegmentMergeInfo
+	sealed class SegmentMergeInfo : IDisposable
 	{
 		internal Term term;
 		internal int base_Renamed;
@@ -30,6 +30,8 @@ namespace Lucene.Net.Index
 		internal int delCount;
 		private TermPositions postings; // use getPositions()
 		private int[] docMap; // use getDocMap()
+
+	    private bool isDisposed;
 		
 		internal SegmentMergeInfo(int b, TermEnum te, IndexReader r)
 		{
@@ -88,14 +90,19 @@ namespace Lucene.Net.Index
 				return false;
 			}
 		}
-		
-		internal void  Close()
-		{
-			termEnum.Close();
-			if (postings != null)
-			{
-				postings.Close();
-			}
-		}
+
+        public void Dispose()
+        {
+            if (isDisposed) return;
+
+            // Move to protected method if class becomes unsealed
+            termEnum.Close();
+            if (postings != null)
+            {
+                postings.Close();
+            }
+
+            isDisposed = true;
+        }
 	}
 }
\ No newline at end of file

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentMergeQueue.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentMergeQueue.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentMergeQueue.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentMergeQueue.cs Sun Feb 19 09:54:42 2012
@@ -21,7 +21,7 @@ using Lucene.Net.Util;
 namespace Lucene.Net.Index
 {
 	
-	sealed class SegmentMergeQueue : PriorityQueue<SegmentMergeInfo>
+	sealed class SegmentMergeQueue : PriorityQueue<SegmentMergeInfo>, IDisposable
 	{
 		internal SegmentMergeQueue(int size)
 		{
@@ -36,11 +36,12 @@ namespace Lucene.Net.Index
 			else
 				return comparison < 0;
 		}
-		
-		internal void  Close()
-		{
-			while (Top() != null)
-				Pop().Close();
-		}
+
+	    public void Dispose()
+	    {
+            // Move to protected method if class becomes unsealed
+            while (Top() != null)
+                Pop().Dispose();
+	    }
 	}
 }
\ No newline at end of file

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentMerger.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentMerger.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentMerger.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentMerger.cs Sun Feb 19 09:54:42 2012
@@ -222,11 +222,11 @@ namespace Lucene.Net.Index
 		/// Should not be called before merge().
 		/// </summary>
 		/// <throws>  IOException </throws>
-		public /*internal*/ void  CloseReaders()
+		internal void  CloseReaders()
 		{
 			foreach(IndexReader reader in readers)
 			{
-				reader.Close();
+				reader.Dispose();
 			}
 		}
 
@@ -421,7 +421,7 @@ namespace Lucene.Net.Index
 				}
 				finally
 				{
-					fieldsWriter.Close();
+					fieldsWriter.Dispose();
 				}
 				
 				System.String fileName = segment + "." + IndexFileNames.FIELDS_INDEX_EXTENSION;
@@ -572,7 +572,7 @@ namespace Lucene.Net.Index
 			}
 			finally
 			{
-				termVectorsWriter.Close();
+				termVectorsWriter.Dispose();
 			}
 			
 			System.String fileName = segment + "." + IndexFileNames.VECTORS_INDEX_EXTENSION;
@@ -690,7 +690,7 @@ namespace Lucene.Net.Index
 			{
 				consumer.Finish();
 				if (queue != null)
-					queue.Close();
+					queue.Dispose();
 			}
 		}
 		
@@ -725,7 +725,7 @@ namespace Lucene.Net.Index
 					queue.Add(smi);
 				// initialize queue
 				else
-					smi.Close();
+					smi.Dispose();
 			}
 			
 			SegmentMergeInfo[] match = new SegmentMergeInfo[readers.Count];
@@ -767,7 +767,7 @@ namespace Lucene.Net.Index
 						queue.Add(smi);
 					// restore queue
 					else
-						smi.Close(); // done with a segment
+						smi.Dispose(); // done with a segment
 				}
 			}
 		}

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentReader.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentReader.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentReader.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentReader.cs Sun Feb 19 09:54:42 2012
@@ -265,14 +265,14 @@ namespace Lucene.Net.Index
 						// close everything, nothing is shared anymore with other readers
 						if (tis != null)
 						{
-							tis.Close();
+							tis.Dispose();
 							// null so if an app hangs on to us we still free most ram
 							tis = null;
 						}
 						
 						if (tisNoIndex != null)
 						{
-							tisNoIndex.Close();
+							tisNoIndex.Dispose();
 						}
 						
 						if (freqStream != null)
@@ -287,12 +287,12 @@ namespace Lucene.Net.Index
 						
 						if (termVectorsReaderOrig != null)
 						{
-							termVectorsReaderOrig.Close();
+							termVectorsReaderOrig.Dispose();
 						}
 						
 						if (fieldsReaderOrig != null)
 						{
-							fieldsReaderOrig.Close();
+                            fieldsReaderOrig.Dispose();
 						}
 						
 						if (cfsReader != null)
@@ -517,7 +517,7 @@ namespace Lucene.Net.Index
 					if (in_Renamed != Enclosing_Instance.singleNormStream)
 					{
 						// It's private to us -- just close it
-						in_Renamed.Close();
+						in_Renamed.Dispose();
 					}
 					else
 					{
@@ -525,7 +525,7 @@ namespace Lucene.Net.Index
 						// maybe close the shared norm stream
 						if (Enclosing_Instance.singleNormRef.DecRef() == 0)
 						{
-							Enclosing_Instance.singleNormStream.Close();
+							Enclosing_Instance.singleNormStream.Dispose();
 							Enclosing_Instance.singleNormStream = null;
 						}
 					}

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentTermDocs.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentTermDocs.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentTermDocs.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentTermDocs.cs Sun Feb 19 09:54:42 2012
@@ -23,7 +23,7 @@ using BitVector = Lucene.Net.Util.BitVec
 namespace Lucene.Net.Index
 {
 	
-	public class SegmentTermDocs : TermDocs
+	internal class SegmentTermDocs : TermDocs
 	{
 		protected internal SegmentReader parent;
 		protected internal IndexInput freqStream;
@@ -45,6 +45,8 @@ namespace Lucene.Net.Index
 		
 		protected internal bool currentFieldStoresPayloads;
 		protected internal bool currentFieldOmitTermFreqAndPositions;
+
+	    private bool isDisposed;
 		
 		public /*protected internal*/ SegmentTermDocs(SegmentReader parent)
 		{
@@ -108,17 +110,27 @@ namespace Lucene.Net.Index
 				haveSkipped = false;
 			}
 		}
-		
-		public virtual void  Close()
-		{
-		    Dispose();
-		}
 
-        public virtual void Dispose()
+        public void Dispose()
+        {
+            Dispose(true);
+        }
+
+        [Obsolete("Use Dispose() instead")]
+        public void Close()
+        {
+            Dispose();
+        }
+
+        protected virtual void Dispose(bool disposing)
         {
-            freqStream.Close();
+            if (isDisposed) return;
+
+            freqStream.Dispose();
             if (skipListReader != null)
-                skipListReader.Close();
+                skipListReader.Dispose();
+
+            isDisposed = true;
         }
 		
 		public int Doc()
@@ -266,7 +278,7 @@ namespace Lucene.Net.Index
 			return true;
 		}
 
-        public IndexInput freqStream_ForNUnit
+	    public IndexInput freqStream_ForNUnit
         {
             get { return freqStream; }
             set { freqStream = value; }

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentTermEnum.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentTermEnum.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentTermEnum.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentTermEnum.cs Sun Feb 19 09:54:42 2012
@@ -21,8 +21,7 @@ using IndexInput = Lucene.Net.Store.Inde
 
 namespace Lucene.Net.Index
 {
-	
-	public sealed class SegmentTermEnum:TermEnum, System.ICloneable
+	internal sealed class SegmentTermEnum : TermEnum, System.ICloneable
 	{
 		private IndexInput input;
 		internal FieldInfos fieldInfos;
@@ -242,12 +241,7 @@ namespace Lucene.Net.Index
 		}
 		
 		/// <summary>Closes the enumeration to further activity, freeing resources. </summary>
-		public override void  Close()
-		{
-            Dispose();
-		}
-
-        public override void Dispose()
+        protected override void Dispose(bool disposing)
         {
             input.Close();
         }

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentTermPositions.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentTermPositions.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentTermPositions.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SegmentTermPositions.cs Sun Feb 19 09:54:42 2012
@@ -21,8 +21,7 @@ using IndexInput = Lucene.Net.Store.Inde
 
 namespace Lucene.Net.Index
 {
-	
-	public sealed class SegmentTermPositions:SegmentTermDocs, TermPositions
+	internal sealed class SegmentTermPositions : SegmentTermDocs, TermPositions
 	{
 		private IndexInput proxStream;
 		private int proxCount;
@@ -56,14 +55,9 @@ namespace Lucene.Net.Index
 			needToLoadPayload = false;
 		}
 		
-		public override void  Close()
-		{
-            Dispose();
-		}
-
-        public override void Dispose()
+        protected override void Dispose(bool disposing)
         {
-            base.Dispose();
+            base.Dispose(disposing);
             if (proxStream != null)
                 proxStream.Close();
         }

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SerialMergeScheduler.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SerialMergeScheduler.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SerialMergeScheduler.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/SerialMergeScheduler.cs Sun Feb 19 09:54:42 2012
@@ -43,9 +43,9 @@ namespace Lucene.Net.Index
 				}
 			}
 		}
-		
-		public override void  Close()
-		{
-		}
+
+	    protected override void Dispose(bool disposing)
+	    {
+	    }
 	}
 }
\ No newline at end of file

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/StoredFieldsWriter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/StoredFieldsWriter.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/StoredFieldsWriter.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/StoredFieldsWriter.cs Sun Feb 19 09:54:42 2012
@@ -102,7 +102,7 @@ namespace Lucene.Net.Index
 				
 				if (fieldsWriter != null)
 				{
-					fieldsWriter.Close();
+					fieldsWriter.Dispose();
 					fieldsWriter = null;
 					lastDocID = 0;
 					System.Diagnostics.Debug.Assert(state.docStoreSegmentName != null);
@@ -152,7 +152,7 @@ namespace Lucene.Net.Index
 				{
 					try
 					{
-						fieldsWriter.Close();
+						fieldsWriter.Dispose();
 					}
 					catch (System.Exception t)
 					{

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermDocs.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermDocs.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermDocs.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermDocs.cs Sun Feb 19 09:54:42 2012
@@ -78,6 +78,7 @@ namespace Lucene.Net.Index
 		/// </summary>
 		bool SkipTo(int target);
 		
+        // TODO: Determine which release this will be removed from
 		/// <summary>Frees associated resources. </summary>
 		[Obsolete("Use Dispose() instead")]
 		void  Close();

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermEnum.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermEnum.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermEnum.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermEnum.cs Sun Feb 19 09:54:42 2012
@@ -34,10 +34,20 @@ namespace Lucene.Net.Index
 		
 		/// <summary>Returns the docFreq of the current Term in the enumeration.</summary>
 		public abstract int DocFreq();
-		
-		/// <summary>Closes the enumeration to further activity, freeing resources. </summary>
-		public abstract void  Close();
 
-	    public abstract void Dispose();
+        /// <summary>Closes the enumeration to further activity, freeing resources. </summary>
+        [Obsolete("Use Dispose() instead")]
+        public void Close()
+        {
+            Dispose();
+        }
+
+	    /// <summary>Closes the enumeration to further activity, freeing resources. </summary>
+	    public void Dispose()
+	    {
+	        Dispose(true);
+	    }
+
+	    protected abstract void Dispose(bool disposing);
 	}
 }
\ No newline at end of file

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermInfosReader.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermInfosReader.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermInfosReader.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermInfosReader.cs Sun Feb 19 09:54:42 2012
@@ -29,12 +29,14 @@ namespace Lucene.Net.Index
 	/// set.  
 	/// </summary>
 	
-	sealed class TermInfosReader
+	sealed class TermInfosReader : IDisposable
 	{
 		private Directory directory;
 		private System.String segment;
 		private FieldInfos fieldInfos;
-		
+
+        private bool isDisposed;
+
 		private CloseableThreadLocal<ThreadResources> threadResources = new CloseableThreadLocal<ThreadResources>();
 		private SegmentTermEnum origEnum;
 		private long size;
@@ -124,7 +126,7 @@ namespace Lucene.Net.Index
 				// wait for a GC to do so.
 				if (!success)
 				{
-					Close();
+					Dispose();
 				}
 			}
 		}
@@ -138,13 +140,18 @@ namespace Lucene.Net.Index
 		{
 			return origEnum.maxSkipLevels;
 		}
-		
-		internal void  Close()
-		{
-			if (origEnum != null)
-				origEnum.Close();
-			threadResources.Close();
-		}
+
+        public void Dispose()
+        {
+            if (isDisposed) return;
+
+            // Move to protected method if class becomes unsealed
+            if (origEnum != null)
+                origEnum.Dispose();
+            threadResources.Dispose();
+
+            isDisposed = true;
+        }
 		
 		/// <summary>Returns the number of term/value pairs in the set. </summary>
 		internal long Size()

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermInfosWriter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermInfosWriter.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermInfosWriter.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermInfosWriter.cs Sun Feb 19 09:54:42 2012
@@ -28,7 +28,7 @@ namespace Lucene.Net.Index
 	/// Directory.  A TermInfos can be written once, in order.  
 	/// </summary>
 	
-	sealed class TermInfosWriter
+	sealed class TermInfosWriter : IDisposable
 	{
 		/// <summary>The file format version, a negative number. </summary>
 		public const int FORMAT = - 3;
@@ -39,7 +39,9 @@ namespace Lucene.Net.Index
 		
 		// NOTE: always change this if you switch to a new format!
 		public static readonly int FORMAT_CURRENT = FORMAT_VERSION_UTF8_LENGTH_IN_BYTES;
-		
+
+        private bool isDisposed;
+
 		private FieldInfos fieldInfos;
 		private IndexOutput output;
 		private TermInfo lastTi = new TermInfo();
@@ -230,14 +232,19 @@ namespace Lucene.Net.Index
 		}
 		
 		/// <summary>Called to complete TermInfos creation. </summary>
-		internal void  Close()
+		public void Dispose()
 		{
+            // Move to protected method if class becomes unsealed
+            if (isDisposed) return;
+
 			output.Seek(4); // write size after format
 			output.WriteLong(size);
-			output.Close();
+            output.Dispose();
 			
 			if (!isIndex)
-				other.Close();
+				other.Dispose();
+
+		    isDisposed = true;
 		}
 	}
 }
\ No newline at end of file

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermPositions.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermPositions.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermPositions.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermPositions.cs Sun Feb 19 09:54:42 2012
@@ -29,7 +29,7 @@ namespace Lucene.Net.Index
 	/// <seealso cref="IndexReader.TermPositions()">
 	/// </seealso>
 	
-	public interface TermPositions:TermDocs
+	public interface TermPositions : TermDocs
 	{
 		/// <summary>Returns next position in the current document.  It is an error to call
 		/// this more than <see cref="TermDocs.Freq()" /> times

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermVectorsReader.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermVectorsReader.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermVectorsReader.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermVectorsReader.cs Sun Feb 19 09:54:42 2012
@@ -23,7 +23,7 @@ using IndexInput = Lucene.Net.Store.Inde
 
 namespace Lucene.Net.Index
 {
-	public class TermVectorsReader : System.ICloneable
+	class TermVectorsReader : System.ICloneable, IDisposable
 	{
 		
 		// NOTE: if you make a new format, it must be larger than
@@ -58,8 +58,9 @@ namespace Lucene.Net.Index
 		private int docStoreOffset;
 		
 		private int format;
-		
-		public /*internal*/ TermVectorsReader(Directory d, System.String segment, FieldInfos fieldInfos):this(d, segment, fieldInfos, BufferedIndexInput.BUFFER_SIZE)
+	    private bool isDisposed;
+
+	    internal TermVectorsReader(Directory d, System.String segment, FieldInfos fieldInfos):this(d, segment, fieldInfos, BufferedIndexInput.BUFFER_SIZE)
 		{
 		}
 		
@@ -133,7 +134,7 @@ namespace Lucene.Net.Index
 				// wait for a GC to do so.
 				if (!success)
 				{
-					Close();
+					Dispose();
 				}
 			}
 		}
@@ -236,45 +237,57 @@ namespace Lucene.Net.Index
 			return format;
 		}
 		
-		internal virtual void  Close()
+        public void Dispose()
+        {
+            Dispose(true);
+        }
+
+		protected virtual void Dispose(bool disposing)
 		{
-			// make all effort to close up. Keep the first exception
-			// and throw it as a new one.
-			System.IO.IOException keep = null;
-			if (tvx != null)
-				try
-				{
-					tvx.Close();
-				}
-				catch (System.IO.IOException e)
-				{
-					if (keep == null)
-						keep = e;
-				}
-			if (tvd != null)
-				try
-				{
-					tvd.Close();
-				}
-				catch (System.IO.IOException e)
-				{
-					if (keep == null)
-						keep = e;
-				}
-			if (tvf != null)
-				try
-				{
-					tvf.Close();
-				}
-				catch (System.IO.IOException e)
-				{
-					if (keep == null)
-						keep = e;
-				}
-			if (keep != null)
-			{
-                throw new System.IO.IOException(keep.StackTrace);
-			}
+            if (isDisposed) return;
+
+            if (disposing)
+            {
+                // make all effort to close up. Keep the first exception
+                // and throw it as a new one.
+                System.IO.IOException keep = null;
+                if (tvx != null)
+                    try
+                    {
+                        tvx.Close();
+                    }
+                    catch (System.IO.IOException e)
+                    {
+                        if (keep == null)
+                            keep = e;
+                    }
+                if (tvd != null)
+                    try
+                    {
+                        tvd.Close();
+                    }
+                    catch (System.IO.IOException e)
+                    {
+                        if (keep == null)
+                            keep = e;
+                    }
+                if (tvf != null)
+                    try
+                    {
+                        tvf.Close();
+                    }
+                    catch (System.IO.IOException e)
+                    {
+                        if (keep == null)
+                            keep = e;
+                    }
+                if (keep != null)
+                {
+                    throw new System.IO.IOException(keep.StackTrace);
+                }
+            }
+
+		    isDisposed = true;
 		}
 		
 		/// <summary> </summary>

Modified: incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermVectorsWriter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermVectorsWriter.cs?rev=1290981&r1=1290980&r2=1290981&view=diff
==============================================================================
--- incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermVectorsWriter.cs (original)
+++ incubator/lucene.net/branches/Lucene.Net.3.0.3/trunk/src/core/Index/TermVectorsWriter.cs Sun Feb 19 09:54:42 2012
@@ -24,8 +24,7 @@ using UnicodeUtil = Lucene.Net.Util.Unic
 
 namespace Lucene.Net.Index
 {
-	
-	sealed class TermVectorsWriter
+	sealed class TermVectorsWriter : IDisposable
 	{
 		
 		private IndexOutput tvx = null, tvd = null, tvf = null;
@@ -201,8 +200,10 @@ namespace Lucene.Net.Index
 		}
 		
 		/// <summary>Close all streams. </summary>
-		internal void  Close()
+		public void Dispose()
 		{
+            // Move to a protected method if class becomes unsealed
+
 			// make an effort to close all streams we can but remember and re-throw
 			// the first exception encountered in this process
 			System.IO.IOException keep = null;