|
@@ -23,68 +23,20 @@ import java.util.concurrent.LinkedBlockingQueue;
|
|
|
@SuppressWarnings("rawtypes")
|
|
|
public class DrainDispatcher extends AsyncDispatcher {
|
|
|
|
|
|
-// flagrant initialize abuse throughout, but safe per
|
|
|
-// http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#96595
|
|
|
-// and similar grotesqueries
|
|
|
- private volatile boolean drained = false;
|
|
|
- private final BlockingQueue<Event> queue;
|
|
|
- final Object mutex;
|
|
|
-
|
|
|
public DrainDispatcher() {
|
|
|
this(new LinkedBlockingQueue<Event>());
|
|
|
}
|
|
|
|
|
|
private DrainDispatcher(BlockingQueue<Event> eventQueue) {
|
|
|
super(eventQueue);
|
|
|
- this.queue = eventQueue;
|
|
|
- this.mutex = this;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Busy loop waiting for all queued events to drain.
|
|
|
*/
|
|
|
public void await() {
|
|
|
- while (!drained) {
|
|
|
+ while (!isDrained()) {
|
|
|
Thread.yield();
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- @Override
|
|
|
- Runnable createThread() {
|
|
|
- return new Runnable() {
|
|
|
- @Override
|
|
|
- public void run() {
|
|
|
- while (!Thread.currentThread().isInterrupted()) {
|
|
|
- synchronized (mutex) {
|
|
|
- // !drained if dispatch queued new events on this dispatcher
|
|
|
- drained = queue.isEmpty();
|
|
|
- }
|
|
|
- Event event;
|
|
|
- try {
|
|
|
- event = queue.take();
|
|
|
- } catch(InterruptedException ie) {
|
|
|
- return;
|
|
|
- }
|
|
|
- if (event != null) {
|
|
|
- dispatch(event);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- };
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public EventHandler getEventHandler() {
|
|
|
- final EventHandler actual = super.getEventHandler();
|
|
|
- return new EventHandler() {
|
|
|
- @Override
|
|
|
- public void handle(Event event) {
|
|
|
- synchronized (mutex) {
|
|
|
- actual.handle(event);
|
|
|
- drained = false;
|
|
|
- }
|
|
|
- }
|
|
|
- };
|
|
|
- }
|
|
|
-
|
|
|
}
|