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