static private void UnrefReaderAndVersion_Unlocked (ReaderAndVersion rav) { rav.Refcount--; if (rav.Refcount == 0) { reader_rav_map.Remove (rav.Reader); directory_rav_map.Remove (rav.Reader.Directory ()); rav.Reader.Close (); } }
static public IndexReader GetReader (Lucene.Net.Store.Directory directory) { IndexReader reader; long version; lock (reader_rav_map) { ReaderAndVersion rav = (ReaderAndVersion) directory_rav_map [directory]; if (rav == null) { version = IndexReader.GetCurrentVersion (directory); reader = IndexReader.Open (directory); rav = new ReaderAndVersion (reader, version); rav.Refcount ++; // add one refcount to keep this reader open until... directory_rav_map [directory] = rav; reader_rav_map [reader] = rav; return reader; } version = IndexReader.GetCurrentVersion (directory); if (version != rav.Version) { // unref once and then close reader or call UnrefReaderAndVersion_Unlocked as a single step UnrefReaderAndVersion_Unlocked (rav); reader = IndexReader.Open (directory); rav = new ReaderAndVersion (reader, version); directory_rav_map [directory] = rav; reader_rav_map [reader] = rav; } else { rav.Refcount++; } return rav.Reader; } }