Skip to content

Instantly share code, notes, and snippets.

@ray-sh
Last active July 22, 2017 14:52
Show Gist options
  • Save ray-sh/50c0aa9b434e79cbd6c9bea490ed6065 to your computer and use it in GitHub Desktop.
Save ray-sh/50c0aa9b434e79cbd6c9bea490ed6065 to your computer and use it in GitHub Desktop.
GenServe Supervisor study
defmodule Bucket do
use GenServer
def start_link(name) do
GenServer.start_link(__MODULE__, %{}, name: name)
end
#callbacks
def handle_call(request, from, state) do
case request do
{:get,key} -> {:reply, Map.get(state,key), state}
{:put,key,value} -> {:reply,:ok,Map.put(state,key,value)}
_ -> {:reply,"unsupported method", state}
end
end
end
defmodule Bucket.Reg do
use GenServer
def start_link do
GenServer.start_link(__MODULE__, %{}, name: __MODULE__)
end
#callbacks
def handle_call({:create,name},from,state) do
if(Map.has_key?(state,name)) do
{:reply,Map.get(state,name),state}
else
{:ok, bucket} = Bucket.Sup.create_bucket(name)
Process.monitor(bucket)
{:reply,bucket,Map.put(state,name,bucket)}
end
end
def handle_call({:lookup,name},from,state) do
{:reply,Map.get(state,name),state}
end
def handle_call(_,_,state) do
{:reply,"Unsupported ops",state}
end
end
defmodule Bucket.Sup do
use Supervisor
def start_link() do
Supervisor.start_link(__MODULE__,:ok,name: __MODULE__)
end
def create_bucket(name) do
#The last parameter must be list, the number of list will match to child start_link function
Supervisor.start_child(__MODULE__,[name])
end
#callbacks
def init(:ok) do
children = [
worker(Bucket,[],restart: :temporary)
]
#simple_one_for_one will not start any child
supervise(children, strategy: :simple_one_for_one)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment