fork download
  1. defmodule M do
  2. defmacro with_timeout(params) do
  3. quote do
  4. return_to = self
  5. pid = spawn_link(fn() ->
  6. result = unquote(params[:do])
  7. send(return_to, {self, result})
  8. end)
  9. receive(
  10. do: ({^pid, result} -> result),
  11. after: unquote(params[:after])
  12. )
  13. end
  14. end
  15. end
  16.  
  17. defmodule N do
  18. import M
  19.  
  20. with_timeout do
  21. IO.puts("A")
  22. after
  23. 10 -> IO.puts("timeout")
  24. end
  25.  
  26. with_timeout do
  27. :timer.sleep(20)
  28. IO.puts("B")
  29. after
  30. 10 -> IO.puts("timeout")
  31. end
  32. end
Success #stdin #stdout 0.85s 106432KB
stdin
Standard input is empty
stdout
A
timeout