From 6d94e728af14b72e80a83682a6927e1f2861c887 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Sun, 29 Oct 2023 00:25:17 +0200 Subject: [PATCH] Repair Actor.every --- src/main/java/org/syndicate_lang/actors/Actor.java | 11 +++-------- .../syndicate_lang/actors/example/example1/Main.java | 8 ++++---- .../actors/example/example1/ValueHolder.java | 1 + 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/syndicate_lang/actors/Actor.java b/src/main/java/org/syndicate_lang/actors/Actor.java index 5949dd6..b7819dd 100644 --- a/src/main/java/org/syndicate_lang/actors/Actor.java +++ b/src/main/java/org/syndicate_lang/actors/Actor.java @@ -151,12 +151,6 @@ public class Actor extends ForkJoinTask { } } - private void _performSync(WorkItem item) { - synchronized (this) { - _perform(item); - } - } - private void _perform(WorkItem item) { if (!_alive) { if (item.ifNotAlive != null) item.ifNotAlive.run(); @@ -228,7 +222,7 @@ public class Actor extends ForkJoinTask { this.execute(item); } else { _scheduledExecutor.schedule( - () -> this._performSync(item), + () -> this.execute(item), delayMilliseconds, TimeUnit.MILLISECONDS); } @@ -239,7 +233,8 @@ public class Actor extends ForkJoinTask { final var callback = new Runnable() { PeriodicTimer timer; public void run() { - self._performSync(new WorkItem(f, this.timer::cancel)); + while (this.timer == null) {} // There's a race. Spin. + self.execute(new WorkItem(f, this.timer::cancel)); } }; callback.timer = new PeriodicTimer( diff --git a/src/test/java/org/syndicate_lang/actors/example/example1/Main.java b/src/test/java/org/syndicate_lang/actors/example/example1/Main.java index e815355..aa1b6f9 100644 --- a/src/test/java/org/syndicate_lang/actors/example/example1/Main.java +++ b/src/test/java/org/syndicate_lang/actors/example/example1/Main.java @@ -11,7 +11,7 @@ public class Main extends Entity { new Actor().scheduleTurn(t -> { final var vh = Actor.forEntity(new ValueHolder<>("There")); vh.getActor().daemonize(); - final var m = Actor.boot(u -> { + Actor.boot(u -> { Main main = new Main(); u.later(10, v -> main.run(v, vh)); return main; @@ -38,9 +38,9 @@ public class Main extends Entity { private Actor me; private int greetingCounter = 0; - public void run(Turn t0, Ref vh) { - me = t0.getActor(); - t0.message_(vh, new IValueHolder.Get(t0.ref(new Entity() { + public void run(Turn t, Ref vh) { + me = t.getActor(); + t.message_(vh, new IValueHolder.Get(t.ref(new Entity() { public void message_(Turn t1, Object v1) { Main.this.greet((String) v1); t1.message_(vh, new IValueHolder.Set<>("World")); diff --git a/src/test/java/org/syndicate_lang/actors/example/example1/ValueHolder.java b/src/test/java/org/syndicate_lang/actors/example/example1/ValueHolder.java index fa22f88..54e9934 100644 --- a/src/test/java/org/syndicate_lang/actors/example/example1/ValueHolder.java +++ b/src/test/java/org/syndicate_lang/actors/example/example1/ValueHolder.java @@ -15,6 +15,7 @@ public class ValueHolder extends Entity { if (body instanceof IValueHolder.Get op) { turn.message_(op.k(), this.value); } else if (body instanceof IValueHolder.Set) { + @SuppressWarnings("unchecked") IValueHolder.Set op = (IValueHolder.Set) body; this.value = op.newValue(); }