# HG changeset patch # User Mike Pavone # Date 1371877774 25200 # Node ID db5c7047ef0e686d7769fd242fdc76a43a351415 Initial commit diff -r 000000000000 -r db5c7047ef0e .hgignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.hgignore Fri Jun 21 22:09:34 2013 -0700 @@ -0,0 +1,2 @@ +.*\.beam +.*~ diff -r 000000000000 -r db5c7047ef0e client/Makefile diff -r 000000000000 -r db5c7047ef0e server/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/Makefile Fri Jun 21 22:09:34 2013 -0700 @@ -0,0 +1,14 @@ + +EBINS= \ + awetv/ebin/awetv.beam \ + awetv/ebin/awesupp.beam \ + awetv/ebin/awelistener.beam \ + awetv/ebin/aweconn.beam + +VPATH=awetv/src + +all : $(EBINS) + +awetv/ebin/%.beam : %.erl + erlc -o awetv/ebin $< + diff -r 000000000000 -r db5c7047ef0e server/awetv/ebin/awetv.app --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/awetv/ebin/awetv.app Fri Jun 21 22:09:34 2013 -0700 @@ -0,0 +1,11 @@ +{application, awetv, + [ + {description, "awetv main application"}, + {vsn, "1"}, + {modules, [awetv]}, + {registered, []}, + {applications, [kernel, stdlib]}, + {mod, {awetv, []}} + ] +}. + diff -r 000000000000 -r db5c7047ef0e server/awetv/src/aweconn.erl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/awetv/src/aweconn.erl Fri Jun 21 22:09:34 2013 -0700 @@ -0,0 +1,39 @@ +-module(aweconn). +-behavior(gen_server). + +-export([start/1, init/1, handle_call/3, handle_cast/2, handle_info/2]). + +start(Socket) -> + {ok, Pid} = gen_server:start(?MODULE, [], []), + set_socket(Pid, Socket). + +set_socket(Pid, Socket) -> + ok = gen_tcp:controlling_process(Socket, Pid), + gen_server:cast(Pid, {set_socket, Socket}). + +init(_Args) -> + io:format("aweconn starting~n"), + {ok, no_sock}. + +handle_call(_Msg, _From, State) -> + {noreply, State}. + +handle_cast({set_socket, NewSocket}, Socket) -> + io:format("aweconn got socket~n"), + inet:setopts(NewSocket, [{active, true}]), + State = case Socket of + no_sock -> NewSocket; + Old -> gen_tcp:close(Old), NewSocket + end, + {noreply, State}; + +handle_cast(_, State) -> + {noreply, State}. + +handle_info({tcp, Socket, Data}, State) -> + io:format("Received: ~p~n", [Data]), + gen_tcp:send(Socket, Data), + {noreply, State}; +handle_info(_Msg, State) -> + {noreply, State}. + diff -r 000000000000 -r db5c7047ef0e server/awetv/src/awelistener.erl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/awetv/src/awelistener.erl Fri Jun 21 22:09:34 2013 -0700 @@ -0,0 +1,51 @@ +-module(awelistener). +-behavior(gen_server). + +-export([start_link/0, init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2]). + +start_link() -> + gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). + + +init(_Args) -> + Port = 5432, + Listeners = 2, + {ok, Socket} = gen_tcp:listen(Port, [{active, false}, binary]), + Children = [spawn_link(fun () -> accept_loop(Socket) end) || _ <- lists:seq(1, Listeners)], + {ok, {Socket, Children}}. + +handle_call(_Msg, _From, State) -> + {noreply, State}. + +handle_cast(_Msg, State) -> + {noreply, State}. + +handle_info({'EXIT', Pid, Reason}, {Socket, Children}) -> + io:format("Accept worker exited due to reason ~p~n", [Reason]), + case Reason of + shutdown -> {noreply, {Socket, []}}; + _ -> {noreply, {Socket, replace_worker(Pid, Socket, Children)}} + end. + +terminate(shutdown, {Socket, Children}) -> + lists:foreach( + fun(Child) -> + exit(Child, shutdown) + end, Children), + socket:close(Socket), + ok. + +accept_loop(Socket) -> + {ok, ClientSock} = gen_tcp:accept(Socket), + io:format("Got new connection~n"), + aweconn:start(ClientSock), + accept_loop(Socket). + +replace_worker(_, _, []) -> + []; +replace_worker(Pid, Socket, [Pid | Rest]) -> + [spawn_link(fun() -> accept_loop(Socket) end) | Rest]; +replace_worker(Pid, Socket, [OtherPid | Rest]) -> + [OtherPid | replace_worker(Pid, Socket, Rest)]. + + diff -r 000000000000 -r db5c7047ef0e server/awetv/src/awesupp.erl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/awetv/src/awesupp.erl Fri Jun 21 22:09:34 2013 -0700 @@ -0,0 +1,16 @@ +-module(awesupp). +-behavior(supervisor). + +-export([start_link/0, init/1]). + +start_link() -> + supervisor:start_link(awesupp, []). + +init(_Args) -> + {ok, { + {one_for_one, 1, 60}, + [ + {awelistener, {awelistener, start_link, []}, permanent, 5000, worker, [awelistener]} + ]} + }. + diff -r 000000000000 -r db5c7047ef0e server/awetv/src/awetv.erl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/awetv/src/awetv.erl Fri Jun 21 22:09:34 2013 -0700 @@ -0,0 +1,12 @@ +-module(awetv). +-behavior(application). + +-export([start/2, stop/1]). + +start(_Type, _Args) -> + awesupp:start_link(). + +stop(_State) -> + ok. + +