diff --git a/src/main/java/org/syndicate_lang/actors/Turn.java b/src/main/java/org/syndicate_lang/actors/Turn.java index 3105820..1778bd1 100644 --- a/src/main/java/org/syndicate_lang/actors/Turn.java +++ b/src/main/java/org/syndicate_lang/actors/Turn.java @@ -9,11 +9,12 @@ public class Turn { private final static AtomicLong nextHandle = new AtomicLong(0); private final Actor _actor; - private Actor _pendingTarget = null; - private List> _pendingQ = null; - private Map>> _pending = null; private boolean _complete = false; + private Actor _pendingTarget = null; + private Consumer[] _pendingQ = null; + private Map>> _pending = null; + public static void forActor(Actor a, Consumer f) { a.execute(() -> Turn._forActor(a, f)); } @@ -49,31 +50,34 @@ public class Turn { var q = _pendingQ; _pendingTarget = null; _pendingQ = null; - ac.execute(() -> Turn.forActor(ac, t -> q.forEach(f -> f.accept(t)))); + ac.execute(() -> Turn.forActor(ac, t -> { + for (var f : q) if (f != null) f.accept(t); + })); } _complete = true; } - private static LinkedList> singletonList(Consumer action) { - var q = new LinkedList>(); - q.add(action); - return q; - } - private void enqueue(Actor target, Consumer action) { if (_complete) throw new IllegalStateException("Attempt to reuse a committed Turn"); if (_pending == null) { if (_pendingTarget == null) { _pendingTarget = target; - _pendingQ = singletonList(action); + @SuppressWarnings("unchecked") + var q = (Consumer[]) new Consumer[3]; + _pendingQ = q; + _pendingQ[0] = action; return; } if (_pendingTarget == target) { - _pendingQ.add(action); - return; + if (_pendingQ[1] == null) { _pendingQ[1] = action; return; } + if (_pendingQ[2] == null) { _pendingQ[2] = action; return; } } _pending = new HashMap<>(); - _pending.put(_pendingTarget, _pendingQ); + var q = new LinkedList>(); + _pending.put(_pendingTarget, q); + q.add(_pendingQ[0]); + if (_pendingQ[1] != null) q.add(_pendingQ[1]); + if (_pendingQ[2] != null) q.add(_pendingQ[2]); _pendingTarget = null; _pendingQ = null; }