예제 #1
0
                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 ();
                        }
                }
예제 #2
0
                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;
                        }
                }