defmodule M do
defmacro with_timeout(params) do
quote do
return_to = self
pid = spawn_link(fn() ->
result = unquote(params[:do])
send(return_to, {self, result})
end)
receive(
do: ({^pid, result} -> result),
after: unquote(params[:after])
)
end
end
end
defmodule N do
import M
with_timeout do
after
end
with_timeout do
:timer.sleep(20)
after
end
end
ZGVmbW9kdWxlIE0gZG8KCWRlZm1hY3JvIHdpdGhfdGltZW91dChwYXJhbXMpIGRvCgkJcXVvdGUgZG8KCQkJcmV0dXJuX3RvID0gc2VsZgoJCQlwaWQgPSBzcGF3bl9saW5rKGZuKCkgLT4KCQkJCXJlc3VsdCA9IHVucXVvdGUocGFyYW1zWzpkb10pCgkJCQlzZW5kKHJldHVybl90bywge3NlbGYsIHJlc3VsdH0pCgkJCWVuZCkKCQkJcmVjZWl2ZSgKCQkJCWRvOiAoe15waWQsIHJlc3VsdH0gLT4gcmVzdWx0KSwKCQkJCWFmdGVyOiB1bnF1b3RlKHBhcmFtc1s6YWZ0ZXJdKQoJCQkpCgkJZW5kCgllbmQKZW5kCgpkZWZtb2R1bGUgTiBkbwoJaW1wb3J0IE0KCQoJd2l0aF90aW1lb3V0IGRvCgkJSU8ucHV0cygiQSIpCglhZnRlcgoJCTEwIC0+IElPLnB1dHMoInRpbWVvdXQiKQoJZW5kCgkKCXdpdGhfdGltZW91dCBkbwoJCTp0aW1lci5zbGVlcCgyMCkKCQlJTy5wdXRzKCJCIikKCWFmdGVyCgkJMTAgLT4gSU8ucHV0cygidGltZW91dCIpCgllbmQKZW5k