package org.ebookdroid.ui.viewer.viewers;
import org.ebookdroid.core.ViewState;
import java.util.ArrayList;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;
import org.emdev.common.log.LogContext;
import org.emdev.common.log.LogManager;
public class DrawQueue {
private static final LogContext LCTX = LogManager.root().lctx("Imaging");
private final ArrayBlockingQueue<ViewState> queue = new ArrayBlockingQueue<ViewState>(16, true);
private final ArrayList<ViewState> list = new ArrayList<ViewState>();
public DrawQueue() {
}
public ViewState takeLastTask() {
ViewState task = null;
try {
// Workaround for possible ConcurrentModificationException
while (true) {
list.clear();
try {
if (queue.drainTo(list) > 0) {
final int last = list.size() - 1;
task = list.get(last);
for (int i = 0; i < last; i++) {
final ViewState vs = list.get(i);
if (vs != null) {
vs.releaseAfterDraw();
}
}
}
break;
} catch (final Throwable ex) {
// Go to next attempt
LCTX.e("Unexpected error on retrieving last view state from draw queue: " + ex.getMessage());
}
}
} catch (final Throwable ex) {
// Go to next attempt
LCTX.e("Unexpected error on retrieving view state from draw queue: " + ex.getMessage());
}
return task;
}
public ViewState takeFirstTask() {
ViewState task = null;
try {
task = queue.poll(0, TimeUnit.MILLISECONDS);
} catch (final Throwable ex) {
// Go to next attempt
LCTX.e("Unexpected error on retrieving view state from draw queue: " + ex.getMessage());
}
return task;
}
public void draw(final ViewState viewState) {
if (viewState != null) {
// Workaround for possible ConcurrentModificationException
viewState.addedToDrawQueue();
while (true) {
try {
queue.offer(viewState);
break;
} catch (final Throwable ex) {
// Go to next attempt
LCTX.e("Unexpected error on adding view state to draw queue: " + ex.getMessage());
}
}
}
}
}