Skip to content

Commit

Permalink
Moved port_sup into ns_server.
Browse files Browse the repository at this point in the history
  • Loading branch information
dustin committed Dec 18, 2009
1 parent 721e3ba commit f9d672f
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 1 deletion.
10 changes: 10 additions & 0 deletions priv/test_child.py
@@ -0,0 +1,10 @@
#!/usr/bin/env python

import sys
import time

if __name__ == '__main__':
naptime = 5
if len(sys.argv) > 1:
naptime = float(sys.argv[1])
time.sleep(naptime)
46 changes: 46 additions & 0 deletions src/ns_port_server.erl
@@ -0,0 +1,46 @@
-module(ns_port_server).
-behavior(gen_server).

-export([start_link/3]).

%% gen_server callbacks
-export([init/1,
handle_call/3,
handle_cast/2,
handle_info/2,
code_change/3,
terminate/2]).

%% Server state
-record(state, {port, name}).

start_link(Name, Cmd, Args) ->
gen_server:start_link({local, Name}, ?MODULE, {Name, Cmd, Args}, []).

init({Name, Cmd, Args}) ->
error_logger:info_msg("Starting ~p with ~p~n", [Cmd, Args]),
process_flag(trap_exit, true),
Port = open_port({spawn_executable, Cmd}, [{args, Args}]),
{ok, #state{port = Port, name = Name}}.

handle_info({'EXIT', _Port, Reason}, State) ->
error_logger:info_msg("Port subprocess (~p) exited: ~p~n",
[State#state.name, Reason]),
{stop, {port_terminated, Reason}, State}.

handle_call(Something, _From, State) ->
error_logger:info_msg("Unexpected call: ~p~n", [Something]),
{reply, "What?", State}.

handle_cast(Something, State) ->
error_logger:info_msg("Unexpected cast: ~p~n", [Something]),
{noreply, State}.

terminate({port_terminated, _Reason}, _State) ->
ok;
terminate(Reason, State) ->
error_logger:info_msg("Terminating ~p: ~p~n", [State#state.name, Reason]),
port_close(State#state.port).

code_change(_OldVsn, State, _Extra) ->
{ok, State}.
35 changes: 35 additions & 0 deletions src/ns_port_sup.erl
@@ -0,0 +1,35 @@
-module(ns_port_sup).
-behavior(supervisor).

-export([start_link/0]).

-export([init/1, launch_port/2, launch_port/3, terminate_port/1]).

start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).

init([]) ->
{ok, {{one_for_one,
get_env_default(max_r, 3),
get_env_default(max_t, 10)},
[]}}.

get_env_default(Var, Def) ->
case application:get_env(Var) of
{ok, Value} -> Value;
undefined -> Def
end.

launch_port(Name, Cmd) ->
launch_port(Name, Cmd, []).

launch_port(Name, Cmd, Args) when is_atom(Name); is_list(Cmd); is_list(Args) ->
error_logger:info_msg("Supervising ~p~n", [Cmd]),
supervisor:start_child(?MODULE, {Name,
{ns_port_server, start_link, [Name, Cmd, Args]},
permanent, 10, worker, [ns_port_server]}).

terminate_port(Name) ->
error_logger:info_msg("Unsupervising ~p~n", [Name]),
ok = supervisor:terminate_child(?MODULE, Name),
ok = supervisor:delete_child(?MODULE, Name).
5 changes: 4 additions & 1 deletion src/ns_server_sup.erl
Expand Up @@ -25,5 +25,8 @@ get_child_specs() ->
% TODO: Figure out what to pass into ns_config
{ns_config_sup, {ns_config_sup, start_link, []},
permanent, infinity, supervisor,
[ns_config_sup, ns_config, ns_config_default]}
[ns_config_sup, ns_config, ns_config_default]},
{ns_port_sup, {ns_port_sup, start_link, []},
permanent, infinity, supervisor,
[ns_port_sup, ns_port_server]}
].

0 comments on commit f9d672f

Please sign in to comment.