changeset 0:db5c7047ef0e default tip

Initial commit
author Mike Pavone <pavone@retrodev.com>
date Fri, 21 Jun 2013 22:09:34 -0700
parents
children
files .hgignore client/Makefile server/Makefile server/awetv/ebin/awetv.app server/awetv/src/aweconn.erl server/awetv/src/awelistener.erl server/awetv/src/awesupp.erl server/awetv/src/awetv.erl
diffstat 7 files changed, 145 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /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
+.*~
--- /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 $<
+
--- /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, []}}
+	]
+}.
+
--- /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}.
+
--- /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)].
+
+
--- /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]}
+		]}
+	}.
+
--- /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.
+
+