package org.apache.hadoop.mapred;
import java.util.concurrent.locks.ReentrantLock;
public class RoundQueue<T> {
class Segment {
Segment(T t) {
value = t;
next = null;
}
T value;
Segment next;
}
private ReentrantLock lock;
private Segment last;
private Segment head;
private Segment ind;
private int size;
RoundQueue() {
last = null;
head = null;
size = 0;
ind = null;
lock = new ReentrantLock();
}
public void insert(T t) {
try {
lock.lock();
if (size == 0) {
head = new Segment(t);
last = head;
last.next = head;
ind = head;
size++;
} else {
last.next = new Segment(t);
last = last.next;
last.next = head;
size++;
}
} finally {
lock.unlock();
}
}
private void reset() {
last = null;
head = null;
ind = null;
size = 0;
}
public T remove(T t) {
try {
lock.lock();
if (size == 0 || head == null) {
return null;
}
Segment q = head;
Segment p = last;
do {
if (q.value == t || q.value.equals(t)) {
size--;
if (size == 0) {
reset();
} else {
p.next = q.next;
if(head == q) {
head = head.next;
}
if (last == q) {
last = p;
}
if (ind == q) {
ind = ind.next;
}
}
return q.value;
}
p = q;
q = q.next;
}
while (q != head);
return null;
} finally {
lock.unlock();
}
}
public T getNext() {
try {
lock.lock();
if (ind == null || size == 0) {
return null;
}
T r = ind.value;
ind = ind.next;
return r;
} finally {
lock.unlock();
}
}
public void list(String t) {
if (size == 0 || head == null) {
return;
}
t += (size + ": ");
Segment s = head;
do {
t += (s.value + ", ");
s = s.next;
}while(s != head);
}
public int size() {
return size;
}
}