blob: 4bf575bfd13e21573be5a9e10e0632ddb671c64f [file] [log] [blame]
/*
* Copyright (c) 2008, 2011, 2012, 2015 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.net4j.util.concurrent;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @author Eike Stepper
*/
public final class RoundRobinList<E> extends LinkedList<E>
{
private static final long serialVersionUID = 1L;
private ReadWriteLock lock = new ReentrantReadWriteLock();
private Iterator<E> it;
public RoundRobinList()
{
}
public RoundRobinList(Collection<? extends E> c)
{
super(c);
}
public void executeReads(Runnable runnable)
{
try
{
lock.readLock().lock();
runnable.run();
}
finally
{
lock.readLock().unlock();
}
}
public void executeWrites(Runnable runnable)
{
try
{
lock.writeLock().lock();
runnable.run();
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public void add(int index, E element)
{
try
{
lock.writeLock().lock();
super.add(index, element);
it = null;
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public boolean add(E o)
{
try
{
lock.writeLock().lock();
it = null;
return super.add(o);
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public boolean addAll(Collection<? extends E> c)
{
try
{
lock.writeLock().lock();
it = null;
return super.addAll(c);
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public boolean addAll(int index, Collection<? extends E> c)
{
try
{
lock.writeLock().lock();
it = null;
return super.addAll(index, c);
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public void addFirst(E o)
{
try
{
lock.writeLock().lock();
it = null;
super.addFirst(o);
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public void addLast(E o)
{
try
{
lock.writeLock().lock();
it = null;
super.addLast(o);
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public void clear()
{
try
{
lock.writeLock().lock();
it = null;
super.clear();
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public Object clone()
{
try
{
lock.readLock().lock();
return super.clone();
}
finally
{
lock.readLock().unlock();
}
}
@Override
public boolean contains(Object o)
{
try
{
lock.readLock().lock();
return super.contains(o);
}
finally
{
lock.readLock().unlock();
}
}
@Override
public boolean containsAll(Collection<?> c)
{
try
{
lock.readLock().lock();
return super.containsAll(c);
}
finally
{
lock.readLock().unlock();
}
}
@Override
public E element()
{
try
{
lock.readLock().lock();
if (isEmpty())
{
return null;
}
if (it == null || !it.hasNext())
{
it = iterator();
}
return it.next();
}
finally
{
lock.readLock().unlock();
}
}
@Override
public E get(int index)
{
try
{
lock.readLock().lock();
return super.get(index);
}
finally
{
lock.readLock().unlock();
}
}
@Override
public E getFirst()
{
try
{
lock.readLock().lock();
return super.getFirst();
}
finally
{
lock.readLock().unlock();
}
}
@Override
public E getLast()
{
try
{
lock.readLock().lock();
return super.getLast();
}
finally
{
lock.readLock().unlock();
}
}
@Override
public int indexOf(Object o)
{
try
{
lock.readLock().lock();
return super.indexOf(o);
}
finally
{
lock.readLock().unlock();
}
}
@Override
public int lastIndexOf(Object o)
{
try
{
lock.readLock().lock();
return super.lastIndexOf(o);
}
finally
{
lock.readLock().unlock();
}
}
@Override
public boolean offer(E o)
{
try
{
lock.writeLock().lock();
it = null;
return super.offer(o);
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public E peek()
{
try
{
lock.readLock().lock();
return super.peek();
}
finally
{
lock.readLock().unlock();
}
}
@Override
public E poll()
{
try
{
lock.writeLock().lock();
it = null;
return super.poll();
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public E remove()
{
try
{
lock.writeLock().lock();
it = null;
return super.remove();
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public E remove(int index)
{
try
{
lock.writeLock().lock();
it = null;
return super.remove(index);
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public boolean remove(Object o)
{
try
{
lock.writeLock().lock();
it = null;
return super.remove(o);
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public boolean removeAll(Collection<?> c)
{
try
{
lock.writeLock().lock();
it = null;
return super.removeAll(c);
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public E removeFirst()
{
try
{
lock.writeLock().lock();
it = null;
return super.removeFirst();
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public E removeLast()
{
try
{
lock.writeLock().lock();
it = null;
return super.removeLast();
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public boolean retainAll(Collection<?> c)
{
try
{
lock.writeLock().lock();
it = null;
return super.retainAll(c);
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public E set(int index, E element)
{
try
{
lock.writeLock().lock();
it = null;
return super.set(index, element);
}
finally
{
lock.writeLock().unlock();
}
}
@Override
public List<E> subList(int fromIndex, int toIndex)
{
try
{
lock.readLock().lock();
return super.subList(fromIndex, toIndex);
}
finally
{
lock.readLock().unlock();
}
}
@Override
public Object[] toArray()
{
try
{
lock.readLock().lock();
return super.toArray();
}
finally
{
lock.readLock().unlock();
}
}
@Override
public <T> T[] toArray(T[] a)
{
try
{
lock.readLock().lock();
return super.toArray(a);
}
finally
{
lock.readLock().unlock();
}
}
}