| using System.Collections; |
| using System.Collections.Generic; |
| using System.Threading; |
| |
| namespace Lucene.Net.Index |
| { |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| internal class SynchronizedList<T> : IList<T> |
| { |
| private readonly List<T> _list = new List<T>(); |
| |
| private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(); |
| |
| public T this[int index] |
| { |
| get => _list[index]; |
| set => _list[index] = value; |
| } |
| |
| public int Count => _list.Count; |
| |
| public bool IsReadOnly => false; |
| |
| public void Add(T item) |
| { |
| _lock.EnterWriteLock(); |
| |
| try |
| { |
| _list.Add(item); |
| } |
| finally |
| { |
| _lock.ExitWriteLock(); |
| } |
| } |
| |
| public void Clear() |
| { |
| _lock.EnterWriteLock(); |
| |
| try |
| { |
| _list.Clear(); |
| } |
| finally |
| { |
| _lock.ExitWriteLock(); |
| } |
| } |
| |
| public bool Contains(T item) |
| { |
| _lock.EnterReadLock(); |
| |
| try |
| { |
| return _list.Contains(item); |
| } |
| finally |
| { |
| _lock.ExitReadLock(); |
| } |
| } |
| |
| public void CopyTo(T[] array, int arrayIndex) |
| { |
| _lock.EnterWriteLock(); |
| |
| try |
| { |
| _list.CopyTo(array, arrayIndex); |
| } |
| finally |
| { |
| _lock.ExitWriteLock(); |
| } |
| } |
| |
| public IEnumerator<T> GetEnumerator() |
| { |
| _lock.EnterReadLock(); |
| |
| try |
| { |
| return _list.GetEnumerator(); |
| } |
| finally |
| { |
| _lock.ExitReadLock(); |
| } |
| } |
| |
| public int IndexOf(T item) |
| { |
| _lock.EnterReadLock(); |
| |
| try |
| { |
| return _list.IndexOf(item); |
| } |
| finally |
| { |
| _lock.ExitReadLock(); |
| } |
| } |
| |
| public void Insert(int index, T item) |
| { |
| _lock.EnterWriteLock(); |
| |
| try |
| { |
| _list.Insert(index, item); |
| } |
| finally |
| { |
| _lock.ExitWriteLock(); |
| } |
| } |
| |
| public bool Remove(T item) |
| { |
| _lock.EnterWriteLock(); |
| |
| try |
| { |
| return _list.Remove(item); |
| } |
| finally |
| { |
| _lock.ExitWriteLock(); |
| } |
| } |
| |
| public void RemoveAt(int index) |
| { |
| _lock.EnterWriteLock(); |
| |
| try |
| { |
| _list.RemoveAt(index); |
| } |
| finally |
| { |
| _lock.ExitWriteLock(); |
| } |
| } |
| |
| IEnumerator IEnumerable.GetEnumerator() |
| { |
| return _list.GetEnumerator(); |
| } |
| } |
| } |