benjamintanweihao/the-little-elixir-otp-guidebook-code

terminating children in thy_supervisor.ex

gabrielgrover opened this issue · 1 comments

I am reading through the book and I am confused on pages 102 - 103. for the following handle_call cb we delete the child from the state (HashDict).

def handle_call({ :terminate, pid }, _from, state) do
case terminate_child(pid) do
:ok ->
new_state = state |> HashDict.delete(pid)
{ :reply, :ok, new_state }
:error ->
{ :reply, { :error, "error terminating child" }, state }
end
end

defp terminate_child(pid) do
Process.exit(pid, :kill)
:ok
end

Benjamin then goes to explain that we must provide the following handle info cb to terminate the child process, since we used Process.exit(pid, :kill)

def handle_info({ :EXIT, from, :killed }, state) do
new_state = state |> HashDict.delete(from)
{ :noreply, new_state }
end

To me it seems you are deleting the child process twice since the following line

new_state = state |> HashDict.delete(from)

is in both the handle_call and handle_info callbacks. What is going on here?

jswny commented

Yep, I came across the same problem when going through the code in the book. This isn't actually a problem because both HashDict.delete and the newer Map.delete simply return the same map if the key cannot be found. That being said, I agree with this issue that the code is confusing and repetitive. I posted an expanded post on the topic similar to this issue on the official book forum here.