elib/ernie_server.erl in mojombo-ernie-0.2.0 vs elib/ernie_server.erl in mojombo-ernie-0.3.0
- old
+ new
@@ -62,35 +62,42 @@
%% {noreply, State, Timeout} |
%% {stop, Reason, State}
%% Description: Handling cast messages
%%--------------------------------------------------------------------
handle_cast({process, Sock}, State) ->
- case queue:is_empty(State#state.pending) of
- false ->
- Pending2 = queue:in(Sock, State#state.pending),
- io:format("Q", []),
- {noreply, State#state{pending = Pending2}};
- true ->
- State2 = try_process_now(Sock, State),
- {noreply, State2}
- end;
+ case gen_tcp:recv(Sock, 0) of
+ {ok, BinaryTerm} ->
+ logger:debug("Got binary term: ~p~n", [BinaryTerm]),
+ Term = binary_to_term(BinaryTerm),
+ logger:info("Got term: ~p~n", [Term]),
+ case Term of
+ {call, '__admin__', Fun, Args} ->
+ State2 = process_admin(Sock, Fun, Args, State);
+ Any ->
+ State2 = process_normal(BinaryTerm, Sock, State)
+ end,
+ {noreply, State2};
+ {error, closed} ->
+ ok = gen_tcp:close(Sock),
+ {noreply, State}
+ end;
handle_cast({asset_freed}, State) ->
case queue:is_empty(State#state.pending) of
false ->
case asset_pool:lease() of
{ok, Asset} ->
- {{value, Sock}, Pending2} = queue:out(State#state.pending),
- io:format("d", []),
- spawn(fun() -> process_now(Sock, Asset) end),
+ {{value, {pending, BinaryTerm, Sock}}, Pending2} = queue:out(State#state.pending),
+ % io:format("d", []),
+ spawn(fun() -> process_now(BinaryTerm, Sock, Asset) end),
{noreply, State#state{pending = Pending2}};
empty ->
- io:format(".", []),
+ % io:format(".", []),
{noreply, State}
end;
true ->
{noreply, State}
- end;
+ end;
handle_cast(_Msg, State) -> {noreply, State}.
handle_info(Msg, State) ->
error_logger:error_msg("Unexpected message: ~p~n", [Msg]),
{noreply, State}.
@@ -104,11 +111,11 @@
try_listen(Port, 0) ->
error_logger:error_msg("Could not listen on port ~p~n", [Port]),
{error, "Could not listen on port"};
try_listen(Port, Times) ->
- Res = gen_tcp:listen(Port, [binary, {packet, 4}, {active, false}]),
+ Res = gen_tcp:listen(Port, [binary, {packet, 4}, {active, false}, {reuseaddr, true}]),
case Res of
{ok, LSock} ->
error_logger:info_msg("Listening on port ~p~n", [Port]),
{ok, LSock};
{error, Reason} ->
@@ -117,37 +124,52 @@
try_listen(Port, Times - 1)
end.
loop(LSock) ->
{ok, Sock} = gen_tcp:accept(LSock),
+ logger:debug("Accepted socket: ~p~n", [Sock]),
ernie_server:process(Sock),
loop(LSock).
-try_process_now(Sock, State) ->
+process_admin(Sock, reload_handlers, _Args, State) ->
+ asset_pool:reload_assets(),
+ gen_tcp:send(Sock, term_to_binary({reply, <<"Handlers reloaded.">>})),
+ ok = gen_tcp:close(Sock),
+ State;
+process_admin(Sock, Fun, _Args, State) ->
+ gen_tcp:send(Sock, term_to_binary({reply, <<"Admin function not supported.">>})),
+ ok = gen_tcp:close(Sock),
+ State.
+
+process_normal(BinaryTerm, Sock, State) ->
+ case queue:is_empty(State#state.pending) of
+ false ->
+ Pending2 = queue:in({pending, BinaryTerm, Sock}, State#state.pending),
+ % io:format("Q", []),
+ State#state{pending = Pending2};
+ true ->
+ try_process_now(BinaryTerm, Sock, State)
+ end.
+
+try_process_now(BinaryTerm, Sock, State) ->
case asset_pool:lease() of
{ok, Asset} ->
- io:format("i", []),
- spawn(fun() -> process_now(Sock, Asset) end),
+ % io:format("i", []),
+ spawn(fun() -> process_now(BinaryTerm, Sock, Asset) end),
State;
empty ->
- io:format("q", []),
- Pending2 = queue:in(Sock, State#state.pending),
+ % io:format("q", []),
+ Pending2 = queue:in({pending, BinaryTerm, Sock}, State#state.pending),
State#state{pending = Pending2}
end.
-process_now(Sock, Asset) ->
- case gen_tcp:recv(Sock, 0) of
- {ok, BinaryTerm} ->
- % io:format(".", []),
- % error_logger:info_msg("From Internet: ~p~n", [BinaryTerm]),
- {ok, Data} = port_wrapper:rpc(Asset, BinaryTerm),
- % error_logger:info_msg("From Port: ~p~n", [Data]),
- asset_pool:return(Asset),
- ernie_server:asset_freed(),
- gen_tcp:send(Sock, Data),
- ok = gen_tcp:close(Sock);
- {error, closed} ->
- asset_pool:return(Asset),
- ernie_server:asset_freed(),
- io:format("c", []),
- ok = gen_tcp:close(Sock)
- end.
+process_now(BinaryTerm, Sock, Asset) ->
+ % io:format(".", []),
+ % error_logger:info_msg("From Internet: ~p~n", [BinaryTerm]),
+ {asset, Port, Token} = Asset,
+ logger:debug("Asset: ~p ~p~n", [Port, Token]),
+ {ok, Data} = port_wrapper:rpc(Port, BinaryTerm),
+ % error_logger:info_msg("From Port: ~p~n", [Data]),
+ asset_pool:return(Asset),
+ ernie_server:asset_freed(),
+ gen_tcp:send(Sock, Data),
+ ok = gen_tcp:close(Sock).
\ No newline at end of file