actor: handle :become message first

This commit is contained in:
Helmut Merz 2026-06-19 10:47:36 +02:00
parent 8efa448999
commit 7105937324
3 changed files with 11 additions and 9 deletions

View file

@ -3,13 +3,13 @@ defmodule Scopes.Core.Actor do
defp loop(bhv) do defp loop(bhv) do
receive do receive do
{:become, bhv_n} -> loop(bhv_n)
msg -> msg ->
Logger.debug([msg: inspect(msg)]) Logger.debug([msg: inspect(msg)])
case msg do case msg do
{:message, msg} -> {:message, msg} ->
bhv.(msg) bhv.(msg)
loop(bhv) loop(bhv)
{:become, bhv_n} -> loop(bhv_n)
{:register, reg, name, value} -> {:register, reg, name, value} ->
Registry.register(reg, name, value) Registry.register(reg, name, value)
loop(bhv) loop(bhv)
@ -19,11 +19,13 @@ defmodule Scopes.Core.Actor do
end end
def create(bhv) do def create(bhv) do
spawn_link(fn -> loop(bhv) end) #spawn_link(fn -> loop(bhv) end)
spawn(fn -> loop(bhv) end)
end end
def create(bhv, reg, name, value \\ []) do def create(bhv, reg, name, value \\ []) do
spawn_link(fn -> #spawn_link(fn ->
spawn(fn ->
Registry.register(reg, name, value) Registry.register(reg, name, value)
loop(bhv) end) loop(bhv) end)
end end

View file

@ -33,12 +33,12 @@ defmodule Scopes.Core.Environ do
def proc_env(msg, scope = {state, _proc, _syns, env}) do def proc_env(msg, scope = {state, _proc, _syns, env}) do
case Shape.head(msg) do case Shape.head(msg) do
{:exec, func} -> func.(state) {:exec, func} -> func.(state)
[:csys, :created | _rest] -> process_creation(msg, scope) [:csys, :created | _rest] -> process_created(msg, scope)
_ -> send(env, msg) # forward message to application _ -> send(env, msg) # forward message to application
end end
end end
def process_creation(msg, {state, proc, syns, env}) do def process_created(msg, {state, proc, syns, env}) do
data = Shape.data(msg) data = Shape.data(msg)
new = data.new new = data.new
addr = data[:addr] addr = data[:addr]

View file

@ -18,7 +18,7 @@ defmodule Scopes.CoreTest do
describe "core-basic:" do describe "core-basic:" do
test "minimal-b1" do test "minimal-b1" do
Environ.setup(Program.prepare_basic(), Program.init_seq_b1()) Environ.setup(Program.prepare_basic(), Program.init_seq_b1())
Process.sleep(10) Process.sleep(5)
env = Environ.get_cell({:env, :c00}) env = Environ.get_cell({:env, :c00})
Environ.forward_value(env, [:csys, :c00, "0-0"], 0) Environ.forward_value(env, [:csys, :c00, "0-0"], 0)
assert 0 = receive_data().value assert 0 = receive_data().value
@ -28,18 +28,18 @@ defmodule Scopes.CoreTest do
Environ.forward_value(env, [:csys, :s01, "1-1"], 3) Environ.forward_value(env, [:csys, :s01, "1-1"], 3)
assert receive_data().value in [2, 3] assert receive_data().value in [2, 3]
assert receive_data().value in [2, 3] assert receive_data().value in [2, 3]
refute_receive msg, 10, "unhandled message(s): #{inspect(msg)}" refute_receive msg, 5, "unhandled message(s): #{inspect(msg)}"
end end
test "recursive-1" do test "recursive-1" do
Environ.setup(Program.prepare_basic(), Program.init_recursive_1()) Environ.setup(Program.prepare_basic(), Program.init_recursive_1())
Process.sleep(10) Process.sleep(5)
env = Environ.get_cell({:env, :c00}) env = Environ.get_cell({:env, :c00})
Environ.forward_value(env, [:csys, :s01, "1-1"], 42) Environ.forward_value(env, [:csys, :s01, "1-1"], 42)
assert receive_data().value == 42 assert receive_data().value == 42
Environ.forward_value(env, [:csys, :s01, "1-1"], 47) Environ.forward_value(env, [:csys, :s01, "1-1"], 47)
assert receive_data().value == 5 assert receive_data().value == 5
refute_receive msg, 10, "unhandled message(s): #{inspect(msg)}" refute_receive msg, 5, "unhandled message(s): #{inspect(msg)}"
end end
end end
end end